symbolize 3.3.0pre → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +51 -35
- data/Rakefile +3 -3
- data/VERSION +1 -1
- data/lib/symbolize/active_record.rb +194 -0
- data/lib/symbolize/mongoid.rb +172 -0
- data/lib/symbolize/railtie.rb +11 -10
- data/lib/symbolize.rb +3 -190
- data/spec/locales/pt.yml +15 -0
- data/spec/spec_helper.rb +0 -13
- data/spec/spec_helper_ar.rb +17 -0
- data/spec/spec_helper_mongoid.rb +9 -0
- data/spec/symbolize/active_record_spec.rb +440 -0
- data/spec/symbolize/mongoid_spec.rb +350 -0
- data/spec/symbolize_spec.rb +0 -430
- data/symbolize.gemspec +10 -6
- metadata +14 -10
- data/init.rb +0 -1
- data/rails/init.rb +0 -2
@@ -0,0 +1,440 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.dirname(__FILE__) + '/../spec_helper_ar'
|
3
|
+
|
4
|
+
#
|
5
|
+
# Test model
|
6
|
+
class User < ActiveRecord::Base
|
7
|
+
symbolize :other
|
8
|
+
symbolize :language, :in => [:pt, :en]
|
9
|
+
symbolize :sex, :in => [true, false], :scopes => true
|
10
|
+
symbolize :status , :in => [:active, :inactive], :i18n => false, :capitalize => true, :scopes => true
|
11
|
+
symbolize :so, :allow_blank => true, :in => {
|
12
|
+
:linux => 'Linux',
|
13
|
+
:mac => 'Mac OS X',
|
14
|
+
:win => 'Videogame'
|
15
|
+
}, :scopes => true
|
16
|
+
symbolize :gui, :allow_blank => true, :in => [:cocoa, :qt, :gtk], :i18n => false
|
17
|
+
symbolize :karma, :in => %w{ good bad ugly}, :methods => true, :i18n => false, :allow_nil => true
|
18
|
+
symbolize :cool, :in => [true, false], :scopes => true
|
19
|
+
|
20
|
+
has_many :extras, :dependent => :destroy, :class_name => "UserExtra"
|
21
|
+
has_many :access, :dependent => :destroy, :class_name => "UserAccess"
|
22
|
+
end
|
23
|
+
|
24
|
+
class UserSkill < ActiveRecord::Base
|
25
|
+
symbolize :kind, :in => [:agility, :magic]
|
26
|
+
end
|
27
|
+
|
28
|
+
class UserExtra < ActiveRecord::Base
|
29
|
+
symbolize :key, :in => [:one, :another]
|
30
|
+
end
|
31
|
+
|
32
|
+
class Permission < ActiveRecord::Base
|
33
|
+
validates_presence_of :name
|
34
|
+
symbolize :kind, :in => [:temp, :perm], :default => :perm
|
35
|
+
symbolize :lvl, :in => (1..9).to_a, :i18n => false#, :default => 1
|
36
|
+
end
|
37
|
+
|
38
|
+
# Make with_scope public-usable for testing
|
39
|
+
#if ActiveRecord::VERSION::MAJOR < 3
|
40
|
+
class << ActiveRecord::Base
|
41
|
+
public :with_scope
|
42
|
+
end
|
43
|
+
#end
|
44
|
+
|
45
|
+
# Test records
|
46
|
+
User.create(:name => 'Anna', :other => :fo, :status => :active , :so => :linux, :gui => :qt, :language => :pt, :sex => true, :cool => true)
|
47
|
+
User.create!(:name => 'Bob' , :other => :bar,:status => :inactive, :so => :mac, :gui => :gtk, :language => :en, :sex => false, :cool => false)
|
48
|
+
|
49
|
+
|
50
|
+
describe "Symbolize" do
|
51
|
+
|
52
|
+
it "should respond to symbolize" do
|
53
|
+
ActiveRecord::Base.should respond_to :symbolize
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "User Instantiated" do
|
57
|
+
before(:each) do
|
58
|
+
@user = User.first
|
59
|
+
end
|
60
|
+
|
61
|
+
it "test_symbolize_string" do
|
62
|
+
@user.status = 'inactive'
|
63
|
+
@user.status.should eql(:inactive)
|
64
|
+
# @user.status_before_type_cast.should eql(:inactive)
|
65
|
+
# @user.read_attribute(:status).should eql('inactive')
|
66
|
+
end
|
67
|
+
|
68
|
+
it "test_symbolize_symbol" do
|
69
|
+
@user.status = :active
|
70
|
+
@user.status.should eql(:active)
|
71
|
+
@user.status_before_type_cast.should eql(:active)
|
72
|
+
# @user.read_attribute(:status).should eql('active')
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should work nice with numbers" do
|
76
|
+
@user.status = 43
|
77
|
+
@user.status.should_not be_nil
|
78
|
+
# @user.status_before_type_cast.should be_nil
|
79
|
+
# @user.read_attribute(:status).should be_nil
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should acts nice with nil" do
|
83
|
+
@user.status = nil
|
84
|
+
@user.status.should be_nil
|
85
|
+
@user.status_before_type_cast.should be_nil
|
86
|
+
@user.read_attribute(:status).should be_nil
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should acts nice with blank" do
|
90
|
+
@user.status = ""
|
91
|
+
@user.status.should be_nil
|
92
|
+
@user.status_before_type_cast.should be_nil
|
93
|
+
@user.read_attribute(:status).should be_nil
|
94
|
+
end
|
95
|
+
|
96
|
+
it "test_symbols_quoted_id" do
|
97
|
+
pending
|
98
|
+
@user.status = :active
|
99
|
+
@user.status.quoted_id.should eql("'active'")
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should not validates other" do
|
103
|
+
@user.other = nil
|
104
|
+
@user.should be_valid
|
105
|
+
@user.other = ""
|
106
|
+
@user.should be_valid
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should get the correct values" do
|
110
|
+
User.get_status_values.should eql([["Active", :active],["Inactive", :inactive]])
|
111
|
+
User::STATUS_VALUES.should eql({:inactive=>"Inactive", :active=>"Active"})
|
112
|
+
end
|
113
|
+
|
114
|
+
it "test_symbolize_humanize" do
|
115
|
+
@user.status_text.should eql("Active")
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should get the correct values" do
|
119
|
+
User.get_gui_values.should =~ [["cocoa", :cocoa], ["qt", :qt], ["gtk", :gtk]]
|
120
|
+
User::GUI_VALUES.should eql({:cocoa=>"cocoa", :qt=>"qt", :gtk=>"gtk"})
|
121
|
+
end
|
122
|
+
|
123
|
+
it "test_symbolize_humanize" do
|
124
|
+
@user.gui_text.should eql("qt")
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should get the correct values" do
|
128
|
+
User.get_so_values.should =~ [["Linux", :linux], ["Mac OS X", :mac], ["Videogame", :win]]
|
129
|
+
User::SO_VALUES.should eql({:linux => "Linux", :mac => "Mac OS X", :win => "Videogame"})
|
130
|
+
end
|
131
|
+
|
132
|
+
it "test_symbolize_humanize" do
|
133
|
+
@user.so_text.should eql("Linux")
|
134
|
+
end
|
135
|
+
|
136
|
+
it "test_symbolize_humanize" do
|
137
|
+
@user.so = :mac
|
138
|
+
@user.so_text.should eql("Mac OS X")
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should stringify" do
|
142
|
+
@user.other_text.should eql("fo")
|
143
|
+
@user.other = :foo
|
144
|
+
@user.other_text.should eql("foo")
|
145
|
+
end
|
146
|
+
|
147
|
+
it "should validate status" do
|
148
|
+
@user.status = nil
|
149
|
+
@user.should_not be_valid
|
150
|
+
@user.should have(1).errors
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should not validate so" do
|
154
|
+
@user.so = nil
|
155
|
+
@user.should be_valid
|
156
|
+
end
|
157
|
+
|
158
|
+
it "test_symbols_with_weird_chars_quoted_id" do
|
159
|
+
@user.status = :"weird'; chars"
|
160
|
+
@user.status_before_type_cast.should eql(:"weird'; chars")
|
161
|
+
# assert_equal "weird'; chars", @user.read_attribute(:status)
|
162
|
+
# assert_equal "'weird''; chars'", @user.status.quoted_id
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should work fine through relations" do
|
166
|
+
@user.extras.create(:key => :one)
|
167
|
+
UserExtra.first.key.should eql(:one)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should play fine with null db columns" do
|
171
|
+
new_extra = @user.extras.build
|
172
|
+
new_extra.should_not be_valid
|
173
|
+
end
|
174
|
+
|
175
|
+
it "should play fine with null db columns" do
|
176
|
+
new_extra = @user.extras.build
|
177
|
+
new_extra.should_not be_valid
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
|
182
|
+
describe "View helpers" do
|
183
|
+
include ActionView::Helpers::FormHelper
|
184
|
+
include ActionView::Helpers::FormOptionsHelper
|
185
|
+
|
186
|
+
before(:each) do
|
187
|
+
@options_status = [['Active', :active], ['Inactive', :inactive]]
|
188
|
+
@options_gui = [["cocoa", :cocoa], ["qt", :qt], ["gtk", :gtk]]
|
189
|
+
@options_so = [["Linux", :linux] , ["Mac OS X", :mac], ["Videogame", :win]]
|
190
|
+
end
|
191
|
+
|
192
|
+
it "test_helper_select_sym" do
|
193
|
+
@user.status = :inactive
|
194
|
+
output = "<select id=\"user_status\" name=\"user[status]\">#{options_for_select(@options_status, @user.status)}</select>"
|
195
|
+
output.should eql(select_sym("user", "status", nil))
|
196
|
+
|
197
|
+
|
198
|
+
output = "<select id=\"user_status\" name=\"user[status]\">#{options_for_select(@options_status, @user.status)}</select>"
|
199
|
+
output.should eql(select_sym("user", "status", nil))
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_helper_select_sym_order
|
203
|
+
output_so = "<select id=\"user_so\" name=\"user[so]\">#{options_for_select(@options_so, @user.so)}</select>"
|
204
|
+
output_office = "<select id=\"user_office\" name=\"user[office]\">#{options_for_select(@options_office, @user.office)}</select>"
|
205
|
+
|
206
|
+
assert_equal output_so, select_sym("user", "so", nil)
|
207
|
+
assert_equal output_office, select_sym("user", "office", nil)
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_helper_radio_sym
|
211
|
+
output = radio_sym("user", "status", nil)
|
212
|
+
assert_equal("<label>Active: <input checked=\"checked\" id=\"user_status_active\" name=\"user[status]\" type=\"radio\" value=\"active\" /></label><label>Inactive: <input id=\"user_status_inactive\" name=\"user[status]\" type=\"radio\" value=\"inactive\" /></label>", output)
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
describe "i18n" do
|
218
|
+
|
219
|
+
it "should test i18n ones" do
|
220
|
+
@user.language_text.should eql("Português")
|
221
|
+
end
|
222
|
+
|
223
|
+
it "should get the correct values" do
|
224
|
+
User.get_language_values.should =~ [["Português", :pt], ["Inglês", :en]]
|
225
|
+
end
|
226
|
+
|
227
|
+
it "should get the correct values" do
|
228
|
+
User::LANGUAGE_VALUES.should eql({:pt=>"pt", :en=>"en"})
|
229
|
+
end
|
230
|
+
|
231
|
+
it "should test boolean" do
|
232
|
+
@user.sex_text.should eql("Feminino")
|
233
|
+
@user.sex = false
|
234
|
+
@user.sex_text.should eql('Masculino')
|
235
|
+
end
|
236
|
+
|
237
|
+
it "should get the correct values" do
|
238
|
+
User.get_sex_values.should eql([["Feminino", true],["Masculino", false]])
|
239
|
+
end
|
240
|
+
|
241
|
+
it "should get the correct values" do
|
242
|
+
User::SEX_VALUES.should eql({true=>"true", false=>"false"})
|
243
|
+
end
|
244
|
+
|
245
|
+
it "should translate a multiword class" do
|
246
|
+
@skill = UserSkill.create(:kind => :magic)
|
247
|
+
@skill.kind_text.should eql("Mágica")
|
248
|
+
end
|
249
|
+
|
250
|
+
it "should return nil if there's no value" do
|
251
|
+
@skill = UserSkill.create(:kind => nil)
|
252
|
+
@skill.kind_text.should be_nil
|
253
|
+
end
|
254
|
+
|
255
|
+
end
|
256
|
+
|
257
|
+
describe "Methods" do
|
258
|
+
|
259
|
+
it "should play nice with other stuff" do
|
260
|
+
@user.karma.should be_nil
|
261
|
+
User::KARMA_VALUES.should eql({:bad => "bad", :ugly => "ugly", :good => "good"})
|
262
|
+
end
|
263
|
+
|
264
|
+
it "should provide a boolean method" do
|
265
|
+
@user.should_not be_good
|
266
|
+
@user.karma = :ugly
|
267
|
+
@user.should be_ugly
|
268
|
+
end
|
269
|
+
|
270
|
+
it "should work" do
|
271
|
+
@user.karma = "good"
|
272
|
+
@user.should be_good
|
273
|
+
@user.should_not be_bad
|
274
|
+
end
|
275
|
+
|
276
|
+
end
|
277
|
+
|
278
|
+
end
|
279
|
+
|
280
|
+
describe "more tests on Permission" do
|
281
|
+
|
282
|
+
it "should use default value on object build" do
|
283
|
+
Permission.new.kind.should eql(:perm)
|
284
|
+
end
|
285
|
+
|
286
|
+
it "should not interfer on create" do
|
287
|
+
Permission.create!(:name => "p7", :kind =>:temp, :lvl => 7)
|
288
|
+
Permission.find_by_name("p7").kind.should eql(:temp)
|
289
|
+
end
|
290
|
+
|
291
|
+
it "should work on create" do
|
292
|
+
pm = Permission.new(:name => "p7", :lvl => 7)
|
293
|
+
pm.should be_valid
|
294
|
+
pm.save.should be_true
|
295
|
+
end
|
296
|
+
|
297
|
+
it "should work on create" do
|
298
|
+
Permission.create!(:name => "p8", :lvl => 9)
|
299
|
+
Permission.find_by_name("p8").kind.should eql(:perm)
|
300
|
+
end
|
301
|
+
|
302
|
+
it "should work on edit" do
|
303
|
+
pm = Permission.find_by_name("p8")
|
304
|
+
pm.kind = :temp
|
305
|
+
pm.save
|
306
|
+
Permission.find_by_name("p8").kind.should eql(:temp)
|
307
|
+
end
|
308
|
+
|
309
|
+
it "should work with default values" do
|
310
|
+
pm = Permission.new(:name => "p9")
|
311
|
+
pm.lvl = 9
|
312
|
+
pm.save
|
313
|
+
Permission.find_by_name("p9").lvl.to_i.should eql(9)
|
314
|
+
end
|
315
|
+
|
316
|
+
end
|
317
|
+
|
318
|
+
describe "ActiveRecord stuff" do
|
319
|
+
|
320
|
+
#
|
321
|
+
# ActiveRecord <= 2
|
322
|
+
#
|
323
|
+
if ActiveRecord::VERSION::MAJOR <= 2
|
324
|
+
|
325
|
+
it "test_symbolized_finder" do
|
326
|
+
User.find(:all, :conditions => { :status => :inactive }).map(&:name).should eql(['Bob'])
|
327
|
+
User.find_all_by_status(:inactive).map(&:name).should eql(['Bob'])
|
328
|
+
end
|
329
|
+
|
330
|
+
it "test_symbolized_with_scope" do
|
331
|
+
User.with_scope(:find => { :conditions => { :status => :inactive }}) do
|
332
|
+
User.find(:all).map(&:name).should eql(['Bob'])
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
describe "dirty tracking / changed flag" do
|
337
|
+
before do
|
338
|
+
@anna = User.find_by_name!('Anna')
|
339
|
+
end
|
340
|
+
|
341
|
+
it "is dirty if you change the attribute value" do
|
342
|
+
@anna.language.should == :pt
|
343
|
+
@anna.language_changed?.should be_false
|
344
|
+
|
345
|
+
return_value = @anna.language = :en
|
346
|
+
return_value.should == :en
|
347
|
+
@anna.language_changed?.should be_true
|
348
|
+
end
|
349
|
+
|
350
|
+
it "is not dirty if you set the attribute value to the same value it was originally" do
|
351
|
+
@anna.language.should == :pt
|
352
|
+
@anna.language_changed?.should be_false
|
353
|
+
|
354
|
+
return_value = @anna.language = :pt
|
355
|
+
return_value.should == :pt
|
356
|
+
@anna.language_changed?.should be_false
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
#
|
361
|
+
# ActiveRecord >= 3
|
362
|
+
#
|
363
|
+
else
|
364
|
+
|
365
|
+
it "test_symbolized_finder" do
|
366
|
+
User.where({ :status => :inactive }).all.map(&:name).should eql(['Bob'])
|
367
|
+
User.find_all_by_status(:inactive).map(&:name).should eql(['Bob'])
|
368
|
+
end
|
369
|
+
|
370
|
+
it "test_symbolized_with_scope" do
|
371
|
+
User.with_scope(:find => { :conditions => { :status => :inactive }}) do
|
372
|
+
User.find(:all).map(&:name).should eql(['Bob'])
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
describe "dirty tracking / changed flag" do
|
377
|
+
before do
|
378
|
+
@anna = User.find_by_name!('Anna')
|
379
|
+
end
|
380
|
+
|
381
|
+
it "is dirty if you change the attribute value" do
|
382
|
+
@anna.language.should == :pt
|
383
|
+
@anna.language_changed?.should be_false
|
384
|
+
|
385
|
+
return_value = @anna.language = :en
|
386
|
+
return_value.should == :en
|
387
|
+
@anna.language_changed?.should be_true
|
388
|
+
end
|
389
|
+
|
390
|
+
it "is not dirty if you set the attribute value to the same value it was originally" do
|
391
|
+
@anna.language.should == :pt
|
392
|
+
@anna.language_changed?.should be_false
|
393
|
+
|
394
|
+
return_value = @anna.language = :pt
|
395
|
+
return_value.should == :pt
|
396
|
+
p @anna.changes
|
397
|
+
@anna.language_changed?.should be_false
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
if ActiveRecord::VERSION::STRING <= "3.0"
|
402
|
+
describe "Named Scopes" do
|
403
|
+
|
404
|
+
before do
|
405
|
+
@anna = User.find_by_name!('Anna')
|
406
|
+
@bob = User.find_by_name!('Bob')
|
407
|
+
end
|
408
|
+
|
409
|
+
it "should have main named scope" do
|
410
|
+
User.inactive.should == [@bob]
|
411
|
+
end
|
412
|
+
|
413
|
+
it "should have other to test better" do
|
414
|
+
User.linux.should == [@anna]
|
415
|
+
end
|
416
|
+
|
417
|
+
it "should have 'with' helper" do
|
418
|
+
User.with_sex.should == [@anna]
|
419
|
+
end
|
420
|
+
|
421
|
+
it "should have 'without' helper" do
|
422
|
+
User.without_sex.should == [@bob]
|
423
|
+
end
|
424
|
+
|
425
|
+
it "should have 'attr_name' helper" do
|
426
|
+
User.cool.should == [@anna]
|
427
|
+
end
|
428
|
+
|
429
|
+
it "should have 'not_attr_name' helper" do
|
430
|
+
User.not_cool.should == [@bob]
|
431
|
+
end
|
432
|
+
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
end
|
437
|
+
|
438
|
+
end
|
439
|
+
|
440
|
+
end
|