preferences 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/test/factory.rb ADDED
@@ -0,0 +1,45 @@
1
+ module Factory
2
+ # Build actions for the class
3
+ def self.build(klass, &block)
4
+ name = klass.to_s.underscore
5
+ define_method("#{name}_attributes", block)
6
+
7
+ module_eval <<-end_eval
8
+ def valid_#{name}_attributes(attributes = {})
9
+ #{name}_attributes(attributes)
10
+ attributes
11
+ end
12
+
13
+ def new_#{name}(attributes = {})
14
+ #{klass}.new(valid_#{name}_attributes(attributes))
15
+ end
16
+
17
+ def create_#{name}(*args)
18
+ record = new_#{name}(*args)
19
+ record.save!
20
+ record.reload
21
+ record
22
+ end
23
+ end_eval
24
+ end
25
+
26
+ build Car do |attributes|
27
+ attributes.reverse_merge!(
28
+ :name => 'Porsche'
29
+ )
30
+ end
31
+
32
+ build Preference do |attributes|
33
+ attributes[:owner] = create_user unless attributes.include?(:owner)
34
+ attributes.reverse_merge!(
35
+ :attribute => 'notifications',
36
+ :value => false
37
+ )
38
+ end
39
+
40
+ build User do |attributes|
41
+ attributes.reverse_merge!(
42
+ :login => 'admin'
43
+ )
44
+ end
45
+ end
@@ -0,0 +1,259 @@
1
+ require "#{File.dirname(__FILE__)}/../test_helper"
2
+
3
+ class PreferencesTest < Test::Unit::TestCase
4
+ def setup
5
+ @user = User.new
6
+ end
7
+
8
+ def test_should_raise_exception_if_invalid_options_specified
9
+ assert_raise(ArgumentError) {User.preference :notifications, :invalid => true}
10
+ assert_raise(ArgumentError) {User.preference :notifications, :boolean, :invalid => true}
11
+ end
12
+
13
+ def test_should_create_prefers_query_method
14
+ assert @user.respond_to?(:prefers_notifications?)
15
+ end
16
+
17
+ def test_should_create_prefers_writer
18
+ assert @user.respond_to?(:prefers_notifications=)
19
+ end
20
+
21
+ def test_should_create_preferred_reader
22
+ assert @user.respond_to?(:preferred_notifications)
23
+ end
24
+
25
+ def test_should_create_preferred_writer
26
+ assert @user.respond_to?(:preferred_notifications=)
27
+ end
28
+
29
+ def test_should_create_preference_definitions
30
+ assert User.respond_to?(:preference_definitions)
31
+ end
32
+
33
+ def test_should_include_new_definitions_in_preference_definitions
34
+ definition = User.preference :notifications
35
+ assert_equal definition, User.preference_definitions['notifications']
36
+ end
37
+ end
38
+
39
+ class UserByDefaultTest < Test::Unit::TestCase
40
+ def setup
41
+ @user = User.new
42
+ end
43
+
44
+ def test_should_not_prefer_hot_salsa
45
+ assert_nil @user.preferred_hot_salsa
46
+ end
47
+
48
+ def test_should_prefer_dark_chocolate
49
+ assert_equal true, @user.preferred_dark_chocolate
50
+ end
51
+
52
+ def test_should_not_have_a_preferred_color
53
+ assert_nil @user.preferred_color
54
+ end
55
+
56
+ def test_should_not_have_a_preferred_car
57
+ assert_nil @user.preferred_car
58
+ end
59
+
60
+ def test_should_have_a_preferred_language
61
+ assert_equal 'English', @user.preferred_language
62
+ end
63
+ end
64
+
65
+ class UserTest < Test::Unit::TestCase
66
+ def setup
67
+ @user = new_user
68
+ end
69
+
70
+ def test_should_be_able_to_change_hot_salsa_preference
71
+ @user.prefers_hot_salsa = false
72
+ assert_equal false, @user.prefers_hot_salsa?
73
+
74
+ @user.prefers_hot_salsa = true
75
+ assert_equal true, @user.prefers_hot_salsa?
76
+ end
77
+
78
+ def test_should_be_able_to_change_dark_chocolate_preference
79
+ @user.prefers_dark_chocolate = false
80
+ assert_equal false, @user.prefers_dark_chocolate?
81
+
82
+ @user.prefers_dark_chocolate = true
83
+ assert_equal true, @user.prefers_dark_chocolate?
84
+ end
85
+
86
+ def test_should_be_able_to_change_color_preference
87
+ @user.preferred_color = 'blue'
88
+ assert_equal 'blue', @user.preferred_color
89
+ end
90
+
91
+ def test_should_be_able_to_change_car_preference
92
+ @user.preferred_car = 1
93
+ assert_equal 1, @user.preferred_car
94
+ end
95
+
96
+ def test_should_be_able_to_change_language_preference
97
+ @user.preferred_language = 'Latin'
98
+ assert_equal 'Latin', @user.preferred_language
99
+ end
100
+
101
+ def test_should_be_able_to_use_generic_prefers_query_method
102
+ @user.prefers_hot_salsa = true
103
+ assert @user.prefers?(:hot_salsa)
104
+ end
105
+
106
+ def test_should_be_able_to_use_generic_preferred_method
107
+ @user.preferred_color = 'blue'
108
+ assert_equal 'blue', @user.preferred(:color)
109
+ end
110
+
111
+ def test_should_be_able_to_use_generic_set_preference_method
112
+ @user.set_preference(:color, 'blue')
113
+ assert_equal 'blue', @user.preferred(:color)
114
+ end
115
+
116
+ def test_should_still_be_new_record_after_changing_preference
117
+ @user.preferred_color = 'blue'
118
+ assert @user.new_record?
119
+ assert @user.preferences.empty?
120
+ end
121
+ end
122
+
123
+ class UserAfterBeingCreatedTest < Test::Unit::TestCase
124
+ def setup
125
+ @user = create_user
126
+ end
127
+
128
+ def test_should_not_have_any_preferences
129
+ assert @user.preferences.empty?
130
+ end
131
+ end
132
+
133
+ class UserWithoutPreferencesTest < Test::Unit::TestCase
134
+ def setup
135
+ @user = create_user
136
+ end
137
+
138
+ def test_should_not_prefer_hot_salsa
139
+ assert_nil @user.preferred_hot_salsa
140
+ end
141
+
142
+ def test_should_prefer_dark_chocolate
143
+ assert_equal true, @user.preferred_dark_chocolate
144
+ end
145
+
146
+ def test_should_not_have_a_preferred_color
147
+ assert_nil @user.preferred_color
148
+ end
149
+
150
+ def test_should_not_have_a_preferred_car
151
+ assert_nil @user.preferred_car
152
+ end
153
+
154
+ def test_should_have_a_preferred_language
155
+ assert_equal 'English', @user.preferred_language
156
+ end
157
+
158
+ def test_should_not_save_record_after_changing_preference
159
+ @user.preferred_language = 'Latin'
160
+
161
+ user = User.find(@user.id)
162
+ assert_equal 'English', user.preferred_language
163
+ assert user.preferences.empty?
164
+ end
165
+ end
166
+
167
+ class UserWithPreferencesTest < Test::Unit::TestCase
168
+ def setup
169
+ @user = create_user
170
+ @user.preferred_language = 'Latin'
171
+ @user.save!
172
+ end
173
+
174
+ def test_should_have_preferences
175
+ assert_equal 1, @user.preferences.size
176
+ end
177
+
178
+ def test_should_not_remove_preference_if_set_to_default
179
+ @user.preferred_language = 'English'
180
+ @user.save!
181
+ @user.reload
182
+ assert_equal 1, @user.preferences.size
183
+ end
184
+
185
+ def test_should_not_remove_preference_if_set_to_nil
186
+ @user.preferred_language = nil
187
+ @user.save!
188
+ @user.reload
189
+ assert_equal 1, @user.preferences.size
190
+ end
191
+
192
+ def test_should_not_save_preference_if_model_is_not_saved
193
+ @user.preferred_language = 'English'
194
+
195
+ user = User.find(@user.id)
196
+ assert_equal 'Latin', user.preferred_language
197
+ end
198
+
199
+ def test_should_modify_existing_preferences_when_saved
200
+ @user.preferred_language = 'Spanish'
201
+ assert @user.save
202
+
203
+ @user.reload
204
+ assert_equal 'Spanish', @user.preferred_language
205
+ assert_equal 1, @user.preferences.size
206
+ end
207
+
208
+ def test_should_add_new_preferences_when_saved
209
+ @user.preferred_color = 'blue'
210
+ assert @user.save
211
+
212
+ @user.reload
213
+ assert_equal 'blue', @user.preferred_color
214
+ assert_equal 2, @user.preferences.size
215
+ end
216
+ end
217
+
218
+ class UserWithPreferencesForOtherModelsTest < Test::Unit::TestCase
219
+ def setup
220
+ @car = create_car
221
+
222
+ @user = create_user
223
+ @user.preferred_color = 'red', {:for => @car}
224
+ @user.save!
225
+ end
226
+
227
+ def test_should_have_preferences
228
+ assert_equal 1, @user.preferences.size
229
+ end
230
+
231
+ def test_should_not_have_preference_without_preferenced_record
232
+ assert_nil @user.preferred_color
233
+ end
234
+
235
+ def test_should_have_preference_with_preferenced_record
236
+ assert_equal 'red', @user.preferred_color(:for => @car)
237
+ end
238
+
239
+ def test_should_modify_existing_preferences_when_saved
240
+ @user.preferred_color = 'blue', {:for => @car}
241
+ assert @user.save
242
+
243
+ @user.reload
244
+ assert_equal 'blue', @user.preferred_color(:for => @car)
245
+ assert_equal 1, @user.preferences.size
246
+ end
247
+
248
+ def test_should_be_able_to_differentiate_between_preferenced_records
249
+ @different_car = create_car
250
+
251
+ @user.preferred_color = 'blue', {:for => @different_car}
252
+ assert @user.save
253
+
254
+ @user.reload
255
+ assert_equal 'red', @user.preferred_color(:for => @car)
256
+ assert_equal 'blue', @user.preferred_color(:for => @different_car)
257
+ assert_equal 2, @user.preferences.size
258
+ end
259
+ end
@@ -0,0 +1,13 @@
1
+ # Load the plugin testing framework
2
+ $:.unshift("#{File.dirname(__FILE__)}/../../plugin_test_helper/lib")
3
+ require 'rubygems'
4
+ require 'plugin_test_helper'
5
+
6
+ # Run the migrations
7
+ ActiveRecord::Migrator.migrate("#{RAILS_ROOT}/db/migrate")
8
+
9
+ # Mixin the factory helper
10
+ require File.expand_path("#{File.dirname(__FILE__)}/factory")
11
+ class Test::Unit::TestCase #:nodoc:
12
+ include Factory
13
+ end
@@ -0,0 +1,185 @@
1
+ require "#{File.dirname(__FILE__)}/../test_helper"
2
+
3
+ class PreferenceDefinitionByDefaultTest < Test::Unit::TestCase
4
+ def setup
5
+ @definition = PluginAWeek::Preferences::PreferenceDefinition.new(:notifications)
6
+ end
7
+
8
+ def test_should_have_an_attribute
9
+ assert_equal 'notifications', @definition.attribute
10
+ end
11
+
12
+ def test_should_not_have_a_default_value
13
+ assert_nil @definition.default_value
14
+ end
15
+
16
+ def test_should_type_cast_values_as_booleans
17
+ assert_equal nil, @definition.type_cast(nil)
18
+ assert_equal true, @definition.type_cast(true)
19
+ assert_equal false, @definition.type_cast(false)
20
+ assert_equal false, @definition.type_cast(0)
21
+ assert_equal true, @definition.type_cast(1)
22
+ end
23
+ end
24
+
25
+ class PreferenceDefinitionTest < Test::Unit::TestCase
26
+ def test_should_raise_exception_if_invalid_option_specified
27
+ assert_raise(ArgumentError) {PluginAWeek::Preferences::PreferenceDefinition.new(:notifications, :invalid => true)}
28
+ end
29
+ end
30
+
31
+ class PreferenceDefinitionWithDefaultValueTest < Test::Unit::TestCase
32
+ def setup
33
+ @definition = PluginAWeek::Preferences::PreferenceDefinition.new(:notifications, :boolean, :default => 1)
34
+ end
35
+
36
+ def test_should_type_cast_default_values
37
+ assert_equal true, @definition.default_value
38
+ end
39
+ end
40
+
41
+ class PreferenceDefinitionWithAnyTypeTest < Test::Unit::TestCase
42
+ def setup
43
+ @definition = PluginAWeek::Preferences::PreferenceDefinition.new(:notifications, :any)
44
+ end
45
+
46
+ def test_should_not_type_cast
47
+ assert_equal nil, @definition.type_cast(nil)
48
+ assert_equal 0, @definition.type_cast(0)
49
+ assert_equal 1, @definition.type_cast(1)
50
+ assert_equal false, @definition.type_cast(false)
51
+ assert_equal true, @definition.type_cast(true)
52
+ assert_equal '', @definition.type_cast('')
53
+ end
54
+
55
+ def test_should_query_false_if_value_is_nil
56
+ assert_equal false, @definition.query(nil)
57
+ end
58
+
59
+ def test_should_query_true_if_value_is_zero
60
+ assert_equal true, @definition.query(0)
61
+ end
62
+
63
+ def test_should_query_true_if_value_is_not_zero
64
+ assert_equal true, @definition.query(1)
65
+ assert_equal true, @definition.query(-1)
66
+ end
67
+
68
+ def test_should_query_false_if_value_is_blank
69
+ assert_equal false, @definition.query('')
70
+ end
71
+
72
+ def test_should_query_true_if_value_is_not_blank
73
+ assert_equal true, @definition.query('hello')
74
+ end
75
+ end
76
+
77
+ class PreferenceDefinitionWithBooleanTypeTest < Test::Unit::TestCase
78
+ def setup
79
+ @definition = PluginAWeek::Preferences::PreferenceDefinition.new(:notifications)
80
+ end
81
+
82
+ def test_should_not_type_cast_if_value_is_nil
83
+ assert_equal nil, @definition.type_cast(nil)
84
+ end
85
+
86
+ def test_should_type_cast_to_false_if_value_is_zero
87
+ assert_equal false, @definition.type_cast(0)
88
+ end
89
+
90
+ def test_should_type_cast_to_true_if_value_is_not_zero
91
+ assert_equal true, @definition.type_cast(1)
92
+ end
93
+
94
+ def test_should_type_cast_to_true_if_value_is_true_string
95
+ assert_equal true, @definition.type_cast('true')
96
+ end
97
+
98
+ def test_should_type_cast_to_false_if_value_is_not_true_string
99
+ assert_equal false, @definition.type_cast('')
100
+ end
101
+
102
+ def test_should_query_false_if_value_is_nil
103
+ assert_equal false, @definition.query(nil)
104
+ end
105
+
106
+ def test_should_query_true_if_value_is_one
107
+ assert_equal true, @definition.query(1)
108
+ end
109
+
110
+ def test_should_query_false_if_value_not_one
111
+ assert_equal false, @definition.query(0)
112
+ end
113
+
114
+ def test_should_query_true_if_value_is_true_string
115
+ assert_equal true, @definition.query('true')
116
+ end
117
+
118
+ def test_should_query_false_if_value_is_not_true_string
119
+ assert_equal false, @definition.query('')
120
+ end
121
+ end
122
+
123
+ class PreferenceDefinitionWithNumericTypeTest < Test::Unit::TestCase
124
+ def setup
125
+ @definition = PluginAWeek::Preferences::PreferenceDefinition.new(:notifications, :integer)
126
+ end
127
+
128
+ def test_should_type_cast_true_to_integer
129
+ assert_equal 1, @definition.type_cast(true)
130
+ end
131
+
132
+ def test_should_type_cast_false_to_integer
133
+ assert_equal 0, @definition.type_cast(false)
134
+ end
135
+
136
+ def test_should_type_cast_string_to_integer
137
+ assert_equal 0, @definition.type_cast('hello')
138
+ end
139
+
140
+ def test_should_query_false_if_value_is_nil
141
+ assert_equal false, @definition.query(nil)
142
+ end
143
+
144
+ def test_should_query_true_if_value_is_one
145
+ assert_equal true, @definition.query(1)
146
+ end
147
+
148
+ def test_should_query_false_if_value_is_zero
149
+ assert_equal false, @definition.query(0)
150
+ end
151
+ end
152
+
153
+ class PreferenceDefinitionWithStringTypeTest < Test::Unit::TestCase
154
+ def setup
155
+ @definition = PluginAWeek::Preferences::PreferenceDefinition.new(:notifications, :string)
156
+ end
157
+
158
+ def test_should_type_cast_integers_to_strings
159
+ assert_equal '1', @definition.type_cast('1')
160
+ end
161
+
162
+ def test_should_not_type_cast_booleans
163
+ assert_equal true, @definition.type_cast(true)
164
+ end
165
+
166
+ def test_should_query_false_if_value_is_nil
167
+ assert_equal false, @definition.query(nil)
168
+ end
169
+
170
+ def test_should_query_true_if_value_is_one
171
+ assert_equal true, @definition.query(1)
172
+ end
173
+
174
+ def test_should_query_true_if_value_is_zero
175
+ assert_equal true, @definition.query(0)
176
+ end
177
+
178
+ def test_should_query_false_if_value_is_blank
179
+ assert_equal false, @definition.query('')
180
+ end
181
+
182
+ def test_should_query_true_if_value_is_not_blank
183
+ assert_equal true, @definition.query('hello')
184
+ end
185
+ end
@@ -0,0 +1,145 @@
1
+ require "#{File.dirname(__FILE__)}/../test_helper"
2
+
3
+ class PreferenceByDefaultTest < Test::Unit::TestCase
4
+ def setup
5
+ @preference = Preference.new
6
+ end
7
+
8
+ def test_should_not_have_an_attribute
9
+ assert @preference.attribute.blank?
10
+ end
11
+
12
+ def test_should_not_have_an_owner
13
+ assert_nil @preference.owner_id
14
+ end
15
+
16
+ def test_should_not_have_an_owner_type
17
+ assert @preference.owner_type.blank?
18
+ end
19
+
20
+ def test_should_not_have_a_preferenced_association
21
+ assert_nil @preference.preferenced_id
22
+ end
23
+
24
+ def test_should_not_have_a_preferenced_type
25
+ assert @preference.preferenced_type.nil?
26
+ end
27
+
28
+ def test_should_not_have_a_value
29
+ assert @preference.value.blank?
30
+ end
31
+
32
+ def test_should_not_have_a_definition
33
+ assert_nil @preference.definition
34
+ end
35
+ end
36
+
37
+ class PreferenceTest < Test::Unit::TestCase
38
+ def test_should_be_valid_with_a_set_of_valid_attributes
39
+ preference = new_preference
40
+ assert preference.valid?
41
+ end
42
+
43
+ def test_should_require_an_attribute
44
+ preference = new_preference(:attribute => nil)
45
+ assert !preference.valid?
46
+ assert_equal 1, Array(preference.errors.on(:attribute)).size
47
+ end
48
+
49
+ def test_should_require_an_owner_id
50
+ preference = new_preference(:owner => nil)
51
+ assert !preference.valid?
52
+ assert_equal 1, Array(preference.errors.on(:owner_id)).size
53
+ end
54
+
55
+ def test_should_require_an_owner_type
56
+ preference = new_preference(:owner => nil)
57
+ assert !preference.valid?
58
+ assert_equal 1, Array(preference.errors.on(:owner_type)).size
59
+ end
60
+
61
+ def test_should_not_require_a_preferenced_id
62
+ preference = new_preference(:preferenced => nil)
63
+ assert preference.valid?
64
+ end
65
+
66
+ def test_should_require_a_preferenced_id_if_specified
67
+ preference = new_preference(:preferenced => nil)
68
+ preference.preferenced_type = 'Car'
69
+ assert !preference.valid?
70
+ assert_equal 1, Array(preference.errors.on(:preferenced_id)).size
71
+ end
72
+
73
+ def test_should_not_require_a_preferenced_type
74
+ preference = new_preference(:preferenced => nil)
75
+ assert preference.valid?
76
+ end
77
+
78
+ def test_should_require_a_preferenced_type_if_specified
79
+ preference = new_preference(:preferenced => nil)
80
+ preference.preferenced_id = 1
81
+ assert !preference.valid?
82
+ assert_equal 1, Array(preference.errors.on(:preferenced_type)).size
83
+ end
84
+ end
85
+
86
+ class PreferenceAfterBeingCreatedTest < Test::Unit::TestCase
87
+ def setup
88
+ User.preference :notifications, :boolean
89
+
90
+ @preference = create_preference(:attribute => 'notifications')
91
+ end
92
+
93
+ def test_should_have_an_owner
94
+ assert_not_nil @preference.owner
95
+ end
96
+
97
+ def test_should_have_a_definition
98
+ assert_not_nil @preference.definition
99
+ end
100
+
101
+ def test_should_have_a_value
102
+ assert_not_nil @preference.value
103
+ end
104
+
105
+ def test_should_not_have_a_preferenced_association
106
+ assert_nil @preference.preferenced
107
+ end
108
+ end
109
+
110
+ class PreferenceWithPreferencedAssociationTest < Test::Unit::TestCase
111
+ def setup
112
+ @preference = create_preference(:preferenced => create_car)
113
+ end
114
+
115
+ def test_should_have_a_preferenced_association
116
+ assert_not_nil @preference.preferenced
117
+ end
118
+ end
119
+
120
+ class PreferenceWithBooleanAttributeTest < Test::Unit::TestCase
121
+ def setup
122
+ User.preference :notifications, :boolean
123
+ end
124
+
125
+ def test_should_type_cast_nil_values
126
+ preference = new_preference(:attribute => 'notifications', :value => nil)
127
+ assert_nil preference.value
128
+ end
129
+
130
+ def test_should_type_cast_numeric_values
131
+ preference = new_preference(:attribute => 'notifications', :value => 0)
132
+ assert_equal false, preference.value
133
+
134
+ preference.value = 1
135
+ assert_equal true, preference.value
136
+ end
137
+
138
+ def test_should_type_cast_boolean_values
139
+ preference = new_preference(:attribute => 'notifications', :value => false)
140
+ assert_equal false, preference.value
141
+
142
+ preference.value = true
143
+ assert_equal true, preference.value
144
+ end
145
+ end