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,89 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class PluginsTest < Test::Unit::TestCase
|
|
4
|
+
should "default plugins to empty array" do
|
|
5
|
+
Class.new { extend MongoMapper::Plugins }.plugins.should == []
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
context "a plugin" do
|
|
9
|
+
module MyConcern
|
|
10
|
+
extend ActiveSupport::Concern
|
|
11
|
+
|
|
12
|
+
included do
|
|
13
|
+
attr_accessor :from_concern
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
module ClassMethods
|
|
17
|
+
def class_foo
|
|
18
|
+
'class_foo'
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def instance_foo
|
|
23
|
+
'instance_foo'
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
setup do
|
|
28
|
+
@document = Class.new do
|
|
29
|
+
extend MongoMapper::Plugins
|
|
30
|
+
plugin MyConcern
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
should "include instance methods" do
|
|
35
|
+
@document.new.instance_foo.should == 'instance_foo'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
should "extend class methods" do
|
|
39
|
+
@document.class_foo.should == 'class_foo'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
should "pass model to configure" do
|
|
43
|
+
@document.new.should respond_to(:from_concern)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
should "add plugin to plugins" do
|
|
47
|
+
@document.plugins.should include(MyConcern)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "Document" do
|
|
51
|
+
setup do
|
|
52
|
+
MongoMapper::Document.plugins.delete(MyConcern)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
should 'allow plugins on Document' do
|
|
56
|
+
MongoMapper::Document.plugin(MyConcern)
|
|
57
|
+
Doc().should respond_to(:class_foo)
|
|
58
|
+
Doc().new.should respond_to(:instance_foo)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
should 'add plugins to classes that include Document before they are added' do
|
|
62
|
+
article = Doc()
|
|
63
|
+
MongoMapper::Document.plugin(MyConcern)
|
|
64
|
+
article.should respond_to(:class_foo)
|
|
65
|
+
article.new.should respond_to(:instance_foo)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context "EmbeddedDocument" do
|
|
70
|
+
setup do
|
|
71
|
+
MongoMapper::EmbeddedDocument.plugins.delete(MyConcern)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
should 'allow plugins on EmbeddedDocument' do
|
|
75
|
+
MongoMapper::EmbeddedDocument.plugin(MyConcern)
|
|
76
|
+
article = EDoc()
|
|
77
|
+
article.should respond_to(:class_foo)
|
|
78
|
+
article.new.should respond_to(:instance_foo)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
should 'add plugins to classes that include EmbeddedDocument before they are added' do
|
|
82
|
+
article = EDoc()
|
|
83
|
+
MongoMapper::EmbeddedDocument.plugin(MyConcern)
|
|
84
|
+
article.should respond_to(:class_foo)
|
|
85
|
+
article.new.should respond_to(:instance_foo)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class TestRails < Test::Unit::TestCase
|
|
4
|
+
context "Document" do
|
|
5
|
+
setup do
|
|
6
|
+
@klass = Doc('Post') do
|
|
7
|
+
key :foo, String
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
context "Class methods" do
|
|
12
|
+
should "alias has_many to many" do
|
|
13
|
+
@klass.should respond_to(:has_many)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
should 'pass on block given in has_many' do
|
|
17
|
+
@klass.class_eval do
|
|
18
|
+
has_many :posts do
|
|
19
|
+
def foo_bars; true; end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
@klass.new.posts.should respond_to(:foo_bars)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "alias has_one to one" do
|
|
27
|
+
@klass.should respond_to(:has_one)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
should "have column names" do
|
|
31
|
+
@klass.column_names.sort.should == ['_id', 'foo']
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context "Instance methods" do
|
|
36
|
+
setup do
|
|
37
|
+
@klass.class_eval do
|
|
38
|
+
def bar=(value)
|
|
39
|
+
write_attribute(:foo, value)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def bar_before_type_cast
|
|
43
|
+
read_attribute_before_type_cast(:foo)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def bar
|
|
47
|
+
read_attribute(:foo)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
should "alias new_record? to new?" do
|
|
53
|
+
@klass.new.should be_new_record
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
should "be able to read key with read_attribute" do
|
|
57
|
+
@klass.new(:foo => 'Bar').bar.should == 'Bar'
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
should "be able to read key before type cast with read_attribute_before_type_cast" do
|
|
61
|
+
@klass.new(:foo => 21).bar_before_type_cast.should == 21
|
|
62
|
+
@klass.new(:foo => 21).bar.should == '21'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
should "be able to write key with write_attribute" do
|
|
66
|
+
@klass.new(:bar => 'Setting Foo').foo.should == 'Setting Foo'
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context '#to_param' do
|
|
70
|
+
should "be nil if not persisted" do
|
|
71
|
+
@klass.new.tap do |doc|
|
|
72
|
+
doc.to_param.should be_nil
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
should "array representation of id if persisted" do
|
|
77
|
+
@klass.create.tap do |doc|
|
|
78
|
+
doc.to_param.should == doc.id.to_s
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context '#to_key' do
|
|
84
|
+
should "be nil if not persisted" do
|
|
85
|
+
@klass.new.tap do |doc|
|
|
86
|
+
doc.to_key.should be_nil
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
should "array representation of id if persisted" do
|
|
91
|
+
@klass.create.tap do |doc|
|
|
92
|
+
doc.to_key.should == [doc.id]
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
context "EmbeddedDocument" do
|
|
100
|
+
setup do
|
|
101
|
+
@klass = EDoc('Post') { key :foo, String }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context "Class methods" do
|
|
105
|
+
should "alias has_many to many" do
|
|
106
|
+
@klass.should respond_to(:has_many)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
should "alias has_one to one" do
|
|
110
|
+
@klass.should respond_to(:has_one)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
should "have column names" do
|
|
114
|
+
@klass.column_names.sort.should == ['_id', 'foo']
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
context "Instance methods" do
|
|
119
|
+
setup do
|
|
120
|
+
@klass.class_eval do
|
|
121
|
+
def bar=(value)
|
|
122
|
+
write_attribute(:foo, value)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def bar_before_type_cast
|
|
126
|
+
read_attribute_before_type_cast(:foo)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def bar
|
|
130
|
+
read_attribute(:foo)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
should "alias new_record? to new?" do
|
|
136
|
+
@klass.new.should be_new_record
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
should "be able to read key with read_attribute" do
|
|
140
|
+
@klass.new(:foo => 'Bar').bar.should == 'Bar'
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
should "be able to read key before type cast with read_attribute_before_type_cast" do
|
|
144
|
+
@klass.new(:foo => 21).bar_before_type_cast.should == 21
|
|
145
|
+
@klass.new(:foo => 21).bar.should == '21'
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
should "be able to write key with write_attribute" do
|
|
149
|
+
@klass.new(:bar => 'Setting Foo').foo.should == 'Setting Foo'
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
context '#to_param' do
|
|
153
|
+
should "be nil if not persisted" do
|
|
154
|
+
@klass.new.tap do |doc|
|
|
155
|
+
doc.to_param.should be_nil
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
should "array representation of id if persisted" do
|
|
160
|
+
@klass.new.tap do |doc|
|
|
161
|
+
doc.expects(:persisted?).returns(true)
|
|
162
|
+
doc.to_param.should == doc.id.to_s
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
context '#to_key' do
|
|
168
|
+
should "be nil if not persisted" do
|
|
169
|
+
@klass.new.tap do |doc|
|
|
170
|
+
doc.to_key.should be_nil
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
should "array representation of id if persisted" do
|
|
175
|
+
@klass.new.tap do |doc|
|
|
176
|
+
doc.expects(:persisted?).returns(true)
|
|
177
|
+
doc.to_key.should == [doc.id]
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class TestRailsCompatibility < Test::Unit::TestCase
|
|
4
|
+
class Item
|
|
5
|
+
include MongoMapper::EmbeddedDocument
|
|
6
|
+
key :for_all, String
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class FirstItem < Item
|
|
10
|
+
key :first_only, String
|
|
11
|
+
many :second_items
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class SecondItem < Item
|
|
15
|
+
key :second_only, String
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "EmbeddedDocument" do
|
|
19
|
+
should "alias many to has_many" do
|
|
20
|
+
FirstItem.should respond_to(:has_many)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
should "alias one to has_one" do
|
|
24
|
+
FirstItem.should respond_to(:has_one)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
should "have column names" do
|
|
28
|
+
Item.column_names.sort.should == ['_id', '_type', 'for_all']
|
|
29
|
+
FirstItem.column_names.sort.should == ['_id', '_type', 'first_only', 'for_all']
|
|
30
|
+
SecondItem.column_names.sort.should == ['_id', '_type', 'for_all', 'second_only']
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
should "alias new to new_record?" do
|
|
34
|
+
instance = Item.new
|
|
35
|
+
instance.new_record?.should == instance.new?
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
module ReflectOnAssociationTestModels
|
|
4
|
+
class Tree
|
|
5
|
+
include MongoMapper::Document
|
|
6
|
+
many :birds, :class_name => "ReflectOnAssociationTestModels::Bird"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class Bird
|
|
10
|
+
include MongoMapper::Document
|
|
11
|
+
belongs_to :tree, :class_name => "ReflectOnAssociationTestModels::Tree"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class Book
|
|
15
|
+
include MongoMapper::Document
|
|
16
|
+
many :authors, :class_name => "ReflectOnAssociationTestModels::Author", :in => :author_ids
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class Author
|
|
20
|
+
include MongoMapper::Document
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class Employee
|
|
24
|
+
include MongoMapper::Document
|
|
25
|
+
one :desk, :class_name => "ReflectOnAssociationTestModels::Desk"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class Desk
|
|
29
|
+
include MongoMapper::Document
|
|
30
|
+
belongs_to :employee, :class_name => "ReflectOnAssociationTestModels::Employee"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class Order
|
|
34
|
+
include MongoMapper::Document
|
|
35
|
+
many :line_items, :class_name => "ReflectOnAssociationTestModels::LineItem"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
class LineItem
|
|
39
|
+
include MongoMapper::EmbeddedDocument
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class Body
|
|
43
|
+
include MongoMapper::Document
|
|
44
|
+
one :heart, :class_name => "ReflectOnAssociationTestModels::Heart"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
class Heart
|
|
48
|
+
include MongoMapper::EmbeddedDocument
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
class ReflectOnAssociationTest < Test::Unit::TestCase
|
|
53
|
+
context "one-to-many association" do
|
|
54
|
+
should "return :has_many association for Tree#birds" do
|
|
55
|
+
association = ReflectOnAssociationTestModels::Tree.reflect_on_association(:birds)
|
|
56
|
+
association.klass.should == ReflectOnAssociationTestModels::Bird
|
|
57
|
+
association.macro.should == :has_many
|
|
58
|
+
association.name.should == :birds
|
|
59
|
+
association.options.should == {}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
should "return :belongs_to association for Bird#tree" do
|
|
63
|
+
association = ReflectOnAssociationTestModels::Bird.reflect_on_association(:tree)
|
|
64
|
+
association.klass.should == ReflectOnAssociationTestModels::Tree
|
|
65
|
+
association.macro.should == :belongs_to
|
|
66
|
+
association.name.should == :tree
|
|
67
|
+
association.options.should == {}
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context "many-to-many association" do
|
|
72
|
+
should "return :has_many association for Book#authors" do
|
|
73
|
+
association = ReflectOnAssociationTestModels::Book.reflect_on_association(:authors)
|
|
74
|
+
association.klass.should == ReflectOnAssociationTestModels::Author
|
|
75
|
+
association.macro.should == :has_many
|
|
76
|
+
association.name.should == :authors
|
|
77
|
+
association.options.should == {}
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
context "one-to-one association" do
|
|
82
|
+
should "return :has_one association for Employee#desk" do
|
|
83
|
+
association = ReflectOnAssociationTestModels::Employee.reflect_on_association(:desk)
|
|
84
|
+
association.klass.should == ReflectOnAssociationTestModels::Desk
|
|
85
|
+
association.macro.should == :has_one
|
|
86
|
+
association.name.should == :desk
|
|
87
|
+
association.options.should == {}
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
should "return :belongs_to association for Desk#employee" do
|
|
91
|
+
association = ReflectOnAssociationTestModels::Desk.reflect_on_association(:employee)
|
|
92
|
+
association.klass.should == ReflectOnAssociationTestModels::Employee
|
|
93
|
+
association.macro.should == :belongs_to
|
|
94
|
+
association.name.should == :employee
|
|
95
|
+
association.options.should == {}
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
context "embeds one" do
|
|
100
|
+
should "return :has_one association for Body#heart" do
|
|
101
|
+
association = ReflectOnAssociationTestModels::Body.reflect_on_association(:heart)
|
|
102
|
+
association.klass.should == ReflectOnAssociationTestModels::Heart
|
|
103
|
+
association.macro.should == :has_one
|
|
104
|
+
association.name.should == :heart
|
|
105
|
+
association.options.should == {}
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
context "embeds many" do
|
|
110
|
+
should "return :has_many association for Order#line_items" do
|
|
111
|
+
association = ReflectOnAssociationTestModels::Order.reflect_on_association(:line_items)
|
|
112
|
+
association.klass.should == ReflectOnAssociationTestModels::LineItem
|
|
113
|
+
association.macro.should == :has_many
|
|
114
|
+
association.name.should == :line_items
|
|
115
|
+
association.options.should == {}
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require "rails"
|
|
3
|
+
require 'mongo_mapper/railtie'
|
|
4
|
+
|
|
5
|
+
class TestRailtie < Test::Unit::TestCase
|
|
6
|
+
|
|
7
|
+
def expect_descendants(expectation)
|
|
8
|
+
# Keep expectation a string so we don't accidentally load in a class
|
|
9
|
+
Railtie::Parent.descendants.map(&:to_s).sort.should == expectation.sort
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def run_initializer(mod, name)
|
|
13
|
+
initializer = mod.initializers.detect do |i|
|
|
14
|
+
i.name == name
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if initializer.nil?
|
|
18
|
+
raise 'Initializer not found'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
initializer.block.arity == -1 ? initializer.run : initializer.run(FakeRails)
|
|
22
|
+
# mongo_mapper.prepare_dispatcher takes a Rails app as its one arg,
|
|
23
|
+
# set_clear_dependencies_hook takes no args
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def load_autoloaded_class
|
|
27
|
+
Railtie::Autoloaded.presence
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class FakeRails
|
|
31
|
+
def self.config
|
|
32
|
+
return Class.new { def cache_classes ; false ; end }.new
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context "Railtie" do
|
|
37
|
+
include Rails::Application::Bootstrap
|
|
38
|
+
|
|
39
|
+
setup do
|
|
40
|
+
require 'support/railtie'
|
|
41
|
+
require 'support/railtie/parent'
|
|
42
|
+
require 'support/railtie/not_autoloaded'
|
|
43
|
+
|
|
44
|
+
ActiveSupport::Dependencies.autoload_paths << File.join(File.dirname(__FILE__), '..', 'support')
|
|
45
|
+
|
|
46
|
+
# These initializers don't actually run anything, they just register cleanup and prepare hooks
|
|
47
|
+
run_initializer Rails::Application::Bootstrap, :set_clear_dependencies_hook
|
|
48
|
+
run_initializer MongoMapper::Railtie, 'mongo_mapper.prepare_dispatcher'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
should "not clear ActiveSupport::DescendantsTracker" do
|
|
52
|
+
expect_descendants %w( Railtie::NotAutoloaded )
|
|
53
|
+
load_autoloaded_class
|
|
54
|
+
expect_descendants %w( Railtie::NotAutoloaded Railtie::Autoloaded )
|
|
55
|
+
|
|
56
|
+
ActionDispatch::Reloader.cleanup! # cleanup 'last request'
|
|
57
|
+
|
|
58
|
+
expect_descendants %w( Railtie::NotAutoloaded )
|
|
59
|
+
load_autoloaded_class
|
|
60
|
+
expect_descendants %w( Railtie::NotAutoloaded Railtie::Autoloaded )
|
|
61
|
+
|
|
62
|
+
ActionDispatch::Reloader.prepare! # prepare 'next request'
|
|
63
|
+
expect_descendants %w( Railtie::NotAutoloaded Railtie::Autoloaded )
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|