careacademy-enumerize 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +69 -0
  3. data/.gitignore +23 -0
  4. data/.rspec +2 -0
  5. data/CHANGELOG.md +327 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.global +12 -0
  8. data/Gemfile.mongo_mapper +6 -0
  9. data/Gemfile.rails60 +6 -0
  10. data/Gemfile.rails61 +6 -0
  11. data/Gemfile.rails70 +9 -0
  12. data/Gemfile.railsmaster +5 -0
  13. data/MIT-LICENSE +22 -0
  14. data/README.md +641 -0
  15. data/Rakefile +17 -0
  16. data/enumerize.gemspec +22 -0
  17. data/lib/enumerize/activemodel.rb +47 -0
  18. data/lib/enumerize/activerecord.rb +142 -0
  19. data/lib/enumerize/attribute.rb +192 -0
  20. data/lib/enumerize/attribute_map.rb +40 -0
  21. data/lib/enumerize/base.rb +112 -0
  22. data/lib/enumerize/hooks/formtastic.rb +27 -0
  23. data/lib/enumerize/hooks/sequel_dataset.rb +17 -0
  24. data/lib/enumerize/hooks/simple_form.rb +37 -0
  25. data/lib/enumerize/hooks/uniqueness.rb +22 -0
  26. data/lib/enumerize/integrations/rails_admin.rb +18 -0
  27. data/lib/enumerize/integrations/rspec/matcher.rb +164 -0
  28. data/lib/enumerize/integrations/rspec.rb +19 -0
  29. data/lib/enumerize/module.rb +33 -0
  30. data/lib/enumerize/module_attributes.rb +12 -0
  31. data/lib/enumerize/mongoid.rb +29 -0
  32. data/lib/enumerize/predicatable.rb +23 -0
  33. data/lib/enumerize/predicates.rb +76 -0
  34. data/lib/enumerize/scope/activerecord.rb +53 -0
  35. data/lib/enumerize/scope/mongoid.rb +50 -0
  36. data/lib/enumerize/scope/sequel.rb +56 -0
  37. data/lib/enumerize/sequel.rb +62 -0
  38. data/lib/enumerize/set.rb +81 -0
  39. data/lib/enumerize/utils.rb +12 -0
  40. data/lib/enumerize/value.rb +47 -0
  41. data/lib/enumerize/version.rb +5 -0
  42. data/lib/enumerize.rb +90 -0
  43. data/lib/sequel/plugins/enumerize.rb +18 -0
  44. data/spec/enumerize/integrations/rspec/matcher_spec.rb +261 -0
  45. data/spec/spec_helper.rb +30 -0
  46. data/test/activemodel_test.rb +114 -0
  47. data/test/activerecord_test.rb +679 -0
  48. data/test/attribute_map_test.rb +70 -0
  49. data/test/attribute_test.rb +141 -0
  50. data/test/base_test.rb +230 -0
  51. data/test/formtastic_test.rb +152 -0
  52. data/test/module_attributes_test.rb +52 -0
  53. data/test/mongo_mapper_test.rb +83 -0
  54. data/test/mongoid_test.rb +164 -0
  55. data/test/multiple_test.rb +65 -0
  56. data/test/predicates_test.rb +65 -0
  57. data/test/rails_admin_test.rb +27 -0
  58. data/test/sequel_test.rb +344 -0
  59. data/test/set_test.rb +166 -0
  60. data/test/simple_form_test.rb +156 -0
  61. data/test/support/mock_controller.rb +31 -0
  62. data/test/support/shared_enums.rb +43 -0
  63. data/test/support/view_test_helper.rb +46 -0
  64. data/test/test_helper.rb +53 -0
  65. data/test/value_test.rb +158 -0
  66. metadata +143 -0
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module Enumerize
6
+ class AttributeMapTest < MiniTest::Spec
7
+ subject { AttributeMap.new }
8
+
9
+ def make_attr(name)
10
+ Attribute.new(nil, name, :in => %[a b])
11
+ end
12
+
13
+ it 'empty when no attrs' do
14
+ expect(subject).must_be_empty
15
+ end
16
+
17
+ it 'not empty when attr added' do
18
+ subject << make_attr(:a)
19
+ expect(subject).wont_be_empty
20
+ end
21
+
22
+ it 'iterates over added attrs' do
23
+ attr_1 = make_attr(:a)
24
+ attr_2 = make_attr(:b)
25
+
26
+ subject << attr_1
27
+ subject << attr_2
28
+
29
+ count = 0
30
+ actual = []
31
+
32
+ subject.each do |element|
33
+ count += 1
34
+ actual << element
35
+ end
36
+
37
+ expect(count).must_equal 2
38
+ expect(actual).must_equal [attr_1, attr_2]
39
+ end
40
+
41
+ it 'reads attribute by name' do
42
+ attr = make_attr(:a)
43
+ subject << attr
44
+ expect(subject[:a]).must_equal attr
45
+ end
46
+
47
+ it 'reads attribute by name using string' do
48
+ attr = make_attr(:a)
49
+ subject << attr
50
+ expect(subject['a']).must_equal attr
51
+ end
52
+
53
+ it 'updates dependants' do
54
+ attr = make_attr(:a)
55
+ dependant = MiniTest::Mock.new
56
+ dependant.expect(:<<, nil, [attr])
57
+ subject.add_dependant dependant
58
+ subject << attr
59
+ dependant.verify
60
+ end
61
+
62
+ it 'adds attrs to dependant' do
63
+ attr = make_attr(:a)
64
+ subject << attr
65
+ dependant = AttributeMap.new
66
+ subject.add_dependant dependant
67
+ expect(dependant[:a]).must_equal attr
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ describe Enumerize::Attribute do
6
+ def attr
7
+ @attr ||= nil
8
+ end
9
+
10
+ def build_attr(*args, &block)
11
+ @attr = Enumerize::Attribute.new(*args, &block)
12
+ end
13
+
14
+ it 'returns values' do
15
+ build_attr nil, :foo, :in => [:a, :b]
16
+ expect(attr.values).must_equal %w[a b]
17
+ end
18
+
19
+ it 'returns frozen values' do
20
+ build_attr nil, :foo, :in => [:a, :b]
21
+ expect(attr.values.map(&:frozen?)).must_equal [true, true]
22
+ end
23
+
24
+ it 'converts name to symbol' do
25
+ build_attr nil, 'foo', :in => %w[a b]
26
+ expect(attr.name).must_equal :foo
27
+ end
28
+
29
+ it 'uses custom value class' do
30
+ value_class = Class.new(Enumerize::Value)
31
+ build_attr nil, 'foo', :in => %w[a b], :value_class => value_class
32
+ expect(attr.values.first).must_be_instance_of value_class
33
+ end
34
+
35
+ describe 'i18n scopes' do
36
+ it 'returns scopes from options' do
37
+ build_attr nil, 'foo', :in => %w[a b], :i18n_scope => %w[bar buzz]
38
+ expect(attr.i18n_scopes).must_equal %w[bar buzz]
39
+ end
40
+
41
+ it 'accepts only string scopes' do
42
+ expect(proc { build_attr nil, 'foo', :in => %w[a b], :i18n_scope => [%w[bar buzz], "bar.buzz"] }).must_raise ArgumentError
43
+ end
44
+ end
45
+
46
+ describe 'options for select' do
47
+ it 'returns all options for select' do
48
+ store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
49
+ build_attr nil, :foo, :in => %w[a b]
50
+ expect(attr.options).must_equal [['a text', 'a'], ['b text', 'b']]
51
+ end
52
+ end
53
+
54
+ it 'returns requested options for select via :only' do
55
+ store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
56
+ build_attr nil, :foo, :in => %w[a b]
57
+ expect(attr.options(:only => :a)).must_equal [['a text', 'a']]
58
+ expect(attr.options(:only => [:b])).must_equal [['b text', 'b']]
59
+ expect(attr.options(:only => [])).must_equal []
60
+ end
61
+ end
62
+
63
+ it 'returns requested options for select via :except' do
64
+ store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
65
+ build_attr nil, :foo, :in => %w[a b]
66
+ expect(attr.options(:except => :a)).must_equal [['b text', 'b']]
67
+ expect(attr.options(:except => :b)).must_equal [['a text', 'a']]
68
+ expect(attr.options(:except => [])).must_equal [['a text', 'a'], ['b text', 'b']]
69
+ end
70
+ end
71
+
72
+ it 'does not work with both :only and :except' do
73
+ store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
74
+ build_attr nil, :foo, :in => %w[a b]
75
+ expect(proc { attr.options(:except => [], :only => []) }).must_raise ArgumentError
76
+ end
77
+ end
78
+ end
79
+
80
+ describe 'values hash' do
81
+ before do
82
+ build_attr nil, :foo, :in => {:a => 1, :b => 2}
83
+ end
84
+
85
+ it 'returns hash keys as values' do
86
+ expect(attr.values).must_equal %w[a b]
87
+ end
88
+
89
+ it 'finds values by hash values' do
90
+ expect(attr.find_value(1)).must_equal 'a'
91
+ expect(attr.find_value(2)).must_equal 'b'
92
+ end
93
+ end
94
+
95
+ it 'sets up shortcut methods for each value' do
96
+ build_attr nil, :foo, :in => {:a => 1, :b => 2}
97
+
98
+ expect(attr).must_respond_to :a
99
+ expect(attr).must_respond_to :b
100
+
101
+ expect(attr.a.value).must_equal 1
102
+ expect(attr.b.value).must_equal 2
103
+ expect(attr.a.text).must_equal 'A'
104
+ expect(attr.b.text).must_equal 'B'
105
+ end
106
+
107
+ describe 'values hash with zero' do
108
+ before do
109
+ build_attr nil, :foo, :in => {:a => 1, :b => 2, :c => 0}
110
+ end
111
+
112
+ it 'returns hash keys as values' do
113
+ expect(attr.values).must_equal %w[a b c]
114
+ end
115
+
116
+ it 'finds values by hash values' do
117
+ expect(attr.find_value(1)).must_equal 'a'
118
+ expect(attr.find_value(2)).must_equal 'b'
119
+ expect(attr.find_value(0)).must_equal 'c'
120
+ end
121
+
122
+ it 'finds all values by hash values' do
123
+ expect(attr.find_values(1, 2, 0)).must_equal ['a', 'b', 'c']
124
+ end
125
+ end
126
+
127
+ describe 'boolean values hash' do
128
+ before do
129
+ build_attr nil, :foo, :in => {:a => true, :b => false}
130
+ end
131
+
132
+ it 'returns hash keys as values' do
133
+ expect(attr.values).must_equal %w[a b]
134
+ end
135
+
136
+ it 'finds values by hash values' do
137
+ expect(attr.find_value(true)).must_equal 'a'
138
+ expect(attr.find_value(false)).must_equal 'b'
139
+ end
140
+ end
141
+ end
data/test/base_test.rb ADDED
@@ -0,0 +1,230 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ describe Enumerize::Base do
6
+ let(:kklass) do
7
+ Class.new do
8
+ extend Enumerize
9
+ end
10
+ end
11
+
12
+ let(:subklass) do
13
+ Class.new(kklass)
14
+ end
15
+
16
+ let(:object) { kklass.new }
17
+
18
+ it 'returns nil when not set' do
19
+ kklass.enumerize(:foo, :in => [:a, :b])
20
+ expect(object.foo).must_be_nil
21
+ end
22
+
23
+ it 'returns value that was set' do
24
+ kklass.enumerize(:foo, :in => [:a, :b])
25
+ object.foo = :a
26
+ expect(object.foo).must_equal 'a'
27
+ end
28
+
29
+ it 'returns translation' do
30
+ store_translations(:en, :enumerize => {:foo => {:a => 'a text'}}) do
31
+ kklass.enumerize(:foo, :in => [:a, :b])
32
+ object.foo = :a
33
+ expect(object.foo.text).must_equal 'a text'
34
+ expect(object.foo_text).must_equal 'a text'
35
+ expect(object.foo_text).must_equal 'a text'
36
+ end
37
+ end
38
+
39
+ it 'returns nil as translation when value is nil' do
40
+ store_translations(:en, :enumerize => {:foo => {:a => 'a text'}}) do
41
+ kklass.enumerize(:foo, :in => [:a, :b])
42
+ expect(object.foo_text).must_be_nil
43
+ end
44
+ end
45
+
46
+ it 'scopes translation by i18n key' do
47
+ def kklass.model_name
48
+ name = String.new("ExampleClass")
49
+ def name.i18n_key
50
+ 'example_class'
51
+ end
52
+
53
+ name
54
+ end
55
+
56
+ store_translations(:en, :enumerize => {:example_class => {:foo => {:a => 'a text scoped'}}}) do
57
+ kklass.enumerize(:foo, :in => [:a, :b])
58
+ object.foo = :a
59
+ expect(object.foo.text).must_equal 'a text scoped'
60
+ expect(object.foo_text).must_equal 'a text scoped'
61
+ end
62
+ end
63
+
64
+ it 'returns humanized value if there are no translations' do
65
+ store_translations(:en, :enumerize => {}) do
66
+ kklass.enumerize(:foo, :in => [:a, :b])
67
+ object.foo = :a
68
+ expect(object.foo_text).must_equal 'A'
69
+ end
70
+ end
71
+
72
+ it 'stores value as string' do
73
+ kklass.enumerize(:foo, :in => [:a, :b])
74
+ object.foo = :a
75
+ expect(object.instance_variable_get(:@foo)).must_be_instance_of String
76
+ end
77
+
78
+ it 'handles default value' do
79
+ kklass.enumerize(:foo, :in => [:a, :b], :default => :b)
80
+ expect(object.foo).must_equal 'b'
81
+ end
82
+
83
+ it 'handles default value with lambda' do
84
+ kklass.enumerize(:foo, :in => [:a, :b], :default => lambda { :b })
85
+ expect(object.foo).must_equal 'b'
86
+ end
87
+
88
+ it 'injects object instance into lamda default value' do
89
+ kklass.enumerize(:foo, :in => [:a, :b], :default => lambda { |obj| :b if obj.is_a? kklass })
90
+ expect(object.foo).must_equal 'b'
91
+ end
92
+
93
+ it 'raises exception on invalid default value' do
94
+ expect(proc {
95
+ kklass.enumerize(:foo, :in => [:a, :b], :default => :c)
96
+ }).must_raise ArgumentError
97
+ end
98
+
99
+ it 'has enumerized attributes' do
100
+ expect(kklass.enumerized_attributes).must_be_empty
101
+ kklass.enumerize(:foo, :in => %w[a b])
102
+ expect(kklass.enumerized_attributes[:foo]).must_be_instance_of Enumerize::Attribute
103
+ end
104
+
105
+ it "doesn't override existing method" do
106
+ method = kklass.method(:name)
107
+ kklass.enumerize(:name, :in => %w[a b], :default => 'a')
108
+ expect(kklass.method(:name)).must_equal method
109
+ end
110
+
111
+ it "inherits enumerized attributes from a parent class" do
112
+ kklass.enumerize(:foo, :in => %w[a b])
113
+ expect(subklass.enumerized_attributes[:foo]).must_be_instance_of Enumerize::Attribute
114
+ end
115
+
116
+ it "inherits enumerized attributes from a grandparent class" do
117
+ kklass.enumerize(:foo, :in => %w[a b])
118
+ expect(Class.new(subklass).enumerized_attributes[:foo]).must_be_instance_of Enumerize::Attribute
119
+ end
120
+
121
+ it "doesn't add enumerized attributes to parent class" do
122
+ kklass.enumerize(:foo, :in => %w[a b])
123
+ subklass.enumerize(:bar, :in => %w[c d])
124
+
125
+ expect(kklass.enumerized_attributes[:bar]).must_be_nil
126
+ end
127
+
128
+ it 'adds new parent class attributes to subclass' do
129
+ subklass = Class.new(kklass)
130
+ kklass.enumerize :foo, :in => %w[a b]
131
+ expect(subklass.enumerized_attributes[:foo]).must_be_instance_of Enumerize::Attribute
132
+ end
133
+
134
+ it 'stores nil value' do
135
+ kklass.enumerize(:foo, :in => [:a, :b])
136
+ object.foo = nil
137
+ expect(object.instance_variable_get(:@foo)).must_be_nil
138
+ end
139
+
140
+ it 'casts value to string for validation' do
141
+ kklass.enumerize(:foo, :in => [:a, :b])
142
+ object.foo = :c
143
+ expect(object.read_attribute_for_validation(:foo)).must_equal 'c'
144
+ end
145
+
146
+ it "doesn't cast nil to string for validation" do
147
+ kklass.enumerize(:foo, :in => [:a, :b])
148
+ object.foo = nil
149
+ expect(object.read_attribute_for_validation(:foo)).must_be_nil
150
+ end
151
+
152
+ it 'calls super in the accessor method' do
153
+ accessors = Module.new do
154
+ def attributes
155
+ @attributes ||= {}
156
+ end
157
+
158
+ def foo
159
+ attributes[:foo]
160
+ end
161
+
162
+ def foo=(v)
163
+ attributes[:foo] = v
164
+ end
165
+ end
166
+
167
+ klass = Class.new do
168
+ include accessors
169
+ extend Enumerize
170
+
171
+ enumerize :foo, :in => %w[test]
172
+ end
173
+
174
+ object = klass.new
175
+ expect(object.foo).must_be_nil
176
+ expect(object.attributes).must_equal({})
177
+
178
+ object.foo = 'test'
179
+ expect(object.foo).must_equal 'test'
180
+ expect(object.attributes).must_equal(:foo => 'test')
181
+ end
182
+
183
+ it 'stores hash values' do
184
+ kklass.enumerize(:foo, :in => {:a => 1, :b => 2})
185
+
186
+ object.foo = :a
187
+ expect(object.instance_variable_get(:@foo)).must_equal 1
188
+ expect(object.foo).must_equal 'a'
189
+
190
+ object.foo = :b
191
+ expect(object.instance_variable_get(:@foo)).must_equal 2
192
+ expect(object.foo).must_equal 'b'
193
+ end
194
+
195
+ it 'returns custom value' do
196
+ kklass.enumerize(:foo, :in => {:a => 1, :b => 2})
197
+
198
+ object.foo = :a
199
+ expect(object.foo_value).must_equal 1
200
+
201
+ object.foo = :b
202
+ expect(object.foo_value).must_equal 2
203
+ end
204
+
205
+ it 'allows initialize method with arguments' do
206
+ klass = Class.new do
207
+ extend Enumerize
208
+
209
+ def initialize(argument, key_word_argument: nil); end
210
+ end
211
+
212
+ klass.new('arg1', key_word_argument: 'kwargs1')
213
+ end
214
+
215
+ it 'allows initialize method with arguments for inherited classes' do
216
+ parent_klass = Class.new do
217
+ def initialize(argument, key_word_argument: nil); end
218
+ end
219
+
220
+ klass = Class.new(parent_klass) do
221
+ extend Enumerize
222
+
223
+ def initialize(argument, key_word_argument: nil)
224
+ super
225
+ end
226
+ end
227
+
228
+ klass.new('arg1', key_word_argument: 'kwargs1')
229
+ end
230
+ end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ Formtastic::FormBuilder.action_class_finder = Formtastic::ActionClassFinder
6
+ Formtastic::FormBuilder.input_class_finder = Formtastic::InputClassFinder
7
+
8
+ class FormtasticSpec < MiniTest::Spec
9
+ include ViewTestHelper
10
+ include Formtastic::Helpers::FormHelper
11
+
12
+ class Thing < Struct.new(:name)
13
+ extend ActiveModel::Naming
14
+ include ActiveModel::Conversion
15
+
16
+ def persisted?
17
+ false
18
+ end
19
+ end
20
+
21
+ class User < Struct.new(:sex, :age)
22
+ extend ActiveModel::Naming
23
+ include ActiveModel::Conversion
24
+
25
+ extend Enumerize
26
+
27
+ enumerize :sex, :in => [:male, :female]
28
+
29
+ def persisted?
30
+ false
31
+ end
32
+ end
33
+
34
+ class Post < Struct.new(:category, :title)
35
+ extend ActiveModel::Naming
36
+ include ActiveModel::Conversion
37
+
38
+ extend Enumerize
39
+
40
+ enumerize :categories, :in => [:music, :games], :multiple => true
41
+
42
+ def persisted?
43
+ false
44
+ end
45
+ end
46
+
47
+ class Registration < Struct.new(:sex)
48
+ extend Enumerize
49
+
50
+ enumerize :sex, in: [:male, :female]
51
+ end
52
+
53
+ before { $VERBOSE = nil }
54
+ after { $VERBOSE = true }
55
+
56
+ let(:user) { User.new }
57
+ let(:post) { Post.new }
58
+
59
+ it 'renders select with enumerized values' do
60
+ concat(semantic_form_for(user) do |f|
61
+ f.input :sex
62
+ end)
63
+
64
+ assert_select 'select option[value=male]'
65
+ assert_select 'select option[value=female]'
66
+ end
67
+
68
+ it 'renders multiple select with enumerized values' do
69
+ concat(semantic_form_for(post) do |f|
70
+ f.input(:categories)
71
+ end)
72
+
73
+ assert_select 'select[multiple=multiple]'
74
+ assert_select 'select option[value=music]'
75
+ assert_select 'select option[value=games]'
76
+ end
77
+
78
+ it 'renders multiple select with selected enumerized value' do
79
+ post.categories << :music
80
+
81
+ concat(semantic_form_for(post) do |f|
82
+ f.input(:categories)
83
+ end)
84
+
85
+ assert_select 'select[multiple=multiple]'
86
+ assert_select 'select option[value=music][selected=selected]'
87
+ assert_select 'select option[value=games][selected=selected]', count: 0
88
+ end
89
+
90
+ it 'renders checkboxes with enumerized values' do
91
+ concat(semantic_form_for(post) do |f|
92
+ f.input(:categories, as: :check_boxes)
93
+ end)
94
+
95
+ assert_select 'select[multiple=multiple]', count: 0
96
+ assert_select 'input[type=checkbox][value=music]'
97
+ assert_select 'input[type=checkbox][value=games]'
98
+ end
99
+
100
+ it 'renders checkboxes with selected enumerized value' do
101
+ post.categories << :music
102
+
103
+ concat(semantic_form_for(post) do |f|
104
+ f.input(:categories, as: :check_boxes)
105
+ end)
106
+
107
+ assert_select 'input[type=checkbox][value=music][checked=checked]'
108
+ assert_select 'input[type=checkbox][value=games][checked=checked]', count: 0
109
+ end
110
+
111
+ it 'renders radio buttons with enumerized values' do
112
+ concat(semantic_form_for(user) do |f|
113
+ f.input :sex, :as => :radio
114
+ end)
115
+
116
+ assert_select 'input[type=radio][value=male]'
117
+ assert_select 'input[type=radio][value=female]'
118
+ end
119
+
120
+ it 'does not affect not enumerized attributes' do
121
+ concat(semantic_form_for(user) do |f|
122
+ f.input(:age)
123
+ end)
124
+
125
+ assert_select 'input[type=text]'
126
+ end
127
+
128
+ it 'does not affect not enumerized classes' do
129
+ concat(semantic_form_for(Thing.new) do |f|
130
+ f.input(:name)
131
+ end)
132
+
133
+ assert_select 'input[type=text]'
134
+ end
135
+
136
+ it 'renders select with enumerized values for non-ActiveModel object' do
137
+ concat(semantic_form_for(Registration.new, as: 'registration', url: '/') do |f|
138
+ f.input(:sex)
139
+ end)
140
+
141
+ assert_select 'select option[value=male]'
142
+ assert_select 'select option[value=female]'
143
+ end
144
+
145
+ it 'does not affect forms without object' do
146
+ concat(semantic_form_for('') do |f|
147
+ f.input(:name)
148
+ end)
149
+
150
+ assert_select 'input[type=text]'
151
+ end
152
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class ModuleAttributesSpec < MiniTest::Spec
6
+ it 'inherits attribute from the module' do
7
+ mod = Module.new do
8
+ extend Enumerize
9
+ enumerize :sex, :in => %w[male female], :default => 'male'
10
+ end
11
+
12
+ klass = Class.new
13
+ klass.send :include, mod
14
+ expect(klass.enumerized_attributes[:sex]).must_be_instance_of Enumerize::Attribute
15
+ expect(klass.new.sex).must_equal 'male'
16
+ expect(klass.sex).must_be_instance_of Enumerize::Attribute
17
+ end
18
+
19
+ it 'uses new attributes from the module' do
20
+ mod = Module.new do
21
+ extend Enumerize
22
+ end
23
+
24
+ klass = Class.new
25
+ klass.send :include, mod
26
+ mod.enumerize :sex, :in => %w[male female], :default => 'male'
27
+ expect(klass.enumerized_attributes[:sex]).must_be_instance_of Enumerize::Attribute
28
+ expect(klass.new.sex).must_equal 'male'
29
+ expect(klass.sex).must_be_instance_of Enumerize::Attribute
30
+ end
31
+
32
+ it 'validates attributes' do
33
+ mod = Module.new do
34
+ extend Enumerize
35
+ enumerize :sex, :in => %w[male female]
36
+ end
37
+
38
+ klass = Class.new do
39
+ include ActiveModel::Validations
40
+ include mod
41
+
42
+ def self.model_name
43
+ ActiveModel::Name.new(self, nil, 'name')
44
+ end
45
+ end
46
+
47
+ object = klass.new
48
+ object.sex = 'wrong'
49
+ expect(object).wont_be :valid?
50
+ expect(object.errors[:sex]).must_include 'is not included in the list'
51
+ end
52
+ end