arsettings 1.0.1 → 1.1.1

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.
data/test/_run_one.rb ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ query = File.dirname(__FILE__) << '/*_test.rb'
3
+ Dir[query].each { |filename| require filename }
@@ -0,0 +1,137 @@
1
+ require File.dirname(__FILE__) + '/_helper'
2
+
3
+ class ActiveRecordIntegration < Test::Unit::TestCase
4
+
5
+ def setup
6
+ ARSettings.default_class = Setting
7
+ Setting.reset_all
8
+ @@class_numbers ||= Array(1..100)
9
+ @klass = Object.const_get "Model#{@@class_numbers.shift}"
10
+ end
11
+
12
+ verify 'can add settings to any AR::B class with has_setting' do
13
+ @klass.class_eval { has_setting :abcd , :default => 5 }
14
+ assert_equal 5 , @klass.abcd
15
+ end
16
+
17
+ verify 'can specify that a setting should be able to be looked up from the instance' do
18
+ @klass.class_eval do
19
+ has_setting :abcd , :default => 4
20
+ has_setting :efgh , :default => 5 , :instance => true
21
+ end
22
+ assert_raises(NoMethodError) { @klass.new.abcd }
23
+ assert_raises(NoMethodError) { @klass.new.abcd? }
24
+ assert_nothing_raised { @klass.new.efgh }
25
+ assert_nothing_raised { @klass.new.efgh? }
26
+ end
27
+
28
+ verify 'settings are loaded from the db, if they exist in the db' do
29
+ $sql_executor.silent_execute "insert into settings (name,value,package,volatile) values ('abcd','#{ARSettings.serialize(12)}','#{@klass.name}','f')"
30
+ Setting.send :load_from_db # to simulate initial conditions
31
+ @klass.class_eval { has_setting :abcd }
32
+ assert_equal 12 , @klass.abcd
33
+ end
34
+
35
+ verify 'uses ARSettings.default_class' do
36
+ ARSettings.create_settings_class :Setting16
37
+ ARSettings.default_class = Setting16
38
+ @klass.class_eval { has_setting :abcd }
39
+ @klass.abcd = 50
40
+ assert_equal 1 , Setting16.count
41
+ assert_equal 50 , Setting16.first.value
42
+ end
43
+
44
+ verify 'can pass all the same args that Setting.add can take' do
45
+ @klass.class_eval do
46
+ has_setting :abcd , :default => 12 , :volatile => true do |val|
47
+ val.to_i
48
+ end
49
+ has_setting :efgh , :default => 13.0 , :volatile => false do |val|
50
+ val.to_f
51
+ end
52
+ has_setting :ijkl
53
+ end
54
+ assert_equal 12 , @klass.abcd
55
+ assert_equal 12.class , @klass.abcd.class
56
+ assert_equal 13.0 , @klass.efgh
57
+ assert_equal 13.0.class , @klass.efgh.class
58
+ @klass.abcd = @klass.efgh = @klass.ijkl = '14'
59
+ assert_equal 14 , @klass.abcd
60
+ assert_equal 14.class , @klass.abcd.class
61
+ assert_equal 14.0 , @klass.efgh
62
+ assert_equal 14.0.class , @klass.efgh.class
63
+ assert_equal '14' , @klass.ijkl
64
+ assert_equal '14'.class , @klass.ijkl.class
65
+ $sql_executor.silent_execute "update settings set value='#{ARSettings.serialize(200) }' where name='abcd'"
66
+ $sql_executor.silent_execute "update settings set value='#{ARSettings.serialize(200.0)}' where name='efgh'"
67
+ $sql_executor.silent_execute "update settings set value='#{ARSettings.serialize(200.0)}' where name='ijkl'"
68
+ assert_equal 200 , @klass.abcd
69
+ assert_equal 14.0 , @klass.efgh
70
+ assert_equal '14' , @klass.ijkl
71
+ end
72
+
73
+ verify 'two classes dont see eachothers settings' do
74
+ @klass1 = @klass
75
+ setup
76
+ @klass2 = @klass
77
+ @klass1.class_eval { has_setting :abcd }
78
+ @klass2.class_eval { has_setting :abcd }
79
+ @klass1.abcd = 5
80
+ @klass2.abcd = 6
81
+ assert_equal 5 , @klass1.abcd
82
+ assert_equal 6 , @klass2.abcd
83
+ end
84
+
85
+ verify 'updates setting values if readding' do
86
+ @klass.class_eval { has_setting :abcd , :volatile => true , &lambda { |val| val.to_i * 2 } }
87
+ @klass.abcd = 5
88
+ assert_equal 10 , @klass.abcd
89
+ $sql_executor.silent_execute "update settings set value='#{ARSettings.serialize(200)}' where name='abcd'"
90
+ assert_equal 200 , @klass.abcd
91
+ assert_equal 200 , @klass.abcd
92
+ @klass.class_eval { has_setting :abcd , :volatile => false , &lambda { |val| val * 3 } }
93
+ @klass.abcd = 5
94
+ assert_equal 15 , @klass.abcd
95
+ $sql_executor.silent_execute "update settings set value='#{ARSettings.serialize(200)}' where name='abcd'"
96
+ assert_equal 15 , @klass.abcd
97
+ end
98
+
99
+ verify "doesn't raise error for valid options" do
100
+ assert_nothing_raised do
101
+ @klass.class_eval do
102
+ has_setting :abcd , :instance => true , :volatile => true , :default => 5
103
+ end
104
+ end
105
+ end
106
+
107
+ verify "does raise error if it receives any invalid options" do
108
+ [[:abcd,:settings_class,Setting],[:efgh,:package,String],[:ijkl,:lkjdsf,true],[:mnop,:abcd,true]].each do |meth,key,value|
109
+ assert_raises ARSettings::InvalidOptionError do
110
+ @klass.class_eval do
111
+ has_setting meth , key => value
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ end
118
+
119
+
120
+
121
+ # probably a better way, but IDK what it is
122
+ # just adds a table and AR::B class for each test
123
+ # and additional ones as necessary
124
+ ActiveRecord::Schema.define do
125
+ suppress_messages do
126
+ ActiveRecordIntegration.instance_methods.grep(/^test/).size.next.times do |i|
127
+ create_table "model#{i+1}s" do |t|
128
+ t.string :name , :null => false , :size => 30
129
+ t.text :value
130
+ t.boolean :volatile , :default => false
131
+ t.timestamps
132
+ end
133
+ Object.const_set "Model#{i+1}" , Class.new(ActiveRecord::Base)
134
+ end
135
+ end
136
+ end
137
+
@@ -0,0 +1,156 @@
1
+ require File.dirname(__FILE__) + '/_helper'
2
+
3
+ class AddToArbitraryClass < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Setting.reset_all
7
+ end
8
+
9
+ def teardown
10
+ ARSettings.default_class = Setting
11
+ end
12
+
13
+ def make_class(name,&block)
14
+ self.class.const_set name , Class.new
15
+ klass = self.class.const_get name
16
+ ARSettings.on klass
17
+ klass.instance_eval &block if block
18
+ end
19
+
20
+ verify 'can add to any class' do
21
+ class C1 ; end
22
+ assert_raises(NoMethodError) { C1.has_setting :abc }
23
+ class C1 ; ARSettings.on self ; end
24
+ assert_nothing_raised { C1.has_setting :abc }
25
+ end
26
+
27
+ verify 'this allows them to have settings' do
28
+ make_class(:C2) { has_setting :abcd }
29
+ C2.abcd = 5
30
+ assert_equal 5 , C2.abcd
31
+ assert_equal true , C2.abcd?
32
+ end
33
+
34
+ verify 'can specify the desired settings class when adding to another class' do
35
+ ARSettings.create_settings_class :Setting12s
36
+ class C4 ; ARSettings.on self , :settings_class => Setting12s ; end
37
+ assert_equal 0 , Setting12s.count
38
+ C4.has_setting :abcd
39
+ assert_equal 1 , Setting12s.count
40
+ end
41
+
42
+ verify 'settings are loaded from the db, if they exist in the db' do
43
+ $sql_executor.silent_execute "insert into settings (name,value,package,volatile) values ('abcd','#{ARSettings.serialize(12)}','AddToArbitraryClass::C3','f')"
44
+ Setting.send :load_from_db # to simulate initial conditions
45
+ make_class(:C3) { has_setting :abcd }
46
+ assert_equal 12 , C3.abcd
47
+ end
48
+
49
+ verify 'can specify settings without specifying a settings class, then it defaults to ARSettings.default_class' do
50
+ ARSettings.create_settings_class :Setting13
51
+ ARSettings.default_class = Setting13
52
+ make_class(:C4) { has_setting :abcd }
53
+ C4.abcd = 12
54
+ assert_equal 1 , Setting13.count
55
+ assert_equal 12 , Setting13.first.value
56
+ end
57
+
58
+ verify 'raises error if try to add settings without specifying a settings class or default' do
59
+ ARSettings.default_class = nil
60
+ assert_raises(ARSettings::NoDefaultPackageError) { make_class(:C5) { has_setting :abcd } }
61
+ end
62
+
63
+ verify 'can pass all the same args that Setting.add can take' do
64
+ ARSettings.default_class = nil
65
+ ARSettings.create_settings_class :Setting15
66
+ make_class :C6 do
67
+ has_setting :abcd , :default => 12 , :volatile => true do |val|
68
+ val.to_i
69
+ end
70
+ has_setting :efgh , :default => 13.0 , :volatile => false do |val|
71
+ val.to_f
72
+ end
73
+ has_setting :ijkl
74
+ end
75
+ assert_equal 12 , C6.abcd
76
+ assert_equal 12.class , C6.abcd.class
77
+ assert_equal 13.0 , C6.efgh
78
+ assert_equal 13.0.class , C6.efgh.class
79
+ C6.abcd = C6.efgh = C6.ijkl = '14'
80
+ assert_equal 14 , C6.abcd
81
+ assert_equal 14.class , C6.abcd.class
82
+ assert_equal 14.0 , C6.efgh
83
+ assert_equal 14.0.class , C6.efgh.class
84
+ assert_equal '14' , C6.ijkl
85
+ assert_equal '14'.class , C6.ijkl.class
86
+ $sql_executor.silent_execute "update setting15s set value='#{ARSettings.serialize(200) }' where name='abcd'"
87
+ $sql_executor.silent_execute "update setting15s set value='#{ARSettings.serialize(200.0)}' where name='efgh'"
88
+ $sql_executor.silent_execute "update setting15s set value='#{ARSettings.serialize(200.0)}' where name='ijkl'"
89
+ assert_equal 200 , C6.abcd
90
+ assert_equal 14.0 , C6.efgh
91
+ assert_equal '14' , C6.ijkl
92
+ end
93
+
94
+ verify 'two classes dont see eachothers settings' do
95
+ make_class(:C7) { has_setting :abcd }
96
+ make_class(:C8) { has_setting :abcd }
97
+ C7.abcd = 5
98
+ C8.abcd = 6
99
+ assert_equal 5 , C7.abcd
100
+ assert_equal 6 , C8.abcd
101
+ end
102
+
103
+ verify 'can specify that a setting should be able to be looked up from the instance' do
104
+ make_class :C25 do
105
+ has_setting :abcd , :default => 4
106
+ has_setting :efgh , :default => 5 , :instance => true
107
+ end
108
+ assert_raises(NoMethodError) { C25.new.abcd }
109
+ assert_raises(NoMethodError) { C25.new.abcd? }
110
+ assert_nothing_raised { C25.new.efgh }
111
+ assert_nothing_raised { C25.new.efgh? }
112
+ end
113
+
114
+ verify "ARSettings.on doesn't raise error for valid options" do
115
+ class C9 ; end
116
+ assert_nothing_raised do
117
+ ARSettings.on C9 , :settings_class => Setting
118
+ end
119
+ end
120
+
121
+ verify "ARSettings.on does raise error if it receives any invalid options" do
122
+ [ [ (class C11;self;end) , :package , String ],
123
+ [ (class C12;self;end) , :lkjdsf , true ],
124
+ [ (class C13;self;end) , :abcd , true ],
125
+ [ (class C14;self;end) , :instance , true ],
126
+ [ (class C15;self;end) , :volatile , true ],
127
+ [ (class C16;self;end) , :default , true ],
128
+ ].each do |klass,key,value|
129
+ assert_raises ARSettings::InvalidOptionError do
130
+ ARSettings.on klass , key => value
131
+ end
132
+ end
133
+ end
134
+
135
+
136
+ verify "has_setting doesn't raise error for valid options" do
137
+ class C17 ; ARSettings.on self ; end
138
+ assert_nothing_raised do
139
+ C17.has_setting :abcd , :volatile => true , :default => 4 , :instance => true
140
+ end
141
+ end
142
+
143
+ verify "has_setting does raise error if it receives any invalid options" do
144
+ [ [ (class C18;ARSettings.on(self);self;end) , :a , :package , String ],
145
+ [ (class C19;ARSettings.on(self);self;end) , :b , :lkjdsf , true ],
146
+ [ (class C20;ARSettings.on(self);self;end) , :c , :abcd , true ],
147
+ [ (class C24;ARSettings.on(self);self;end) , :g , :settings_class , Setting ],
148
+ ].each do |klass,meth,key,value|
149
+ assert_raises ARSettings::InvalidOptionError do
150
+ klass.has_setting meth , key => value
151
+ end
152
+ end
153
+ end
154
+ end
155
+
156
+
@@ -0,0 +1,306 @@
1
+ require File.dirname(__FILE__) + '/_helper'
2
+
3
+ class TestPackaging < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Setting.reset_all
7
+ end
8
+
9
+
10
+ context 'singleton' do
11
+
12
+ packaged = ARSettings::Packaged
13
+
14
+ verify 'cannot instantiate on your own' do
15
+ assert_raises(NoMethodError) { ARSettings::Packaged.new Setting , String }
16
+ end
17
+
18
+ verify 'has_instance? returns whether it has instantiated a given package' do
19
+ MyClass1 = Class.new
20
+ assert !packaged.has_instance?(Setting,MyClass1)
21
+ packaged.instance Setting , MyClass1
22
+ assert packaged.has_instance?(Setting,MyClass1)
23
+ end
24
+
25
+ verify 'instance returns the same result' do
26
+ packaged.instance(Setting,String)
27
+ packaged.instance(Setting,String)
28
+ end
29
+
30
+ verify '#instance returns an instance of Packaged' do
31
+ MyClass2 = Class.new
32
+ assert_equal packaged , packaged.instance(Setting , MyClass2).class
33
+ assert_equal packaged , packaged.instance(Setting , String).class
34
+ end
35
+
36
+ verify 'it raises an error if given a package that is not a string / symbol / class' do
37
+ assert_raises(ARSettings::InvalidPackageError) { packaged.instance(Setting,/whoops!/) }
38
+ assert_nothing_raised { packaged.instance(Setting,'string') }
39
+ assert_nothing_raised { packaged.instance(Setting,:symbol) }
40
+ assert_nothing_raised { packaged.instance(Setting,Class) }
41
+ end
42
+
43
+ verify 'it considers strings, symbols, and classes to symbols' do
44
+ assert_equal :cLaSs , packaged.instance(Setting,'cLaSs').package
45
+ assert_equal :Symbol , packaged.instance(Setting,:Symbol).package
46
+ assert_equal :Symbol , packaged.instance(Setting,Symbol).package
47
+ end
48
+
49
+ verify 'raises error if settings_class is not a settings class' do
50
+ assert_raises(packaged::InvalidSettingsClassError) { packaged.instance(String,String) }
51
+ end
52
+
53
+ verify 'returns the same package regardless of how it is requested' do
54
+ id = Setting.package(Setting).object_id
55
+ assert_equal id , Setting.package(:Setting).object_id
56
+ assert_equal id , Setting.package('Setting').object_id
57
+ end
58
+
59
+ end
60
+
61
+
62
+
63
+
64
+
65
+ context 'settings behaviour' do
66
+
67
+ s = Setting.package(String)
68
+
69
+ verify 'can query whether a setting exists with setting?, and can declare settings with add, or has_setting' do
70
+ assert !s.setting?(:a)
71
+ assert !s.setting?(:b)
72
+ s.add :a
73
+ s.add :b
74
+ assert s.setting?(:a)
75
+ assert s.setting?(:b)
76
+ end
77
+
78
+ verify 'has_setting is an alias for add' do
79
+ assert_equal s.method(:add) , s.method(:has_setting)
80
+ end
81
+
82
+ verify "add returns the package the setting was added to" do
83
+ assert_equal s , s.add( :xyz , :default => 1)
84
+ assert_equal s , s.add( :xyz , :default => 2)
85
+ end
86
+
87
+ verify 'can add default when creating' do
88
+ s.add :a , :default => 123
89
+ assert_equal 123 , s.a
90
+ end
91
+
92
+ verify 'can pass proc to handle postprocessing' do
93
+ s.add :a , :default => '123' do |setting|
94
+ setting.to_i
95
+ end
96
+ assert_equal 123 , s.a
97
+ s.a = '456'
98
+ assert_equal 456 , s.a
99
+ end
100
+
101
+ verify 'adds record to the db' do
102
+ assert_count 0
103
+ s.add :a , :default => /abc/
104
+ assert_count 1
105
+ setting = Setting.find_by_sql("select * from settings").first
106
+ assert_equal 'a' , setting.name
107
+ assert_equal( /abc/ , setting.value )
108
+ end
109
+
110
+ verify 'does not raise error if the setting already exists' do
111
+ assert_nothing_raised { s.add :a }
112
+ assert_nothing_raised { s.add :a }
113
+ end
114
+
115
+ verify 'does not overwrite current value with default when added repeatedly' do
116
+ s.add :a , :default => 12
117
+ assert_equal 12 , s.a
118
+ s.add 'a' , :default => 13
119
+ assert_equal 12 , s.a
120
+ s.add 'b' , :default => 14
121
+ assert_equal 14 , s.b
122
+ s.add :b , :default => 15
123
+ assert_equal 14 , s.b
124
+ end
125
+
126
+ verify 'get a list of settings' do
127
+ s.add :abc
128
+ s.add :def
129
+ s.add :ghi
130
+ assert_equal [:abc,:def,:ghi] , s.settings.sort_by { |name| name.to_s }
131
+ end
132
+
133
+ verify 'get a list of settings and values' do
134
+ s.add :abc , :default => 1
135
+ s.add :def , :default => 2
136
+ s.add :ghi , :default => 3
137
+ assert_equal [[:abc,1],[:def,2],[:ghi,3]] , s.settings_with_values.sort_by { |name,value| name.to_s }
138
+ end
139
+
140
+ verify 'can specify that object should reload from db each time' do
141
+ s.add :abcd , :default => 1
142
+ s.add :efgh , :default => 10 , :volatile => true
143
+ assert_equal 1 , s.abcd
144
+ assert_equal 10 , s.efgh
145
+ $sql_executor.silent_execute "update settings set value='#{ARSettings.serialize(2)}' where name='abcd'"
146
+ $sql_executor.silent_execute "update settings set value='#{ARSettings.serialize(20)}' where name='efgh'"
147
+ assert_equal 1 , s.abcd
148
+ assert_equal 20 , s.efgh
149
+ end
150
+
151
+ verify 'retains postprocessing after a reload' do
152
+ s.add( :abcd , :default => 1 , :volatile => true ) { |val| val.to_i }
153
+ assert_equal 1 , s.abcd
154
+ $sql_executor.silent_execute "update settings set value='#{ARSettings.serialize(2)}' where name='abcd'"
155
+ assert_equal 2 , s.abcd
156
+ s.abcd = "3"
157
+ assert_equal 3 , s.abcd
158
+ end
159
+
160
+ verify 'readding the setting allows you to update volatility' do
161
+ s.add( :abcd , :default => "12.5" , :volatile => false ) { |val| val.to_f }
162
+ assert_equal 12.5 , s.abcd
163
+ $sql_executor.silent_execute "update settings set value='#{ARSettings.serialize(5.5)}' where name='abcd'"
164
+ assert_equal 12.5 , s.abcd
165
+ s.add :abcd , :volatile => true
166
+ assert_equal 5.5 , s.abcd
167
+ end
168
+
169
+ verify 'postprocessing only occurs when inserting the data' do
170
+ s.add( :abcd , :default => "12.5" , :volatile => false ) { |val| val.to_f }
171
+ assert_equal 12.5 , s.abcd
172
+ s.add( :abcd ) { |val| val.to_i }
173
+ assert_equal 12.5 , s.abcd
174
+ end
175
+
176
+ verify 'readding the setting allows you to update postprocessing' do
177
+ s.add( :abcd , :default => 0 ) { |val| val.to_f }
178
+ s.abcd = "12.5"
179
+ assert_equal 12.5 , s.abcd
180
+ s.add( :abcd ) { |val| val.to_i }
181
+ s.abcd = "12.5"
182
+ assert_equal 12 , s.abcd
183
+ end
184
+
185
+ verify 'defaults get run through the postprocessor' do
186
+ s.add( :abcd , :default => "5" ) { |i| i.to_i }
187
+ assert_equal 5 , s.abcd
188
+ end
189
+
190
+ verify 'raises NoSuchSettingError when invoking nonexistent setting' do
191
+ assert_raises(ARSettings::NoSuchSettingError) { s.hjk }
192
+ assert_raises(ARSettings::NoSuchSettingError) { s.hjk = 1 }
193
+ end
194
+
195
+ verify 'raises InvalidSetting for settings with over MAX_NAME chars' do
196
+ assert_nothing_raised { s.add 'a' * s.settings_class.MAX_CHARS }
197
+ assert_invalid_name { s.add 'a' * s.settings_class.MAX_CHARS.next }
198
+ end
199
+
200
+ end
201
+
202
+
203
+
204
+
205
+
206
+
207
+
208
+ context 'initializations' do
209
+
210
+ s = Setting.package(String)
211
+ packaged = ARSettings::Packaged
212
+
213
+ verify 'it raises an error if given a package that is not string / symbol / class' do
214
+ assert_nothing_raised { Setting.package "string" }
215
+ assert_nothing_raised { Setting.package :Symbol }
216
+ assert_nothing_raised { Setting.package Class }
217
+ assert_raises(ARSettings::InvalidPackageError) { Setting.package 1 }
218
+ assert_raises(ARSettings::InvalidPackageError) { Setting.package Object.new }
219
+ assert_raises(ARSettings::InvalidPackageError) { Setting.package(SomeConstant=Object.new) }
220
+ end
221
+
222
+ verify 'can add a package as an option' do
223
+ Setting.add :abcd , :package => Hash , :default => 12
224
+ assert_equal 12 , Setting.package(Hash).abcd
225
+ assert_raises(ARSettings::NoSuchSettingError) { Setting.abcd }
226
+ end
227
+
228
+ verify 'can package settings with classes' do
229
+ Setting.add :abcd , :package => String , :default => 12
230
+ assert_equal 12 , s.abcd
231
+ assert_equal :String , Setting.find( :first , :conditions => { :name => 'abcd' } ).package
232
+ end
233
+
234
+ verify 'Setting.package(package) returns a PackagedSetting object' do
235
+ assert_equal ARSettings::Packaged , Setting.package(String).class
236
+ end
237
+
238
+ verify 'packaged knows its settings class' do
239
+ assert_equal Setting , Setting.package(String).settings_class
240
+ end
241
+
242
+ verify 'current_package returns the current package' do
243
+ assert_equal :String , Setting.package(String).package
244
+ assert_equal :string , Setting.package('string').package
245
+ assert_equal :strIng , Setting.package(:strIng).package
246
+ end
247
+
248
+
249
+ verify 'can add and remove variables within a given package' do
250
+ s.add :abcd , :default => 12
251
+ assert_equal 12 , s.abcd
252
+ s.abcd = 5
253
+ assert_equal 5 , s.abcd
254
+ end
255
+
256
+ verify 'raises NoSuchSettingError when given incorrect package' do
257
+ s.add :abcd , :default => 12
258
+ assert_raises(ARSettings::NoSuchSettingError) { Setting.abcd }
259
+ assert_raises(ARSettings::NoSuchSettingError) { Setting.abcd = 3 }
260
+ assert_nothing_raised { s.abcd }
261
+ assert_nothing_raised { s.abcd = 5 }
262
+ end
263
+
264
+ verify 'packaged settings can list all settings and values' do
265
+ s.add :abcd , :default => 1
266
+ s.add :efgh , :default => 2
267
+ s.add :ijkl , :default => 3
268
+ assert_equal [:abcd,:efgh,:ijkl] , s.settings.sort_by { |setting| setting.to_s }
269
+ assert_equal [[:abcd,1],[:efgh,2],[:ijkl,3]] , s.settings_with_values.sort_by { |setting,value| value }
270
+ end
271
+
272
+ verify 'reset only applies to settings of a given package' do
273
+ string = Setting.package(String)
274
+ hash = Setting.package(Hash)
275
+ string.add :abcd , :default => 1
276
+ hash.add :abcd , :default => 2
277
+ string.reset
278
+ assert_equal 1 , Setting.count
279
+ assert_equal :Hash , Setting.first.package
280
+ assert_equal 2 , hash.abcd
281
+ end
282
+
283
+ verify "doesn't raise error for valid options" do
284
+ assert_nothing_raised do
285
+ s.add :abcd , :default => 1 , :volatile => true do end
286
+ end
287
+ end
288
+
289
+ verify "does raise error if it receives any invalid options" do
290
+ [ [ :a , :package , String ],
291
+ [ :b , :settings_class , Setting ],
292
+ [ :c , :lkjdsf , true ],
293
+ [ :d , :abcd , true ],
294
+ [ :e , :instance , true ],
295
+ ].each do |meth,key,value|
296
+ assert_raises ARSettings::InvalidOptionError do
297
+ s.add meth , key => value
298
+ end
299
+ end
300
+ end
301
+
302
+ end
303
+
304
+
305
+ end
306
+
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + '/_helper'
2
+
3
+ class ResetTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Setting.package(String).reset
7
+ Setting.package(String).add :abc
8
+ end
9
+
10
+ s = Setting.package(String)
11
+
12
+ verify 'resets respond_to?' do
13
+ assert s.respond_to?(:abc)
14
+ assert s.respond_to?(:abc=)
15
+ s.reset
16
+ assert !s.respond_to?(:abc)
17
+ assert !s.respond_to?(:abc=)
18
+ end
19
+
20
+ verify 'resets method' do
21
+ assert_nothing_raised { s.abc = 1 }
22
+ s.reset
23
+ assert_raises(ARSettings::NoSuchSettingError) { s.abc }
24
+ assert_raises(ARSettings::NoSuchSettingError) { s.abc = 2 }
25
+ end
26
+
27
+ verify 'resets setting?' do
28
+ assert s.setting?(:abc)
29
+ s.reset
30
+ assert !s.setting?(:abc)
31
+ end
32
+
33
+ verify 'resets count' do
34
+ assert_count 1
35
+ s.reset
36
+ assert_count 0
37
+ end
38
+
39
+ verify 'can reset all packages' do
40
+ Setting.reset_all
41
+ Setting.package(String).add :abcd
42
+ Setting.package(Hash).add :efgh
43
+ assert_equal 2 , Setting.count
44
+ Setting.reset_all
45
+ assert_equal 0 , Setting.count
46
+ end
47
+
48
+ verify "resetting one settings class' package doesn't impact others" do
49
+ ARSettings.create_settings_class 'Setting6'
50
+ Setting6.package(String).add :abc
51
+ Setting6.package(Hash).add :def
52
+ Setting.package(:ghi).add :jkl
53
+ assert_equal 2 , Setting6.count
54
+ assert_equal 2 , Setting.count
55
+ Setting.reset_all
56
+ assert_equal 2 , Setting6.count
57
+ assert_equal 0 , Setting.count
58
+ Setting.package(:ghi).add :mno
59
+ Setting.package(:ghi).add :pqr
60
+ Setting6.reset_all
61
+ assert_equal 0 , Setting6.count
62
+ assert_equal 2 , Setting.count
63
+ end
64
+
65
+
66
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/_helper'
2
+
3
+ class CanChooseNameOfSettingClass < Test::Unit::TestCase
4
+
5
+ verify 'can choose name of the class to store settings in' do
6
+ assert_raises(NameError) { DifferentName }
7
+ ARSettings.create_settings_class 'DifferentName'
8
+ assert_nothing_raised { DifferentName }
9
+ assert_equal Class , DifferentName.class
10
+ assert DifferentName.ancestors.include?(ActiveRecord::Base)
11
+ assert_nothing_raised { DifferentName.add :abc , :default => 12 }
12
+ assert_equal 12 , DifferentName.abc
13
+ end
14
+
15
+ end