mongo_doc 0.3.2 → 0.4.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.
@@ -0,0 +1,230 @@
1
+ require 'spec_helper'
2
+
3
+ describe "MongoDoc::Associations" do
4
+
5
+ context ".embed" do
6
+ class TestDoc
7
+ include MongoDoc::Document
8
+
9
+ embed :sub_doc
10
+ end
11
+
12
+ class SubDoc
13
+ include MongoDoc::Document
14
+
15
+ attr_accessor :data
16
+ end
17
+
18
+ class TestHasOne
19
+ include MongoDoc::Document
20
+
21
+ has_one :sub_doc
22
+ end
23
+
24
+ let(:subdoc) { SubDoc.new }
25
+ let(:doc) { TestDoc.new(:sub_doc => subdoc) }
26
+
27
+ it "uses a proxy" do
28
+ MongoDoc::Associations::DocumentProxy.should === doc.sub_doc
29
+ end
30
+
31
+ it ".has_one is an alias for embed" do
32
+ MongoDoc::Associations::DocumentProxy.should === TestHasOne.new(:sub_doc => SubDoc.new).sub_doc
33
+ end
34
+
35
+ it "sets the subdocuments parent to the proxy" do
36
+ doc.sub_doc.should == subdoc._parent
37
+ end
38
+
39
+ it "set the subdocuments root" do
40
+ doc.should == subdoc._root
41
+ end
42
+
43
+ context "validations" do
44
+ class EmbedValidationTest
45
+ include MongoDoc::Document
46
+
47
+ attr_accessor :data
48
+ validates_presence_of :data
49
+ end
50
+
51
+ it "cascades validations down" do
52
+ invalid = EmbedValidationTest.new
53
+ TestDoc.new(:sub_doc => invalid).should have(1).error_on(:sub_doc)
54
+ end
55
+ end
56
+ end
57
+
58
+ context ".embed_many" do
59
+
60
+ class SubEmbedManyDoc
61
+ include MongoDoc::Document
62
+
63
+ attr_accessor :data
64
+ end
65
+
66
+ class TestEmbedManyDoc
67
+ include MongoDoc::Document
68
+
69
+ embed_many :sub_docs, :class_name => 'SubEmbedManyDoc'
70
+ end
71
+
72
+ class TestEmbedManyDoc2
73
+ include MongoDoc::Document
74
+
75
+ embed_many :sub_docs, :class_name => :sub_embed_many_doc
76
+ end
77
+
78
+ class TestImplicitEmbedManyDoc
79
+ include MongoDoc::Document
80
+
81
+ embed_many :sub_embed_many_docs
82
+ end
83
+
84
+ class TestHasManyDoc
85
+ include MongoDoc::Document
86
+
87
+ has_many :sub_docs, :class_name => 'SubEmbedManyDoc'
88
+ end
89
+
90
+ let(:subdoc) { SubEmbedManyDoc.new }
91
+ let(:doc) { TestEmbedManyDoc.new(:sub_docs => [subdoc]) }
92
+
93
+ it "uses a proxy" do
94
+ MongoDoc::Associations::CollectionProxy.should === TestEmbedManyDoc.new.sub_docs
95
+ end
96
+
97
+ it ".has_many is an alias for .embed_many" do
98
+ MongoDoc::Associations::CollectionProxy.should === TestHasManyDoc.new.sub_docs
99
+ end
100
+
101
+ it "sets the subdocuments parent to the proxy" do
102
+ doc.sub_docs.should == subdoc._parent
103
+ end
104
+
105
+ it "set the subdocuments root to the root" do
106
+ doc.should == subdoc._root
107
+ end
108
+
109
+ it "uses the association name to find the children's class name" do
110
+ TestImplicitEmbedManyDoc.new.sub_embed_many_docs.assoc_class.should == SubEmbedManyDoc
111
+ end
112
+
113
+ it "uses class_name attribute for the children's class name" do
114
+ TestEmbedManyDoc.new.sub_docs.assoc_class.should == SubEmbedManyDoc
115
+ end
116
+
117
+ it "uses class_name attribute for the children's class name" do
118
+ TestEmbedManyDoc2.new.sub_docs.assoc_class.should == SubEmbedManyDoc
119
+ end
120
+
121
+ context "validations" do
122
+ class EmbedManyValidationChild
123
+ include MongoDoc::Document
124
+
125
+ attr_accessor :data
126
+ validates_presence_of :data
127
+ end
128
+
129
+ class EmbedManyValidationTest
130
+ include MongoDoc::Document
131
+
132
+ embed_many :subdocs, :class_name => 'HasManyValidationChild'
133
+ end
134
+
135
+ let(:invalid_child) { EmbedManyValidationChild.new }
136
+ let(:doc) { EmbedManyValidationTest.new(:subdocs => [invalid_child]) }
137
+
138
+ it "cascades validations and marks it in the parent" do
139
+ doc.should have(1).error_on(:subdocs)
140
+ end
141
+
142
+ it "cascades validations and marks it in the child" do
143
+ invalid_child.should have(1).error_on(:data)
144
+ end
145
+
146
+ it "ignores non-document children" do
147
+ EmbedManyValidationTest.new(:subdocs => ['not a doc']).should be_valid
148
+ end
149
+ end
150
+ end
151
+
152
+ context ".embed_hash" do
153
+ class SubEmbedHashDoc
154
+ include MongoDoc::Document
155
+
156
+ attr_accessor :data
157
+ end
158
+
159
+ class TestEmbedHashDoc
160
+ include MongoDoc::Document
161
+
162
+ embed_hash :sub_docs, :class_name => 'SubEmbedHashDoc'
163
+ end
164
+
165
+ class TestImplicitEmbedHashDoc
166
+ include MongoDoc::Document
167
+
168
+ embed_hash :sub_embed_hash_docs
169
+ end
170
+
171
+ class TestHasHashDoc
172
+ include MongoDoc::Document
173
+
174
+ has_hash :sub_embed_hash_docs
175
+ end
176
+
177
+ let(:subdoc) { SubEmbedHashDoc.new }
178
+ let(:doc) { TestEmbedHashDoc.new(:sub_docs => {:key => subdoc}) }
179
+
180
+ it "uses a proxy" do
181
+ MongoDoc::Associations::HashProxy.should === TestEmbedHashDoc.new.sub_docs
182
+ end
183
+
184
+ it ".has_hash is an alias for embed_hash" do
185
+ MongoDoc::Associations::HashProxy.should === TestEmbedHashDoc.new.sub_docs
186
+ end
187
+
188
+ it "sets the subdocuments parent to the proxy" do
189
+ doc.sub_docs.should == subdoc._parent
190
+ end
191
+
192
+ it "set the subdocuments root to the root" do
193
+ doc.should == subdoc._root
194
+ end
195
+
196
+ it "uses the association name to find the children's class name" do
197
+ TestImplicitEmbedHashDoc.new.sub_embed_hash_docs.assoc_class.should == SubEmbedHashDoc
198
+ end
199
+
200
+ context "validations" do
201
+ class EmbedHashValidationChild
202
+ include MongoDoc::Document
203
+
204
+ attr_accessor :data
205
+ validates_presence_of :data
206
+ end
207
+
208
+ class EmbedHashValidationTest
209
+ include MongoDoc::Document
210
+
211
+ embed_hash :subdocs, :class_name => 'EmbedHashValidationChild'
212
+ end
213
+
214
+ let(:invalid_child) { EmbedHashValidationChild.new }
215
+ let(:doc) { EmbedHashValidationTest.new(:subdocs => {:key => invalid_child}) }
216
+
217
+ it "cascades validations and marks it in the parent" do
218
+ doc.should have(1).error_on(:subdocs)
219
+ end
220
+
221
+ it "cascades validations and marks it in the child" do
222
+ invalid_child.should have(1).error_on(:data)
223
+ end
224
+
225
+ it "ignores non-document children" do
226
+ EmbedHashValidationTest.new(:subdocs => {:key => 'data'}).should be_valid
227
+ end
228
+ end
229
+ end
230
+ end
@@ -4,9 +4,9 @@ describe "MongoDoc::Attributes attributes accessor" do
4
4
  class AttributesTest
5
5
  include MongoDoc::Attributes
6
6
 
7
- key :name
8
- key :age
9
- key :birthdate
7
+ attr_accessor :name
8
+ attr_accessor :age
9
+ attr_accessor :birthdate, :type => Date
10
10
  end
11
11
 
12
12
  context "#attributes" do
@@ -11,10 +11,22 @@ describe "MongoDoc::Attributes" do
11
11
  end
12
12
 
13
13
  context ".key" do
14
+ class AttributeAccessorTest
15
+ include MongoDoc::Attributes
16
+
17
+ key :date, :default => Date.today, :type => Date
18
+ end
19
+
20
+ it "is an alias for attr_accessor" do
21
+ AttributeAccessorTest._keys.should include(:date)
22
+ end
23
+ end
24
+
25
+ context ".attr_accessor" do
14
26
  class TestKeys
15
27
  include MongoDoc::Attributes
16
28
 
17
- key :attr1, :attr2
29
+ attr_accessor :attr1, :attr2
18
30
  end
19
31
 
20
32
  it "adds its arguments to _keys" do
@@ -39,7 +51,7 @@ describe "MongoDoc::Attributes" do
39
51
  class TestDefault
40
52
  include MongoDoc::Attributes
41
53
 
42
- key :with_default, :default => 'value'
54
+ attr_accessor :with_default, :default => 'value'
43
55
  end
44
56
 
45
57
  let(:object) { TestDefault.new }
@@ -68,7 +80,7 @@ describe "MongoDoc::Attributes" do
68
80
  class TestType
69
81
  include MongoDoc::Attributes
70
82
 
71
- key :birthdate, :type => Date
83
+ attr_accessor :birthdate, :type => Date
72
84
  end
73
85
 
74
86
  let(:object) { TestType.new }
@@ -97,11 +109,11 @@ describe "MongoDoc::Attributes" do
97
109
  class TestParent
98
110
  include MongoDoc::Attributes
99
111
 
100
- key :parent_attr
112
+ attr_accessor :parent_attr
101
113
  end
102
114
 
103
115
  class TestChild < TestParent
104
- key :child_attr
116
+ attr_accessor :child_attr
105
117
  end
106
118
 
107
119
  it "has its own keys" do
@@ -118,212 +130,16 @@ describe "MongoDoc::Attributes" do
118
130
  end
119
131
  end
120
132
 
121
- context ".has_one" do
122
- class TestDoc
123
- include MongoDoc::Document
124
-
125
- has_one :sub_doc
126
- end
127
-
128
- class SubDoc
129
- include MongoDoc::Document
130
-
131
- key :data
132
- end
133
-
134
- let(:subdoc) { SubDoc.new }
135
- let(:doc) { TestDoc.new(:sub_doc => subdoc) }
136
-
137
- it "uses a proxy" do
138
- MongoDoc::Associations::DocumentProxy.should === doc.sub_doc
139
- end
140
-
141
- it "sets the subdocuments parent to the proxy" do
142
- doc.sub_doc.should == subdoc._parent
143
- end
144
-
145
- it "set the subdocuments root" do
146
- doc.should == subdoc._root
147
- end
148
-
149
- context "validations" do
150
- class HasOneValidationTest
151
- include MongoDoc::Document
152
-
153
- key :data
154
- validates_presence_of :data
155
- end
156
-
157
- it "cascades validations down" do
158
- invalid = HasOneValidationTest.new
159
- TestDoc.new(:sub_doc => invalid).should have(1).error_on(:sub_doc)
160
- end
161
- end
162
- end
163
-
164
133
  context "._attributes" do
165
134
  class TestHasOneDoc
166
135
  include MongoDoc::Document
167
136
 
168
- key :key
169
- has_one :has_one
137
+ attr_accessor :key
138
+ embed :embed
170
139
  end
171
140
 
172
141
  it "is _keys + _associations" do
173
142
  TestHasOneDoc._attributes.should == TestHasOneDoc._keys + TestHasOneDoc._associations
174
143
  end
175
144
  end
176
-
177
- context ".has_many" do
178
-
179
- class SubHasManyDoc
180
- include MongoDoc::Document
181
-
182
- key :data
183
- end
184
-
185
- class TestHasManyDoc
186
- include MongoDoc::Document
187
-
188
- has_many :sub_docs, :class_name => 'SubHasManyDoc'
189
- end
190
-
191
- class TestHasManyDoc2
192
- include MongoDoc::Document
193
-
194
- has_many :sub_docs, :class_name => :sub_has_many_doc
195
- end
196
-
197
- class TestImplicitHasManyDoc
198
- include MongoDoc::Document
199
-
200
- has_many :sub_has_many_docs
201
- end
202
-
203
- let(:subdoc) { SubHasManyDoc.new }
204
- let(:doc) { TestHasManyDoc.new(:sub_docs => [subdoc]) }
205
-
206
- it "uses a proxy" do
207
- MongoDoc::Associations::CollectionProxy.should === TestHasManyDoc.new.sub_docs
208
- end
209
-
210
- it "sets the subdocuments parent to the proxy" do
211
- doc.sub_docs.should == subdoc._parent
212
- end
213
-
214
- it "set the subdocuments root to the root" do
215
- doc.should == subdoc._root
216
- end
217
-
218
- it "uses the association name to find the children's class name" do
219
- TestImplicitHasManyDoc.new.sub_has_many_docs.assoc_class.should == SubHasManyDoc
220
- end
221
-
222
- it "uses class_name attribute for the children's class name" do
223
- TestHasManyDoc.new.sub_docs.assoc_class.should == SubHasManyDoc
224
- end
225
-
226
- it "uses class_name attribute for the children's class name" do
227
- TestHasManyDoc2.new.sub_docs.assoc_class.should == SubHasManyDoc
228
- end
229
-
230
- context "validations" do
231
- class HasManyValidationChild
232
- include MongoDoc::Document
233
-
234
- key :data
235
- validates_presence_of :data
236
- end
237
-
238
- class HasManyValidationTest
239
- include MongoDoc::Document
240
-
241
- has_many :subdocs, :class_name => 'HasManyValidationChild'
242
- end
243
-
244
- let(:invalid_child) { HasManyValidationChild.new }
245
- let(:doc) { HasManyValidationTest.new(:subdocs => [invalid_child]) }
246
-
247
- it "cascades validations and marks it in the parent" do
248
- doc.should have(1).error_on(:subdocs)
249
- end
250
-
251
- it "cascades validations and marks it in the child" do
252
- invalid_child.should have(1).error_on(:data)
253
- end
254
-
255
- it "ignores non-document children" do
256
- HasManyValidationTest.new(:subdocs => ['not a doc']).should be_valid
257
- end
258
- end
259
- end
260
-
261
- context ".has_hash" do
262
- class SubHasHashDoc
263
- include MongoDoc::Document
264
-
265
- key :data
266
- end
267
-
268
- class TestHasHashDoc
269
- include MongoDoc::Document
270
-
271
- has_hash :sub_docs, :class_name => 'SubHasHashDoc'
272
- end
273
-
274
- class TestImplicitHasHashDoc
275
- include MongoDoc::Document
276
-
277
- has_hash :sub_has_hash_docs
278
- end
279
-
280
- let(:subdoc) { SubHasHashDoc.new }
281
- let(:doc) { TestHasHashDoc.new(:sub_docs => {:key => subdoc}) }
282
-
283
- it "uses a proxy" do
284
- MongoDoc::Associations::HashProxy.should === TestHasHashDoc.new.sub_docs
285
- end
286
-
287
- it "sets the subdocuments parent to the proxy" do
288
- doc.sub_docs.should == subdoc._parent
289
- end
290
-
291
- it "set the subdocuments root to the root" do
292
- doc.should == subdoc._root
293
- end
294
-
295
- it "uses the association name to find the children's class name" do
296
- TestImplicitHasHashDoc.new.sub_has_hash_docs.assoc_class.should == SubHasHashDoc
297
- end
298
-
299
- context "validations" do
300
- class HasHashValidationChild
301
- include MongoDoc::Document
302
-
303
- key :data
304
- validates_presence_of :data
305
- end
306
-
307
- class HasHashValidationTest
308
- include MongoDoc::Document
309
-
310
- has_hash :subdocs, :class_name => 'HasHashValidationChild'
311
- end
312
-
313
- let(:invalid_child) { HasHashValidationChild.new }
314
- let(:doc) { HasHashValidationTest.new(:subdocs => {:key => invalid_child}) }
315
-
316
- it "cascades validations and marks it in the parent" do
317
- doc.should have(1).error_on(:subdocs)
318
- end
319
-
320
- it "cascades validations and marks it in the child" do
321
- invalid_child.should have(1).error_on(:data)
322
- end
323
-
324
- it "ignores non-document children" do
325
- HasHashValidationTest.new(:subdocs => {:key => 'data'}).should be_valid
326
- end
327
- end
328
- end
329
145
  end
@@ -6,8 +6,8 @@ describe MongoDoc::Contexts::Enumerable do
6
6
  include MongoDoc::Document
7
7
  include MongoDoc::Matchers
8
8
 
9
- key :number
10
- key :street
9
+ attr_accessor :number
10
+ attr_accessor :street
11
11
  end
12
12
 
13
13
  before do
@@ -6,8 +6,8 @@ describe "MongoDoc::Contexts::Ids" do
6
6
  include MongoDoc::Document
7
7
  include MongoDoc::Matchers
8
8
 
9
- key :number
10
- key :street
9
+ attr_accessor :number
10
+ attr_accessor :street
11
11
  end
12
12
 
13
13
  let(:criteria) { Mongoid::Criteria.new(Address) }
@@ -6,8 +6,8 @@ describe "MongoDoc::Contexts::Mongo" do
6
6
  include MongoDoc::Document
7
7
  include MongoDoc::Matchers
8
8
 
9
- key :number
10
- key :street
9
+ attr_accessor :number
10
+ attr_accessor :street
11
11
  end
12
12
 
13
13
  let(:criteria) { Mongoid::Criteria.new(Address) }
@@ -5,7 +5,7 @@ describe MongoDoc::Contexts do
5
5
  class ContextTest
6
6
  include MongoDoc::Document
7
7
 
8
- has_many :children
8
+ embed_many :children
9
9
  end
10
10
 
11
11
  context ".context_for" do