2014-04-25 20:10:54 +08:00
require " spec_helper "
2014-04-28 16:37:34 +08:00
2014-04-28 16:31:51 +08:00
describe HasCustomFields do
2014-04-25 20:10:54 +08:00
context " custom_fields " do
before do
2014-04-28 16:37:34 +08:00
Topic . exec_sql ( " create temporary table custom_fields_test_items(id SERIAL primary key) " )
Topic . exec_sql ( " create temporary table custom_fields_test_item_custom_fields(id SERIAL primary key, custom_fields_test_item_id int, name varchar(256) not null, value text) " )
2014-04-25 20:10:54 +08:00
2014-04-28 16:37:34 +08:00
class CustomFieldsTestItem < ActiveRecord :: Base
2014-04-28 16:31:51 +08:00
include HasCustomFields
2014-04-25 20:10:54 +08:00
end
2014-04-28 16:37:34 +08:00
class CustomFieldsTestItemCustomField < ActiveRecord :: Base
belongs_to :custom_fields_test_item
2014-04-25 20:10:54 +08:00
end
end
after do
2014-04-28 16:37:34 +08:00
Topic . exec_sql ( " drop table custom_fields_test_items " )
Topic . exec_sql ( " drop table custom_fields_test_item_custom_fields " )
2014-04-25 20:10:54 +08:00
# import is making my life hard, we need to nuke this out of orbit
des = ActiveSupport :: DescendantsTracker . class_variable_get :@@direct_descendants
2014-04-28 16:37:34 +08:00
des [ ActiveRecord :: Base ] . delete ( CustomFieldsTestItem )
des [ ActiveRecord :: Base ] . delete ( CustomFieldsTestItemCustomField )
2014-04-25 20:10:54 +08:00
end
it " simple modification of custom fields " do
2014-04-28 16:37:34 +08:00
test_item = CustomFieldsTestItem . new
2014-04-25 20:10:54 +08:00
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields [ " a " ] ) . to eq ( nil )
2014-04-25 20:10:54 +08:00
test_item . custom_fields [ " bob " ] = " marley "
test_item . custom_fields [ " jack " ] = " black "
2014-04-26 01:15:23 +08:00
2014-04-25 20:10:54 +08:00
test_item . save
2014-04-28 16:37:34 +08:00
test_item = CustomFieldsTestItem . find ( test_item . id )
2014-04-25 20:10:54 +08:00
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields [ " bob " ] ) . to eq ( " marley " )
expect ( test_item . custom_fields [ " jack " ] ) . to eq ( " black " )
2014-04-25 20:10:54 +08:00
test_item . custom_fields . delete ( " bob " )
test_item . custom_fields [ " jack " ] = " jill "
test_item . save
2014-04-28 16:37:34 +08:00
test_item = CustomFieldsTestItem . find ( test_item . id )
2014-04-25 20:10:54 +08:00
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields ) . to eq ( { " jack " = > " jill " } )
2014-04-25 20:10:54 +08:00
end
2014-04-26 01:15:23 +08:00
it " casts integers to string without error " do
2014-04-28 16:37:34 +08:00
test_item = CustomFieldsTestItem . new
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields [ " a " ] ) . to eq ( nil )
2014-04-26 01:15:23 +08:00
test_item . custom_fields [ " a " ] = 0
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields [ " a " ] ) . to eq ( 0 )
2014-04-26 01:15:23 +08:00
test_item . save
# should be casted right after saving
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields [ " a " ] ) . to eq ( " 0 " )
2014-04-26 01:15:23 +08:00
2014-04-28 16:37:34 +08:00
test_item = CustomFieldsTestItem . find ( test_item . id )
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields [ " a " ] ) . to eq ( " 0 " )
2014-04-26 01:15:23 +08:00
end
2014-04-30 01:23:13 +08:00
it " reload loads from database " do
test_item = CustomFieldsTestItem . new
test_item . custom_fields [ " a " ] = 0
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields [ " a " ] ) . to eq ( 0 )
2014-04-30 01:23:13 +08:00
test_item . save
# should be casted right after saving
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields [ " a " ] ) . to eq ( " 0 " )
2014-04-30 01:23:13 +08:00
CustomFieldsTestItem . exec_sql ( " UPDATE custom_fields_test_item_custom_fields SET value='1' WHERE custom_fields_test_item_id=? AND name='a' " , test_item . id )
# still the same, did not load
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields [ " a " ] ) . to eq ( " 0 " )
2014-04-30 01:23:13 +08:00
# refresh loads from database
2015-01-10 00:34:37 +08:00
expect ( test_item . reload . custom_fields [ " a " ] ) . to eq ( " 1 " )
expect ( test_item . custom_fields [ " a " ] ) . to eq ( " 1 " )
2014-04-30 01:23:13 +08:00
end
2014-04-26 00:22:49 +08:00
2015-04-24 01:33:29 +08:00
it " double save actually saves " do
2014-04-28 16:37:34 +08:00
test_item = CustomFieldsTestItem . new
2014-04-26 00:22:49 +08:00
test_item . custom_fields = { " a " = > " b " }
test_item . save
test_item . custom_fields [ " c " ] = " d "
test_item . save
2014-04-28 16:37:34 +08:00
db_item = CustomFieldsTestItem . find ( test_item . id )
2015-01-10 00:34:37 +08:00
expect ( db_item . custom_fields ) . to eq ( { " a " = > " b " , " c " = > " d " } )
2014-04-26 00:22:49 +08:00
end
2014-04-26 01:15:23 +08:00
it " handles arrays properly " do
2014-04-28 16:37:34 +08:00
test_item = CustomFieldsTestItem . new
2014-04-26 01:15:23 +08:00
test_item . custom_fields = { " a " = > [ " b " , " c " , " d " ] }
test_item . save
2014-04-28 16:37:34 +08:00
db_item = CustomFieldsTestItem . find ( test_item . id )
2015-01-10 00:34:37 +08:00
expect ( db_item . custom_fields ) . to eq ( { " a " = > [ " b " , " c " , " d " ] } )
2014-04-26 01:15:23 +08:00
2015-01-03 04:56:44 +08:00
db_item . custom_fields . update ( 'a' = > [ 'c' , 'd' ] )
2014-04-26 01:15:23 +08:00
db_item . save
2015-01-10 00:34:37 +08:00
expect ( db_item . custom_fields ) . to eq ( { " a " = > [ " c " , " d " ] } )
2014-04-26 01:15:23 +08:00
2015-01-16 04:31:31 +08:00
# It can be updated to the exact same value
db_item . custom_fields . update ( 'a' = > [ 'c' ] )
db_item . save
expect ( db_item . custom_fields ) . to eq ( { " a " = > " c " } )
db_item . custom_fields . update ( 'a' = > [ 'c' ] )
db_item . save
expect ( db_item . custom_fields ) . to eq ( { " a " = > " c " } )
2015-01-03 04:56:44 +08:00
db_item . custom_fields . delete ( 'a' )
2015-01-10 00:34:37 +08:00
expect ( db_item . custom_fields ) . to eq ( { } )
2014-04-26 01:15:23 +08:00
end
it " casts integers in arrays properly without error " do
2014-04-28 16:37:34 +08:00
test_item = CustomFieldsTestItem . new
2014-04-26 01:15:23 +08:00
test_item . custom_fields = { " a " = > [ " b " , 10 , " d " ] }
test_item . save
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields ) . to eq ( { " a " = > [ " b " , " 10 " , " d " ] } )
2014-04-26 01:15:23 +08:00
2014-04-28 16:37:34 +08:00
db_item = CustomFieldsTestItem . find ( test_item . id )
2015-01-10 00:34:37 +08:00
expect ( db_item . custom_fields ) . to eq ( { " a " = > [ " b " , " 10 " , " d " ] } )
2014-04-26 01:15:23 +08:00
end
2014-06-17 10:42:12 +08:00
it " supportes type coersion " do
test_item = CustomFieldsTestItem . new
CustomFieldsTestItem . register_custom_field_type ( " bool " , :boolean )
CustomFieldsTestItem . register_custom_field_type ( " int " , :integer )
2015-04-24 01:33:29 +08:00
CustomFieldsTestItem . register_custom_field_type ( " json " , :json )
2014-06-17 10:42:12 +08:00
2015-04-24 01:33:29 +08:00
test_item . custom_fields = { " bool " = > true , " int " = > 1 , " json " = > { " foo " = > " bar " } }
2014-06-17 10:42:12 +08:00
test_item . save
test_item . reload
2015-04-24 01:33:29 +08:00
expect ( test_item . custom_fields ) . to eq ( { " bool " = > true , " int " = > 1 , " json " = > { " foo " = > " bar " } } )
2014-06-17 10:42:12 +08:00
end
2014-04-25 20:10:54 +08:00
it " simple modifications don't interfere " do
2014-04-28 16:37:34 +08:00
test_item = CustomFieldsTestItem . new
2014-04-25 20:10:54 +08:00
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields [ " a " ] ) . to eq ( nil )
2014-04-25 20:10:54 +08:00
test_item . custom_fields [ " bob " ] = " marley "
test_item . custom_fields [ " jack " ] = " black "
test_item . save
2014-04-28 16:37:34 +08:00
test_item2 = CustomFieldsTestItem . new
2014-04-25 20:10:54 +08:00
2015-01-10 00:34:37 +08:00
expect ( test_item2 . custom_fields [ " x " ] ) . to eq ( nil )
2014-04-25 20:10:54 +08:00
test_item2 . custom_fields [ " sixto " ] = " rodriguez "
test_item2 . custom_fields [ " de " ] = " la playa "
test_item2 . save
2014-04-28 16:37:34 +08:00
test_item = CustomFieldsTestItem . find ( test_item . id )
test_item2 = CustomFieldsTestItem . find ( test_item2 . id )
2014-04-25 20:10:54 +08:00
2015-01-10 00:34:37 +08:00
expect ( test_item . custom_fields ) . to eq ( { " jack " = > " black " , " bob " = > " marley " } )
expect ( test_item2 . custom_fields ) . to eq ( { " sixto " = > " rodriguez " , " de " = > " la playa " } )
2014-04-25 20:10:54 +08:00
end
2014-05-15 02:38:04 +08:00
it " supports bulk retrieval with a list of ids " do
item1 = CustomFieldsTestItem . new
item1 . custom_fields = { " a " = > [ " b " , " c " , " d " ] , 'not_whitelisted' = > 'secret' }
item1 . save
item2 = CustomFieldsTestItem . new
item2 . custom_fields = { " e " = > 'hallo' }
item2 . save
fields = CustomFieldsTestItem . custom_fields_for_ids ( [ item1 . id , item2 . id ] , [ 'a' , 'e' ] )
2015-01-10 00:34:37 +08:00
expect ( fields ) . to be_present
expect ( fields [ item1 . id ] [ 'a' ] ) . to match_array ( [ 'b' , 'c' , 'd' ] )
expect ( fields [ item1 . id ] [ 'not_whitelisted' ] ) . to be_blank
expect ( fields [ item2 . id ] [ 'e' ] ) . to eq ( 'hallo' )
2014-05-15 02:38:04 +08:00
end
2014-04-25 20:10:54 +08:00
end
end