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.
Files changed (176) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +33 -0
  3. data/UPGRADES +26 -0
  4. data/bin/mmconsole +59 -0
  5. data/examples/attr_accessible.rb +22 -0
  6. data/examples/attr_protected.rb +22 -0
  7. data/examples/cache_key.rb +24 -0
  8. data/examples/custom_types.rb +24 -0
  9. data/examples/identity_map.rb +33 -0
  10. data/examples/identity_map/automatic.rb +2 -0
  11. data/examples/keys.rb +40 -0
  12. data/examples/modifiers/set.rb +25 -0
  13. data/examples/plugins.rb +38 -0
  14. data/examples/querying.rb +35 -0
  15. data/examples/safe.rb +43 -0
  16. data/examples/scopes.rb +52 -0
  17. data/examples/validating/embedded_docs.rb +29 -0
  18. data/lib/mongo_mapper.rb +94 -0
  19. data/lib/mongo_mapper/connection.rb +96 -0
  20. data/lib/mongo_mapper/document.rb +42 -0
  21. data/lib/mongo_mapper/embedded_document.rb +32 -0
  22. data/lib/mongo_mapper/exceptions.rb +30 -0
  23. data/lib/mongo_mapper/extensions/array.rb +19 -0
  24. data/lib/mongo_mapper/extensions/binary.rb +22 -0
  25. data/lib/mongo_mapper/extensions/boolean.rb +44 -0
  26. data/lib/mongo_mapper/extensions/date.rb +25 -0
  27. data/lib/mongo_mapper/extensions/float.rb +14 -0
  28. data/lib/mongo_mapper/extensions/hash.rb +14 -0
  29. data/lib/mongo_mapper/extensions/integer.rb +19 -0
  30. data/lib/mongo_mapper/extensions/kernel.rb +9 -0
  31. data/lib/mongo_mapper/extensions/nil_class.rb +18 -0
  32. data/lib/mongo_mapper/extensions/object.rb +26 -0
  33. data/lib/mongo_mapper/extensions/object_id.rb +32 -0
  34. data/lib/mongo_mapper/extensions/set.rb +20 -0
  35. data/lib/mongo_mapper/extensions/string.rb +18 -0
  36. data/lib/mongo_mapper/extensions/time.rb +28 -0
  37. data/lib/mongo_mapper/locale/en.yml +5 -0
  38. data/lib/mongo_mapper/middleware/identity_map.rb +16 -0
  39. data/lib/mongo_mapper/plugins.rb +22 -0
  40. data/lib/mongo_mapper/plugins/accessible.rb +52 -0
  41. data/lib/mongo_mapper/plugins/active_model.rb +18 -0
  42. data/lib/mongo_mapper/plugins/associations.rb +90 -0
  43. data/lib/mongo_mapper/plugins/associations/base.rb +92 -0
  44. data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +54 -0
  45. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +34 -0
  46. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +52 -0
  47. data/lib/mongo_mapper/plugins/associations/collection.rb +27 -0
  48. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +44 -0
  49. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +133 -0
  50. data/lib/mongo_mapper/plugins/associations/many_association.rb +63 -0
  51. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +28 -0
  52. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +118 -0
  53. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +32 -0
  54. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +24 -0
  55. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +14 -0
  56. data/lib/mongo_mapper/plugins/associations/one_as_proxy.rb +22 -0
  57. data/lib/mongo_mapper/plugins/associations/one_association.rb +48 -0
  58. data/lib/mongo_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +30 -0
  59. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +44 -0
  60. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +95 -0
  61. data/lib/mongo_mapper/plugins/associations/proxy.rb +134 -0
  62. data/lib/mongo_mapper/plugins/associations/single_association.rb +46 -0
  63. data/lib/mongo_mapper/plugins/caching.rb +21 -0
  64. data/lib/mongo_mapper/plugins/callbacks.rb +29 -0
  65. data/lib/mongo_mapper/plugins/clone.rb +22 -0
  66. data/lib/mongo_mapper/plugins/dirty.rb +60 -0
  67. data/lib/mongo_mapper/plugins/document.rb +41 -0
  68. data/lib/mongo_mapper/plugins/dynamic_querying.rb +45 -0
  69. data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +44 -0
  70. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +56 -0
  71. data/lib/mongo_mapper/plugins/embedded_document.rb +53 -0
  72. data/lib/mongo_mapper/plugins/equality.rb +23 -0
  73. data/lib/mongo_mapper/plugins/identity_map.rb +128 -0
  74. data/lib/mongo_mapper/plugins/indexes.rb +13 -0
  75. data/lib/mongo_mapper/plugins/inspect.rb +16 -0
  76. data/lib/mongo_mapper/plugins/keys.rb +313 -0
  77. data/lib/mongo_mapper/plugins/keys/key.rb +61 -0
  78. data/lib/mongo_mapper/plugins/logger.rb +18 -0
  79. data/lib/mongo_mapper/plugins/modifiers.rb +134 -0
  80. data/lib/mongo_mapper/plugins/pagination.rb +16 -0
  81. data/lib/mongo_mapper/plugins/persistence.rb +69 -0
  82. data/lib/mongo_mapper/plugins/protected.rb +45 -0
  83. data/lib/mongo_mapper/plugins/querying.rb +165 -0
  84. data/lib/mongo_mapper/plugins/querying/decorator.rb +36 -0
  85. data/lib/mongo_mapper/plugins/rails.rb +58 -0
  86. data/lib/mongo_mapper/plugins/rails/active_record_association_adapter.rb +33 -0
  87. data/lib/mongo_mapper/plugins/safe.rb +28 -0
  88. data/lib/mongo_mapper/plugins/sci.rb +36 -0
  89. data/lib/mongo_mapper/plugins/scopes.rb +27 -0
  90. data/lib/mongo_mapper/plugins/serialization.rb +109 -0
  91. data/lib/mongo_mapper/plugins/timestamps.rb +22 -0
  92. data/lib/mongo_mapper/plugins/touch.rb +18 -0
  93. data/lib/mongo_mapper/plugins/userstamps.rb +18 -0
  94. data/lib/mongo_mapper/plugins/validations.rb +86 -0
  95. data/lib/mongo_mapper/railtie.rb +48 -0
  96. data/lib/mongo_mapper/railtie/database.rake +65 -0
  97. data/lib/mongo_mapper/translation.rb +10 -0
  98. data/lib/mongo_mapper/version.rb +4 -0
  99. data/lib/rails/generators/mongo_mapper/config/config_generator.rb +24 -0
  100. data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +18 -0
  101. data/lib/rails/generators/mongo_mapper/model/model_generator.rb +23 -0
  102. data/lib/rails/generators/mongo_mapper/model/templates/model.rb +13 -0
  103. data/test/_NOTE_ON_TESTING +1 -0
  104. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +64 -0
  105. data/test/functional/associations/test_belongs_to_proxy.rb +238 -0
  106. data/test/functional/associations/test_in_array_proxy.rb +349 -0
  107. data/test/functional/associations/test_many_documents_as_proxy.rb +231 -0
  108. data/test/functional/associations/test_many_documents_proxy.rb +866 -0
  109. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +239 -0
  110. data/test/functional/associations/test_many_embedded_proxy.rb +289 -0
  111. data/test/functional/associations/test_many_polymorphic_proxy.rb +303 -0
  112. data/test/functional/associations/test_one_as_proxy.rb +491 -0
  113. data/test/functional/associations/test_one_embedded_polymorphic_proxy.rb +208 -0
  114. data/test/functional/associations/test_one_embedded_proxy.rb +100 -0
  115. data/test/functional/associations/test_one_proxy.rb +383 -0
  116. data/test/functional/test_accessible.rb +198 -0
  117. data/test/functional/test_associations.rb +46 -0
  118. data/test/functional/test_binary.rb +27 -0
  119. data/test/functional/test_caching.rb +77 -0
  120. data/test/functional/test_callbacks.rb +232 -0
  121. data/test/functional/test_dirty.rb +301 -0
  122. data/test/functional/test_document.rb +282 -0
  123. data/test/functional/test_dynamic_querying.rb +75 -0
  124. data/test/functional/test_embedded_document.rb +288 -0
  125. data/test/functional/test_equality.rb +20 -0
  126. data/test/functional/test_identity_map.rb +513 -0
  127. data/test/functional/test_indexes.rb +50 -0
  128. data/test/functional/test_logger.rb +20 -0
  129. data/test/functional/test_modifiers.rb +537 -0
  130. data/test/functional/test_pagination.rb +91 -0
  131. data/test/functional/test_protected.rb +201 -0
  132. data/test/functional/test_querying.rb +935 -0
  133. data/test/functional/test_safe.rb +76 -0
  134. data/test/functional/test_sci.rb +240 -0
  135. data/test/functional/test_scopes.rb +171 -0
  136. data/test/functional/test_timestamps.rb +62 -0
  137. data/test/functional/test_touch.rb +125 -0
  138. data/test/functional/test_userstamps.rb +44 -0
  139. data/test/functional/test_validations.rb +414 -0
  140. data/test/models.rb +261 -0
  141. data/test/support/railtie.rb +4 -0
  142. data/test/support/railtie/autoloaded.rb +2 -0
  143. data/test/support/railtie/not_autoloaded.rb +3 -0
  144. data/test/support/railtie/parent.rb +3 -0
  145. data/test/test_active_model_lint.rb +18 -0
  146. data/test/test_helper.rb +93 -0
  147. data/test/unit/associations/test_base.rb +146 -0
  148. data/test/unit/associations/test_belongs_to_association.rb +29 -0
  149. data/test/unit/associations/test_many_association.rb +63 -0
  150. data/test/unit/associations/test_one_association.rb +47 -0
  151. data/test/unit/associations/test_proxy.rb +100 -0
  152. data/test/unit/serializers/test_json_serializer.rb +216 -0
  153. data/test/unit/serializers/test_xml_serializer.rb +196 -0
  154. data/test/unit/test_clone.rb +69 -0
  155. data/test/unit/test_document.rb +249 -0
  156. data/test/unit/test_dynamic_finder.rb +125 -0
  157. data/test/unit/test_embedded_document.rb +682 -0
  158. data/test/unit/test_equality.rb +38 -0
  159. data/test/unit/test_exceptions.rb +12 -0
  160. data/test/unit/test_extensions.rb +380 -0
  161. data/test/unit/test_identity_map_middleware.rb +34 -0
  162. data/test/unit/test_inspect.rb +47 -0
  163. data/test/unit/test_key.rb +205 -0
  164. data/test/unit/test_keys.rb +65 -0
  165. data/test/unit/test_mongo_mapper.rb +143 -0
  166. data/test/unit/test_pagination.rb +11 -0
  167. data/test/unit/test_plugins.rb +89 -0
  168. data/test/unit/test_rails.rb +183 -0
  169. data/test/unit/test_rails_compatibility.rb +38 -0
  170. data/test/unit/test_rails_reflect_on_association.rb +118 -0
  171. data/test/unit/test_railtie.rb +66 -0
  172. data/test/unit/test_serialization.rb +166 -0
  173. data/test/unit/test_time_zones.rb +44 -0
  174. data/test/unit/test_translation.rb +27 -0
  175. data/test/unit/test_validations.rb +562 -0
  176. metadata +285 -0
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ class PaginationTest < Test::Unit::TestCase
4
+ should "default per_page to 25" do
5
+ Doc().per_page.should == 25
6
+ end
7
+
8
+ should "allow overriding per_page" do
9
+ Doc() { def self.per_page; 1 end }.per_page.should == 1
10
+ end
11
+ end
@@ -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