mongo_mapper 0.7.6 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. data/README.rdoc +4 -8
  2. data/bin/mmconsole +1 -1
  3. data/examples/keys.rb +37 -0
  4. data/examples/plugins.rb +41 -0
  5. data/examples/querying.rb +35 -0
  6. data/examples/scopes.rb +52 -0
  7. data/lib/mongo_mapper.rb +77 -97
  8. data/lib/mongo_mapper/connection.rb +83 -0
  9. data/lib/mongo_mapper/document.rb +10 -252
  10. data/lib/mongo_mapper/embedded_document.rb +7 -46
  11. data/lib/mongo_mapper/exceptions.rb +30 -0
  12. data/lib/mongo_mapper/extensions/array.rb +19 -0
  13. data/lib/mongo_mapper/extensions/binary.rb +22 -0
  14. data/lib/mongo_mapper/extensions/boolean.rb +44 -0
  15. data/lib/mongo_mapper/extensions/date.rb +25 -0
  16. data/lib/mongo_mapper/extensions/float.rb +14 -0
  17. data/lib/mongo_mapper/extensions/hash.rb +14 -0
  18. data/lib/mongo_mapper/extensions/integer.rb +19 -0
  19. data/lib/mongo_mapper/extensions/kernel.rb +9 -0
  20. data/lib/mongo_mapper/extensions/nil_class.rb +18 -0
  21. data/lib/mongo_mapper/extensions/object.rb +27 -0
  22. data/lib/mongo_mapper/extensions/object_id.rb +30 -0
  23. data/lib/mongo_mapper/extensions/set.rb +20 -0
  24. data/lib/mongo_mapper/extensions/string.rb +18 -0
  25. data/lib/mongo_mapper/extensions/time.rb +29 -0
  26. data/lib/mongo_mapper/plugins.rb +1 -21
  27. data/lib/mongo_mapper/plugins/accessible.rb +44 -0
  28. data/lib/mongo_mapper/plugins/associations.rb +7 -24
  29. data/lib/mongo_mapper/plugins/associations/base.rb +1 -0
  30. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +5 -6
  31. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +5 -6
  32. data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
  33. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +2 -1
  34. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +22 -39
  35. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +4 -4
  36. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +22 -23
  37. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
  38. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -0
  39. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
  40. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +2 -3
  41. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +6 -7
  42. data/lib/mongo_mapper/plugins/associations/proxy.rb +8 -6
  43. data/lib/mongo_mapper/plugins/caching.rb +21 -0
  44. data/lib/mongo_mapper/plugins/callbacks.rb +4 -3
  45. data/lib/mongo_mapper/plugins/clone.rb +10 -4
  46. data/lib/mongo_mapper/plugins/descendants.rb +1 -0
  47. data/lib/mongo_mapper/plugins/dirty.rb +1 -0
  48. data/lib/mongo_mapper/plugins/document.rb +41 -0
  49. data/lib/mongo_mapper/plugins/dynamic_querying.rb +41 -0
  50. data/lib/mongo_mapper/{support/find.rb → plugins/dynamic_querying/dynamic_finder.rb} +3 -36
  51. data/lib/mongo_mapper/plugins/embedded_document.rb +49 -0
  52. data/lib/mongo_mapper/plugins/equality.rb +3 -9
  53. data/lib/mongo_mapper/plugins/identity_map.rb +8 -10
  54. data/lib/mongo_mapper/plugins/indexes.rb +12 -0
  55. data/lib/mongo_mapper/plugins/inspect.rb +1 -0
  56. data/lib/mongo_mapper/plugins/keys.rb +15 -27
  57. data/lib/mongo_mapper/plugins/keys/key.rb +14 -3
  58. data/lib/mongo_mapper/plugins/logger.rb +1 -0
  59. data/lib/mongo_mapper/plugins/modifiers.rb +3 -2
  60. data/lib/mongo_mapper/plugins/pagination.rb +5 -15
  61. data/lib/mongo_mapper/plugins/persistence.rb +12 -11
  62. data/lib/mongo_mapper/plugins/protected.rb +8 -0
  63. data/lib/mongo_mapper/plugins/querying.rb +236 -0
  64. data/lib/mongo_mapper/plugins/querying/decorator.rb +46 -0
  65. data/lib/mongo_mapper/plugins/rails.rb +1 -0
  66. data/lib/mongo_mapper/plugins/safe.rb +28 -0
  67. data/lib/mongo_mapper/plugins/sci.rb +32 -0
  68. data/lib/mongo_mapper/plugins/scopes.rb +21 -0
  69. data/lib/mongo_mapper/plugins/serialization.rb +1 -0
  70. data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
  71. data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
  72. data/lib/mongo_mapper/plugins/validations.rb +5 -1
  73. data/lib/mongo_mapper/support/descendant_appends.rb +5 -6
  74. data/lib/mongo_mapper/version.rb +2 -1
  75. data/test/NOTE_ON_TESTING +1 -0
  76. data/test/active_model_lint_test.rb +13 -0
  77. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +63 -0
  78. data/test/functional/associations/test_belongs_to_proxy.rb +93 -0
  79. data/test/functional/associations/test_in_array_proxy.rb +319 -0
  80. data/test/functional/associations/test_many_documents_as_proxy.rb +229 -0
  81. data/test/functional/associations/test_many_documents_proxy.rb +536 -0
  82. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +176 -0
  83. data/test/functional/associations/test_many_embedded_proxy.rb +256 -0
  84. data/test/functional/associations/test_many_polymorphic_proxy.rb +302 -0
  85. data/test/functional/associations/test_one_embedded_proxy.rb +58 -0
  86. data/test/functional/associations/test_one_proxy.rb +182 -0
  87. data/test/functional/test_accessible.rb +168 -0
  88. data/test/functional/test_associations.rb +44 -0
  89. data/test/functional/test_binary.rb +27 -0
  90. data/test/functional/test_caching.rb +76 -0
  91. data/test/functional/test_callbacks.rb +151 -0
  92. data/test/functional/test_dirty.rb +163 -0
  93. data/test/functional/test_document.rb +253 -0
  94. data/test/functional/test_dynamic_querying.rb +75 -0
  95. data/test/functional/test_embedded_document.rb +210 -0
  96. data/test/functional/test_identity_map.rb +506 -0
  97. data/test/functional/test_indexes.rb +42 -0
  98. data/test/functional/test_logger.rb +20 -0
  99. data/test/functional/test_modifiers.rb +416 -0
  100. data/test/functional/test_pagination.rb +91 -0
  101. data/test/functional/test_protected.rb +175 -0
  102. data/test/functional/test_querying.rb +873 -0
  103. data/test/functional/test_safe.rb +76 -0
  104. data/test/functional/test_sci.rb +230 -0
  105. data/test/functional/test_scopes.rb +171 -0
  106. data/test/functional/test_string_id_compatibility.rb +67 -0
  107. data/test/functional/test_timestamps.rb +62 -0
  108. data/test/functional/test_userstamps.rb +27 -0
  109. data/test/functional/test_validations.rb +342 -0
  110. data/test/models.rb +227 -0
  111. data/test/test_helper.rb +98 -0
  112. data/test/unit/associations/test_base.rb +212 -0
  113. data/test/unit/associations/test_proxy.rb +105 -0
  114. data/test/unit/serializers/test_json_serializer.rb +202 -0
  115. data/test/unit/test_clone.rb +69 -0
  116. data/test/unit/test_descendant_appends.rb +71 -0
  117. data/test/unit/test_document.rb +213 -0
  118. data/test/unit/test_dynamic_finder.rb +125 -0
  119. data/test/unit/test_embedded_document.rb +644 -0
  120. data/test/unit/test_extensions.rb +380 -0
  121. data/test/unit/test_key.rb +185 -0
  122. data/test/unit/test_keys.rb +55 -0
  123. data/test/unit/test_mongo_mapper.rb +110 -0
  124. data/test/unit/test_pagination.rb +11 -0
  125. data/test/unit/test_plugins.rb +50 -0
  126. data/test/unit/test_rails.rb +181 -0
  127. data/test/unit/test_rails_compatibility.rb +52 -0
  128. data/test/unit/test_serialization.rb +51 -0
  129. data/test/unit/test_time_zones.rb +39 -0
  130. data/test/unit/test_validations.rb +544 -0
  131. metadata +113 -44
  132. data/lib/mongo_mapper/plugins/pagination/proxy.rb +0 -72
  133. data/lib/mongo_mapper/query.rb +0 -23
  134. data/lib/mongo_mapper/support.rb +0 -196
@@ -0,0 +1,105 @@
1
+ require 'test_helper'
2
+
3
+ class FakeNilProxy < MongoMapper::Plugins::Associations::Proxy
4
+ def find_target; nil end
5
+ end
6
+
7
+ class FakeBlankProxy < MongoMapper::Plugins::Associations::Proxy
8
+ def find_target; '' end
9
+ end
10
+
11
+ class FakeNumberProxy < MongoMapper::Plugins::Associations::Proxy
12
+ def find_target; 17 end
13
+ end
14
+
15
+ class FakeProxy < MongoMapper::Plugins::Associations::Proxy
16
+ def find_target; [1, 2] end
17
+ end
18
+
19
+ class ProxyTest < Test::Unit::TestCase
20
+ def setup
21
+ @owner = mock('owner')
22
+ @owner.stubs(:new?).returns(false)
23
+ @association = mock('association')
24
+ @association.stubs(:options).returns({:extend => []})
25
+
26
+ @proxy = FakeProxy.new(@owner, @association)
27
+ @nil_proxy = FakeNilProxy.new(@owner, @association)
28
+ @blank_proxy = FakeBlankProxy.new(@owner, @association)
29
+ end
30
+
31
+ should 'return true for === target' do
32
+ @proxy = FakeProxy.new(@owner, @association)
33
+ @proxy.should === Array
34
+ end
35
+
36
+ should "set target to nil when reset is called" do
37
+ @proxy.reset
38
+ @proxy.target.should be_nil
39
+ end
40
+
41
+ should "be able to inspect the proxy" do
42
+ @proxy.inspect.should == '[1, 2]'
43
+ end
44
+
45
+ context "nil?" do
46
+ should "be true if nil" do
47
+ @nil_proxy.nil?.should be_true
48
+ end
49
+
50
+ should "be false if not nil" do
51
+ @proxy.nil?.should be_false
52
+ end
53
+ end
54
+
55
+ context "blank?" do
56
+ should "be true if blank" do
57
+ @blank_proxy.blank?.should be_true
58
+ @nil_proxy.blank?.should be_true
59
+ end
60
+
61
+ should "be false if not blank" do
62
+ @proxy.blank?.should be_false
63
+ end
64
+ end
65
+
66
+ context "present?" do
67
+ should "be true if present" do
68
+ @proxy.present?.should be_true
69
+ end
70
+
71
+ should "be false if not present" do
72
+ @blank_proxy.present?.should be_false
73
+ @nil_proxy.present?.should be_false
74
+ end
75
+ end
76
+
77
+ should "delegate respond_to? to target" do
78
+ @proxy.respond_to?(:each).should be_true
79
+ @proxy.respond_to?(:size).should be_true
80
+ @proxy.respond_to?(:gsub).should be_false
81
+ end
82
+
83
+ should "alias proxy owner to owner" do
84
+ @proxy.proxy_owner.should == @owner
85
+ end
86
+
87
+ should "alias proxy target to target" do
88
+ @proxy.proxy_target.should == @target
89
+ end
90
+
91
+ context "send" do
92
+ should "work if proxy responds to method" do
93
+ @proxy.send(:reset)
94
+ @proxy.target.should be_nil
95
+ end
96
+
97
+ should "work if the target responds to the method" do
98
+ @proxy.send(:size).should == 2
99
+ end
100
+
101
+ should "not work if neither the proxy or target respond to method" do
102
+ lambda { @proxy.send(:gsub) }.should raise_error
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,202 @@
1
+ require 'test_helper'
2
+ require 'active_support/version'
3
+
4
+ class JsonSerializationTest < Test::Unit::TestCase
5
+
6
+ # Helper function in case things change in the future
7
+ # - replacing all those to_json calls was a nightmare
8
+ def convert_to_json(object, options={})
9
+ ActiveSupport::JSON.encode(object, options)
10
+ end
11
+
12
+ class Tag
13
+ include MongoMapper::EmbeddedDocument
14
+ key :name, String
15
+ end
16
+
17
+ class Contact
18
+ include MongoMapper::Document
19
+ key :name, String
20
+ key :age, Integer
21
+ key :created_at, Time
22
+ key :awesome, Boolean
23
+ key :preferences, Hash
24
+
25
+ many :tags, :class_name => 'JsonSerializationTest::Tag'
26
+ end
27
+
28
+ def setup
29
+ Contact.include_root_in_json = false
30
+ @contact = Contact.new(
31
+ :name => 'Konata Izumi',
32
+ :age => 16,
33
+ :created_at => Time.utc(2006, 8, 1),
34
+ :awesome => true,
35
+ :preferences => { :shows => 'anime' }
36
+ )
37
+ end
38
+
39
+ should "include demodulized root" do
40
+ Contact.include_root_in_json = true
41
+ assert_match %r{^\{"contact":\s?\{}, convert_to_json(@contact)
42
+ end
43
+
44
+ should "encode all encodable attributes" do
45
+ json = convert_to_json(@contact)
46
+
47
+ assert_no_match %r{"_id"}, json
48
+ assert_match %r{"name":"Konata Izumi"}, json
49
+ assert_match %r{"age":16}, json
50
+ assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
51
+ assert_match %r{"awesome":true}, json
52
+ assert_match %r{"preferences":\{"shows":"anime"\}}, json
53
+ end
54
+
55
+ should "allow attribute filtering with only" do
56
+ json = convert_to_json(@contact, :only => [:name, :age])
57
+
58
+ assert_no_match %r{"_id"}, json
59
+ assert_match %r{"name":"Konata Izumi"}, json
60
+ assert_match %r{"age":16}, json
61
+ assert_no_match %r{"awesome"}, json
62
+ assert_no_match %r{"created_at"}, json
63
+ assert_no_match %r{"preferences"}, json
64
+ end
65
+
66
+ should "allow attribute filtering with except" do
67
+ json = convert_to_json(@contact, :except => [:name, :age])
68
+
69
+ assert_no_match %r{"_id"}, json
70
+ assert_no_match %r{"name"}, json
71
+ assert_no_match %r{"age"}, json
72
+ assert_match %r{"awesome"}, json
73
+ assert_match %r{"created_at"}, json
74
+ assert_match %r{"preferences"}, json
75
+ end
76
+
77
+ context "_id key" do
78
+ should "not be included by default" do
79
+ json = convert_to_json(@contact)
80
+ assert_no_match %r{"_id":}, json
81
+ end
82
+
83
+ should "not be included even if :except is used" do
84
+ json = convert_to_json(@contact, :except => :name)
85
+ assert_no_match %r{"_id":}, json
86
+ end
87
+ end
88
+
89
+ context "id method" do
90
+ setup do
91
+ def @contact.label; "Has cheezburger"; end
92
+ def @contact.favorite_quote; "Constraints are liberating"; end
93
+ end
94
+
95
+ should "be included by default" do
96
+ json = convert_to_json(@contact)
97
+ assert_match %r{"id"}, json
98
+ end
99
+
100
+ should "be included when single method included" do
101
+ json = convert_to_json(@contact, :methods => :label)
102
+ assert_match %r{"id"}, json
103
+ assert_match %r{"label":"Has cheezburger"}, json
104
+ assert_match %r{"name":"Konata Izumi"}, json
105
+ assert_no_match %r{"favorite_quote":"Constraints are liberating"}, json
106
+ end
107
+
108
+ should "be included when multiple methods included" do
109
+ json = convert_to_json(@contact, :methods => [:label, :favorite_quote])
110
+ assert_match %r{"id"}, json
111
+ assert_match %r{"label":"Has cheezburger"}, json
112
+ assert_match %r{"favorite_quote":"Constraints are liberating"}, json
113
+ assert_match %r{"name":"Konata Izumi"}, json
114
+ end
115
+
116
+ should "not be included if :only is present" do
117
+ json = convert_to_json(@contact, :only => :name)
118
+ assert_no_match %r{"id":}, json
119
+ end
120
+
121
+ should "be represented by a string" do
122
+ json = convert_to_json(@contact)
123
+ assert_match %r{"id":"}, json
124
+ end
125
+ end
126
+
127
+ context "including methods" do
128
+ setup do
129
+ def @contact.label; "Has cheezburger"; end
130
+ def @contact.favorite_quote; "Constraints are liberating"; end
131
+ end
132
+
133
+ should "include single method" do
134
+ json = convert_to_json(@contact, :methods => :label)
135
+ assert_match %r{"label":"Has cheezburger"}, json
136
+ end
137
+
138
+ should "include multiple methods" do
139
+ json = convert_to_json(@contact, :only => :name, :methods => [:label, :favorite_quote])
140
+ assert_match %r{"label":"Has cheezburger"}, json
141
+ assert_match %r{"favorite_quote":"Constraints are liberating"}, json
142
+ assert_match %r{"name":"Konata Izumi"}, json
143
+ assert_no_match %r{"age":16}, json
144
+ assert_no_match %r{"awesome"}, json
145
+ assert_no_match %r{"created_at"}, json
146
+ assert_no_match %r{"preferences"}, json
147
+ end
148
+ end
149
+
150
+ context "array of records" do
151
+ setup do
152
+ @contacts = [
153
+ Contact.new(:name => 'David', :age => 39),
154
+ Contact.new(:name => 'Mary', :age => 14)
155
+ ]
156
+ end
157
+
158
+ should "allow attribute filtering with only" do
159
+ json =convert_to_json(@contacts, :only => :name)
160
+ assert_match %r{\{"name":"David"\}}, json
161
+ assert_match %r{\{"name":"Mary"\}}, json
162
+ end
163
+
164
+ should "allow attribute filtering with except" do
165
+ json = convert_to_json(@contacts, :except => [:name, :preferences, :awesome, :created_at, :updated_at])
166
+ assert_match %r{"age":39}, json
167
+ assert_match %r{"age":14}, json
168
+ assert_no_match %r{"name":}, json
169
+ assert_no_match %r{"preferences":}, json
170
+ assert_no_match %r{"awesome":}, json
171
+ assert_no_match %r{"created_at":}, json
172
+ assert_no_match %r{"updated_at":}, json
173
+ end
174
+ end
175
+
176
+ should "allow options for hash of records" do
177
+ contacts = {
178
+ 1 => Contact.new(:name => 'David', :age => 39),
179
+ 2 => Contact.new(:name => 'Mary', :age => 14)
180
+ }
181
+ json = convert_to_json(contacts, :only => [1, :name])
182
+ assert_match %r{"1":}, json
183
+ assert_match %r{\{"name":"David"\}}, json
184
+ assert_no_match %r{"2":}, json
185
+ end
186
+
187
+ should "include embedded attributes" do
188
+ contact = Contact.new(:name => 'John', :age => 27)
189
+ contact.tags = [Tag.new(:name => 'awesome'), Tag.new(:name => 'ruby')]
190
+ json = convert_to_json(contact)
191
+ assert_match %r{"tags":}, json
192
+ assert_match %r{"name":"awesome"}, json
193
+ assert_match %r{"name":"ruby"}, json
194
+ end
195
+
196
+ should "include dynamic attributes" do
197
+ contact = Contact.new(:name => 'John', :age => 27, :foo => 'bar')
198
+ contact['smell'] = 'stinky'
199
+ json = convert_to_json(contact)
200
+ assert_match %r{"smell":"stinky"}, json
201
+ end
202
+ end
@@ -0,0 +1,69 @@
1
+ require 'test_helper'
2
+
3
+ class CloneTest < Test::Unit::TestCase
4
+ context "Document" do
5
+ setup do
6
+ @document = Doc()
7
+ @embedded = EDoc()
8
+ @document.many :widgets, :class => @embedded
9
+ @tags = ['red', 'green', 'blue']
10
+ @doc = @document.create({
11
+ :name => "foo",
12
+ :age => 27,
13
+ :tags => @tags,
14
+ :widgets => [@embedded.new, @embedded.new],
15
+ })
16
+ end
17
+
18
+ context "#clone" do
19
+ should "be new" do
20
+ @doc.clone.should be_new
21
+ end
22
+
23
+ should "copy the attributes" do
24
+ clone = @doc.clone
25
+ clone.name.should == "foo"
26
+ clone.age.should == 27
27
+ end
28
+
29
+ should "clone duplicable attributes" do
30
+ @doc.clone.tags.should_not equal(@tags)
31
+ end
32
+
33
+ should "clone many embedded documents" do
34
+ @doc.clone.widgets.should_not equal(@doc.widgets)
35
+ end
36
+
37
+ should "not be destroyed" do
38
+ @doc.destroy
39
+ @doc.clone.should_not be_destroyed
40
+ end
41
+ end
42
+ end
43
+
44
+ context "EmbeddedDocument" do
45
+ setup do
46
+ @document = EDoc do
47
+ key :name, String
48
+ key :age, Integer
49
+ end
50
+ end
51
+
52
+ context "#clone" do
53
+ should "regenerate the id" do
54
+ doc = @document.new(:name => "foo", :age => 27)
55
+ doc_id = doc.id
56
+ clone = doc.clone
57
+ clone_id = clone.id
58
+ clone_id.should_not == doc_id
59
+ end
60
+
61
+ should "copy the attributes" do
62
+ doc = @document.new(:name => "foo", :age => 27)
63
+ clone = doc.clone
64
+ clone.name.should == "foo"
65
+ clone.age.should == 27
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,71 @@
1
+ require 'test_helper'
2
+
3
+ class DescendantAppendsTest < Test::Unit::TestCase
4
+ context "Document" do
5
+ should "default descendants to a new set" do
6
+ MongoMapper::Document.descendants.should be_instance_of(Set)
7
+ end
8
+
9
+ should 'allow extensions to Document to be appended' do
10
+ module Extension; def test_this_extension; end end
11
+ MongoMapper::Document.append_extensions(Extension)
12
+ article = Doc()
13
+ article.should respond_to(:test_this_extension)
14
+ end
15
+
16
+ should 'add appended extensions to classes that include Document before they are added' do
17
+ module Extension; def test_this_extension; end end
18
+ article = Doc()
19
+ MongoMapper::Document.append_extensions(Extension)
20
+ article.should respond_to(:test_this_extension)
21
+ end
22
+
23
+ should 'allow inclusions to Document to be appended' do
24
+ module Inclusion; def test_this_inclusion; end end
25
+ MongoMapper::Document.append_inclusions(Inclusion)
26
+ article = Doc()
27
+ article.new.should respond_to(:test_this_inclusion)
28
+ end
29
+
30
+ should 'add appended inclusions to classes that include Document before they are added' do
31
+ module Inclusion; def test_this_inclusion; end end
32
+ article = Doc()
33
+ MongoMapper::Document.append_inclusions(Inclusion)
34
+ article.new.should respond_to(:test_this_inclusion)
35
+ end
36
+ end
37
+
38
+ context "EmbeddedDocument" do
39
+ should "default descendants to a new set" do
40
+ MongoMapper::EmbeddedDocument.descendants.should be_instance_of(Set)
41
+ end
42
+
43
+ should 'allow extensions to Document to be appended' do
44
+ module Extension; def test_this_extension; end end
45
+ MongoMapper::EmbeddedDocument.append_extensions(Extension)
46
+ article = EDoc()
47
+ article.should respond_to(:test_this_extension)
48
+ end
49
+
50
+ should 'add appended extensions to classes that include Document before they are added' do
51
+ module Extension; def test_this_extension; end end
52
+ article = EDoc()
53
+ MongoMapper::EmbeddedDocument.append_extensions(Extension)
54
+ article.should respond_to(:test_this_extension)
55
+ end
56
+
57
+ should 'allow inclusions to Document to be appended' do
58
+ module Inclusion; def test_this_inclusion; end end
59
+ MongoMapper::EmbeddedDocument.append_inclusions(Inclusion)
60
+ article = EDoc()
61
+ article.new.should respond_to(:test_this_inclusion)
62
+ end
63
+
64
+ should 'add appended inclusions to classes that include Document before they are added' do
65
+ module Inclusion; def test_this_inclusion; end end
66
+ article = EDoc()
67
+ MongoMapper::EmbeddedDocument.append_inclusions(Inclusion)
68
+ article.new.should respond_to(:test_this_inclusion)
69
+ end
70
+ end
71
+ end