preferences 0.0.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/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