lookout-mongo_mapper 0.11.3
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/LICENSE +20 -0
- data/README.rdoc +33 -0
- data/UPGRADES +26 -0
- data/bin/mmconsole +59 -0
- data/examples/attr_accessible.rb +22 -0
- data/examples/attr_protected.rb +22 -0
- data/examples/cache_key.rb +24 -0
- data/examples/custom_types.rb +24 -0
- data/examples/identity_map.rb +33 -0
- data/examples/identity_map/automatic.rb +2 -0
- data/examples/keys.rb +40 -0
- data/examples/modifiers/set.rb +25 -0
- data/examples/plugins.rb +38 -0
- data/examples/querying.rb +35 -0
- data/examples/safe.rb +43 -0
- data/examples/scopes.rb +52 -0
- data/examples/validating/embedded_docs.rb +29 -0
- data/lib/mongo_mapper.rb +94 -0
- data/lib/mongo_mapper/connection.rb +96 -0
- data/lib/mongo_mapper/document.rb +42 -0
- data/lib/mongo_mapper/embedded_document.rb +32 -0
- 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 +26 -0
- data/lib/mongo_mapper/extensions/object_id.rb +32 -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 +28 -0
- data/lib/mongo_mapper/locale/en.yml +5 -0
- data/lib/mongo_mapper/middleware/identity_map.rb +16 -0
- data/lib/mongo_mapper/plugins.rb +22 -0
- data/lib/mongo_mapper/plugins/accessible.rb +52 -0
- data/lib/mongo_mapper/plugins/active_model.rb +18 -0
- data/lib/mongo_mapper/plugins/associations.rb +90 -0
- data/lib/mongo_mapper/plugins/associations/base.rb +92 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +54 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +34 -0
- data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +52 -0
- data/lib/mongo_mapper/plugins/associations/collection.rb +27 -0
- data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +44 -0
- data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +133 -0
- data/lib/mongo_mapper/plugins/associations/many_association.rb +63 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +28 -0
- data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +118 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +32 -0
- data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +24 -0
- data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +14 -0
- data/lib/mongo_mapper/plugins/associations/one_as_proxy.rb +22 -0
- data/lib/mongo_mapper/plugins/associations/one_association.rb +48 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +30 -0
- data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +44 -0
- data/lib/mongo_mapper/plugins/associations/one_proxy.rb +95 -0
- data/lib/mongo_mapper/plugins/associations/proxy.rb +134 -0
- data/lib/mongo_mapper/plugins/associations/single_association.rb +46 -0
- data/lib/mongo_mapper/plugins/caching.rb +21 -0
- data/lib/mongo_mapper/plugins/callbacks.rb +29 -0
- data/lib/mongo_mapper/plugins/clone.rb +22 -0
- data/lib/mongo_mapper/plugins/dirty.rb +60 -0
- data/lib/mongo_mapper/plugins/document.rb +41 -0
- data/lib/mongo_mapper/plugins/dynamic_querying.rb +45 -0
- data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +44 -0
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +56 -0
- data/lib/mongo_mapper/plugins/embedded_document.rb +53 -0
- data/lib/mongo_mapper/plugins/equality.rb +23 -0
- data/lib/mongo_mapper/plugins/identity_map.rb +128 -0
- data/lib/mongo_mapper/plugins/indexes.rb +13 -0
- data/lib/mongo_mapper/plugins/inspect.rb +16 -0
- data/lib/mongo_mapper/plugins/keys.rb +313 -0
- data/lib/mongo_mapper/plugins/keys/key.rb +61 -0
- data/lib/mongo_mapper/plugins/logger.rb +18 -0
- data/lib/mongo_mapper/plugins/modifiers.rb +134 -0
- data/lib/mongo_mapper/plugins/pagination.rb +16 -0
- data/lib/mongo_mapper/plugins/persistence.rb +69 -0
- data/lib/mongo_mapper/plugins/protected.rb +45 -0
- data/lib/mongo_mapper/plugins/querying.rb +165 -0
- data/lib/mongo_mapper/plugins/querying/decorator.rb +36 -0
- data/lib/mongo_mapper/plugins/rails.rb +58 -0
- data/lib/mongo_mapper/plugins/rails/active_record_association_adapter.rb +33 -0
- data/lib/mongo_mapper/plugins/safe.rb +28 -0
- data/lib/mongo_mapper/plugins/sci.rb +36 -0
- data/lib/mongo_mapper/plugins/scopes.rb +27 -0
- data/lib/mongo_mapper/plugins/serialization.rb +109 -0
- data/lib/mongo_mapper/plugins/timestamps.rb +22 -0
- data/lib/mongo_mapper/plugins/touch.rb +18 -0
- data/lib/mongo_mapper/plugins/userstamps.rb +18 -0
- data/lib/mongo_mapper/plugins/validations.rb +86 -0
- data/lib/mongo_mapper/railtie.rb +48 -0
- data/lib/mongo_mapper/railtie/database.rake +65 -0
- data/lib/mongo_mapper/translation.rb +10 -0
- data/lib/mongo_mapper/version.rb +4 -0
- data/lib/rails/generators/mongo_mapper/config/config_generator.rb +24 -0
- data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +18 -0
- data/lib/rails/generators/mongo_mapper/model/model_generator.rb +23 -0
- data/lib/rails/generators/mongo_mapper/model/templates/model.rb +13 -0
- data/test/_NOTE_ON_TESTING +1 -0
- data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +64 -0
- data/test/functional/associations/test_belongs_to_proxy.rb +238 -0
- data/test/functional/associations/test_in_array_proxy.rb +349 -0
- data/test/functional/associations/test_many_documents_as_proxy.rb +231 -0
- data/test/functional/associations/test_many_documents_proxy.rb +866 -0
- data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +239 -0
- data/test/functional/associations/test_many_embedded_proxy.rb +289 -0
- data/test/functional/associations/test_many_polymorphic_proxy.rb +303 -0
- data/test/functional/associations/test_one_as_proxy.rb +491 -0
- data/test/functional/associations/test_one_embedded_polymorphic_proxy.rb +208 -0
- data/test/functional/associations/test_one_embedded_proxy.rb +100 -0
- data/test/functional/associations/test_one_proxy.rb +383 -0
- data/test/functional/test_accessible.rb +198 -0
- data/test/functional/test_associations.rb +46 -0
- data/test/functional/test_binary.rb +27 -0
- data/test/functional/test_caching.rb +77 -0
- data/test/functional/test_callbacks.rb +232 -0
- data/test/functional/test_dirty.rb +301 -0
- data/test/functional/test_document.rb +282 -0
- data/test/functional/test_dynamic_querying.rb +75 -0
- data/test/functional/test_embedded_document.rb +288 -0
- data/test/functional/test_equality.rb +20 -0
- data/test/functional/test_identity_map.rb +513 -0
- data/test/functional/test_indexes.rb +50 -0
- data/test/functional/test_logger.rb +20 -0
- data/test/functional/test_modifiers.rb +537 -0
- data/test/functional/test_pagination.rb +91 -0
- data/test/functional/test_protected.rb +201 -0
- data/test/functional/test_querying.rb +935 -0
- data/test/functional/test_safe.rb +76 -0
- data/test/functional/test_sci.rb +240 -0
- data/test/functional/test_scopes.rb +171 -0
- data/test/functional/test_timestamps.rb +62 -0
- data/test/functional/test_touch.rb +125 -0
- data/test/functional/test_userstamps.rb +44 -0
- data/test/functional/test_validations.rb +414 -0
- data/test/models.rb +261 -0
- data/test/support/railtie.rb +4 -0
- data/test/support/railtie/autoloaded.rb +2 -0
- data/test/support/railtie/not_autoloaded.rb +3 -0
- data/test/support/railtie/parent.rb +3 -0
- data/test/test_active_model_lint.rb +18 -0
- data/test/test_helper.rb +93 -0
- data/test/unit/associations/test_base.rb +146 -0
- data/test/unit/associations/test_belongs_to_association.rb +29 -0
- data/test/unit/associations/test_many_association.rb +63 -0
- data/test/unit/associations/test_one_association.rb +47 -0
- data/test/unit/associations/test_proxy.rb +100 -0
- data/test/unit/serializers/test_json_serializer.rb +216 -0
- data/test/unit/serializers/test_xml_serializer.rb +196 -0
- data/test/unit/test_clone.rb +69 -0
- data/test/unit/test_document.rb +249 -0
- data/test/unit/test_dynamic_finder.rb +125 -0
- data/test/unit/test_embedded_document.rb +682 -0
- data/test/unit/test_equality.rb +38 -0
- data/test/unit/test_exceptions.rb +12 -0
- data/test/unit/test_extensions.rb +380 -0
- data/test/unit/test_identity_map_middleware.rb +34 -0
- data/test/unit/test_inspect.rb +47 -0
- data/test/unit/test_key.rb +205 -0
- data/test/unit/test_keys.rb +65 -0
- data/test/unit/test_mongo_mapper.rb +143 -0
- data/test/unit/test_pagination.rb +11 -0
- data/test/unit/test_plugins.rb +89 -0
- data/test/unit/test_rails.rb +183 -0
- data/test/unit/test_rails_compatibility.rb +38 -0
- data/test/unit/test_rails_reflect_on_association.rb +118 -0
- data/test/unit/test_railtie.rb +66 -0
- data/test/unit/test_serialization.rb +166 -0
- data/test/unit/test_time_zones.rb +44 -0
- data/test/unit/test_translation.rb +27 -0
- data/test/unit/test_validations.rb +562 -0
- metadata +285 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class InspectTest < Test::Unit::TestCase
|
|
4
|
+
context "#inspect" do
|
|
5
|
+
setup do
|
|
6
|
+
@document = Doc('User') do
|
|
7
|
+
key :name, String
|
|
8
|
+
key :age, Integer
|
|
9
|
+
key :email, String
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
@doc = @document.new(:name => 'John', :age => 29)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
should "print out non-nil attributes in alpha sorted order" do
|
|
16
|
+
@doc.inspect.should =~ /_id:.*, age: 29, name: "John"/
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
should "print out all attributes when (optional) include_super argument is true" do
|
|
20
|
+
@doc.inspect(true).should =~ /_id:.*, age: 29, email: nil, name: "John"/
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should "include class name" do
|
|
24
|
+
@doc.inspect.should =~ /^#<User/
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
should "include embedded documents" do
|
|
28
|
+
klass = Doc()
|
|
29
|
+
pets = EDoc()
|
|
30
|
+
|
|
31
|
+
klass.many :pets, :class => pets
|
|
32
|
+
|
|
33
|
+
doc = klass.new(:pets => [{:name => "Kitten"}])
|
|
34
|
+
doc.inspect.should =~ /_id:.*, pets: \[.*_id.*, name: "Kitten".*\]/
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
should "include embedded document" do
|
|
38
|
+
klass = Doc()
|
|
39
|
+
pet = EDoc()
|
|
40
|
+
|
|
41
|
+
klass.one :pet, :class => pet
|
|
42
|
+
|
|
43
|
+
doc = klass.new(:pet => {:name => "Kitten"})
|
|
44
|
+
doc.inspect.should =~ /_id:.*, pet: .*_id.*, name: "Kitten".*/
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'models'
|
|
3
|
+
|
|
4
|
+
class FooType < Struct.new(:bar)
|
|
5
|
+
def self.to_mongo(value)
|
|
6
|
+
'to_mongo'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.from_mongo(value)
|
|
10
|
+
'from_mongo'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class KeyTest < Test::Unit::TestCase
|
|
15
|
+
Key = MongoMapper::Plugins::Keys::Key
|
|
16
|
+
|
|
17
|
+
context "Initializing a new key" do
|
|
18
|
+
should "allow setting the name" do
|
|
19
|
+
Key.new(:foo, String).name.should == 'foo'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "allow setting the type" do
|
|
23
|
+
Key.new(:foo, Integer).type.should be(Integer)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "allow setting options" do
|
|
27
|
+
Key.new(:foo, Integer, :required => true).options[:required].should be(true)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
should "default options to {}" do
|
|
31
|
+
Key.new(:foo, Integer, nil).options.should == {}
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
should "symbolize option keys" do
|
|
35
|
+
Key.new(:foo, Integer, 'required' => true).options[:required].should be(true)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
should "work with just name" do
|
|
39
|
+
key = Key.new(:foo)
|
|
40
|
+
key.name.should == 'foo'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
should "work with name and type" do
|
|
44
|
+
key = Key.new(:foo, String)
|
|
45
|
+
key.name.should == 'foo'
|
|
46
|
+
key.type.should == String
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
should "work with name, type, and options" do
|
|
50
|
+
key = Key.new(:foo, String, :required => true)
|
|
51
|
+
key.name.should == 'foo'
|
|
52
|
+
key.type.should == String
|
|
53
|
+
key.options[:required].should be_true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
should "work with name and options" do
|
|
57
|
+
key = Key.new(:foo, :required => true)
|
|
58
|
+
key.name.should == 'foo'
|
|
59
|
+
key.options[:required].should be_true
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context "A key" do
|
|
64
|
+
should "be equal to another key with same name and type" do
|
|
65
|
+
Key.new(:name, String).should == Key.new(:name, String)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
should "not be equal to another key with different name" do
|
|
69
|
+
Key.new(:name, String).should_not == Key.new(:foo, String)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
should "not be equal to another key with different type" do
|
|
73
|
+
Key.new(:name, String).should_not == Key.new(:name, Integer)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
should "know if it is a embedded_document" do
|
|
77
|
+
Key.new(:name, EDoc()).embeddable?.should be_true
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
should "know if it is not a embedded_document" do
|
|
81
|
+
Key.new(:name, String).embeddable?.should be_false
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
should "know if it is a number" do
|
|
85
|
+
Key.new(:age, Integer).number?.should be_true
|
|
86
|
+
Key.new(:age, Float).number?.should be_true
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
should "know if it is not a number" do
|
|
90
|
+
Key.new(:age, String).number?.should be_false
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
context "for an array with :typecast option" do
|
|
95
|
+
setup { @key = Key.new(:user_ids, Array, :typecast => 'ObjectId') }
|
|
96
|
+
subject { @key }
|
|
97
|
+
|
|
98
|
+
should "cast each element correctly" do
|
|
99
|
+
ids = [BSON::ObjectId.new, BSON::ObjectId.new, BSON::ObjectId.new.to_s, BSON::ObjectId.new.to_s]
|
|
100
|
+
subject.set(ids).should == ids.map { |id| ObjectId.to_mongo(id) }
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context "for an array with :typecast option of Date" do
|
|
105
|
+
setup { @key = Key.new(:dates, Array, :typecast => 'Date') }
|
|
106
|
+
subject { @key }
|
|
107
|
+
|
|
108
|
+
should "cast each element correctly when get" do
|
|
109
|
+
dates = [Date.yesterday, Date.today, Date.tomorrow.to_s]
|
|
110
|
+
subject.get(dates).should == dates.map { |date| Date.from_mongo(date) }
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
should "cast each element correctly when set" do
|
|
114
|
+
dates = [Date.yesterday, Date.today, Date.tomorrow.to_s]
|
|
115
|
+
subject.set(dates).should == dates.map { |date| Date.to_mongo(date) }
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context "for a set with :typecast option" do
|
|
120
|
+
setup { @key = Key.new(:user_ids, Set, :typecast => 'ObjectId') }
|
|
121
|
+
subject { @key }
|
|
122
|
+
|
|
123
|
+
should "cast each element correctly" do
|
|
124
|
+
ids = [BSON::ObjectId.new, BSON::ObjectId.new, BSON::ObjectId.new.to_s, BSON::ObjectId.new.to_s]
|
|
125
|
+
subject.set(ids).should == ids.map { |id| ObjectId.to_mongo(id) }
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
context "setting a value with a custom type" do
|
|
130
|
+
should "correctly typecast" do
|
|
131
|
+
key = Key.new(:foo, FooType)
|
|
132
|
+
key.set("something").should == 'to_mongo'
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
should "correctly typecast if object of that type is given" do
|
|
136
|
+
key = Key.new(:foo, FooType)
|
|
137
|
+
key.set(FooType.new('something')).should == 'to_mongo'
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
context "getting a value with a custom type" do
|
|
142
|
+
should "use #from_mongo to convert back to custom type" do
|
|
143
|
+
key = Key.new(:foo, FooType)
|
|
144
|
+
key.get('something').should == 'from_mongo'
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
context "getting a value" do
|
|
149
|
+
should "work with a type" do
|
|
150
|
+
key = Key.new(:foo, String)
|
|
151
|
+
key.get('bar').should == 'bar'
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
should "work without type" do
|
|
155
|
+
key = Key.new(:foo)
|
|
156
|
+
key.get([1, '2']).should == [1, '2']
|
|
157
|
+
key.get(false).should == false
|
|
158
|
+
key.get({}).should == {}
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
context "for a embedded_document" do
|
|
162
|
+
should "default to nil" do
|
|
163
|
+
key = Key.new(:foo, Address)
|
|
164
|
+
key.get(nil).should be_nil
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
should "return instance if instance" do
|
|
168
|
+
address = Address.new(:city => 'South Bend', :state => 'IN', :zip => 46544)
|
|
169
|
+
key = Key.new(:foo, Address)
|
|
170
|
+
key.get(address).should == address
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
context "getting a value with a default set" do
|
|
176
|
+
setup do
|
|
177
|
+
@key = Key.new(:foo, String, :default => 'baz')
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
should "return default value if value nil" do
|
|
181
|
+
@key.get(nil).should == 'baz'
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
should "return a dup of the default value" do
|
|
185
|
+
@key.get(nil).replace('bar')
|
|
186
|
+
@key.get(nil).should == 'baz'
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
should "return value if not blank" do
|
|
190
|
+
@key.get('foobar').should == 'foobar'
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
should "work with Boolean type and false value" do
|
|
194
|
+
Key.new(:active, Boolean, :default => false).get(nil).should be_false
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
should "work with Boolean type and true value" do
|
|
198
|
+
Key.new(:active, Boolean, :default => true).get(nil).should be_true
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
should "work with procs" do
|
|
202
|
+
Key.new(:foo, String, :default => lambda { return 'hello world' }).get(nil).should == "hello world"
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end # KeyTest
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'models'
|
|
3
|
+
|
|
4
|
+
class KeyTest < Test::Unit::TestCase
|
|
5
|
+
context ".new with no id and _id of type integer" do
|
|
6
|
+
should "not error" do
|
|
7
|
+
lambda {
|
|
8
|
+
klass = Doc() do
|
|
9
|
+
key :_id, Integer
|
|
10
|
+
end
|
|
11
|
+
# No sensible default id for integer, people better pass them in if they user this
|
|
12
|
+
silence_stderr { klass.new.id.should be_nil }
|
|
13
|
+
}.should_not raise_error
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context ".key?(:symbol)" do
|
|
18
|
+
should "be true if document has key" do
|
|
19
|
+
Address.key?(:city).should be_true
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
should "be false if document does not have key" do
|
|
23
|
+
Address.key?(:foo).should be_false
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context ".key?('string')" do
|
|
28
|
+
should "be true if document has key" do
|
|
29
|
+
Address.key?('city').should be_true
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
should "be false if document does not have key" do
|
|
33
|
+
Address.key?('foo').should be_false
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context ".new (from database)" do
|
|
38
|
+
setup do
|
|
39
|
+
@klass = Doc do
|
|
40
|
+
key :user, Hash
|
|
41
|
+
|
|
42
|
+
def user=(user)
|
|
43
|
+
super(:id => user.id, :name => user.name)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
user_class = Struct.new(:id, :name)
|
|
48
|
+
@klass.create(:user => user_class.new(1, 'John Nunemaker'))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
should "use []= for keys instead of public writer" do
|
|
52
|
+
assert_nothing_raised do
|
|
53
|
+
doc = @klass.first
|
|
54
|
+
doc.user['id'].should == 1
|
|
55
|
+
doc.user['name'].should == 'John Nunemaker'
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context ".load" do
|
|
61
|
+
should "return nil if argument is nil" do
|
|
62
|
+
Doc().load(nil).should be_nil
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end # KeyTest
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Address; end
|
|
4
|
+
|
|
5
|
+
class MongoMapperTest < Test::Unit::TestCase
|
|
6
|
+
should "be able to write and read connection" do
|
|
7
|
+
conn = Mongo::Connection.new
|
|
8
|
+
MongoMapper.connection = conn
|
|
9
|
+
MongoMapper.connection.should == conn
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
should "default connection to new mongo ruby driver" do
|
|
13
|
+
MongoMapper.connection = nil
|
|
14
|
+
MongoMapper.connection.should be_instance_of(Mongo::Connection)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
should "be able to write and read default database" do
|
|
18
|
+
MongoMapper.database = 'test'
|
|
19
|
+
MongoMapper.database.should be_instance_of(Mongo::DB)
|
|
20
|
+
MongoMapper.database.name.should == 'test'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should "have document not found error" do
|
|
24
|
+
lambda {
|
|
25
|
+
MongoMapper::DocumentNotFound
|
|
26
|
+
}.should_not raise_error
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
should "be able to read/write config" do
|
|
30
|
+
config = {
|
|
31
|
+
'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test'},
|
|
32
|
+
'production' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test-prod'}
|
|
33
|
+
}
|
|
34
|
+
MongoMapper.config = config
|
|
35
|
+
MongoMapper.config.should == config
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context "connecting to environment from config" do
|
|
39
|
+
should "work without authentication" do
|
|
40
|
+
MongoMapper.config = {
|
|
41
|
+
'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test'}
|
|
42
|
+
}
|
|
43
|
+
Mongo::Connection.expects(:new).with('127.0.0.1', 27017, {})
|
|
44
|
+
MongoMapper.expects(:database=).with('test')
|
|
45
|
+
Mongo::DB.any_instance.expects(:authenticate).never
|
|
46
|
+
MongoMapper.connect('development')
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
should "work without authentication using uri" do
|
|
50
|
+
MongoMapper.config = {
|
|
51
|
+
'development' => {'uri' => 'mongodb://127.0.0.1:27017/test'}
|
|
52
|
+
}
|
|
53
|
+
Mongo::Connection.expects(:new).with('127.0.0.1', 27017, {})
|
|
54
|
+
MongoMapper.expects(:database=).with('test')
|
|
55
|
+
Mongo::DB.any_instance.expects(:authenticate).never
|
|
56
|
+
MongoMapper.connect('development')
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
should "work with sinatra environment symbol" do
|
|
60
|
+
MongoMapper.config = {
|
|
61
|
+
'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test'}
|
|
62
|
+
}
|
|
63
|
+
Mongo::Connection.expects(:new).with('127.0.0.1', 27017, {})
|
|
64
|
+
MongoMapper.expects(:database=).with('test')
|
|
65
|
+
Mongo::DB.any_instance.expects(:authenticate).never
|
|
66
|
+
MongoMapper.connect(:development)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
should "work with options" do
|
|
70
|
+
MongoMapper.config = {
|
|
71
|
+
'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test'}
|
|
72
|
+
}
|
|
73
|
+
connection, logger = mock('connection'), mock('logger')
|
|
74
|
+
Mongo::Connection.expects(:new).with('127.0.0.1', 27017, :logger => logger)
|
|
75
|
+
MongoMapper.connect('development', :logger => logger)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
should "work with options from config" do
|
|
79
|
+
MongoMapper.config = {
|
|
80
|
+
'development' => {'host' => '192.168.1.1', 'port' => 2222, 'database' => 'test', 'options' => {'safe' => true}}
|
|
81
|
+
}
|
|
82
|
+
connection, logger = mock('connection'), mock('logger')
|
|
83
|
+
Mongo::Connection.expects(:new).with('192.168.1.1', 2222, :logger => logger, :safe => true)
|
|
84
|
+
MongoMapper.connect('development', :logger => logger)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
should "work with options using uri" do
|
|
88
|
+
MongoMapper.config = {
|
|
89
|
+
'development' => {'uri' => 'mongodb://127.0.0.1:27017/test'}
|
|
90
|
+
}
|
|
91
|
+
connection, logger = mock('connection'), mock('logger')
|
|
92
|
+
Mongo::Connection.expects(:new).with('127.0.0.1', 27017, :logger => logger)
|
|
93
|
+
MongoMapper.connect('development', :logger => logger)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
should "work with authentication" do
|
|
97
|
+
MongoMapper.config = {
|
|
98
|
+
'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test', 'username' => 'john', 'password' => 'secret'}
|
|
99
|
+
}
|
|
100
|
+
Mongo::DB.any_instance.expects(:authenticate).with('john', 'secret')
|
|
101
|
+
MongoMapper.connect('development')
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
should "work with authentication using uri" do
|
|
105
|
+
MongoMapper.config = {
|
|
106
|
+
'development' => {'uri' => 'mongodb://john:secret@127.0.0.1:27017/test'}
|
|
107
|
+
}
|
|
108
|
+
Mongo::DB.any_instance.expects(:authenticate).with('john', 'secret')
|
|
109
|
+
MongoMapper.connect('development')
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
should "raise error for invalid scheme" do
|
|
113
|
+
MongoMapper.config = {
|
|
114
|
+
'development' => {'uri' => 'mysql://127.0.0.1:5336/foo'}
|
|
115
|
+
}
|
|
116
|
+
assert_raises(MongoMapper::InvalidScheme) { MongoMapper.connect('development') }
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
should "create a replica set connection if config contains multiple hosts" do
|
|
120
|
+
MongoMapper.config = {
|
|
121
|
+
'development' => {
|
|
122
|
+
'hosts' => [ ['127.0.0.1', 27017], ['localhost', 27017] ],
|
|
123
|
+
'database' => 'test'
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
Mongo::ReplSetConnection.expects(:new).with( ['127.0.0.1', 27017], ['localhost', 27017], {'read_secondary' => true} )
|
|
128
|
+
MongoMapper.expects(:database=).with('test')
|
|
129
|
+
Mongo::DB.any_instance.expects(:authenticate).never
|
|
130
|
+
MongoMapper.connect('development', 'read_secondary' => true)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
context "setup" do
|
|
135
|
+
should "work as shortcut for setting config, environment and options" do
|
|
136
|
+
config, logger = mock('config'), mock('logger')
|
|
137
|
+
MongoMapper.expects(:config=).with(config)
|
|
138
|
+
MongoMapper.expects(:connect).with('development', :logger => logger)
|
|
139
|
+
MongoMapper.expects(:handle_passenger_forking).once
|
|
140
|
+
MongoMapper.setup(config, 'development', :logger => logger)
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|