2014-04-25 08:10:54 -04:00
require " spec_helper "
2014-04-28 04:37:34 -04:00
2014-04-28 04:31:51 -04:00
describe HasCustomFields do
2014-04-25 08:10:54 -04:00
context " custom_fields " do
before do
2014-04-28 04:37:34 -04: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 08:10:54 -04:00
2014-04-28 04:37:34 -04:00
class CustomFieldsTestItem < ActiveRecord :: Base
2014-04-28 04:31:51 -04:00
include HasCustomFields
2014-04-25 08:10:54 -04:00
end
2014-04-28 04:37:34 -04:00
class CustomFieldsTestItemCustomField < ActiveRecord :: Base
belongs_to :custom_fields_test_item
2014-04-25 08:10:54 -04:00
end
end
after do
2014-04-28 04:37:34 -04:00
Topic . exec_sql ( " drop table custom_fields_test_items " )
Topic . exec_sql ( " drop table custom_fields_test_item_custom_fields " )
2014-04-25 08:10:54 -04: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 04:37:34 -04:00
des [ ActiveRecord :: Base ] . delete ( CustomFieldsTestItem )
des [ ActiveRecord :: Base ] . delete ( CustomFieldsTestItemCustomField )
2014-04-25 08:10:54 -04:00
end
it " simple modification of custom fields " do
2014-04-28 04:37:34 -04:00
test_item = CustomFieldsTestItem . new
2014-04-25 08:10:54 -04:00
test_item . custom_fields [ " a " ] . should == nil
test_item . custom_fields [ " bob " ] = " marley "
test_item . custom_fields [ " jack " ] = " black "
2014-04-25 13:15:23 -04:00
2014-04-25 08:10:54 -04:00
test_item . save
2014-04-28 04:37:34 -04:00
test_item = CustomFieldsTestItem . find ( test_item . id )
2014-04-25 08:10:54 -04:00
test_item . custom_fields [ " bob " ] . should == " marley "
test_item . custom_fields [ " jack " ] . should == " black "
test_item . custom_fields . delete ( " bob " )
test_item . custom_fields [ " jack " ] = " jill "
test_item . save
2014-04-28 04:37:34 -04:00
test_item = CustomFieldsTestItem . find ( test_item . id )
2014-04-25 08:10:54 -04:00
test_item . custom_fields . should == { " jack " = > " jill " }
end
2014-04-25 13:15:23 -04:00
it " casts integers to string without error " do
2014-04-28 04:37:34 -04:00
test_item = CustomFieldsTestItem . new
2014-04-25 13:15:23 -04:00
test_item . custom_fields [ " a " ] . should == nil
test_item . custom_fields [ " a " ] = 0
test_item . custom_fields [ " a " ] . should == 0
test_item . save
# should be casted right after saving
test_item . custom_fields [ " a " ] . should == " 0 "
2014-04-28 04:37:34 -04:00
test_item = CustomFieldsTestItem . find ( test_item . id )
2014-04-25 13:15:23 -04:00
test_item . custom_fields [ " a " ] . should == " 0 "
end
2014-04-29 13:23:13 -04:00
it " reload loads from database " do
test_item = CustomFieldsTestItem . new
test_item . custom_fields [ " a " ] = 0
test_item . custom_fields [ " a " ] . should == 0
test_item . save
# should be casted right after saving
test_item . custom_fields [ " a " ] . should == " 0 "
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
test_item . custom_fields [ " a " ] . should == " 0 "
# refresh loads from database
test_item . reload . custom_fields [ " a " ] . should == " 1 "
test_item . custom_fields [ " a " ] . should == " 1 "
end
2014-04-25 12:22:49 -04:00
it " double save actually saves " do
2014-04-28 04:37:34 -04:00
test_item = CustomFieldsTestItem . new
2014-04-25 12:22:49 -04:00
test_item . custom_fields = { " a " = > " b " }
test_item . save
test_item . custom_fields [ " c " ] = " d "
test_item . save
2014-04-28 04:37:34 -04:00
db_item = CustomFieldsTestItem . find ( test_item . id )
2014-04-25 12:22:49 -04:00
db_item . custom_fields . should == { " a " = > " b " , " c " = > " d " }
end
2014-04-25 08:10:54 -04:00
2014-04-25 13:15:23 -04:00
it " handles arrays properly " do
2014-04-28 04:37:34 -04:00
test_item = CustomFieldsTestItem . new
2014-04-25 13:15:23 -04:00
test_item . custom_fields = { " a " = > [ " b " , " c " , " d " ] }
test_item . save
2014-04-28 04:37:34 -04:00
db_item = CustomFieldsTestItem . find ( test_item . id )
2014-04-25 13:15:23 -04:00
db_item . custom_fields . should == { " a " = > [ " b " , " c " , " d " ] }
2015-01-02 15:56:44 -05:00
db_item . custom_fields . update ( 'a' = > [ 'c' , 'd' ] )
2014-04-25 13:15:23 -04:00
db_item . save
db_item . custom_fields . should == { " a " = > [ " c " , " d " ] }
2015-01-02 15:56:44 -05:00
db_item . custom_fields . delete ( 'a' )
db_item . custom_fields . should == { }
2014-04-25 13:15:23 -04:00
end
it " casts integers in arrays properly without error " do
2014-04-28 04:37:34 -04:00
test_item = CustomFieldsTestItem . new
2014-04-25 13:15:23 -04:00
test_item . custom_fields = { " a " = > [ " b " , 10 , " d " ] }
test_item . save
test_item . custom_fields . should == { " a " = > [ " b " , " 10 " , " d " ] }
2014-04-28 04:37:34 -04:00
db_item = CustomFieldsTestItem . find ( test_item . id )
2014-04-25 13:15:23 -04:00
db_item . custom_fields . should == { " a " = > [ " b " , " 10 " , " d " ] }
end
2014-06-16 22:42:12 -04:00
it " supportes type coersion " do
test_item = CustomFieldsTestItem . new
CustomFieldsTestItem . register_custom_field_type ( " bool " , :boolean )
CustomFieldsTestItem . register_custom_field_type ( " int " , :integer )
test_item . custom_fields = { " bool " = > true , " int " = > 1 }
test_item . save
test_item . reload
test_item . custom_fields . should == { " bool " = > true , " int " = > 1 }
end
2014-04-25 08:10:54 -04:00
it " simple modifications don't interfere " do
2014-04-28 04:37:34 -04:00
test_item = CustomFieldsTestItem . new
2014-04-25 08:10:54 -04:00
test_item . custom_fields [ " a " ] . should == nil
test_item . custom_fields [ " bob " ] = " marley "
test_item . custom_fields [ " jack " ] = " black "
test_item . save
2014-04-28 04:37:34 -04:00
test_item2 = CustomFieldsTestItem . new
2014-04-25 08:10:54 -04:00
test_item2 . custom_fields [ " x " ] . should == nil
test_item2 . custom_fields [ " sixto " ] = " rodriguez "
test_item2 . custom_fields [ " de " ] = " la playa "
test_item2 . save
2014-04-28 04:37:34 -04:00
test_item = CustomFieldsTestItem . find ( test_item . id )
test_item2 = CustomFieldsTestItem . find ( test_item2 . id )
2014-04-25 08:10:54 -04:00
test_item . custom_fields . should == { " jack " = > " black " , " bob " = > " marley " }
test_item2 . custom_fields . should == { " sixto " = > " rodriguez " , " de " = > " la playa " }
end
2014-05-14 14:38:04 -04: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' ] )
fields . should be_present
fields [ item1 . id ] [ 'a' ] . should =~ [ 'b' , 'c' , 'd' ]
fields [ item1 . id ] [ 'not_whitelisted' ] . should be_blank
fields [ item2 . id ] [ 'e' ] . should == 'hallo'
end
2014-04-25 08:10:54 -04:00
end
end