mongo_mapper 0.12.0 → 0.13.0.beta1
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.
- checksums.yaml +7 -0
- data/README.rdoc +35 -13
- data/bin/mmconsole +1 -1
- data/lib/mongo_mapper.rb +4 -0
- data/lib/mongo_mapper/connection.rb +17 -6
- data/lib/mongo_mapper/document.rb +1 -0
- data/lib/mongo_mapper/exceptions.rb +4 -1
- data/lib/mongo_mapper/extensions/binary.rb +1 -1
- data/lib/mongo_mapper/extensions/boolean.rb +20 -23
- data/lib/mongo_mapper/extensions/date.rb +3 -3
- data/lib/mongo_mapper/extensions/integer.rb +5 -1
- data/lib/mongo_mapper/extensions/kernel.rb +2 -0
- data/lib/mongo_mapper/extensions/ordered_hash.rb +23 -0
- data/lib/mongo_mapper/extensions/string.rb +2 -2
- data/lib/mongo_mapper/extensions/time.rb +7 -5
- data/lib/mongo_mapper/middleware/identity_map.rb +3 -4
- data/lib/mongo_mapper/plugins.rb +1 -1
- data/lib/mongo_mapper/plugins/associations.rb +11 -5
- data/lib/mongo_mapper/plugins/associations/base.rb +5 -3
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +0 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +8 -8
- data/lib/mongo_mapper/plugins/associations/collection.rb +2 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +32 -7
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +2 -2
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +12 -12
- data/lib/mongo_mapper/plugins/associations/proxy.rb +5 -1
- data/lib/mongo_mapper/plugins/associations/single_association.rb +6 -6
- data/lib/mongo_mapper/plugins/clone.rb +4 -2
- data/lib/mongo_mapper/plugins/dirty.rb +22 -21
- data/lib/mongo_mapper/plugins/document.rb +4 -4
- data/lib/mongo_mapper/plugins/dumpable.rb +22 -0
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +58 -9
- data/lib/mongo_mapper/plugins/identity_map.rb +42 -32
- data/lib/mongo_mapper/plugins/keys.rb +133 -54
- data/lib/mongo_mapper/plugins/keys/key.rb +68 -22
- data/lib/mongo_mapper/plugins/modifiers.rb +26 -19
- data/lib/mongo_mapper/plugins/persistence.rb +15 -5
- data/lib/mongo_mapper/plugins/querying.rb +15 -40
- data/lib/mongo_mapper/plugins/querying/{decorator.rb → decorated_plucky_query.rb} +24 -4
- data/lib/mongo_mapper/plugins/rails.rb +22 -2
- data/lib/mongo_mapper/plugins/safe.rb +8 -5
- data/lib/mongo_mapper/plugins/sci.rb +26 -4
- data/lib/mongo_mapper/plugins/scopes.rb +5 -4
- data/lib/mongo_mapper/plugins/timestamps.rb +11 -4
- data/lib/mongo_mapper/plugins/validations.rb +1 -1
- data/lib/mongo_mapper/utils.rb +12 -0
- data/lib/mongo_mapper/version.rb +1 -1
- data/lib/rails/generators/mongo_mapper/config/config_generator.rb +20 -7
- data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +6 -0
- data/lib/rails/generators/mongo_mapper/model/model_generator.rb +18 -1
- data/lib/rails/generators/mongo_mapper/model/templates/model.rb +9 -5
- data/{test/functional/test_accessible.rb → spec/functional/accessible_spec.rb} +29 -29
- data/{test/functional/associations/test_belongs_to_polymorphic_proxy.rb → spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb} +10 -10
- data/{test/functional/associations/test_belongs_to_proxy.rb → spec/functional/associations/belongs_to_proxy_spec.rb} +82 -64
- data/{test/functional/associations/test_in_array_proxy.rb → spec/functional/associations/in_array_proxy_spec.rb} +68 -68
- data/{test/functional/associations/test_many_documents_as_proxy.rb → spec/functional/associations/many_documents_as_proxy_spec.rb} +37 -38
- data/{test/functional/associations/test_many_documents_proxy.rb → spec/functional/associations/many_documents_proxy_spec.rb} +233 -146
- data/{test/functional/associations/test_many_embedded_polymorphic_proxy.rb → spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb} +19 -20
- data/{test/functional/associations/test_many_embedded_proxy.rb → spec/functional/associations/many_embedded_proxy_spec.rb} +23 -24
- data/{test/functional/associations/test_many_polymorphic_proxy.rb → spec/functional/associations/many_polymorphic_proxy_spec.rb} +45 -46
- data/{test/functional/associations/test_one_as_proxy.rb → spec/functional/associations/one_as_proxy_spec.rb} +75 -77
- data/{test/functional/associations/test_one_embedded_polymorphic_proxy.rb → spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb} +31 -32
- data/{test/functional/associations/test_one_embedded_proxy.rb → spec/functional/associations/one_embedded_proxy_spec.rb} +10 -10
- data/{test/functional/associations/test_one_proxy.rb → spec/functional/associations/one_proxy_spec.rb} +125 -102
- data/spec/functional/associations_spec.rb +48 -0
- data/{test/functional/test_binary.rb → spec/functional/binary_spec.rb} +6 -6
- data/spec/functional/caching_spec.rb +75 -0
- data/{test/functional/test_callbacks.rb → spec/functional/callbacks_spec.rb} +84 -26
- data/{test/functional/test_dirty.rb → spec/functional/dirty_spec.rb} +57 -42
- data/{test/functional/test_document.rb → spec/functional/document_spec.rb} +52 -52
- data/spec/functional/dumpable_spec.rb +24 -0
- data/{test/functional/test_dynamic_querying.rb → spec/functional/dynamic_querying_spec.rb} +14 -14
- data/{test/functional/test_embedded_document.rb → spec/functional/embedded_document_spec.rb} +51 -42
- data/{test/functional/test_equality.rb → spec/functional/equality_spec.rb} +4 -4
- data/spec/functional/extensions_spec.rb +16 -0
- data/{test/functional/test_identity_map.rb → spec/functional/identity_map_spec.rb} +73 -61
- data/spec/functional/indexes_spec.rb +48 -0
- data/spec/functional/keys_spec.rb +224 -0
- data/{test/functional/test_logger.rb → spec/functional/logger_spec.rb} +6 -6
- data/spec/functional/modifiers_spec.rb +550 -0
- data/spec/functional/pagination_spec.rb +89 -0
- data/spec/functional/protected_spec.rb +199 -0
- data/spec/functional/querying_spec.rb +1003 -0
- data/spec/functional/rails_spec.rb +55 -0
- data/spec/functional/safe_spec.rb +163 -0
- data/{test/functional/test_sci.rb → spec/functional/sci_spec.rb} +123 -34
- data/{test/functional/test_scopes.rb → spec/functional/scopes_spec.rb} +59 -26
- data/spec/functional/timestamps_spec.rb +97 -0
- data/{test/functional/test_touch.rb → spec/functional/touch_spec.rb} +13 -13
- data/spec/functional/userstamps_spec.rb +46 -0
- data/{test/functional/test_validations.rb → spec/functional/validations_spec.rb} +64 -64
- data/spec/spec_helper.rb +81 -0
- data/spec/support/matchers.rb +24 -0
- data/{test → spec/support}/models.rb +1 -6
- data/spec/unit/associations/base_spec.rb +146 -0
- data/spec/unit/associations/belongs_to_association_spec.rb +30 -0
- data/spec/unit/associations/many_association_spec.rb +64 -0
- data/spec/unit/associations/one_association_spec.rb +48 -0
- data/{test/unit/associations/test_proxy.rb → spec/unit/associations/proxy_spec.rb} +21 -21
- data/{test/unit/test_clone.rb → spec/unit/clone_spec.rb} +21 -11
- data/spec/unit/config_generator_spec.rb +24 -0
- data/{test/unit/test_document.rb → spec/unit/document_spec.rb} +42 -42
- data/{test/unit/test_dynamic_finder.rb → spec/unit/dynamic_finder_spec.rb} +28 -28
- data/{test/unit/test_embedded_document.rb → spec/unit/embedded_document_spec.rb} +102 -108
- data/{test/unit/test_equality.rb → spec/unit/equality_spec.rb} +7 -7
- data/{test/unit/test_exceptions.rb → spec/unit/exceptions_spec.rb} +3 -3
- data/{test/unit/test_extensions.rb → spec/unit/extensions_spec.rb} +85 -71
- data/spec/unit/identity_map_middleware_spec.rb +134 -0
- data/{test/unit/test_inspect.rb → spec/unit/inspect_spec.rb} +8 -8
- data/{test/unit/test_key.rb → spec/unit/key_spec.rb} +82 -52
- data/spec/unit/keys_spec.rb +155 -0
- data/spec/unit/model_generator_spec.rb +47 -0
- data/spec/unit/mongo_mapper_spec.rb +184 -0
- data/spec/unit/pagination_spec.rb +11 -0
- data/{test/unit/test_plugins.rb → spec/unit/plugins_spec.rb} +14 -14
- data/spec/unit/rails_compatibility_spec.rb +40 -0
- data/{test/unit/test_rails_reflect_on_association.rb → spec/unit/rails_reflect_on_association_spec.rb} +9 -9
- data/{test/unit/test_rails.rb → spec/unit/rails_spec.rb} +31 -31
- data/spec/unit/serialization_spec.rb +169 -0
- data/spec/unit/serializers/json_serializer_spec.rb +218 -0
- data/spec/unit/serializers/xml_serializer_spec.rb +198 -0
- data/{test/unit/test_time_zones.rb → spec/unit/time_zones_spec.rb} +8 -8
- data/{test/unit/test_translation.rb → spec/unit/translation_spec.rb} +6 -6
- data/{test/unit/test_validations.rb → spec/unit/validations_spec.rb} +72 -59
- metadata +199 -179
- data/test/_NOTE_ON_TESTING +0 -1
- data/test/functional/test_associations.rb +0 -46
- data/test/functional/test_caching.rb +0 -77
- data/test/functional/test_indexes.rb +0 -50
- data/test/functional/test_modifiers.rb +0 -537
- data/test/functional/test_pagination.rb +0 -91
- data/test/functional/test_protected.rb +0 -201
- data/test/functional/test_querying.rb +0 -935
- data/test/functional/test_safe.rb +0 -76
- data/test/functional/test_timestamps.rb +0 -62
- data/test/functional/test_userstamps.rb +0 -44
- data/test/support/railtie.rb +0 -4
- data/test/support/railtie/autoloaded.rb +0 -2
- data/test/support/railtie/not_autoloaded.rb +0 -3
- data/test/support/railtie/parent.rb +0 -3
- data/test/test_active_model_lint.rb +0 -18
- data/test/test_helper.rb +0 -93
- data/test/unit/associations/test_base.rb +0 -146
- data/test/unit/associations/test_belongs_to_association.rb +0 -29
- data/test/unit/associations/test_many_association.rb +0 -63
- data/test/unit/associations/test_one_association.rb +0 -47
- data/test/unit/serializers/test_json_serializer.rb +0 -216
- data/test/unit/serializers/test_xml_serializer.rb +0 -196
- data/test/unit/test_identity_map_middleware.rb +0 -132
- data/test/unit/test_keys.rb +0 -65
- data/test/unit/test_mongo_mapper.rb +0 -157
- data/test/unit/test_pagination.rb +0 -11
- data/test/unit/test_rails_compatibility.rb +0 -38
- data/test/unit/test_serialization.rb +0 -166
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
module IdentityMapSpec
|
5
|
+
describe "IdentityMapMiddleware" do
|
6
|
+
include Rack::Test::Methods
|
7
|
+
|
8
|
+
def app
|
9
|
+
@app ||= Rack::Builder.new do
|
10
|
+
use MongoMapper::Middleware::IdentityMap
|
11
|
+
|
12
|
+
map "/" do
|
13
|
+
run lambda {|env| [200, {}, []] }
|
14
|
+
end
|
15
|
+
|
16
|
+
map "/fail" do
|
17
|
+
run lambda {|env| raise "FAIL!" }
|
18
|
+
end
|
19
|
+
end.to_app
|
20
|
+
end
|
21
|
+
|
22
|
+
context "" do
|
23
|
+
before do
|
24
|
+
@enabled = MongoMapper::Plugins::IdentityMap.enabled
|
25
|
+
MongoMapper::Plugins::IdentityMap.enabled = false
|
26
|
+
end
|
27
|
+
|
28
|
+
after do
|
29
|
+
MongoMapper::Plugins::IdentityMap.enabled = @enabled
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should delegate" do
|
33
|
+
called = false
|
34
|
+
mw = MongoMapper::Middleware::IdentityMap.new lambda { |env|
|
35
|
+
called = true
|
36
|
+
[200, {}, nil]
|
37
|
+
}
|
38
|
+
mw.call({})
|
39
|
+
called.should be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should enable identity map during delegation" do
|
43
|
+
mw = MongoMapper::Middleware::IdentityMap.new lambda { |env|
|
44
|
+
MongoMapper::Plugins::IdentityMap.should be_enabled
|
45
|
+
[200, {}, nil]
|
46
|
+
}
|
47
|
+
mw.call({})
|
48
|
+
end
|
49
|
+
|
50
|
+
class Enum < Struct.new(:iter)
|
51
|
+
def each(&b)
|
52
|
+
iter.call(&b)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should enable IM for body each" do
|
57
|
+
mw = MongoMapper::Middleware::IdentityMap.new lambda { |env|
|
58
|
+
[200, {}, Enum.new(lambda { |&b|
|
59
|
+
MongoMapper::Plugins::IdentityMap.should be_enabled
|
60
|
+
b.call "hello"
|
61
|
+
})]
|
62
|
+
}
|
63
|
+
body = mw.call({}).last
|
64
|
+
body.each { |x| x.should eql('hello') }
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should disable IM after body close" do
|
68
|
+
mw = MongoMapper::Middleware::IdentityMap.new lambda { |env| [200, {}, []] }
|
69
|
+
body = mw.call({}).last
|
70
|
+
MongoMapper::Plugins::IdentityMap.should be_enabled
|
71
|
+
body.close
|
72
|
+
MongoMapper::Plugins::IdentityMap.should_not be_enabled
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should clear IM after body close" do
|
76
|
+
mw = MongoMapper::Middleware::IdentityMap.new lambda { |env| [200, {}, []] }
|
77
|
+
body = mw.call({}).last
|
78
|
+
|
79
|
+
MongoMapper::Plugins::IdentityMap.repository['hello'] = 'world'
|
80
|
+
MongoMapper::Plugins::IdentityMap.repository.should_not be_empty
|
81
|
+
|
82
|
+
body.close
|
83
|
+
|
84
|
+
MongoMapper::Plugins::IdentityMap.repository.should be_empty
|
85
|
+
end
|
86
|
+
|
87
|
+
context "with a successful request" do
|
88
|
+
it "should clear the identity map" do
|
89
|
+
MongoMapper::Plugins::IdentityMap.should_receive(:clear).twice
|
90
|
+
get '/'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context "when the request raises an error" do
|
95
|
+
it "should clear the identity map" do
|
96
|
+
MongoMapper::Plugins::IdentityMap.should_receive(:clear).once
|
97
|
+
get '/fail' rescue nil
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# describe "IdentityMapMiddleware" do
|
104
|
+
# include Rack::Test::Methods
|
105
|
+
|
106
|
+
# def app
|
107
|
+
# @app ||= Rack::Builder.new do
|
108
|
+
# use MongoMapper::Middleware::IdentityMap
|
109
|
+
# map "/" do
|
110
|
+
# run lambda {|env| [200, {}, []] }
|
111
|
+
# end
|
112
|
+
# map "/fail" do
|
113
|
+
# run lambda {|env| raise "FAIL!" }
|
114
|
+
# end
|
115
|
+
# end.to_app
|
116
|
+
# end
|
117
|
+
|
118
|
+
# context "with a successful request" do
|
119
|
+
# it "should clear the identity map" do
|
120
|
+
# MongoMapper::Plugins::IdentityMap.should_receive(:clear).twice
|
121
|
+
# get '/'
|
122
|
+
# end
|
123
|
+
# end
|
124
|
+
|
125
|
+
# context "when the request raises an error" do
|
126
|
+
# it "should clear the identity map" do
|
127
|
+
# MongoMapper::Plugins::IdentityMap.should_receive(:clear).twice
|
128
|
+
# get '/fail' rescue nil
|
129
|
+
# end
|
130
|
+
# end
|
131
|
+
|
132
|
+
|
133
|
+
# end
|
134
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe "Inspect" do
|
4
4
|
context "#inspect" do
|
5
|
-
|
5
|
+
before do
|
6
6
|
@document = Doc('User') do
|
7
7
|
key :name, String
|
8
8
|
key :age, Integer
|
@@ -12,19 +12,19 @@ class InspectTest < Test::Unit::TestCase
|
|
12
12
|
@doc = @document.new(:name => 'John', :age => 29)
|
13
13
|
end
|
14
14
|
|
15
|
-
should
|
15
|
+
it "should print out non-nil attributes in alpha sorted order" do
|
16
16
|
@doc.inspect.should =~ /_id:.*, age: 29, name: "John"/
|
17
17
|
end
|
18
18
|
|
19
|
-
should
|
19
|
+
it "should print out all attributes when (optional) include_super argument is true" do
|
20
20
|
@doc.inspect(true).should =~ /_id:.*, age: 29, email: nil, name: "John"/
|
21
21
|
end
|
22
22
|
|
23
|
-
should
|
23
|
+
it "should include class name" do
|
24
24
|
@doc.inspect.should =~ /^#<User/
|
25
25
|
end
|
26
26
|
|
27
|
-
should
|
27
|
+
it "should include embedded documents" do
|
28
28
|
klass = Doc()
|
29
29
|
pets = EDoc()
|
30
30
|
|
@@ -34,7 +34,7 @@ class InspectTest < Test::Unit::TestCase
|
|
34
34
|
doc.inspect.should =~ /_id:.*, pets: \[.*_id.*, name: "Kitten".*\]/
|
35
35
|
end
|
36
36
|
|
37
|
-
should
|
37
|
+
it "should include embedded document" do
|
38
38
|
klass = Doc()
|
39
39
|
pet = EDoc()
|
40
40
|
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
3
|
|
4
4
|
class FooType < Struct.new(:bar)
|
5
5
|
def self.to_mongo(value)
|
@@ -11,147 +11,159 @@ class FooType < Struct.new(:bar)
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
describe "Key" do
|
15
15
|
Key = MongoMapper::Plugins::Keys::Key
|
16
16
|
|
17
17
|
context "Initializing a new key" do
|
18
|
-
should
|
18
|
+
it "should allow setting the name" do
|
19
19
|
Key.new(:foo, String).name.should == 'foo'
|
20
20
|
end
|
21
21
|
|
22
|
-
should
|
22
|
+
it "should allow setting the type" do
|
23
23
|
Key.new(:foo, Integer).type.should be(Integer)
|
24
24
|
end
|
25
25
|
|
26
|
-
should
|
26
|
+
it "should allow setting options" do
|
27
27
|
Key.new(:foo, Integer, :required => true).options[:required].should be(true)
|
28
28
|
end
|
29
29
|
|
30
|
-
should
|
30
|
+
it "should default options to {}" do
|
31
31
|
Key.new(:foo, Integer, nil).options.should == {}
|
32
32
|
end
|
33
33
|
|
34
|
-
should
|
34
|
+
it "should symbolize option keys" do
|
35
35
|
Key.new(:foo, Integer, 'required' => true).options[:required].should be(true)
|
36
36
|
end
|
37
37
|
|
38
|
-
should
|
38
|
+
it "should work with just name" do
|
39
39
|
key = Key.new(:foo)
|
40
40
|
key.name.should == 'foo'
|
41
41
|
end
|
42
42
|
|
43
|
-
should
|
43
|
+
it "should work with name and type" do
|
44
44
|
key = Key.new(:foo, String)
|
45
45
|
key.name.should == 'foo'
|
46
46
|
key.type.should == String
|
47
47
|
end
|
48
48
|
|
49
|
-
should
|
49
|
+
it "should work with name, type, and options" do
|
50
50
|
key = Key.new(:foo, String, :required => true)
|
51
51
|
key.name.should == 'foo'
|
52
52
|
key.type.should == String
|
53
53
|
key.options[:required].should be_true
|
54
54
|
end
|
55
55
|
|
56
|
-
should
|
56
|
+
it "should work with name and options" do
|
57
57
|
key = Key.new(:foo, :required => true)
|
58
58
|
key.name.should == 'foo'
|
59
59
|
key.options[:required].should be_true
|
60
60
|
end
|
61
|
+
|
62
|
+
it "should not permit reserved names" do
|
63
|
+
expect { Key.new(:id) }.to raise_error(/reserved/)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should not permit bad names" do
|
67
|
+
expect { Key.new(:"id.bar") }.to raise_error(/must match/)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should permit bad names if __dynamic" do
|
71
|
+
expect { Key.new(:"id.bar", :__dynamic => true) }.to_not raise_error
|
72
|
+
end
|
61
73
|
end
|
62
74
|
|
63
75
|
context "A key" do
|
64
|
-
should
|
76
|
+
it "should be equal to another key with same name and type" do
|
65
77
|
Key.new(:name, String).should == Key.new(:name, String)
|
66
78
|
end
|
67
79
|
|
68
|
-
should
|
80
|
+
it "should not be equal to another key with different name" do
|
69
81
|
Key.new(:name, String).should_not == Key.new(:foo, String)
|
70
82
|
end
|
71
83
|
|
72
|
-
should
|
84
|
+
it "should not be equal to another key with different type" do
|
73
85
|
Key.new(:name, String).should_not == Key.new(:name, Integer)
|
74
86
|
end
|
75
87
|
|
76
|
-
should
|
88
|
+
it "should know if it is a embedded_document" do
|
77
89
|
Key.new(:name, EDoc()).embeddable?.should be_true
|
78
90
|
end
|
79
91
|
|
80
|
-
should
|
92
|
+
it "should know if it is not a embedded_document" do
|
81
93
|
Key.new(:name, String).embeddable?.should be_false
|
82
94
|
end
|
83
95
|
|
84
|
-
should
|
96
|
+
it "should know if it is a number" do
|
85
97
|
Key.new(:age, Integer).number?.should be_true
|
86
98
|
Key.new(:age, Float).number?.should be_true
|
87
99
|
end
|
88
100
|
|
89
|
-
should
|
101
|
+
it "should know if it is not a number" do
|
90
102
|
Key.new(:age, String).number?.should be_false
|
91
103
|
end
|
92
104
|
end
|
93
105
|
|
94
106
|
context "for an array with :typecast option" do
|
95
|
-
|
107
|
+
before { @key = Key.new(:user_ids, Array, :typecast => 'ObjectId') }
|
96
108
|
subject { @key }
|
97
109
|
|
98
|
-
should
|
110
|
+
it "should cast each element correctly" do
|
99
111
|
ids = [BSON::ObjectId.new, BSON::ObjectId.new, BSON::ObjectId.new.to_s, BSON::ObjectId.new.to_s]
|
100
112
|
subject.set(ids).should == ids.map { |id| ObjectId.to_mongo(id) }
|
101
113
|
end
|
102
114
|
end
|
103
115
|
|
104
116
|
context "for an array with :typecast option of Date" do
|
105
|
-
|
117
|
+
before { @key = Key.new(:dates, Array, :typecast => 'Date') }
|
106
118
|
subject { @key }
|
107
119
|
|
108
|
-
should
|
120
|
+
it "should cast each element correctly when get" do
|
109
121
|
dates = [Date.yesterday, Date.today, Date.tomorrow.to_s]
|
110
122
|
subject.get(dates).should == dates.map { |date| Date.from_mongo(date) }
|
111
123
|
end
|
112
124
|
|
113
|
-
should
|
125
|
+
it "should cast each element correctly when set" do
|
114
126
|
dates = [Date.yesterday, Date.today, Date.tomorrow.to_s]
|
115
127
|
subject.set(dates).should == dates.map { |date| Date.to_mongo(date) }
|
116
128
|
end
|
117
129
|
end
|
118
130
|
|
119
131
|
context "for a set with :typecast option" do
|
120
|
-
|
132
|
+
before { @key = Key.new(:user_ids, Set, :typecast => 'ObjectId') }
|
121
133
|
subject { @key }
|
122
134
|
|
123
|
-
should
|
135
|
+
it "should cast each element correctly" do
|
124
136
|
ids = [BSON::ObjectId.new, BSON::ObjectId.new, BSON::ObjectId.new.to_s, BSON::ObjectId.new.to_s]
|
125
137
|
subject.set(ids).should == ids.map { |id| ObjectId.to_mongo(id) }
|
126
138
|
end
|
127
139
|
end
|
128
140
|
|
129
141
|
context "setting a value with a custom type" do
|
130
|
-
should
|
142
|
+
it "should correctly typecast" do
|
131
143
|
key = Key.new(:foo, FooType)
|
132
144
|
key.set("something").should == 'to_mongo'
|
133
145
|
end
|
134
146
|
|
135
|
-
should
|
147
|
+
it "should correctly typecast if object of that type is given" do
|
136
148
|
key = Key.new(:foo, FooType)
|
137
149
|
key.set(FooType.new('something')).should == 'to_mongo'
|
138
150
|
end
|
139
151
|
end
|
140
152
|
|
141
153
|
context "getting a value with a custom type" do
|
142
|
-
should
|
154
|
+
it "should use #from_mongo to convert back to custom type" do
|
143
155
|
key = Key.new(:foo, FooType)
|
144
156
|
key.get('something').should == 'from_mongo'
|
145
157
|
end
|
146
158
|
end
|
147
159
|
|
148
160
|
context "getting a value" do
|
149
|
-
should
|
161
|
+
it "should work with a type" do
|
150
162
|
key = Key.new(:foo, String)
|
151
163
|
key.get('bar').should == 'bar'
|
152
164
|
end
|
153
165
|
|
154
|
-
should
|
166
|
+
it "should work without type" do
|
155
167
|
key = Key.new(:foo)
|
156
168
|
key.get([1, '2']).should == [1, '2']
|
157
169
|
key.get(false).should == false
|
@@ -159,12 +171,12 @@ class KeyTest < Test::Unit::TestCase
|
|
159
171
|
end
|
160
172
|
|
161
173
|
context "for a embedded_document" do
|
162
|
-
should
|
174
|
+
it "should default to nil" do
|
163
175
|
key = Key.new(:foo, Address)
|
164
176
|
key.get(nil).should be_nil
|
165
177
|
end
|
166
178
|
|
167
|
-
should
|
179
|
+
it "should return instance if instance" do
|
168
180
|
address = Address.new(:city => 'South Bend', :state => 'IN', :zip => 46544)
|
169
181
|
key = Key.new(:foo, Address)
|
170
182
|
key.get(address).should == address
|
@@ -172,34 +184,52 @@ class KeyTest < Test::Unit::TestCase
|
|
172
184
|
end
|
173
185
|
end
|
174
186
|
|
175
|
-
context "
|
176
|
-
|
187
|
+
context "with a default set" do
|
188
|
+
before do
|
177
189
|
@key = Key.new(:foo, String, :default => 'baz')
|
178
190
|
end
|
179
191
|
|
180
|
-
|
181
|
-
|
182
|
-
|
192
|
+
context "#get" do
|
193
|
+
it "should return nil" do
|
194
|
+
@key.get(nil).should == nil
|
195
|
+
end
|
183
196
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
end
|
197
|
+
it "should return value if not blank" do
|
198
|
+
@key.get('foobar').should == 'foobar'
|
199
|
+
end
|
188
200
|
|
189
|
-
|
190
|
-
|
201
|
+
it "should return default value if name is _id and value nil" do
|
202
|
+
id = BSON::ObjectId.new
|
203
|
+
key = Key.new(:_id, ObjectId, :default => lambda { id })
|
204
|
+
key.get(nil).should == id
|
205
|
+
end
|
191
206
|
end
|
192
207
|
|
193
|
-
|
194
|
-
|
195
|
-
|
208
|
+
context "#default_value" do
|
209
|
+
it "should return default value" do
|
210
|
+
@key.default_value.should == 'baz'
|
211
|
+
end
|
196
212
|
|
197
|
-
|
198
|
-
|
199
|
-
|
213
|
+
it "should return a dup of the default value" do
|
214
|
+
@key.default_value.replace('bar')
|
215
|
+
@key.default_value.should == 'baz'
|
216
|
+
end
|
217
|
+
|
218
|
+
it "should work with Boolean type and false value" do
|
219
|
+
Key.new(:active, Boolean, :default => false).default_value.should be_false
|
220
|
+
end
|
200
221
|
|
201
|
-
|
202
|
-
|
222
|
+
it "should work with Boolean type and true value" do
|
223
|
+
Key.new(:active, Boolean, :default => true).default_value.should be_true
|
224
|
+
end
|
225
|
+
|
226
|
+
it "should work with Array values" do
|
227
|
+
Key.new(:active, Array, :default => []).default_value.should == []
|
228
|
+
end
|
229
|
+
|
230
|
+
it "should work with procs" do
|
231
|
+
Key.new(:foo, String, :default => lambda { return 'hello world' }).default_value.should == "hello world"
|
232
|
+
end
|
203
233
|
end
|
204
234
|
end
|
205
235
|
end # KeyTest
|