arsettings 1.0.1 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|