mongo_doc 0.6.26 → 0.6.27
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.textile +14 -203
- data/Rakefile +0 -134
- data/lib/mongo_doc/collection.rb +4 -0
- data/lib/mongo_doc/finders.rb +1 -0
- data/lib/mongo_doc/timestamps.rb +4 -3
- data/lib/mongo_doc/version.rb +3 -0
- data/lib/mongo_doc.rb +0 -5
- metadata +25 -212
- data/.document +0 -5
- data/.gitignore +0 -8
- data/.rspec +0 -2
- data/.rvmrc +0 -1
- data/.watchr +0 -32
- data/Gemfile +0 -3
- data/Gemfile.lock +0 -72
- data/HISTORY.md +0 -11
- data/VERSION +0 -1
- data/examples/simple_document.rb +0 -46
- data/examples/simple_object.rb +0 -34
- data/features/collections.feature +0 -9
- data/features/connection.feature +0 -13
- data/features/db_references.feature +0 -21
- data/features/embed_hash.feature +0 -16
- data/features/finders.feature +0 -76
- data/features/indexes.feature +0 -28
- data/features/mongodb.yml +0 -7
- data/features/mongodoc_base.feature +0 -128
- data/features/new_record.feature +0 -36
- data/features/partial_updates.feature +0 -95
- data/features/polymorphic_collections.feature +0 -16
- data/features/references.feature +0 -28
- data/features/removing_documents.feature +0 -68
- data/features/saving_an_object.feature +0 -15
- data/features/scopes.feature +0 -66
- data/features/step_definitions/collection_steps.rb +0 -17
- data/features/step_definitions/connection_steps.rb +0 -13
- data/features/step_definitions/document_steps.rb +0 -155
- data/features/step_definitions/documents.rb +0 -61
- data/features/step_definitions/embed_hash_steps.rb +0 -6
- data/features/step_definitions/field_steps.rb +0 -28
- data/features/step_definitions/finder_steps.rb +0 -15
- data/features/step_definitions/index_steps.rb +0 -10
- data/features/step_definitions/json_steps.rb +0 -9
- data/features/step_definitions/object_steps.rb +0 -50
- data/features/step_definitions/objects.rb +0 -24
- data/features/step_definitions/partial_update_steps.rb +0 -31
- data/features/step_definitions/query_steps.rb +0 -69
- data/features/step_definitions/removing_documents_steps.rb +0 -14
- data/features/step_definitions/scope_steps.rb +0 -18
- data/features/step_definitions/string_casting_steps.rb +0 -29
- data/features/step_definitions/util_steps.rb +0 -7
- data/features/string_casting.feature +0 -10
- data/features/support/support.rb +0 -12
- data/features/timestamps.feature +0 -14
- data/features/using_criteria.feature +0 -148
- data/mongo_doc.gemspec +0 -272
- data/mongodb.example.yml +0 -14
- data/perf/mongo_doc_object.rb +0 -83
- data/perf/mongo_document.rb +0 -84
- data/perf/ruby_driver.rb +0 -49
- data/script/console +0 -8
- data/spec/active_model_behavior.rb +0 -64
- data/spec/array_including_argument_matcher.rb +0 -62
- data/spec/associations/collection_proxy_spec.rb +0 -233
- data/spec/associations/document_proxy_spec.rb +0 -45
- data/spec/associations/hash_proxy_spec.rb +0 -181
- data/spec/associations/proxy_base_spec.rb +0 -92
- data/spec/associations_spec.rb +0 -218
- data/spec/attributes_accessor_spec.rb +0 -39
- data/spec/attributes_spec.rb +0 -184
- data/spec/bson_matchers.rb +0 -54
- data/spec/bson_spec.rb +0 -196
- data/spec/collection_spec.rb +0 -169
- data/spec/connection_spec.rb +0 -169
- data/spec/contexts/ids_spec.rb +0 -49
- data/spec/contexts/mongo_spec.rb +0 -241
- data/spec/contexts_spec.rb +0 -56
- data/spec/criteria/optional_spec.rb +0 -26
- data/spec/criteria_spec.rb +0 -73
- data/spec/cursor_spec.rb +0 -91
- data/spec/database_cleaner_spec.rb +0 -24
- data/spec/document_ext.rb +0 -9
- data/spec/document_spec.rb +0 -569
- data/spec/embedded_save_spec.rb +0 -73
- data/spec/ext_spec.rb +0 -100
- data/spec/finders_spec.rb +0 -61
- data/spec/hash_matchers.rb +0 -29
- data/spec/index_spec.rb +0 -79
- data/spec/matchers_spec.rb +0 -342
- data/spec/mongodb.yml +0 -6
- data/spec/mongodb_pairs.yml +0 -8
- data/spec/new_record_spec.rb +0 -128
- data/spec/polymorphic_collection_spec.rb +0 -47
- data/spec/references_many_spec.rb +0 -214
- data/spec/references_spec.rb +0 -121
- data/spec/root_spec.rb +0 -41
- data/spec/scope_spec.rb +0 -88
- data/spec/spec_helper.rb +0 -16
- data/spec/timestamps_spec.rb +0 -154
- data/spec/update_spec.rb +0 -167
- data/spec/validations_spec.rb +0 -30
data/spec/associations_spec.rb
DELETED
@@ -1,218 +0,0 @@
|
|
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 "set the subdocuments root" do
|
36
|
-
doc.should == subdoc._root
|
37
|
-
end
|
38
|
-
|
39
|
-
context "validations" do
|
40
|
-
class EmbedValidationTest
|
41
|
-
include MongoDoc::Document
|
42
|
-
|
43
|
-
attr_accessor :data
|
44
|
-
validates_presence_of :data
|
45
|
-
end
|
46
|
-
|
47
|
-
it "cascades validations down" do
|
48
|
-
invalid = EmbedValidationTest.new
|
49
|
-
TestDoc.new(:sub_doc => invalid).should have(1).error_on(:sub_doc)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
context ".embed_many" do
|
55
|
-
|
56
|
-
class SubEmbedManyDoc
|
57
|
-
include MongoDoc::Document
|
58
|
-
|
59
|
-
attr_accessor :data
|
60
|
-
end
|
61
|
-
|
62
|
-
class TestEmbedManyDoc
|
63
|
-
include MongoDoc::Document
|
64
|
-
|
65
|
-
embed_many :sub_docs, :class_name => 'SubEmbedManyDoc'
|
66
|
-
end
|
67
|
-
|
68
|
-
class TestEmbedManyDoc2
|
69
|
-
include MongoDoc::Document
|
70
|
-
|
71
|
-
embed_many :sub_docs, :class_name => :sub_embed_many_doc
|
72
|
-
end
|
73
|
-
|
74
|
-
class TestImplicitEmbedManyDoc
|
75
|
-
include MongoDoc::Document
|
76
|
-
|
77
|
-
embed_many :sub_embed_many_docs
|
78
|
-
end
|
79
|
-
|
80
|
-
class TestHasManyDoc
|
81
|
-
include MongoDoc::Document
|
82
|
-
|
83
|
-
has_many :sub_docs, :class_name => 'SubEmbedManyDoc'
|
84
|
-
end
|
85
|
-
|
86
|
-
let(:subdoc) { SubEmbedManyDoc.new }
|
87
|
-
let(:doc) { TestEmbedManyDoc.new(:sub_docs => [subdoc]) }
|
88
|
-
|
89
|
-
it "uses a proxy" do
|
90
|
-
MongoDoc::Associations::CollectionProxy.should === TestEmbedManyDoc.new.sub_docs
|
91
|
-
end
|
92
|
-
|
93
|
-
it ".has_many is an alias for .embed_many" do
|
94
|
-
MongoDoc::Associations::CollectionProxy.should === TestHasManyDoc.new.sub_docs
|
95
|
-
end
|
96
|
-
|
97
|
-
it "set the subdocuments root to the root" do
|
98
|
-
doc.should == subdoc._root
|
99
|
-
end
|
100
|
-
|
101
|
-
it "uses the association name to find the children's class name" do
|
102
|
-
TestImplicitEmbedManyDoc.new.sub_embed_many_docs._assoc_class.should == SubEmbedManyDoc
|
103
|
-
end
|
104
|
-
|
105
|
-
it "uses class_name attribute for the children's class name" do
|
106
|
-
TestEmbedManyDoc.new.sub_docs._assoc_class.should == SubEmbedManyDoc
|
107
|
-
end
|
108
|
-
|
109
|
-
it "uses class_name attribute for the children's class name" do
|
110
|
-
TestEmbedManyDoc2.new.sub_docs._assoc_class.should == SubEmbedManyDoc
|
111
|
-
end
|
112
|
-
|
113
|
-
context "validations" do
|
114
|
-
class EmbedManyValidationChild
|
115
|
-
include MongoDoc::Document
|
116
|
-
|
117
|
-
attr_accessor :data
|
118
|
-
validates_presence_of :data
|
119
|
-
end
|
120
|
-
|
121
|
-
class EmbedManyValidationTest
|
122
|
-
include MongoDoc::Document
|
123
|
-
|
124
|
-
embed_many :subdocs, :class_name => 'HasManyValidationChild'
|
125
|
-
end
|
126
|
-
|
127
|
-
let(:invalid_child) { EmbedManyValidationChild.new }
|
128
|
-
let(:doc) { EmbedManyValidationTest.new(:subdocs => [invalid_child]) }
|
129
|
-
|
130
|
-
it "cascades validations and marks it in the parent" do
|
131
|
-
doc.should have(1).error_on(:subdocs)
|
132
|
-
end
|
133
|
-
|
134
|
-
it "cascades validations and marks it in the child" do
|
135
|
-
invalid_child.should have(1).error_on(:data)
|
136
|
-
end
|
137
|
-
|
138
|
-
it "ignores non-document children" do
|
139
|
-
EmbedManyValidationTest.new(:subdocs => ['not a doc']).should be_valid
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
context ".embed_hash" do
|
145
|
-
class SubEmbedHashDoc
|
146
|
-
include MongoDoc::Document
|
147
|
-
|
148
|
-
attr_accessor :data
|
149
|
-
end
|
150
|
-
|
151
|
-
class TestEmbedHashDoc
|
152
|
-
include MongoDoc::Document
|
153
|
-
|
154
|
-
embed_hash :sub_docs, :class_name => 'SubEmbedHashDoc'
|
155
|
-
end
|
156
|
-
|
157
|
-
class TestImplicitEmbedHashDoc
|
158
|
-
include MongoDoc::Document
|
159
|
-
|
160
|
-
embed_hash :sub_embed_hash_docs
|
161
|
-
end
|
162
|
-
|
163
|
-
class TestHasHashDoc
|
164
|
-
include MongoDoc::Document
|
165
|
-
|
166
|
-
has_hash :sub_embed_hash_docs
|
167
|
-
end
|
168
|
-
|
169
|
-
let(:subdoc) { SubEmbedHashDoc.new }
|
170
|
-
let(:doc) { TestEmbedHashDoc.new(:sub_docs => {:key => subdoc}) }
|
171
|
-
|
172
|
-
it "uses a proxy" do
|
173
|
-
MongoDoc::Associations::HashProxy.should === TestEmbedHashDoc.new.sub_docs
|
174
|
-
end
|
175
|
-
|
176
|
-
it ".has_hash is an alias for embed_hash" do
|
177
|
-
MongoDoc::Associations::HashProxy.should === TestEmbedHashDoc.new.sub_docs
|
178
|
-
end
|
179
|
-
|
180
|
-
it "set the subdocuments root to the root" do
|
181
|
-
doc.should == subdoc._root
|
182
|
-
end
|
183
|
-
|
184
|
-
it "uses the association name to find the children's class name" do
|
185
|
-
TestImplicitEmbedHashDoc.new.sub_embed_hash_docs._assoc_class.should == SubEmbedHashDoc
|
186
|
-
end
|
187
|
-
|
188
|
-
context "validations" do
|
189
|
-
class EmbedHashValidationChild
|
190
|
-
include MongoDoc::Document
|
191
|
-
|
192
|
-
attr_accessor :data
|
193
|
-
validates_presence_of :data
|
194
|
-
end
|
195
|
-
|
196
|
-
class EmbedHashValidationTest
|
197
|
-
include MongoDoc::Document
|
198
|
-
|
199
|
-
embed_hash :subdocs, :class_name => 'EmbedHashValidationChild'
|
200
|
-
end
|
201
|
-
|
202
|
-
let(:invalid_child) { EmbedHashValidationChild.new }
|
203
|
-
let(:doc) { EmbedHashValidationTest.new(:subdocs => {:key => invalid_child}) }
|
204
|
-
|
205
|
-
it "cascades validations and marks it in the parent" do
|
206
|
-
doc.should have(1).error_on(:subdocs)
|
207
|
-
end
|
208
|
-
|
209
|
-
it "cascades validations and marks it in the child" do
|
210
|
-
invalid_child.should have(1).error_on(:data)
|
211
|
-
end
|
212
|
-
|
213
|
-
it "ignores non-document children" do
|
214
|
-
EmbedHashValidationTest.new(:subdocs => {:key => 'data'}).should be_valid
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
218
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "MongoDoc::Attributes attributes accessor" do
|
4
|
-
class AttributesTest
|
5
|
-
include MongoDoc::Attributes
|
6
|
-
|
7
|
-
attr_accessor :name
|
8
|
-
attr_accessor :age
|
9
|
-
attr_accessor :birthdate, :type => Date
|
10
|
-
end
|
11
|
-
|
12
|
-
context "#attributes" do
|
13
|
-
subject do
|
14
|
-
AttributesTest.new.attributes
|
15
|
-
end
|
16
|
-
|
17
|
-
it "returns a hash of the given attributes" do
|
18
|
-
should have_key(:name)
|
19
|
-
should have_key(:age)
|
20
|
-
should have_key(:birthdate)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
context "#attributes=" do
|
25
|
-
let(:object) { AttributesTest.new }
|
26
|
-
|
27
|
-
it "sets attributes from a hash" do
|
28
|
-
name = 'name'
|
29
|
-
object.attributes = {:name => name}
|
30
|
-
object.name.should == name
|
31
|
-
end
|
32
|
-
|
33
|
-
it "ignores a nil" do
|
34
|
-
expect do
|
35
|
-
object.attributes = nil
|
36
|
-
end.should_not raise_error
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/spec/attributes_spec.rb
DELETED
@@ -1,184 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "MongoDoc::Attributes" do
|
4
|
-
class AttributesTest
|
5
|
-
include MongoDoc::Attributes
|
6
|
-
end
|
7
|
-
|
8
|
-
it "defines _id attribute" do
|
9
|
-
AttributesTest.new.should respond_to(:_id)
|
10
|
-
AttributesTest.new.should respond_to(:_id=)
|
11
|
-
end
|
12
|
-
|
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
|
26
|
-
class TestKeys
|
27
|
-
include MongoDoc::Attributes
|
28
|
-
|
29
|
-
attr_accessor :attr1, :attr2
|
30
|
-
attr_accessor :validation_context
|
31
|
-
attr_accessor :boolean, :type => Boolean
|
32
|
-
end
|
33
|
-
|
34
|
-
it "adds its arguments to _keys" do
|
35
|
-
TestKeys._keys.should include(:attr1, :attr2)
|
36
|
-
end
|
37
|
-
|
38
|
-
context "the :validation_context attribute from ActiveModel" do
|
39
|
-
|
40
|
-
it "is an attribute" do
|
41
|
-
TestKeys.new.should respond_to(:validation_context)
|
42
|
-
TestKeys.new.should respond_to(:validation_context=)
|
43
|
-
end
|
44
|
-
|
45
|
-
it "is not in _keys" do
|
46
|
-
TestKeys._keys.should_not include(:validation_context)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe "accessors" do
|
51
|
-
subject do
|
52
|
-
TestKeys.new
|
53
|
-
end
|
54
|
-
|
55
|
-
it "has an attr1 reader" do
|
56
|
-
should respond_to(:attr1)
|
57
|
-
end
|
58
|
-
|
59
|
-
it "has an attr1 writer" do
|
60
|
-
should respond_to(:attr1=)
|
61
|
-
end
|
62
|
-
|
63
|
-
it "has a reader for a boolean" do
|
64
|
-
should respond_to(:boolean)
|
65
|
-
end
|
66
|
-
|
67
|
-
it "has a ? reader for a boolean" do
|
68
|
-
should respond_to(:boolean?)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
context "default values" do
|
73
|
-
class TestDefault
|
74
|
-
include MongoDoc::Attributes
|
75
|
-
|
76
|
-
attr_accessor :with_default, :default => 'value'
|
77
|
-
attr_accessor :boolean_default, :type => Boolean, :default => false
|
78
|
-
end
|
79
|
-
|
80
|
-
let(:object) { TestDefault.new }
|
81
|
-
|
82
|
-
it "uses the default value" do
|
83
|
-
object.with_default.should == 'value'
|
84
|
-
end
|
85
|
-
|
86
|
-
it "only uses the default value once" do
|
87
|
-
object.with_default.should == 'value'
|
88
|
-
class << object
|
89
|
-
def _default_with_default
|
90
|
-
'other value'
|
91
|
-
end
|
92
|
-
end
|
93
|
-
object.with_default.should == 'value'
|
94
|
-
end
|
95
|
-
|
96
|
-
it "does not set the default value if the setter is invoked first" do
|
97
|
-
object.with_default = nil
|
98
|
-
object.with_default.should be_nil
|
99
|
-
end
|
100
|
-
|
101
|
-
it "allows a false default for booleans" do
|
102
|
-
object.boolean_default.should == false
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
context "specified type" do
|
107
|
-
class TestType
|
108
|
-
include MongoDoc::Attributes
|
109
|
-
|
110
|
-
attr_accessor :birthdate, :type => Date
|
111
|
-
end
|
112
|
-
|
113
|
-
let(:object) { TestType.new }
|
114
|
-
|
115
|
-
it "does not call Type.cast_from_string when the set value is not a string" do
|
116
|
-
Date.should_not_receive :cast_from_string
|
117
|
-
object.birthdate = Date.today
|
118
|
-
end
|
119
|
-
|
120
|
-
context "when the accessor is set with a string" do
|
121
|
-
let(:date) { Date.today }
|
122
|
-
|
123
|
-
it "delegates to Type.cast_from_string to set the value" do
|
124
|
-
Date.should_receive(:cast_from_string).with(date.to_s)
|
125
|
-
object.birthdate = date.to_s
|
126
|
-
end
|
127
|
-
|
128
|
-
it "sets the value to the result of the cast" do
|
129
|
-
object.birthdate = date.to_s
|
130
|
-
object.birthdate.should == date
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
context "when a namespace collision exists" do
|
135
|
-
class TestType
|
136
|
-
attr_accessor :bson_id, :type => ::BSON::ObjectID
|
137
|
-
end
|
138
|
-
|
139
|
-
let(:bson_id) { ::BSON::ObjectID.new }
|
140
|
-
it "sets the value to the result of the cast" do
|
141
|
-
object.bson_id = bson_id.to_s
|
142
|
-
object.bson_id.should == bson_id
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
describe "used with inheritance" do
|
148
|
-
class TestParent
|
149
|
-
include MongoDoc::Attributes
|
150
|
-
|
151
|
-
attr_accessor :parent_attr
|
152
|
-
end
|
153
|
-
|
154
|
-
class TestChild < TestParent
|
155
|
-
attr_accessor :child_attr
|
156
|
-
end
|
157
|
-
|
158
|
-
it "has its own keys" do
|
159
|
-
TestChild._keys.should include(:child_attr)
|
160
|
-
end
|
161
|
-
|
162
|
-
it "has the keys from the parent class" do
|
163
|
-
TestChild._keys.should include(*TestParent._keys)
|
164
|
-
end
|
165
|
-
|
166
|
-
it "does not add keys to the parent class" do
|
167
|
-
TestParent._keys.should_not include(:child_attr)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
context "._attributes" do
|
173
|
-
class TestHasOneDoc
|
174
|
-
include MongoDoc::Document
|
175
|
-
|
176
|
-
attr_accessor :key
|
177
|
-
embed :embed
|
178
|
-
end
|
179
|
-
|
180
|
-
it "is _keys + _associations" do
|
181
|
-
TestHasOneDoc._attributes.should == TestHasOneDoc._keys + TestHasOneDoc._associations
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
data/spec/bson_matchers.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
module BsonMatchers
|
2
|
-
class BeBsonEql
|
3
|
-
def initialize(expected)
|
4
|
-
@expected = expected
|
5
|
-
end
|
6
|
-
|
7
|
-
def matches?(target)
|
8
|
-
@target = target
|
9
|
-
@target == @expected
|
10
|
-
end
|
11
|
-
|
12
|
-
def failure_message
|
13
|
-
"expected\...#{@target.inspect}\n" +
|
14
|
-
"to be BSON code equivalent to\...#{@expected.inspect}\n" +
|
15
|
-
"Difference:\...#{@expected.diff(@target).inspect}"
|
16
|
-
end
|
17
|
-
|
18
|
-
def negative_failure_message
|
19
|
-
"expected\...#{@target.inspect}\n" +
|
20
|
-
"to be BSON code different from\...#{@expected.inspect}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class BeMongoEql
|
25
|
-
def initialize(expected, include_id)
|
26
|
-
@include_id = include_id
|
27
|
-
@expected = include_id ? expected : expected.except('_id')
|
28
|
-
end
|
29
|
-
|
30
|
-
def matches?(target)
|
31
|
-
@target = @include_id ? target : target.except('_id')
|
32
|
-
@target == @expected
|
33
|
-
end
|
34
|
-
|
35
|
-
def failure_message
|
36
|
-
"expected\...#{@target.inspect}\n" +
|
37
|
-
"to be BSON code equivalent to\...#{@expected.inspect}\n" +
|
38
|
-
"Difference:\...#{@expected.diff(@target).inspect}"
|
39
|
-
end
|
40
|
-
|
41
|
-
def negative_failure_message
|
42
|
-
"expected\...#{@target.inspect}\n" +
|
43
|
-
"to be BSON code different from\...#{@expected.inspect}"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def be_bson_eql(expected)
|
48
|
-
BeBsonEql.new(expected)
|
49
|
-
end
|
50
|
-
|
51
|
-
def be_mongo_eql(expected, include_id = true)
|
52
|
-
BeMongoEql.new(expected, include_id)
|
53
|
-
end
|
54
|
-
end
|
data/spec/bson_spec.rb
DELETED
@@ -1,196 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "BSON for Mongo (BSON)" do
|
4
|
-
describe "#decode" do
|
5
|
-
it "just returns the json if the :raw_json option is used" do
|
6
|
-
hash = {}
|
7
|
-
MongoDoc::BSON.should_not_receive(:bson_create)
|
8
|
-
MongoDoc::BSON.decode(hash, :raw_json => true).should == hash
|
9
|
-
end
|
10
|
-
|
11
|
-
it "calls bson_create if parameter is a hash" do
|
12
|
-
hash = {}
|
13
|
-
options = {:option => true}
|
14
|
-
MongoDoc::BSON.should_receive(:bson_create).with(hash, options)
|
15
|
-
MongoDoc::BSON.decode(hash, options)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "if parameter is an array, it calls array_create" do
|
19
|
-
array = []
|
20
|
-
options = {:option => true}
|
21
|
-
MongoDoc::BSON.should_receive(:array_create).with(array, options)
|
22
|
-
MongoDoc::BSON.decode(array, options)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "returns the json value as is if the parameter is not a hash or array" do
|
26
|
-
["", 1, 1.5, true, false, nil].each do |type_value|
|
27
|
-
MongoDoc::BSON.decode(type_value).should == type_value
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe "#array_create" do
|
33
|
-
it "calls decode for each element" do
|
34
|
-
first = 1
|
35
|
-
array = [first]
|
36
|
-
options = {:option => true}
|
37
|
-
MongoDoc::BSON.should_receive(:decode).with(first, options)
|
38
|
-
MongoDoc::BSON.array_create(array, options)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "just returns the array if the :raw_json option is used" do
|
42
|
-
hash = {'key' => 'value', MongoDoc::BSON::CLASS_KEY => 'Date'}
|
43
|
-
array = [hash]
|
44
|
-
MongoDoc::BSON.should_not_receive(:decode)
|
45
|
-
MongoDoc::BSON.array_create(array, :raw_json => true).should == array
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe "#bson_create" do
|
50
|
-
it "leaves a simple hash intact" do
|
51
|
-
hash = {}
|
52
|
-
MongoDoc::BSON.bson_create(hash).should == hash
|
53
|
-
end
|
54
|
-
|
55
|
-
it "a class hash extracts the class, and calls class.bson_create" do
|
56
|
-
base_hash = {'key' => 'value'}
|
57
|
-
bson_hash = base_hash.merge(MongoDoc::BSON::CLASS_KEY => 'Date')
|
58
|
-
Date.should_receive(:bson_create).with(base_hash, {})
|
59
|
-
MongoDoc::BSON.bson_create(bson_hash)
|
60
|
-
end
|
61
|
-
|
62
|
-
it "ignores a class hash when the :raw_json option is used" do
|
63
|
-
hash = {'key' => 'value', MongoDoc::BSON::CLASS_KEY => 'Date'}
|
64
|
-
MongoDoc::BSON.bson_create(hash, :raw_json => true).should == hash
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe "Hash" do
|
69
|
-
it "#to_bson returns the hash" do
|
70
|
-
hash = {'key' => 1}
|
71
|
-
hash.to_bson.should == hash
|
72
|
-
end
|
73
|
-
|
74
|
-
it "#to_bson returns the hash with symbol keys as strings" do
|
75
|
-
{:key => 1}.to_bson.should == {"key" => 1}
|
76
|
-
end
|
77
|
-
|
78
|
-
it "decodes to a hash" do
|
79
|
-
hash = {'key' => 1}
|
80
|
-
MongoDoc::BSON.decode(hash.to_bson).should == hash
|
81
|
-
end
|
82
|
-
|
83
|
-
it "decodes the values of the hash" do
|
84
|
-
hash = {'key' => {'subkey' => Date.today}}
|
85
|
-
MongoDoc::BSON.decode(hash.to_bson).should == hash
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
describe "Array" do
|
90
|
-
it "#to_bson returns the array" do
|
91
|
-
array = ['string', 1]
|
92
|
-
array.to_bson.should == array
|
93
|
-
end
|
94
|
-
|
95
|
-
it "#to_bson iterates over its elements" do
|
96
|
-
array = []
|
97
|
-
array.should_receive(:map)
|
98
|
-
array.to_bson
|
99
|
-
end
|
100
|
-
|
101
|
-
it "decodes to an array" do
|
102
|
-
array = ['string', 1]
|
103
|
-
MongoDoc::BSON.decode(array.to_bson).should == array
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
describe "Extensions to core classes" do
|
108
|
-
it "#to_bson for objects that are BSON native return themselves" do
|
109
|
-
[true, false, nil, 1.0, 1, /regexp/, 'string', :symbol, Time.now].each do |native|
|
110
|
-
native.to_bson.should == native
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
it "objects that are BSON native decode to themselves" do
|
115
|
-
[true, false, nil, 1.0, 1, /regexp/, 'string', :symbol, Time.now].each do |native|
|
116
|
-
hash = {'native' => native}
|
117
|
-
MongoDoc::BSON.decode(hash.to_bson).should == hash
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
it "Date#to_bson returns a date hash" do
|
122
|
-
date = Date.today
|
123
|
-
date.to_bson.should == {MongoDoc::BSON::CLASS_KEY => "Date", "dt" => date.strftime, "sg" => date.respond_to?(:start) ? date.start : date.sg}
|
124
|
-
end
|
125
|
-
|
126
|
-
it "roundtrips Date" do
|
127
|
-
date = Date.today
|
128
|
-
MongoDoc::BSON.decode(date.to_bson).should == date
|
129
|
-
end
|
130
|
-
|
131
|
-
it "DateTime#to_bson returns a datetime hash" do
|
132
|
-
datetime = DateTime.now
|
133
|
-
datetime.to_bson.should == {MongoDoc::BSON::CLASS_KEY => "DateTime", "dt" => datetime.strftime, "sg" => datetime.respond_to?(:start) ? datetime.start : datetime.sg}
|
134
|
-
end
|
135
|
-
|
136
|
-
it "roundtrips DateTime" do
|
137
|
-
datetime = DateTime.now
|
138
|
-
MongoDoc::BSON.decode(datetime.to_bson).to_s.should == datetime.to_s
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
describe "Mongo Classes" do
|
143
|
-
[BSON::ObjectID.new, BSON::DBRef.new('ns', 1), BSON::Code.new('code'), BSON::Binary.new, BSON::MinKey.new, BSON::MaxKey.new].each do |obj|
|
144
|
-
it "#to_bson for #{obj.class.name} returns self" do
|
145
|
-
obj.to_bson.should == obj
|
146
|
-
end
|
147
|
-
|
148
|
-
it "objects of type #{obj.class.name} decode to themselves" do
|
149
|
-
hash = {"mongo" => obj}
|
150
|
-
MongoDoc::BSON.decode(hash.to_bson)["mongo"].should == obj
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
describe "Extensions to Object" do
|
156
|
-
class Simple
|
157
|
-
attr_accessor :value
|
158
|
-
end
|
159
|
-
|
160
|
-
class Contained
|
161
|
-
attr_accessor :array_of_simple
|
162
|
-
end
|
163
|
-
|
164
|
-
before do
|
165
|
-
@value1 = 'value1'
|
166
|
-
@simple1 = Simple.new
|
167
|
-
@simple1.value = @value1
|
168
|
-
@value2 = 'value2'
|
169
|
-
@simple2 = Simple.new
|
170
|
-
@simple2.value = @value2
|
171
|
-
@complex = Contained.new
|
172
|
-
@complex.array_of_simple = [@simple1, @simple2]
|
173
|
-
end
|
174
|
-
|
175
|
-
it "renders a json representation of a simple object" do
|
176
|
-
@simple1.to_bson.should be_bson_eql({MongoDoc::BSON::CLASS_KEY => Simple.name, "value" => @value1})
|
177
|
-
end
|
178
|
-
|
179
|
-
it "renders a json representation of an object with embedded objects" do
|
180
|
-
@complex.to_bson.should be_bson_eql({MongoDoc::BSON::CLASS_KEY => Contained.name, "array_of_simple" => [@simple1.to_bson, @simple2.to_bson]})
|
181
|
-
end
|
182
|
-
|
183
|
-
it "ignores a class hash when the :raw_json option is used" do
|
184
|
-
Contained.bson_create(@complex.to_bson.except(MongoDoc::BSON::CLASS_KEY), :raw_json => true).array_of_simple.first.should == @simple1.to_bson
|
185
|
-
end
|
186
|
-
|
187
|
-
it "roundtrips the object" do
|
188
|
-
MongoDoc::BSON.decode(@complex.to_bson).should be_kind_of(Contained)
|
189
|
-
end
|
190
|
-
|
191
|
-
it "allows for embedded arrays of objects" do
|
192
|
-
obj = MongoDoc::BSON.decode(@complex.to_bson)
|
193
|
-
obj.array_of_simple.each {|o| o.should be_kind_of(Simple)}
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|