jnunemaker-mongomapper 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/History +13 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/mongomapper.rb +20 -6
- data/lib/mongomapper/associations.rb +69 -0
- data/lib/mongomapper/associations/array_proxy.rb +6 -0
- data/lib/mongomapper/associations/base.rb +50 -0
- data/lib/mongomapper/associations/belongs_to_proxy.rb +26 -0
- data/lib/mongomapper/associations/has_many_embedded_proxy.rb +19 -0
- data/lib/mongomapper/associations/has_many_proxy.rb +28 -0
- data/lib/mongomapper/associations/polymorphic_belongs_to_proxy.rb +31 -0
- data/lib/mongomapper/associations/proxy.rb +60 -0
- data/lib/mongomapper/callbacks.rb +106 -0
- data/lib/mongomapper/document.rb +83 -54
- data/lib/mongomapper/embedded_document.rb +61 -91
- data/lib/mongomapper/finder_options.rb +37 -35
- data/lib/mongomapper/key.rb +11 -10
- data/lib/mongomapper/observing.rb +90 -0
- data/lib/mongomapper/rails_compatibility.rb +5 -2
- data/lib/mongomapper/save_with_validation.rb +6 -36
- data/lib/mongomapper/validations.rb +47 -0
- data/mongomapper.gemspec +18 -5
- data/test/test_associations.rb +121 -24
- data/test/test_callbacks.rb +3 -6
- data/test/test_document.rb +20 -14
- data/test/test_embedded_document.rb +2 -3
- data/test/test_finder_options.rb +37 -22
- data/test/test_key.rb +30 -30
- data/test/test_observing.rb +101 -0
- data/test/test_rails_compatibility.rb +8 -3
- data/test/test_validations.rb +193 -22
- metadata +16 -3
data/test/test_associations.rb
CHANGED
@@ -2,51 +2,148 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class Address
|
4
4
|
include MongoMapper::EmbeddedDocument
|
5
|
-
|
5
|
+
|
6
6
|
key :address, String
|
7
7
|
key :city, String
|
8
8
|
key :state, String
|
9
9
|
key :zip, Integer
|
10
10
|
end
|
11
11
|
|
12
|
+
class Project
|
13
|
+
include MongoMapper::Document
|
14
|
+
|
15
|
+
key :name, String
|
16
|
+
|
17
|
+
many :statuses
|
18
|
+
many :addresses
|
19
|
+
end
|
20
|
+
|
21
|
+
class Status
|
22
|
+
include MongoMapper::Document
|
23
|
+
|
24
|
+
belongs_to :project
|
25
|
+
belongs_to :target, :polymorphic => true
|
26
|
+
|
27
|
+
key :name, String
|
28
|
+
end
|
29
|
+
|
12
30
|
class AssociationsTest < Test::Unit::TestCase
|
13
31
|
def setup
|
14
|
-
|
15
|
-
|
32
|
+
Project.collection.clear
|
33
|
+
Status.collection.clear
|
34
|
+
end
|
35
|
+
|
36
|
+
context "Polymorphic Belongs To" do
|
37
|
+
should "default to nil" do
|
38
|
+
status = Status.new
|
39
|
+
status.target.should be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
should "store the association" do
|
43
|
+
status = Status.new
|
44
|
+
project = Project.new(:name => "mongomapper")
|
45
|
+
status.target = project
|
46
|
+
status.save.should be_true
|
47
|
+
|
48
|
+
from_db = Status.find(status.id)
|
49
|
+
from_db.target.should_not be_nil
|
50
|
+
from_db.target_id.should == project.id
|
51
|
+
from_db.target_type.should == "Project"
|
52
|
+
from_db.target.name.should == "mongomapper"
|
53
|
+
end
|
54
|
+
|
55
|
+
should "unset the association" do
|
56
|
+
status = Status.new
|
57
|
+
project = Project.new(:name => "mongomapper")
|
58
|
+
status.target = project
|
59
|
+
status.save.should be_true
|
60
|
+
|
61
|
+
from_db = Status.find(status.id)
|
62
|
+
from_db.target = nil
|
63
|
+
from_db.target_type.should be_nil
|
64
|
+
from_db.target_id.should be_nil
|
65
|
+
from_db.target.should be_nil
|
16
66
|
end
|
17
67
|
end
|
18
|
-
|
19
|
-
context "
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
68
|
+
|
69
|
+
context "Belongs To" do
|
70
|
+
should "default to nil" do
|
71
|
+
status = Status.new
|
72
|
+
status.project.should be_nil
|
24
73
|
end
|
25
74
|
|
75
|
+
should "store the association" do
|
76
|
+
status = Status.new
|
77
|
+
project = Project.new(:name => "mongomapper")
|
78
|
+
status.project = project
|
79
|
+
status.save.should be_true
|
80
|
+
|
81
|
+
from_db = Status.find(status.id)
|
82
|
+
from_db.project.should_not be_nil
|
83
|
+
from_db.project.name.should == "mongomapper"
|
84
|
+
end
|
85
|
+
|
86
|
+
should "unset the association" do
|
87
|
+
status = Status.new
|
88
|
+
project = Project.new(:name => "mongomapper")
|
89
|
+
status.project = project
|
90
|
+
status.save.should be_true
|
91
|
+
|
92
|
+
from_db = Status.find(status.id)
|
93
|
+
from_db.project = nil
|
94
|
+
from_db.project.should be_nil
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "Many documents" do
|
99
|
+
should "default reader to empty array" do
|
100
|
+
project = Project.new
|
101
|
+
project.statuses.should == []
|
102
|
+
end
|
103
|
+
|
104
|
+
should "allow adding to association like it was an array" do
|
105
|
+
project = Project.new
|
106
|
+
project.statuses << Status.new
|
107
|
+
project.statuses.push Status.new
|
108
|
+
project.statuses.size.should == 2
|
109
|
+
end
|
110
|
+
|
111
|
+
should "store the association" do
|
112
|
+
project = Project.new
|
113
|
+
project.statuses = [Status.new("name" => "ready")]
|
114
|
+
project.save.should be_true
|
115
|
+
|
116
|
+
from_db = Project.find(project.id)
|
117
|
+
from_db.statuses.size.should == 1
|
118
|
+
from_db.statuses[0].name.should == "ready"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context "Many embedded documents" do
|
26
123
|
should "default reader to empty array" do
|
27
|
-
|
28
|
-
|
124
|
+
project = Project.new
|
125
|
+
project.addresses.should == []
|
29
126
|
end
|
30
|
-
|
127
|
+
|
31
128
|
should "allow adding to association like it was an array" do
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
129
|
+
project = Project.new
|
130
|
+
project.addresses << Address.new
|
131
|
+
project.addresses.push Address.new
|
132
|
+
project.addresses.size.should == 2
|
36
133
|
end
|
37
|
-
|
134
|
+
|
38
135
|
should "be embedded in document on save" do
|
39
136
|
sb = Address.new(:city => 'South Bend', :state => 'IN')
|
40
137
|
chi = Address.new(:city => 'Chicago', :state => 'IL')
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
from_db =
|
138
|
+
project = Project.new
|
139
|
+
project.addresses << sb
|
140
|
+
project.addresses << chi
|
141
|
+
project.save
|
142
|
+
|
143
|
+
from_db = Project.find(project.id)
|
47
144
|
from_db.addresses.size.should == 2
|
48
145
|
from_db.addresses[0].should == sb
|
49
146
|
from_db.addresses[1].should == chi
|
50
|
-
end
|
147
|
+
end
|
51
148
|
end
|
52
149
|
end
|
data/test/test_callbacks.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
include ActiveSupport::Callbacks
|
4
|
-
|
5
3
|
class CallbacksTest < Test::Unit::TestCase
|
6
4
|
context "Defining and running callbacks" do
|
7
5
|
setup do
|
@@ -15,8 +13,7 @@ class CallbacksTest < Test::Unit::TestCase
|
|
15
13
|
:before_create, :after_create,
|
16
14
|
:before_update, :after_update,
|
17
15
|
:before_save, :after_save,
|
18
|
-
:before_destroy, :after_destroy
|
19
|
-
:validate, :validate_on_create, :validate_on_update].each do |callback|
|
16
|
+
:before_destroy, :after_destroy].each do |callback|
|
20
17
|
callback_method = "#{callback}_callback"
|
21
18
|
send(callback, callback_method)
|
22
19
|
define_method(callback_method) do
|
@@ -37,7 +34,7 @@ class CallbacksTest < Test::Unit::TestCase
|
|
37
34
|
|
38
35
|
should "get the order right for creating documents" do
|
39
36
|
doc = @document.create(:name => 'John Nunemaker')
|
40
|
-
doc.history.should == [:before_validation, :before_validation_on_create, :
|
37
|
+
doc.history.should == [:before_validation, :before_validation_on_create, :after_validation, :before_save, :before_create, :after_create, :after_save]
|
41
38
|
end
|
42
39
|
|
43
40
|
should "get the order right for updating documents" do
|
@@ -45,7 +42,7 @@ class CallbacksTest < Test::Unit::TestCase
|
|
45
42
|
doc.clear_history
|
46
43
|
doc.name = 'John'
|
47
44
|
doc.save
|
48
|
-
doc.history.should == [:before_validation, :before_validation_on_update, :
|
45
|
+
doc.history.should == [:before_validation, :before_validation_on_update, :after_validation, :before_save, :before_update, :after_update, :after_save]
|
49
46
|
end
|
50
47
|
|
51
48
|
should "work for before and after validation" do
|
data/test/test_document.rb
CHANGED
@@ -13,8 +13,12 @@ class DocumentTest < Test::Unit::TestCase
|
|
13
13
|
include MongoMapper::Document
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
17
|
-
should "
|
16
|
+
|
17
|
+
should "track its descendants" do
|
18
|
+
MongoMapper::Document.descendants.should include(@document)
|
19
|
+
end
|
20
|
+
|
21
|
+
should "be able to define a key" do
|
18
22
|
key = @document.key(:name, String)
|
19
23
|
key.name.should == 'name'
|
20
24
|
key.type.should == String
|
@@ -380,6 +384,11 @@ class DocumentTest < Test::Unit::TestCase
|
|
380
384
|
@document.delete_all({:fname => 'John'})
|
381
385
|
@document.count.should == 2
|
382
386
|
end
|
387
|
+
|
388
|
+
should "convert the conditions to mongo criteria" do
|
389
|
+
@document.delete_all(:age => [26, 27])
|
390
|
+
@document.count.should == 1
|
391
|
+
end
|
383
392
|
end
|
384
393
|
|
385
394
|
context "Destroying a document" do
|
@@ -436,6 +445,11 @@ class DocumentTest < Test::Unit::TestCase
|
|
436
445
|
@document.destroy_all(:age => 26)
|
437
446
|
@document.count.should == 1
|
438
447
|
end
|
448
|
+
|
449
|
+
should "convert the conditions to mongo criteria" do
|
450
|
+
@document.destroy_all(:age => [26, 27])
|
451
|
+
@document.count.should == 1
|
452
|
+
end
|
439
453
|
end
|
440
454
|
|
441
455
|
context "Counting documents in collection" do
|
@@ -466,6 +480,10 @@ class DocumentTest < Test::Unit::TestCase
|
|
466
480
|
should "return count for matching documents if conditions provided" do
|
467
481
|
@document.count(:age => 27).should == 1
|
468
482
|
end
|
483
|
+
|
484
|
+
should "convert the conditions to mongo criteria" do
|
485
|
+
@document.count(:age => [26, 27]).should == 2
|
486
|
+
end
|
469
487
|
end
|
470
488
|
|
471
489
|
context "Indexing" do
|
@@ -561,18 +579,6 @@ class DocumentTest < Test::Unit::TestCase
|
|
561
579
|
end
|
562
580
|
end
|
563
581
|
|
564
|
-
context "when initialized" do
|
565
|
-
should "accept a hash that sets keys and values" do
|
566
|
-
doc = @document.new(:name => 'John', :age => 23)
|
567
|
-
doc.attributes.should == {'name' => 'John', 'age' => 23}
|
568
|
-
end
|
569
|
-
|
570
|
-
should "silently reject keys that have not been defined" do
|
571
|
-
doc = @document.new(:foobar => 'baz')
|
572
|
-
doc.attributes.should == {}
|
573
|
-
end
|
574
|
-
end
|
575
|
-
|
576
582
|
context "mass assigning keys" do
|
577
583
|
should "update values for keys provided" do
|
578
584
|
doc = @document.new(:name => 'foobar', :age => 10)
|
@@ -29,9 +29,8 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
|
|
29
29
|
doc.attributes.should == {'name' => 'John', 'age' => 23}
|
30
30
|
end
|
31
31
|
|
32
|
-
should "
|
33
|
-
doc = @document.new(
|
34
|
-
doc.attributes.should == {}
|
32
|
+
should "not throw error if initialized with nil" do
|
33
|
+
doc = @document.new(nil)
|
35
34
|
end
|
36
35
|
end
|
37
36
|
|
data/test/test_finder_options.rb
CHANGED
@@ -14,26 +14,41 @@ class FinderOptionsTest < Test::Unit::TestCase
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
context "#criteria" do
|
18
|
+
should "convert conditions to criteria" do
|
19
|
+
FinderOptions.expects(:to_mongo_criteria).with(:foo => 1).returns({})
|
20
|
+
FinderOptions.new(:conditions => {:foo => 1}).criteria
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "#options" do
|
25
|
+
should "convert options to mongo options" do
|
26
|
+
FinderOptions.expects(:to_mongo_options).with(:order => 'foo asc', :select => 'foo,bar').returns({})
|
27
|
+
FinderOptions.new(:order => 'foo asc', :select => 'foo,bar').options
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
17
32
|
context "Converting conditions to criteria" do
|
18
33
|
should "work with simple criteria" do
|
19
|
-
FinderOptions.
|
34
|
+
FinderOptions.to_mongo_criteria(:foo => 'bar').should == {
|
20
35
|
:foo => 'bar'
|
21
36
|
}
|
22
37
|
|
23
|
-
FinderOptions.
|
38
|
+
FinderOptions.to_mongo_criteria(:foo => 'bar', :baz => 'wick').should == {
|
24
39
|
:foo => 'bar',
|
25
40
|
:baz => 'wick'
|
26
41
|
}
|
27
42
|
end
|
28
43
|
|
29
44
|
should "use $in for arrays" do
|
30
|
-
FinderOptions.
|
45
|
+
FinderOptions.to_mongo_criteria(:foo => [1,2,3]).should == {
|
31
46
|
:foo => {'$in' => [1,2,3]}
|
32
47
|
}
|
33
48
|
end
|
34
49
|
|
35
50
|
should "work arbitrarily deep" do
|
36
|
-
FinderOptions.
|
51
|
+
FinderOptions.to_mongo_criteria(:foo => {:bar => [1,2,3]}).should == {
|
37
52
|
:foo => {:bar => {'$in' => [1,2,3]}}
|
38
53
|
}
|
39
54
|
end
|
@@ -43,21 +58,21 @@ class FinderOptionsTest < Test::Unit::TestCase
|
|
43
58
|
should "single field with ascending direction" do
|
44
59
|
hash = OrderedHash.new
|
45
60
|
hash[:foo] = 1
|
46
|
-
FinderOptions.
|
47
|
-
FinderOptions.
|
61
|
+
FinderOptions.to_mongo_options(:order => 'foo asc')[:sort].should == hash
|
62
|
+
FinderOptions.to_mongo_options(:order => 'foo ASC')[:sort].should == hash
|
48
63
|
end
|
49
64
|
|
50
65
|
should "single field with descending direction" do
|
51
66
|
hash = OrderedHash.new
|
52
67
|
hash[:foo] = -1
|
53
|
-
FinderOptions.
|
54
|
-
FinderOptions.
|
68
|
+
FinderOptions.to_mongo_options(:order => 'foo desc')[:sort].should == hash
|
69
|
+
FinderOptions.to_mongo_options(:order => 'foo DESC')[:sort].should == hash
|
55
70
|
end
|
56
71
|
|
57
72
|
should "convert field without direction to ascending" do
|
58
73
|
hash = OrderedHash.new
|
59
74
|
hash[:foo] = 1
|
60
|
-
FinderOptions.
|
75
|
+
FinderOptions.to_mongo_options(:order => 'foo')[:sort].should == hash
|
61
76
|
end
|
62
77
|
|
63
78
|
should "convert multiple fields with directions" do
|
@@ -65,7 +80,7 @@ class FinderOptionsTest < Test::Unit::TestCase
|
|
65
80
|
hash[:foo] = -1
|
66
81
|
hash[:bar] = 1
|
67
82
|
hash[:baz] = -1
|
68
|
-
|
83
|
+
FinderOptions.to_mongo_options(:order => 'foo desc, bar asc, baz desc')[:sort].should == hash
|
69
84
|
end
|
70
85
|
|
71
86
|
should "convert multiple fields with some missing directions" do
|
@@ -73,57 +88,57 @@ class FinderOptionsTest < Test::Unit::TestCase
|
|
73
88
|
hash[:foo] = -1
|
74
89
|
hash[:bar] = 1
|
75
90
|
hash[:baz] = 1
|
76
|
-
|
91
|
+
FinderOptions.to_mongo_options(:order => 'foo desc, bar, baz')[:sort].should == hash
|
77
92
|
end
|
78
93
|
end
|
79
94
|
|
80
95
|
context "offset" do
|
81
96
|
should "default to 0" do
|
82
|
-
FinderOptions.
|
97
|
+
FinderOptions.to_mongo_options({})[:offset].should == 0
|
83
98
|
end
|
84
99
|
|
85
100
|
should "use offset provided" do
|
86
|
-
FinderOptions.
|
101
|
+
FinderOptions.to_mongo_options(:offset => 2)[:offset].should == 2
|
87
102
|
end
|
88
103
|
|
89
104
|
should "covert string to integer" do
|
90
|
-
FinderOptions.
|
105
|
+
FinderOptions.to_mongo_options(:offset => '2')[:offset].should == 2
|
91
106
|
end
|
92
107
|
end
|
93
108
|
|
94
109
|
context "limit" do
|
95
110
|
should "default to 0" do
|
96
|
-
FinderOptions.
|
111
|
+
FinderOptions.to_mongo_options({})[:limit].should == 0
|
97
112
|
end
|
98
113
|
|
99
114
|
should "use offset provided" do
|
100
|
-
FinderOptions.
|
115
|
+
FinderOptions.to_mongo_options(:limit => 2)[:limit].should == 2
|
101
116
|
end
|
102
117
|
|
103
118
|
should "covert string to integer" do
|
104
|
-
FinderOptions.
|
119
|
+
FinderOptions.to_mongo_options(:limit => '2')[:limit].should == 2
|
105
120
|
end
|
106
121
|
end
|
107
122
|
|
108
123
|
context "fields" do
|
109
124
|
should "default to nil" do
|
110
|
-
FinderOptions.
|
125
|
+
FinderOptions.to_mongo_options({})[:fields].should be(nil)
|
111
126
|
end
|
112
127
|
|
113
128
|
should "be converted to nil if empty string" do
|
114
|
-
FinderOptions.
|
129
|
+
FinderOptions.to_mongo_options(:fields => '')[:fields].should be(nil)
|
115
130
|
end
|
116
131
|
|
117
132
|
should "be converted to nil if []" do
|
118
|
-
FinderOptions.
|
133
|
+
FinderOptions.to_mongo_options(:fields => [])[:fields].should be(nil)
|
119
134
|
end
|
120
135
|
|
121
136
|
should "should work with array" do
|
122
|
-
FinderOptions.
|
137
|
+
FinderOptions.to_mongo_options({:fields => %w(a b)})[:fields].should == %w(a b)
|
123
138
|
end
|
124
139
|
|
125
140
|
should "convert comma separated list to array" do
|
126
|
-
FinderOptions.
|
141
|
+
FinderOptions.to_mongo_options({:fields => 'a, b'})[:fields].should == %w(a b)
|
127
142
|
end
|
128
143
|
|
129
144
|
should "also work as select" do
|
data/test/test_key.rb
CHANGED
@@ -2,7 +2,7 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class Address
|
4
4
|
include MongoMapper::EmbeddedDocument
|
5
|
-
|
5
|
+
|
6
6
|
key :address, String
|
7
7
|
key :city, String
|
8
8
|
key :state, String
|
@@ -11,65 +11,65 @@ end
|
|
11
11
|
|
12
12
|
class KeyTest < Test::Unit::TestCase
|
13
13
|
include MongoMapper
|
14
|
-
|
14
|
+
|
15
15
|
context "The Key Class" do
|
16
16
|
should "have the native types defined" do
|
17
|
-
Key::NativeTypes.should == [String, Float, Time, Integer, Boolean, Array, Hash]
|
17
|
+
Key::NativeTypes.should == [String, Float, Time, Integer, Boolean, Array, Hash, Ref]
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
context "Initializing a new key" do
|
22
22
|
should "allow setting the name" do
|
23
23
|
Key.new(:foo, String).name.should == 'foo'
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
should "allow setting the type" do
|
27
27
|
Key.new(:foo, Integer).type.should be(Integer)
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
should "allow setting options" do
|
31
31
|
Key.new(:foo, Integer, :required => true).options[:required].should be(true)
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
should "symbolize option keys" do
|
35
35
|
Key.new(:foo, Integer, 'required' => true).options[:required].should be(true)
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
context "A key" do
|
40
40
|
should "be equal to another key with same name and type" do
|
41
41
|
Key.new(:name, String).should == Key.new(:name, String)
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
should "not be equal to another key with different name" do
|
45
45
|
Key.new(:name, String).should_not == Key.new(:foo, String)
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
should "not be equal to another key with different type" do
|
49
49
|
Key.new(:name, String).should_not == Key.new(:name, Integer)
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
should "know if it is native" do
|
53
53
|
Key.new(:name, String).native?.should be_true
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
should "know if it is not native" do
|
57
57
|
klass = Class.new
|
58
58
|
Key.new(:name, klass).native?.should be_false
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
should "know if it is a embedded_document" do
|
62
62
|
klass = Class.new do
|
63
63
|
include MongoMapper::EmbeddedDocument
|
64
64
|
end
|
65
65
|
Key.new(:name, klass).embedded_document?.should be_true
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
should "know if it is not a embedded_document" do
|
69
69
|
Key.new(:name, String).embedded_document?.should be_false
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
context "setting a value" do
|
74
74
|
should "correctly typecast Strings" do
|
75
75
|
key = Key.new(:foo, String)
|
@@ -101,25 +101,25 @@ class KeyTest < Test::Unit::TestCase
|
|
101
101
|
key = Key.new(:foo, Date)
|
102
102
|
key.set('2000-01-01').should == Date.new(2000, 1, 1)
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
should "correctly typecast Boolean" do
|
106
106
|
key = Key.new(:foo, Boolean)
|
107
107
|
['false', false, 'f', '0', 0].each do |b|
|
108
108
|
key.set(b).should == false
|
109
109
|
end
|
110
|
-
|
110
|
+
|
111
111
|
['true', true, 't', '1', 1].each do |b|
|
112
112
|
key.set(b).should == true
|
113
113
|
end
|
114
114
|
end
|
115
|
-
|
115
|
+
|
116
116
|
should "correctly typecast Array" do
|
117
117
|
key = Key.new(:foo, Array)
|
118
118
|
key.set([1,2,3,4]).should == [1,2,3,4]
|
119
119
|
key.set({'1' => '2', '3' => '4'}).should == [['1', '2'], ['3', '4']]
|
120
120
|
key.set('1').should == ['1']
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
should "correctly typecast Hash using indifferent access" do
|
124
124
|
key = Key.new(:foo, Hash)
|
125
125
|
key.set(:foo => 'bar')[:foo].should == 'bar'
|
@@ -128,13 +128,13 @@ class KeyTest < Test::Unit::TestCase
|
|
128
128
|
key.set(:foo => {:bar => 'baz'})['foo']['bar'].should == 'baz'
|
129
129
|
end
|
130
130
|
end
|
131
|
-
|
131
|
+
|
132
132
|
context "getting a value" do
|
133
133
|
should "work" do
|
134
134
|
key = Key.new(:foo, String)
|
135
135
|
key.get('bar').should == 'bar'
|
136
136
|
end
|
137
|
-
|
137
|
+
|
138
138
|
context "for a key with a default value set" do
|
139
139
|
setup do
|
140
140
|
@key = Key.new(:foo, String, :default => 'baz')
|
@@ -143,34 +143,34 @@ class KeyTest < Test::Unit::TestCase
|
|
143
143
|
should "return default value if value nil" do
|
144
144
|
@key.get(nil).should == 'baz'
|
145
145
|
end
|
146
|
-
|
146
|
+
|
147
147
|
should "return value if not blank" do
|
148
148
|
@key.get('foobar').should == 'foobar'
|
149
149
|
end
|
150
150
|
end
|
151
|
-
|
151
|
+
|
152
152
|
context "for a boolean key" do
|
153
153
|
should "allow setting default to false" do
|
154
154
|
Key.new(:active, Boolean, :default => false).get(nil).should be_false
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
should "allow setting default to true" do
|
158
158
|
Key.new(:active, Boolean, :default => true).get(nil).should be_true
|
159
159
|
end
|
160
160
|
end
|
161
|
-
|
161
|
+
|
162
162
|
context "for an array" do
|
163
163
|
should "return array" do
|
164
164
|
key = Key.new(:foo, Array)
|
165
165
|
key.get([1,2]).should == [1,2]
|
166
166
|
end
|
167
|
-
|
167
|
+
|
168
168
|
should "default to empty array" do
|
169
169
|
key = Key.new(:foo, Array)
|
170
170
|
key.get(nil).should == []
|
171
171
|
end
|
172
172
|
end
|
173
|
-
|
173
|
+
|
174
174
|
context "for a hash" do
|
175
175
|
should "default to empty hash" do
|
176
176
|
key = Key.new(:foo, Hash)
|
@@ -183,13 +183,13 @@ class KeyTest < Test::Unit::TestCase
|
|
183
183
|
key.get({:foo => 'bar'})[:foo].should == 'bar'
|
184
184
|
end
|
185
185
|
end
|
186
|
-
|
186
|
+
|
187
187
|
context "for a embedded_document" do
|
188
|
-
should "default to nil" do
|
188
|
+
should "default to nil" do
|
189
189
|
key = Key.new(:foo, Address)
|
190
190
|
key.get(nil).should be_nil
|
191
191
|
end
|
192
|
-
|
192
|
+
|
193
193
|
should "return instance if instance" do
|
194
194
|
address = Address.new(:city => 'South Bend', :state => 'IN', :zip => 46544)
|
195
195
|
key = Key.new(:foo, Address)
|