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/Rakefile +33 -8
- data/Readme.mdown +19 -6
- data/examples/generic_settings.rb +23 -0
- data/examples/helper.rb +27 -0
- data/examples/namespaced.rb +33 -0
- data/examples/on_activerecord_class.rb +20 -0
- data/examples/on_any_class.rb +18 -0
- data/lib/arsettings/arsettings.rb +14 -23
- data/lib/arsettings/has_settings.rb +19 -0
- data/lib/arsettings/packaged.rb +4 -2
- data/lib/arsettings/settings_class/class_methods.rb +57 -0
- data/lib/arsettings/settings_class/instance_methods.rb +46 -0
- data/lib/arsettings.rb +19 -3
- data/test/_helper.rb +56 -0
- data/test/_in_memory_db.rb +73 -0
- data/test/_make_gemsets.sh +11 -0
- data/test/_rcov.sh +10 -0
- data/test/_reek.sh +8 -0
- data/test/_run_all.sh +11 -0
- data/test/_run_one.rb +3 -0
- data/test/activerecord_integration_test.rb +137 -0
- data/test/arbitrary_class_test.rb +156 -0
- data/test/packaged_test.rb +306 -0
- data/test/reset_test.rb +66 -0
- data/test/setting_choose_name_test.rb +15 -0
- data/test/setting_initialize_test.rb +113 -0
- data/test/setting_test.rb +203 -0
- metadata +51 -11
- data/lib/arsettings/activerecord.rb +0 -23
- data/lib/arsettings/settings_class_methods.rb +0 -53
- data/lib/arsettings/settings_instance_methods.rb +0 -45
data/test/_run_one.rb
ADDED
@@ -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
|
+
|
data/test/reset_test.rb
ADDED
@@ -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
|