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,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Documents with the Rails plugin" do
|
4
|
+
let(:doc) { Doc {
|
5
|
+
key :foo, String
|
6
|
+
key :long_field, String, :alias => "lf"
|
7
|
+
}}
|
8
|
+
|
9
|
+
context "with values from the DB" do
|
10
|
+
subject { doc.create(:foo => "bar", :long_field => "long value") }
|
11
|
+
it "should have x_before_type_cast" do
|
12
|
+
subject.foo_before_type_cast.should == "bar"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have x_before_type_cast for aliased fields" do
|
16
|
+
subject.long_field_before_type_cast.should == "long value"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should honor app-set values over DB-set values" do
|
20
|
+
subject.foo = nil
|
21
|
+
subject.foo_before_type_cast.should == nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "when blank" do
|
26
|
+
subject { doc.create() }
|
27
|
+
it "should have x_before_type_cast" do
|
28
|
+
subject.foo_before_type_cast.should == nil
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should honor app-set values over DB-set values" do
|
32
|
+
subject.foo = nil
|
33
|
+
subject.foo_before_type_cast.should == nil
|
34
|
+
|
35
|
+
subject.foo = :baz
|
36
|
+
subject.foo_before_type_cast.should == :baz
|
37
|
+
|
38
|
+
subject.save
|
39
|
+
subject.reload.foo_before_type_cast.should == "baz"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "#has_one" do
|
44
|
+
subject do
|
45
|
+
Doc do
|
46
|
+
has_one :foo
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should create a one association" do
|
51
|
+
subject.associations.should have_key :foo
|
52
|
+
subject.associations[:foo].should be_a MongoMapper::Plugins::Associations::OneAssociation
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Safe" do
|
4
|
+
context "A Document" do
|
5
|
+
it "should default safe to off" do
|
6
|
+
Doc().should_not be_safe
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should allow turning safe on" do
|
10
|
+
Doc() { safe }.should be_safe
|
11
|
+
end
|
12
|
+
|
13
|
+
context "inherited with safe setting on" do
|
14
|
+
it "should set subclass safe setting on" do
|
15
|
+
inherited = Class.new(Doc() { safe })
|
16
|
+
inherited.should be_safe
|
17
|
+
inherited.safe_options.should == true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should set subclass safe setting to same options hash as superclass" do
|
21
|
+
inherited = Class.new(Doc() { safe(:j => true) })
|
22
|
+
inherited.should be_safe
|
23
|
+
inherited.safe_options.should == {:j => true}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "inherited with safe setting off" do
|
28
|
+
it "should leave subclass safe setting off" do
|
29
|
+
inherited = Class.new(Doc())
|
30
|
+
inherited.should_not be_safe
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "An unsafe document" do
|
36
|
+
before do
|
37
|
+
@klass = Doc do
|
38
|
+
safe(:w => 0)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
after { drop_indexes(@klass) }
|
42
|
+
|
43
|
+
it "should not raise an error on duplicate IDs" do
|
44
|
+
k = @klass.create
|
45
|
+
expect { j = @klass.create(:_id => k.id) }.to_not raise_error
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "A safe document" do
|
50
|
+
before do
|
51
|
+
@klass = Doc() do
|
52
|
+
safe
|
53
|
+
end
|
54
|
+
end
|
55
|
+
after { drop_indexes(@klass) }
|
56
|
+
|
57
|
+
context "#save" do
|
58
|
+
before do
|
59
|
+
@klass.ensure_index :email, :unique => true
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should raise an error on duplicate IDs" do
|
63
|
+
k = @klass.create
|
64
|
+
expect { j = @klass.create(:_id => k.id) }.to raise_error(Mongo::OperationFailure)
|
65
|
+
end
|
66
|
+
|
67
|
+
context "using safe setting from class" do
|
68
|
+
it "should pass :w => 1 option to save" do
|
69
|
+
instance = @klass.new(:email => 'john@doe.com')
|
70
|
+
Mongo::Collection.any_instance.should_receive(:insert).once.with({'_id' => instance.id, 'email' => 'john@doe.com'}, {:w => 1})
|
71
|
+
instance.save!
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should work fine when all is well" do
|
75
|
+
expect {
|
76
|
+
@klass.new(:email => 'john@doe.com').save
|
77
|
+
}.to_not raise_error
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should raise error when operation fails" do
|
81
|
+
expect {
|
82
|
+
2.times do
|
83
|
+
@klass.new(:email => 'john@doe.com').save
|
84
|
+
end
|
85
|
+
}.to raise_error(Mongo::OperationFailure)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "overriding safe setting" do
|
90
|
+
it "should raise error if safe is true" do
|
91
|
+
expect {
|
92
|
+
2.times do
|
93
|
+
@klass.new(:email => 'john@doe.com').save(:safe => true)
|
94
|
+
end
|
95
|
+
}.to raise_error(Mongo::OperationFailure)
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should not raise error if safe is false" do
|
99
|
+
expect {
|
100
|
+
2.times do
|
101
|
+
@klass.new(:email => 'john@doe.com').save(:safe => false)
|
102
|
+
end
|
103
|
+
}.to_not raise_error
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context "a safe document with options hash" do
|
110
|
+
before do
|
111
|
+
@klass = Doc() do
|
112
|
+
safe(:j => true)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
after { drop_indexes(@klass) }
|
116
|
+
|
117
|
+
context "#save" do
|
118
|
+
before do
|
119
|
+
@klass.ensure_index :email, :unique => true
|
120
|
+
end
|
121
|
+
|
122
|
+
context "using safe setting from class" do
|
123
|
+
it "should pass :safe => options_hash to save" do
|
124
|
+
instance = @klass.new(:email => 'john@doe.com')
|
125
|
+
Mongo::Collection.any_instance.should_receive(:insert).once.with({'_id' => instance.id, 'email' => 'john@doe.com'}, {:j => true})
|
126
|
+
instance.save!
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should work fine when all is well" do
|
130
|
+
expect {
|
131
|
+
@klass.new(:email => 'john@doe.com').save
|
132
|
+
}.to_not raise_error
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should raise error when operation fails" do
|
136
|
+
expect {
|
137
|
+
2.times do
|
138
|
+
@klass.new(:email => 'john@doe.com').save
|
139
|
+
end
|
140
|
+
}.to raise_error(Mongo::OperationFailure)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context "overriding safe setting" do
|
145
|
+
it "should raise error if safe is true" do
|
146
|
+
expect {
|
147
|
+
2.times do
|
148
|
+
@klass.new(:email => 'john@doe.com').save(:safe => true)
|
149
|
+
end
|
150
|
+
}.to raise_error(Mongo::OperationFailure)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should not raise error if safe is false" do
|
154
|
+
expect {
|
155
|
+
2.times do
|
156
|
+
@klass.new(:email => 'john@doe.com').save(:safe => false)
|
157
|
+
end
|
158
|
+
}.to_not raise_error
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -1,8 +1,28 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Single collection inheritance (document)" do
|
4
|
+
context "without a connection", :without_connection => true do
|
5
|
+
it "should attempt to create a connection during inheritance" do
|
6
|
+
Mongo::MongoClient.should_not_receive(:new)
|
7
|
+
doc = Class.new
|
8
|
+
doc.send(:include, MongoMapper::Document)
|
9
|
+
expect {
|
10
|
+
Class.new(doc)
|
11
|
+
}.to_not raise_error
|
12
|
+
end
|
2
13
|
|
3
|
-
|
4
|
-
|
5
|
-
|
14
|
+
it "should pick up a connection if one wasn't set" do
|
15
|
+
doc = Class.new
|
16
|
+
doc.send(:include, MongoMapper::Document)
|
17
|
+
klass = Class.new(doc)
|
18
|
+
klass.connection.should be_nil
|
19
|
+
MongoMapper.connection
|
20
|
+
klass.connection.should be_a Mongo::MongoClient
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "with a connection" do
|
25
|
+
before do
|
6
26
|
class ::DocParent
|
7
27
|
include MongoMapper::Document
|
8
28
|
key :name, String
|
@@ -20,7 +40,7 @@ class SciTest < Test::Unit::TestCase
|
|
20
40
|
@daughter = DocDaughter.new({:name => "Little Orphan Annie"})
|
21
41
|
end
|
22
42
|
|
23
|
-
|
43
|
+
after do
|
24
44
|
Object.send :remove_const, 'DocParent' if defined?(::DocParent)
|
25
45
|
Object.send :remove_const, 'DocDaughter' if defined?(::DocDaughter)
|
26
46
|
Object.send :remove_const, 'DocSon' if defined?(::DocSon)
|
@@ -28,15 +48,55 @@ class SciTest < Test::Unit::TestCase
|
|
28
48
|
Object.send :remove_const, 'DocGrandGrandSon' if defined?(::DocGrandGrandSon)
|
29
49
|
end
|
30
50
|
|
31
|
-
should
|
51
|
+
it "should automatically add _type key to store class" do
|
32
52
|
DocParent.key?(:_type).should be_true
|
33
53
|
end
|
34
54
|
|
35
|
-
should
|
55
|
+
it "should use modifiers properly" do
|
56
|
+
DocDaughter.increment({:title => 'Home'}, {:day_count => 1}, :upsert => true)
|
57
|
+
DocDaughter.first.should_not be_nil
|
58
|
+
DocDaughter.first._type.should == "DocDaughter"
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should use the same connection in the subclass" do
|
62
|
+
parent_class = Class.new do
|
63
|
+
include MongoMapper::Document
|
64
|
+
connection Mongo::MongoClient.new
|
65
|
+
end
|
66
|
+
|
67
|
+
child_class = Class.new(parent_class) do
|
68
|
+
include MongoMapper::Document
|
69
|
+
end
|
70
|
+
|
71
|
+
child_class.connection.should == child_class.connection
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should use the same database in the subclass" do
|
75
|
+
parent_class = Class.new do
|
76
|
+
include MongoMapper::Document
|
77
|
+
set_database_name 'something'
|
78
|
+
end
|
79
|
+
|
80
|
+
child_class = Class.new(parent_class) do
|
81
|
+
include MongoMapper::Document
|
82
|
+
end
|
83
|
+
|
84
|
+
child_class.database.name.should == 'something'
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should use the same collection in the subclass" do
|
36
88
|
DocDaughter.collection.name.should == DocParent.collection.name
|
37
89
|
end
|
38
90
|
|
39
|
-
|
91
|
+
it "should negate SCI if the subclass changes its collection" do
|
92
|
+
klass = Class.new(DocParent) do
|
93
|
+
set_collection_name "foobars"
|
94
|
+
end
|
95
|
+
klass.collection.name.should == "foobars"
|
96
|
+
klass.should_not be_single_collection_inherited
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should know single_collection_parent" do
|
40
100
|
DocParent.single_collection_parent.should be_nil
|
41
101
|
DocDaughter.single_collection_parent.should == DocParent
|
42
102
|
DocSon.single_collection_parent.should == DocParent
|
@@ -44,7 +104,7 @@ class SciTest < Test::Unit::TestCase
|
|
44
104
|
DocGrandGrandSon.single_collection_parent.should == DocGrandSon
|
45
105
|
end
|
46
106
|
|
47
|
-
should
|
107
|
+
it "should know single_collection_root" do
|
48
108
|
DocParent.single_collection_root.should == DocParent
|
49
109
|
DocDaughter.single_collection_root.should == DocParent
|
50
110
|
DocSon.single_collection_root.should == DocParent
|
@@ -53,29 +113,29 @@ class SciTest < Test::Unit::TestCase
|
|
53
113
|
end
|
54
114
|
|
55
115
|
context ".single_collection_inherited?" do
|
56
|
-
should
|
116
|
+
it "should be false if has not inherited" do
|
57
117
|
DocParent.should_not be_single_collection_inherited
|
58
118
|
end
|
59
119
|
|
60
|
-
should
|
120
|
+
it "should be true if inherited" do
|
61
121
|
DocDaughter.should be_single_collection_inherited
|
62
122
|
DocSon.should be_single_collection_inherited
|
63
123
|
DocGrandSon.should be_single_collection_inherited
|
64
124
|
end
|
65
125
|
end
|
66
126
|
|
67
|
-
should
|
127
|
+
it "should set _type on initialize" do
|
68
128
|
DocDaughter.new._type.should == 'DocDaughter'
|
69
129
|
DocSon.new._type.should == 'DocSon'
|
70
130
|
DocGrandSon.new._type.should == 'DocGrandSon'
|
71
131
|
end
|
72
132
|
|
73
|
-
should
|
133
|
+
it "should set _type based on class and ignore assigned values" do
|
74
134
|
DocSon.new(:_type => 'DocDaughter')._type.should == 'DocSon'
|
75
135
|
end
|
76
136
|
|
77
137
|
context "loading" do
|
78
|
-
should
|
138
|
+
it "should be based on _type" do
|
79
139
|
@parent.save
|
80
140
|
@daughter.save
|
81
141
|
|
@@ -87,7 +147,7 @@ class SciTest < Test::Unit::TestCase
|
|
87
147
|
collection.last.name.should == "Little Orphan Annie"
|
88
148
|
end
|
89
149
|
|
90
|
-
should
|
150
|
+
it "should gracefully handle when _type cannot be constantized" do
|
91
151
|
doc = DocParent.new(:name => 'Nunes')
|
92
152
|
doc._type = 'FoobarBaz'
|
93
153
|
doc.save
|
@@ -99,7 +159,7 @@ class SciTest < Test::Unit::TestCase
|
|
99
159
|
end
|
100
160
|
|
101
161
|
context "querying" do
|
102
|
-
should
|
162
|
+
it "should find scoped to class" do
|
103
163
|
john = DocSon.create(:name => 'John')
|
104
164
|
steve = DocSon.create(:name => 'Steve')
|
105
165
|
steph = DocDaughter.create(:name => 'Steph')
|
@@ -119,13 +179,13 @@ class SciTest < Test::Unit::TestCase
|
|
119
179
|
DocParent.all(:order => 'name').should == [boris, carrie, john, sigmund, steph, steve]
|
120
180
|
end
|
121
181
|
|
122
|
-
should
|
182
|
+
it "should work with nested hash conditions" do
|
123
183
|
john = DocSon.create(:name => 'John')
|
124
184
|
steve = DocSon.create(:name => 'Steve')
|
125
185
|
DocSon.all(:name => {'$ne' => 'Steve'}).should == [john]
|
126
186
|
end
|
127
187
|
|
128
|
-
should
|
188
|
+
it "should raise error if not found scoped to class" do
|
129
189
|
john = DocSon.create(:name => 'John')
|
130
190
|
steph = DocDaughter.create(:name => 'Steph')
|
131
191
|
|
@@ -134,13 +194,13 @@ class SciTest < Test::Unit::TestCase
|
|
134
194
|
}.should raise_error(MongoMapper::DocumentNotFound)
|
135
195
|
end
|
136
196
|
|
137
|
-
should
|
197
|
+
it "should not raise error for find with parent" do
|
138
198
|
john = DocSon.create(:name => 'John')
|
139
199
|
|
140
200
|
DocParent.find!(john._id).should == john
|
141
201
|
end
|
142
202
|
|
143
|
-
should
|
203
|
+
it "should count scoped to class" do
|
144
204
|
john = DocSon.create(:name => 'John')
|
145
205
|
steve = DocSon.create(:name => 'Steve')
|
146
206
|
steph = DocDaughter.create(:name => 'Steph')
|
@@ -152,7 +212,7 @@ class SciTest < Test::Unit::TestCase
|
|
152
212
|
DocParent.count.should == 4
|
153
213
|
end
|
154
214
|
|
155
|
-
should
|
215
|
+
it "should not be able to destroy each other" do
|
156
216
|
john = DocSon.create(:name => 'John')
|
157
217
|
steph = DocDaughter.create(:name => 'Steph')
|
158
218
|
|
@@ -161,7 +221,7 @@ class SciTest < Test::Unit::TestCase
|
|
161
221
|
}.should raise_error(MongoMapper::DocumentNotFound)
|
162
222
|
end
|
163
223
|
|
164
|
-
should
|
224
|
+
it "should not be able to delete each other" do
|
165
225
|
john = DocSon.create(:name => 'John')
|
166
226
|
steph = DocDaughter.create(:name => 'Steph')
|
167
227
|
|
@@ -170,7 +230,7 @@ class SciTest < Test::Unit::TestCase
|
|
170
230
|
}.should_not change { DocParent.count }
|
171
231
|
end
|
172
232
|
|
173
|
-
should
|
233
|
+
it "should be able to destroy using parent" do
|
174
234
|
john = DocSon.create(:name => 'John')
|
175
235
|
steph = DocDaughter.create(:name => 'Steph')
|
176
236
|
|
@@ -179,7 +239,7 @@ class SciTest < Test::Unit::TestCase
|
|
179
239
|
}.should change { DocParent.count }.by(-2)
|
180
240
|
end
|
181
241
|
|
182
|
-
should
|
242
|
+
it "should be able to delete using parent" do
|
183
243
|
john = DocSon.create(:name => 'John')
|
184
244
|
steph = DocDaughter.create(:name => 'Steph')
|
185
245
|
|
@@ -189,7 +249,7 @@ class SciTest < Test::Unit::TestCase
|
|
189
249
|
end
|
190
250
|
end
|
191
251
|
|
192
|
-
should
|
252
|
+
it "should be able to reload single collection inherited parent class" do
|
193
253
|
brian = DocParent.create(:name => 'Brian')
|
194
254
|
brian.name = 'B-Dawg'
|
195
255
|
brian.reload
|
@@ -197,8 +257,8 @@ class SciTest < Test::Unit::TestCase
|
|
197
257
|
end
|
198
258
|
end
|
199
259
|
|
200
|
-
|
201
|
-
|
260
|
+
describe "Single collection inheritance (embedded document)" do
|
261
|
+
before do
|
202
262
|
class ::Grandparent
|
203
263
|
include MongoMapper::EmbeddedDocument
|
204
264
|
key :grandparent, String
|
@@ -220,37 +280,66 @@ class SciTest < Test::Unit::TestCase
|
|
220
280
|
end
|
221
281
|
end
|
222
282
|
|
223
|
-
|
283
|
+
after do
|
224
284
|
Object.send :remove_const, 'Grandparent' if defined?(::Grandparent)
|
225
285
|
Object.send :remove_const, 'Parent' if defined?(::Parent)
|
226
286
|
Object.send :remove_const, 'Child' if defined?(::Child)
|
227
287
|
Object.send :remove_const, 'OtherChild' if defined?(::OtherChild)
|
228
288
|
end
|
229
289
|
|
230
|
-
should
|
290
|
+
it "should automatically add _type key" do
|
231
291
|
Grandparent.key?(:_type).should be_true
|
232
292
|
end
|
233
293
|
|
234
294
|
context ".single_collection_inherited?" do
|
235
|
-
should
|
295
|
+
it "should be false if has not inherited" do
|
236
296
|
Grandparent.should_not be_single_collection_inherited
|
237
297
|
end
|
238
298
|
|
239
|
-
should
|
299
|
+
it "should be true if inherited" do
|
240
300
|
Parent.should be_single_collection_inherited
|
241
301
|
Child.should be_single_collection_inherited
|
242
302
|
OtherChild.should be_single_collection_inherited
|
243
303
|
end
|
244
304
|
end
|
245
305
|
|
246
|
-
should
|
306
|
+
it "should set _type on initialize" do
|
247
307
|
Parent.new._type.should == 'Parent'
|
248
308
|
Child.new._type.should == 'Child'
|
249
309
|
OtherChild.new._type.should == 'OtherChild'
|
250
310
|
end
|
251
311
|
|
252
|
-
should
|
312
|
+
it "should set _type based on class and ignore assigned values" do
|
253
313
|
Child.new(:_type => 'OtherChild')._type.should == 'Child'
|
254
314
|
end
|
255
315
|
end
|
256
|
-
|
316
|
+
|
317
|
+
describe "With polymorphism" do
|
318
|
+
before :all do
|
319
|
+
class SciPolymorphicPost
|
320
|
+
include MongoMapper::Document
|
321
|
+
belongs_to :article_parent, :polymorphic => true
|
322
|
+
end
|
323
|
+
|
324
|
+
class GalleryItem
|
325
|
+
include MongoMapper::Document
|
326
|
+
belongs_to :gallery_album
|
327
|
+
key :text, Hash
|
328
|
+
timestamps!
|
329
|
+
end
|
330
|
+
|
331
|
+
class TextGalleryItem < GalleryItem;
|
332
|
+
many :sci_polymorphic_posts, :as => :article_parent
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
it "should find polymorphic SCI items" do
|
337
|
+
item = TextGalleryItem.new()
|
338
|
+
p = SciPolymorphicPost.create(:article_parent => item)
|
339
|
+
p.article_parent_id.should be_a BSON::ObjectId
|
340
|
+
p.article_parent_type.should == "TextGalleryItem"
|
341
|
+
|
342
|
+
p.reload.article_parent.sci_polymorphic_posts.all.should include(p)
|
343
|
+
end
|
344
|
+
end
|
345
|
+
end
|