mongo_mapper 0.7.6 → 0.8.0
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/README.rdoc +4 -8
- data/bin/mmconsole +1 -1
- data/examples/keys.rb +37 -0
- data/examples/plugins.rb +41 -0
- data/examples/querying.rb +35 -0
- data/examples/scopes.rb +52 -0
- data/lib/mongo_mapper.rb +77 -97
- data/lib/mongo_mapper/connection.rb +83 -0
- data/lib/mongo_mapper/document.rb +10 -252
- data/lib/mongo_mapper/embedded_document.rb +7 -46
- data/lib/mongo_mapper/exceptions.rb +30 -0
- data/lib/mongo_mapper/extensions/array.rb +19 -0
- data/lib/mongo_mapper/extensions/binary.rb +22 -0
- data/lib/mongo_mapper/extensions/boolean.rb +44 -0
- data/lib/mongo_mapper/extensions/date.rb +25 -0
- data/lib/mongo_mapper/extensions/float.rb +14 -0
- data/lib/mongo_mapper/extensions/hash.rb +14 -0
- data/lib/mongo_mapper/extensions/integer.rb +19 -0
- data/lib/mongo_mapper/extensions/kernel.rb +9 -0
- data/lib/mongo_mapper/extensions/nil_class.rb +18 -0
- data/lib/mongo_mapper/extensions/object.rb +27 -0
- data/lib/mongo_mapper/extensions/object_id.rb +30 -0
- data/lib/mongo_mapper/extensions/set.rb +20 -0
- data/lib/mongo_mapper/extensions/string.rb +18 -0
- data/lib/mongo_mapper/extensions/time.rb +29 -0
- data/lib/mongo_mapper/plugins.rb +1 -21
- data/lib/mongo_mapper/plugins/accessible.rb +44 -0
- data/lib/mongo_mapper/plugins/associations.rb +7 -24
- data/lib/mongo_mapper/plugins/associations/base.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +5 -6
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +5 -6
- data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +2 -1
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +22 -39
- data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +4 -4
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +22 -23
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +2 -3
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +6 -7
- data/lib/mongo_mapper/plugins/associations/proxy.rb +8 -6
- data/lib/mongo_mapper/plugins/caching.rb +21 -0
- data/lib/mongo_mapper/plugins/callbacks.rb +4 -3
- data/lib/mongo_mapper/plugins/clone.rb +10 -4
- data/lib/mongo_mapper/plugins/descendants.rb +1 -0
- data/lib/mongo_mapper/plugins/dirty.rb +1 -0
- data/lib/mongo_mapper/plugins/document.rb +41 -0
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +41 -0
- data/lib/mongo_mapper/{support/find.rb → plugins/dynamic_querying/dynamic_finder.rb} +3 -36
- data/lib/mongo_mapper/plugins/embedded_document.rb +49 -0
- data/lib/mongo_mapper/plugins/equality.rb +3 -9
- data/lib/mongo_mapper/plugins/identity_map.rb +8 -10
- data/lib/mongo_mapper/plugins/indexes.rb +12 -0
- data/lib/mongo_mapper/plugins/inspect.rb +1 -0
- data/lib/mongo_mapper/plugins/keys.rb +15 -27
- data/lib/mongo_mapper/plugins/keys/key.rb +14 -3
- data/lib/mongo_mapper/plugins/logger.rb +1 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +3 -2
- data/lib/mongo_mapper/plugins/pagination.rb +5 -15
- data/lib/mongo_mapper/plugins/persistence.rb +12 -11
- data/lib/mongo_mapper/plugins/protected.rb +8 -0
- data/lib/mongo_mapper/plugins/querying.rb +236 -0
- data/lib/mongo_mapper/plugins/querying/decorator.rb +46 -0
- data/lib/mongo_mapper/plugins/rails.rb +1 -0
- data/lib/mongo_mapper/plugins/safe.rb +28 -0
- data/lib/mongo_mapper/plugins/sci.rb +32 -0
- data/lib/mongo_mapper/plugins/scopes.rb +21 -0
- data/lib/mongo_mapper/plugins/serialization.rb +1 -0
- data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
- data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
- data/lib/mongo_mapper/plugins/validations.rb +5 -1
- data/lib/mongo_mapper/support/descendant_appends.rb +5 -6
- data/lib/mongo_mapper/version.rb +2 -1
- data/test/NOTE_ON_TESTING +1 -0
- data/test/active_model_lint_test.rb +13 -0
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +63 -0
- data/test/functional/associations/test_belongs_to_proxy.rb +93 -0
- data/test/functional/associations/test_in_array_proxy.rb +319 -0
- data/test/functional/associations/test_many_documents_as_proxy.rb +229 -0
- data/test/functional/associations/test_many_documents_proxy.rb +536 -0
- data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +176 -0
- data/test/functional/associations/test_many_embedded_proxy.rb +256 -0
- data/test/functional/associations/test_many_polymorphic_proxy.rb +302 -0
- data/test/functional/associations/test_one_embedded_proxy.rb +58 -0
- data/test/functional/associations/test_one_proxy.rb +182 -0
- data/test/functional/test_accessible.rb +168 -0
- data/test/functional/test_associations.rb +44 -0
- data/test/functional/test_binary.rb +27 -0
- data/test/functional/test_caching.rb +76 -0
- data/test/functional/test_callbacks.rb +151 -0
- data/test/functional/test_dirty.rb +163 -0
- data/test/functional/test_document.rb +253 -0
- data/test/functional/test_dynamic_querying.rb +75 -0
- data/test/functional/test_embedded_document.rb +210 -0
- data/test/functional/test_identity_map.rb +506 -0
- data/test/functional/test_indexes.rb +42 -0
- data/test/functional/test_logger.rb +20 -0
- data/test/functional/test_modifiers.rb +416 -0
- data/test/functional/test_pagination.rb +91 -0
- data/test/functional/test_protected.rb +175 -0
- data/test/functional/test_querying.rb +873 -0
- data/test/functional/test_safe.rb +76 -0
- data/test/functional/test_sci.rb +230 -0
- data/test/functional/test_scopes.rb +171 -0
- data/test/functional/test_string_id_compatibility.rb +67 -0
- data/test/functional/test_timestamps.rb +62 -0
- data/test/functional/test_userstamps.rb +27 -0
- data/test/functional/test_validations.rb +342 -0
- data/test/models.rb +227 -0
- data/test/test_helper.rb +98 -0
- data/test/unit/associations/test_base.rb +212 -0
- data/test/unit/associations/test_proxy.rb +105 -0
- data/test/unit/serializers/test_json_serializer.rb +202 -0
- data/test/unit/test_clone.rb +69 -0
- data/test/unit/test_descendant_appends.rb +71 -0
- data/test/unit/test_document.rb +213 -0
- data/test/unit/test_dynamic_finder.rb +125 -0
- data/test/unit/test_embedded_document.rb +644 -0
- data/test/unit/test_extensions.rb +380 -0
- data/test/unit/test_key.rb +185 -0
- data/test/unit/test_keys.rb +55 -0
- data/test/unit/test_mongo_mapper.rb +110 -0
- data/test/unit/test_pagination.rb +11 -0
- data/test/unit/test_plugins.rb +50 -0
- data/test/unit/test_rails.rb +181 -0
- data/test/unit/test_rails_compatibility.rb +52 -0
- data/test/unit/test_serialization.rb +51 -0
- data/test/unit/test_time_zones.rb +39 -0
- data/test/unit/test_validations.rb +544 -0
- metadata +113 -44
- data/lib/mongo_mapper/plugins/pagination/proxy.rb +0 -72
- data/lib/mongo_mapper/query.rb +0 -23
- data/lib/mongo_mapper/support.rb +0 -196
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class FakeNilProxy < MongoMapper::Plugins::Associations::Proxy
|
4
|
+
def find_target; nil end
|
5
|
+
end
|
6
|
+
|
7
|
+
class FakeBlankProxy < MongoMapper::Plugins::Associations::Proxy
|
8
|
+
def find_target; '' end
|
9
|
+
end
|
10
|
+
|
11
|
+
class FakeNumberProxy < MongoMapper::Plugins::Associations::Proxy
|
12
|
+
def find_target; 17 end
|
13
|
+
end
|
14
|
+
|
15
|
+
class FakeProxy < MongoMapper::Plugins::Associations::Proxy
|
16
|
+
def find_target; [1, 2] end
|
17
|
+
end
|
18
|
+
|
19
|
+
class ProxyTest < Test::Unit::TestCase
|
20
|
+
def setup
|
21
|
+
@owner = mock('owner')
|
22
|
+
@owner.stubs(:new?).returns(false)
|
23
|
+
@association = mock('association')
|
24
|
+
@association.stubs(:options).returns({:extend => []})
|
25
|
+
|
26
|
+
@proxy = FakeProxy.new(@owner, @association)
|
27
|
+
@nil_proxy = FakeNilProxy.new(@owner, @association)
|
28
|
+
@blank_proxy = FakeBlankProxy.new(@owner, @association)
|
29
|
+
end
|
30
|
+
|
31
|
+
should 'return true for === target' do
|
32
|
+
@proxy = FakeProxy.new(@owner, @association)
|
33
|
+
@proxy.should === Array
|
34
|
+
end
|
35
|
+
|
36
|
+
should "set target to nil when reset is called" do
|
37
|
+
@proxy.reset
|
38
|
+
@proxy.target.should be_nil
|
39
|
+
end
|
40
|
+
|
41
|
+
should "be able to inspect the proxy" do
|
42
|
+
@proxy.inspect.should == '[1, 2]'
|
43
|
+
end
|
44
|
+
|
45
|
+
context "nil?" do
|
46
|
+
should "be true if nil" do
|
47
|
+
@nil_proxy.nil?.should be_true
|
48
|
+
end
|
49
|
+
|
50
|
+
should "be false if not nil" do
|
51
|
+
@proxy.nil?.should be_false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "blank?" do
|
56
|
+
should "be true if blank" do
|
57
|
+
@blank_proxy.blank?.should be_true
|
58
|
+
@nil_proxy.blank?.should be_true
|
59
|
+
end
|
60
|
+
|
61
|
+
should "be false if not blank" do
|
62
|
+
@proxy.blank?.should be_false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "present?" do
|
67
|
+
should "be true if present" do
|
68
|
+
@proxy.present?.should be_true
|
69
|
+
end
|
70
|
+
|
71
|
+
should "be false if not present" do
|
72
|
+
@blank_proxy.present?.should be_false
|
73
|
+
@nil_proxy.present?.should be_false
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
should "delegate respond_to? to target" do
|
78
|
+
@proxy.respond_to?(:each).should be_true
|
79
|
+
@proxy.respond_to?(:size).should be_true
|
80
|
+
@proxy.respond_to?(:gsub).should be_false
|
81
|
+
end
|
82
|
+
|
83
|
+
should "alias proxy owner to owner" do
|
84
|
+
@proxy.proxy_owner.should == @owner
|
85
|
+
end
|
86
|
+
|
87
|
+
should "alias proxy target to target" do
|
88
|
+
@proxy.proxy_target.should == @target
|
89
|
+
end
|
90
|
+
|
91
|
+
context "send" do
|
92
|
+
should "work if proxy responds to method" do
|
93
|
+
@proxy.send(:reset)
|
94
|
+
@proxy.target.should be_nil
|
95
|
+
end
|
96
|
+
|
97
|
+
should "work if the target responds to the method" do
|
98
|
+
@proxy.send(:size).should == 2
|
99
|
+
end
|
100
|
+
|
101
|
+
should "not work if neither the proxy or target respond to method" do
|
102
|
+
lambda { @proxy.send(:gsub) }.should raise_error
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'active_support/version'
|
3
|
+
|
4
|
+
class JsonSerializationTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
# Helper function in case things change in the future
|
7
|
+
# - replacing all those to_json calls was a nightmare
|
8
|
+
def convert_to_json(object, options={})
|
9
|
+
ActiveSupport::JSON.encode(object, options)
|
10
|
+
end
|
11
|
+
|
12
|
+
class Tag
|
13
|
+
include MongoMapper::EmbeddedDocument
|
14
|
+
key :name, String
|
15
|
+
end
|
16
|
+
|
17
|
+
class Contact
|
18
|
+
include MongoMapper::Document
|
19
|
+
key :name, String
|
20
|
+
key :age, Integer
|
21
|
+
key :created_at, Time
|
22
|
+
key :awesome, Boolean
|
23
|
+
key :preferences, Hash
|
24
|
+
|
25
|
+
many :tags, :class_name => 'JsonSerializationTest::Tag'
|
26
|
+
end
|
27
|
+
|
28
|
+
def setup
|
29
|
+
Contact.include_root_in_json = false
|
30
|
+
@contact = Contact.new(
|
31
|
+
:name => 'Konata Izumi',
|
32
|
+
:age => 16,
|
33
|
+
:created_at => Time.utc(2006, 8, 1),
|
34
|
+
:awesome => true,
|
35
|
+
:preferences => { :shows => 'anime' }
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
should "include demodulized root" do
|
40
|
+
Contact.include_root_in_json = true
|
41
|
+
assert_match %r{^\{"contact":\s?\{}, convert_to_json(@contact)
|
42
|
+
end
|
43
|
+
|
44
|
+
should "encode all encodable attributes" do
|
45
|
+
json = convert_to_json(@contact)
|
46
|
+
|
47
|
+
assert_no_match %r{"_id"}, json
|
48
|
+
assert_match %r{"name":"Konata Izumi"}, json
|
49
|
+
assert_match %r{"age":16}, json
|
50
|
+
assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
|
51
|
+
assert_match %r{"awesome":true}, json
|
52
|
+
assert_match %r{"preferences":\{"shows":"anime"\}}, json
|
53
|
+
end
|
54
|
+
|
55
|
+
should "allow attribute filtering with only" do
|
56
|
+
json = convert_to_json(@contact, :only => [:name, :age])
|
57
|
+
|
58
|
+
assert_no_match %r{"_id"}, json
|
59
|
+
assert_match %r{"name":"Konata Izumi"}, json
|
60
|
+
assert_match %r{"age":16}, json
|
61
|
+
assert_no_match %r{"awesome"}, json
|
62
|
+
assert_no_match %r{"created_at"}, json
|
63
|
+
assert_no_match %r{"preferences"}, json
|
64
|
+
end
|
65
|
+
|
66
|
+
should "allow attribute filtering with except" do
|
67
|
+
json = convert_to_json(@contact, :except => [:name, :age])
|
68
|
+
|
69
|
+
assert_no_match %r{"_id"}, json
|
70
|
+
assert_no_match %r{"name"}, json
|
71
|
+
assert_no_match %r{"age"}, json
|
72
|
+
assert_match %r{"awesome"}, json
|
73
|
+
assert_match %r{"created_at"}, json
|
74
|
+
assert_match %r{"preferences"}, json
|
75
|
+
end
|
76
|
+
|
77
|
+
context "_id key" do
|
78
|
+
should "not be included by default" do
|
79
|
+
json = convert_to_json(@contact)
|
80
|
+
assert_no_match %r{"_id":}, json
|
81
|
+
end
|
82
|
+
|
83
|
+
should "not be included even if :except is used" do
|
84
|
+
json = convert_to_json(@contact, :except => :name)
|
85
|
+
assert_no_match %r{"_id":}, json
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "id method" do
|
90
|
+
setup do
|
91
|
+
def @contact.label; "Has cheezburger"; end
|
92
|
+
def @contact.favorite_quote; "Constraints are liberating"; end
|
93
|
+
end
|
94
|
+
|
95
|
+
should "be included by default" do
|
96
|
+
json = convert_to_json(@contact)
|
97
|
+
assert_match %r{"id"}, json
|
98
|
+
end
|
99
|
+
|
100
|
+
should "be included when single method included" do
|
101
|
+
json = convert_to_json(@contact, :methods => :label)
|
102
|
+
assert_match %r{"id"}, json
|
103
|
+
assert_match %r{"label":"Has cheezburger"}, json
|
104
|
+
assert_match %r{"name":"Konata Izumi"}, json
|
105
|
+
assert_no_match %r{"favorite_quote":"Constraints are liberating"}, json
|
106
|
+
end
|
107
|
+
|
108
|
+
should "be included when multiple methods included" do
|
109
|
+
json = convert_to_json(@contact, :methods => [:label, :favorite_quote])
|
110
|
+
assert_match %r{"id"}, json
|
111
|
+
assert_match %r{"label":"Has cheezburger"}, json
|
112
|
+
assert_match %r{"favorite_quote":"Constraints are liberating"}, json
|
113
|
+
assert_match %r{"name":"Konata Izumi"}, json
|
114
|
+
end
|
115
|
+
|
116
|
+
should "not be included if :only is present" do
|
117
|
+
json = convert_to_json(@contact, :only => :name)
|
118
|
+
assert_no_match %r{"id":}, json
|
119
|
+
end
|
120
|
+
|
121
|
+
should "be represented by a string" do
|
122
|
+
json = convert_to_json(@contact)
|
123
|
+
assert_match %r{"id":"}, json
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context "including methods" do
|
128
|
+
setup do
|
129
|
+
def @contact.label; "Has cheezburger"; end
|
130
|
+
def @contact.favorite_quote; "Constraints are liberating"; end
|
131
|
+
end
|
132
|
+
|
133
|
+
should "include single method" do
|
134
|
+
json = convert_to_json(@contact, :methods => :label)
|
135
|
+
assert_match %r{"label":"Has cheezburger"}, json
|
136
|
+
end
|
137
|
+
|
138
|
+
should "include multiple methods" do
|
139
|
+
json = convert_to_json(@contact, :only => :name, :methods => [:label, :favorite_quote])
|
140
|
+
assert_match %r{"label":"Has cheezburger"}, json
|
141
|
+
assert_match %r{"favorite_quote":"Constraints are liberating"}, json
|
142
|
+
assert_match %r{"name":"Konata Izumi"}, json
|
143
|
+
assert_no_match %r{"age":16}, json
|
144
|
+
assert_no_match %r{"awesome"}, json
|
145
|
+
assert_no_match %r{"created_at"}, json
|
146
|
+
assert_no_match %r{"preferences"}, json
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context "array of records" do
|
151
|
+
setup do
|
152
|
+
@contacts = [
|
153
|
+
Contact.new(:name => 'David', :age => 39),
|
154
|
+
Contact.new(:name => 'Mary', :age => 14)
|
155
|
+
]
|
156
|
+
end
|
157
|
+
|
158
|
+
should "allow attribute filtering with only" do
|
159
|
+
json =convert_to_json(@contacts, :only => :name)
|
160
|
+
assert_match %r{\{"name":"David"\}}, json
|
161
|
+
assert_match %r{\{"name":"Mary"\}}, json
|
162
|
+
end
|
163
|
+
|
164
|
+
should "allow attribute filtering with except" do
|
165
|
+
json = convert_to_json(@contacts, :except => [:name, :preferences, :awesome, :created_at, :updated_at])
|
166
|
+
assert_match %r{"age":39}, json
|
167
|
+
assert_match %r{"age":14}, json
|
168
|
+
assert_no_match %r{"name":}, json
|
169
|
+
assert_no_match %r{"preferences":}, json
|
170
|
+
assert_no_match %r{"awesome":}, json
|
171
|
+
assert_no_match %r{"created_at":}, json
|
172
|
+
assert_no_match %r{"updated_at":}, json
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
should "allow options for hash of records" do
|
177
|
+
contacts = {
|
178
|
+
1 => Contact.new(:name => 'David', :age => 39),
|
179
|
+
2 => Contact.new(:name => 'Mary', :age => 14)
|
180
|
+
}
|
181
|
+
json = convert_to_json(contacts, :only => [1, :name])
|
182
|
+
assert_match %r{"1":}, json
|
183
|
+
assert_match %r{\{"name":"David"\}}, json
|
184
|
+
assert_no_match %r{"2":}, json
|
185
|
+
end
|
186
|
+
|
187
|
+
should "include embedded attributes" do
|
188
|
+
contact = Contact.new(:name => 'John', :age => 27)
|
189
|
+
contact.tags = [Tag.new(:name => 'awesome'), Tag.new(:name => 'ruby')]
|
190
|
+
json = convert_to_json(contact)
|
191
|
+
assert_match %r{"tags":}, json
|
192
|
+
assert_match %r{"name":"awesome"}, json
|
193
|
+
assert_match %r{"name":"ruby"}, json
|
194
|
+
end
|
195
|
+
|
196
|
+
should "include dynamic attributes" do
|
197
|
+
contact = Contact.new(:name => 'John', :age => 27, :foo => 'bar')
|
198
|
+
contact['smell'] = 'stinky'
|
199
|
+
json = convert_to_json(contact)
|
200
|
+
assert_match %r{"smell":"stinky"}, json
|
201
|
+
end
|
202
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CloneTest < Test::Unit::TestCase
|
4
|
+
context "Document" do
|
5
|
+
setup do
|
6
|
+
@document = Doc()
|
7
|
+
@embedded = EDoc()
|
8
|
+
@document.many :widgets, :class => @embedded
|
9
|
+
@tags = ['red', 'green', 'blue']
|
10
|
+
@doc = @document.create({
|
11
|
+
:name => "foo",
|
12
|
+
:age => 27,
|
13
|
+
:tags => @tags,
|
14
|
+
:widgets => [@embedded.new, @embedded.new],
|
15
|
+
})
|
16
|
+
end
|
17
|
+
|
18
|
+
context "#clone" do
|
19
|
+
should "be new" do
|
20
|
+
@doc.clone.should be_new
|
21
|
+
end
|
22
|
+
|
23
|
+
should "copy the attributes" do
|
24
|
+
clone = @doc.clone
|
25
|
+
clone.name.should == "foo"
|
26
|
+
clone.age.should == 27
|
27
|
+
end
|
28
|
+
|
29
|
+
should "clone duplicable attributes" do
|
30
|
+
@doc.clone.tags.should_not equal(@tags)
|
31
|
+
end
|
32
|
+
|
33
|
+
should "clone many embedded documents" do
|
34
|
+
@doc.clone.widgets.should_not equal(@doc.widgets)
|
35
|
+
end
|
36
|
+
|
37
|
+
should "not be destroyed" do
|
38
|
+
@doc.destroy
|
39
|
+
@doc.clone.should_not be_destroyed
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "EmbeddedDocument" do
|
45
|
+
setup do
|
46
|
+
@document = EDoc do
|
47
|
+
key :name, String
|
48
|
+
key :age, Integer
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "#clone" do
|
53
|
+
should "regenerate the id" do
|
54
|
+
doc = @document.new(:name => "foo", :age => 27)
|
55
|
+
doc_id = doc.id
|
56
|
+
clone = doc.clone
|
57
|
+
clone_id = clone.id
|
58
|
+
clone_id.should_not == doc_id
|
59
|
+
end
|
60
|
+
|
61
|
+
should "copy the attributes" do
|
62
|
+
doc = @document.new(:name => "foo", :age => 27)
|
63
|
+
clone = doc.clone
|
64
|
+
clone.name.should == "foo"
|
65
|
+
clone.age.should == 27
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DescendantAppendsTest < Test::Unit::TestCase
|
4
|
+
context "Document" do
|
5
|
+
should "default descendants to a new set" do
|
6
|
+
MongoMapper::Document.descendants.should be_instance_of(Set)
|
7
|
+
end
|
8
|
+
|
9
|
+
should 'allow extensions to Document to be appended' do
|
10
|
+
module Extension; def test_this_extension; end end
|
11
|
+
MongoMapper::Document.append_extensions(Extension)
|
12
|
+
article = Doc()
|
13
|
+
article.should respond_to(:test_this_extension)
|
14
|
+
end
|
15
|
+
|
16
|
+
should 'add appended extensions to classes that include Document before they are added' do
|
17
|
+
module Extension; def test_this_extension; end end
|
18
|
+
article = Doc()
|
19
|
+
MongoMapper::Document.append_extensions(Extension)
|
20
|
+
article.should respond_to(:test_this_extension)
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'allow inclusions to Document to be appended' do
|
24
|
+
module Inclusion; def test_this_inclusion; end end
|
25
|
+
MongoMapper::Document.append_inclusions(Inclusion)
|
26
|
+
article = Doc()
|
27
|
+
article.new.should respond_to(:test_this_inclusion)
|
28
|
+
end
|
29
|
+
|
30
|
+
should 'add appended inclusions to classes that include Document before they are added' do
|
31
|
+
module Inclusion; def test_this_inclusion; end end
|
32
|
+
article = Doc()
|
33
|
+
MongoMapper::Document.append_inclusions(Inclusion)
|
34
|
+
article.new.should respond_to(:test_this_inclusion)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "EmbeddedDocument" do
|
39
|
+
should "default descendants to a new set" do
|
40
|
+
MongoMapper::EmbeddedDocument.descendants.should be_instance_of(Set)
|
41
|
+
end
|
42
|
+
|
43
|
+
should 'allow extensions to Document to be appended' do
|
44
|
+
module Extension; def test_this_extension; end end
|
45
|
+
MongoMapper::EmbeddedDocument.append_extensions(Extension)
|
46
|
+
article = EDoc()
|
47
|
+
article.should respond_to(:test_this_extension)
|
48
|
+
end
|
49
|
+
|
50
|
+
should 'add appended extensions to classes that include Document before they are added' do
|
51
|
+
module Extension; def test_this_extension; end end
|
52
|
+
article = EDoc()
|
53
|
+
MongoMapper::EmbeddedDocument.append_extensions(Extension)
|
54
|
+
article.should respond_to(:test_this_extension)
|
55
|
+
end
|
56
|
+
|
57
|
+
should 'allow inclusions to Document to be appended' do
|
58
|
+
module Inclusion; def test_this_inclusion; end end
|
59
|
+
MongoMapper::EmbeddedDocument.append_inclusions(Inclusion)
|
60
|
+
article = EDoc()
|
61
|
+
article.new.should respond_to(:test_this_inclusion)
|
62
|
+
end
|
63
|
+
|
64
|
+
should 'add appended inclusions to classes that include Document before they are added' do
|
65
|
+
module Inclusion; def test_this_inclusion; end end
|
66
|
+
article = EDoc()
|
67
|
+
MongoMapper::EmbeddedDocument.append_inclusions(Inclusion)
|
68
|
+
article.new.should respond_to(:test_this_inclusion)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|