mongo_mapper-unstable 2010.3.8 → 2010.06.23

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 (143) 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/connection.rb +83 -0
  8. data/lib/mongo_mapper/document.rb +11 -329
  9. data/lib/mongo_mapper/embedded_document.rb +9 -38
  10. data/lib/mongo_mapper/exceptions.rb +30 -0
  11. data/lib/mongo_mapper/extensions/array.rb +19 -0
  12. data/lib/mongo_mapper/extensions/binary.rb +22 -0
  13. data/lib/mongo_mapper/extensions/boolean.rb +44 -0
  14. data/lib/mongo_mapper/extensions/date.rb +25 -0
  15. data/lib/mongo_mapper/extensions/float.rb +14 -0
  16. data/lib/mongo_mapper/extensions/hash.rb +14 -0
  17. data/lib/mongo_mapper/extensions/integer.rb +19 -0
  18. data/lib/mongo_mapper/extensions/kernel.rb +9 -0
  19. data/lib/mongo_mapper/extensions/nil_class.rb +18 -0
  20. data/lib/mongo_mapper/extensions/object.rb +27 -0
  21. data/lib/mongo_mapper/extensions/object_id.rb +30 -0
  22. data/lib/mongo_mapper/extensions/set.rb +20 -0
  23. data/lib/mongo_mapper/extensions/string.rb +18 -0
  24. data/lib/mongo_mapper/extensions/time.rb +29 -0
  25. data/lib/mongo_mapper/plugins/accessible.rb +44 -0
  26. data/lib/mongo_mapper/plugins/associations/base.rb +7 -6
  27. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +5 -6
  28. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +5 -6
  29. data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
  30. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +2 -1
  31. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +25 -39
  32. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +4 -4
  33. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +36 -46
  34. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
  35. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +5 -4
  36. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
  37. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +40 -0
  38. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +7 -7
  39. data/lib/mongo_mapper/plugins/associations/proxy.rb +16 -8
  40. data/lib/mongo_mapper/plugins/associations.rb +14 -22
  41. data/lib/mongo_mapper/plugins/caching.rb +21 -0
  42. data/lib/mongo_mapper/plugins/callbacks.rb +17 -5
  43. data/lib/mongo_mapper/plugins/clone.rb +10 -4
  44. data/lib/mongo_mapper/plugins/descendants.rb +3 -2
  45. data/lib/mongo_mapper/plugins/dirty.rb +1 -0
  46. data/lib/mongo_mapper/plugins/document.rb +41 -0
  47. data/lib/mongo_mapper/{support/find.rb → plugins/dynamic_querying/dynamic_finder.rb} +3 -36
  48. data/lib/mongo_mapper/plugins/dynamic_querying.rb +43 -0
  49. data/lib/mongo_mapper/plugins/embedded_document.rb +49 -0
  50. data/lib/mongo_mapper/plugins/equality.rb +4 -10
  51. data/lib/mongo_mapper/plugins/identity_map.rb +29 -23
  52. data/lib/mongo_mapper/plugins/indexes.rb +12 -0
  53. data/lib/mongo_mapper/plugins/inspect.rb +1 -0
  54. data/lib/mongo_mapper/plugins/keys/key.rb +55 -0
  55. data/lib/mongo_mapper/plugins/keys.rb +85 -110
  56. data/lib/mongo_mapper/plugins/logger.rb +1 -0
  57. data/lib/mongo_mapper/plugins/modifiers.rb +41 -16
  58. data/lib/mongo_mapper/plugins/pagination.rb +5 -15
  59. data/lib/mongo_mapper/plugins/persistence.rb +69 -0
  60. data/lib/mongo_mapper/plugins/protected.rb +9 -1
  61. data/lib/mongo_mapper/plugins/querying/decorator.rb +46 -0
  62. data/lib/mongo_mapper/plugins/querying/plucky_methods.rb +15 -0
  63. data/lib/mongo_mapper/plugins/querying.rb +176 -0
  64. data/lib/mongo_mapper/plugins/rails.rb +6 -1
  65. data/lib/mongo_mapper/plugins/safe.rb +28 -0
  66. data/lib/mongo_mapper/plugins/sci.rb +32 -0
  67. data/lib/mongo_mapper/plugins/scopes.rb +21 -0
  68. data/lib/mongo_mapper/plugins/serialization.rb +5 -4
  69. data/lib/mongo_mapper/plugins/timestamps.rb +2 -1
  70. data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
  71. data/lib/mongo_mapper/plugins/validations.rb +9 -5
  72. data/lib/mongo_mapper/plugins.rb +1 -20
  73. data/lib/mongo_mapper/support/descendant_appends.rb +5 -6
  74. data/lib/mongo_mapper/version.rb +4 -0
  75. data/lib/mongo_mapper.rb +71 -128
  76. data/test/{NOTE_ON_TESTING → _NOTE_ON_TESTING} +0 -0
  77. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +5 -5
  78. data/test/functional/associations/test_belongs_to_proxy.rb +13 -21
  79. data/test/functional/associations/test_in_array_proxy.rb +7 -9
  80. data/test/functional/associations/test_many_documents_as_proxy.rb +5 -5
  81. data/test/functional/associations/test_many_documents_proxy.rb +186 -64
  82. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +22 -22
  83. data/test/functional/associations/test_many_embedded_proxy.rb +32 -32
  84. data/test/functional/associations/test_many_polymorphic_proxy.rb +47 -47
  85. data/test/functional/associations/test_one_embedded_proxy.rb +67 -0
  86. data/test/functional/associations/test_one_proxy.rb +70 -49
  87. data/test/functional/test_accessible.rb +168 -0
  88. data/test/functional/test_associations.rb +11 -11
  89. data/test/functional/test_binary.rb +5 -5
  90. data/test/functional/test_caching.rb +76 -0
  91. data/test/functional/test_callbacks.rb +104 -34
  92. data/test/functional/test_dirty.rb +16 -16
  93. data/test/functional/test_document.rb +12 -924
  94. data/test/functional/test_dynamic_querying.rb +75 -0
  95. data/test/functional/test_embedded_document.rb +88 -8
  96. data/test/functional/test_identity_map.rb +41 -43
  97. data/test/functional/{test_indexing.rb → test_indexes.rb} +3 -5
  98. data/test/functional/test_logger.rb +1 -1
  99. data/test/functional/test_modifiers.rb +275 -181
  100. data/test/functional/test_pagination.rb +13 -15
  101. data/test/functional/test_protected.rb +25 -11
  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 +11 -11
  107. data/test/functional/test_timestamps.rb +0 -2
  108. data/test/functional/test_userstamps.rb +0 -1
  109. data/test/functional/test_validations.rb +44 -31
  110. data/test/models.rb +18 -17
  111. data/test/{active_model_lint_test.rb → test_active_model_lint.rb} +3 -1
  112. data/test/test_helper.rb +59 -16
  113. data/test/unit/associations/test_base.rb +47 -42
  114. data/test/unit/associations/test_proxy.rb +15 -15
  115. data/test/unit/serializers/test_json_serializer.rb +29 -29
  116. data/test/unit/test_clone.rb +69 -0
  117. data/test/unit/test_descendant_appends.rb +3 -3
  118. data/test/unit/test_document.rb +49 -67
  119. data/test/unit/test_dynamic_finder.rb +53 -51
  120. data/test/unit/test_embedded_document.rb +19 -38
  121. data/test/unit/{test_support.rb → test_extensions.rb} +136 -122
  122. data/test/unit/test_key.rb +185 -0
  123. data/test/unit/test_keys.rb +29 -147
  124. data/test/unit/test_mongo_mapper.rb +3 -48
  125. data/test/unit/test_pagination.rb +1 -150
  126. data/test/unit/test_rails.rb +77 -19
  127. data/test/unit/test_rails_compatibility.rb +12 -12
  128. data/test/unit/test_serialization.rb +5 -5
  129. data/test/unit/test_time_zones.rb +9 -9
  130. data/test/unit/test_validations.rb +46 -46
  131. metadata +157 -155
  132. data/.gitignore +0 -10
  133. data/Rakefile +0 -55
  134. data/VERSION +0 -1
  135. data/lib/mongo_mapper/plugins/pagination/proxy.rb +0 -72
  136. data/lib/mongo_mapper/query.rb +0 -130
  137. data/lib/mongo_mapper/support.rb +0 -215
  138. data/mongo_mapper.gemspec +0 -196
  139. data/performance/read_write.rb +0 -52
  140. data/specs.watchr +0 -51
  141. data/test/support/custom_matchers.rb +0 -55
  142. data/test/support/timing.rb +0 -16
  143. data/test/unit/test_query.rb +0 -340
@@ -5,203 +5,208 @@ class FooMonster; end
5
5
 
6
6
  class AssociationBaseTest < Test::Unit::TestCase
7
7
  include MongoMapper::Plugins::Associations
8
-
8
+
9
9
  should "initialize with type and name" do
10
10
  base = Base.new(:many, :foos)
11
11
  base.type.should == :many
12
12
  base.name.should == :foos
13
13
  end
14
-
14
+
15
15
  should "also allow options when initializing" do
16
16
  base = Base.new(:many, :foos, :polymorphic => true)
17
17
  base.options[:polymorphic].should be_true
18
18
  end
19
-
19
+
20
20
  context "class_name" do
21
21
  should "work for belongs_to" do
22
22
  Base.new(:belongs_to, :user).class_name.should == 'User'
23
23
  end
24
-
24
+
25
25
  should "work for many" do
26
26
  Base.new(:many, :smart_people).class_name.should == 'SmartPerson'
27
27
  end
28
-
28
+
29
29
  should "be changeable using class_name option" do
30
30
  base = Base.new(:many, :smart_people, :class_name => 'IntelligentPerson')
31
31
  base.class_name.should == 'IntelligentPerson'
32
32
  end
33
33
  end
34
-
34
+
35
35
  context "klass" do
36
36
  should "default to class_name constantized" do
37
37
  Base.new(:belongs_to, :foo_monster).klass.should == FooMonster
38
38
  end
39
-
39
+
40
40
  should "be the specified class" do
41
41
  anonnymous_class = Class.new
42
42
  Base.new(:belongs_to, :foo_monster, :class => anonnymous_class).klass.should == anonnymous_class
43
43
  end
44
44
  end
45
-
45
+
46
46
  context "many?" do
47
47
  should "be true if many" do
48
48
  Base.new(:many, :foos).many?.should be_true
49
49
  end
50
-
50
+
51
51
  should "be false if not many" do
52
52
  Base.new(:belongs_to, :foo).many?.should be_false
53
53
  Base.new(:one, :foo).many?.should be_false
54
54
  end
55
55
  end
56
-
56
+
57
57
  context "one?" do
58
58
  should "be true if one" do
59
59
  Base.new(:one, :foo).one?.should be_true
60
60
  end
61
-
61
+
62
62
  should "be false if not one" do
63
63
  Base.new(:many, :foo).one?.should be_false
64
64
  end
65
65
  end
66
-
66
+
67
67
  context "belongs_to?" do
68
68
  should "be true if belongs_to" do
69
69
  Base.new(:belongs_to, :foo).belongs_to?.should be_true
70
70
  end
71
-
71
+
72
72
  should "be false if not belongs_to" do
73
73
  Base.new(:many, :foos).belongs_to?.should be_false
74
74
  end
75
75
  end
76
-
76
+
77
77
  context "polymorphic?" do
78
78
  should "be true if polymorphic" do
79
79
  Base.new(:many, :foos, :polymorphic => true).polymorphic?.should be_true
80
80
  end
81
-
81
+
82
82
  should "be false if not polymorphic" do
83
83
  Base.new(:many, :bars).polymorphic?.should be_false
84
84
  end
85
85
  end
86
-
86
+
87
87
  context "as?" do
88
88
  should "be true if one" do
89
89
  Base.new(:one, :foo, :as => :commentable).as?.should be_true
90
90
  end
91
-
91
+
92
92
  should "be false if not one" do
93
93
  Base.new(:many, :foo).as?.should be_false
94
94
  end
95
95
  end
96
-
96
+
97
97
  context "in_array?" do
98
98
  should "be true if one" do
99
99
  Base.new(:one, :foo, :in => :list_ids).in_array?.should be_true
100
100
  end
101
-
101
+
102
102
  should "be false if not one" do
103
103
  Base.new(:many, :foo).in_array?.should be_false
104
104
  end
105
105
  end
106
-
106
+
107
107
  context "query_options" do
108
108
  should "default to empty hash" do
109
109
  base = Base.new(:many, :foos)
110
110
  base.query_options.should == {}
111
111
  end
112
-
112
+
113
113
  should "work with order" do
114
114
  base = Base.new(:many, :foos, :order => 'position')
115
115
  base.query_options.should == {:order => 'position'}
116
116
  end
117
-
117
+
118
118
  should "correctly parse from options" do
119
119
  base = Base.new(:many, :foos, :order => 'position', :somekey => 'somevalue')
120
120
  base.query_options.should == {:order => 'position', :somekey => 'somevalue'}
121
121
  end
122
122
  end
123
-
123
+
124
124
  context "type_key_name" do
125
125
  should "be _type for many" do
126
126
  Base.new(:many, :foos).type_key_name.should == '_type'
127
127
  end
128
-
128
+
129
129
  should "be association name _ type for belongs_to" do
130
130
  Base.new(:belongs_to, :foo).type_key_name.should == 'foo_type'
131
131
  end
132
132
  end
133
-
133
+
134
134
  context "foreign_key" do
135
135
  should "default to assocation name _id for belongs to" do
136
136
  base = Base.new(:belongs_to, :foo)
137
137
  base.foreign_key.should == 'foo_id'
138
138
  end
139
-
139
+
140
140
  should "be overridable with :foreign_key option" do
141
141
  base = Base.new(:belongs_to, :foo, :foreign_key => 'foobar_id')
142
142
  base.foreign_key.should == 'foobar_id'
143
143
  end
144
144
  end
145
-
145
+
146
146
  should "have ivar that is association name" do
147
147
  Base.new(:belongs_to, :foo).ivar.should == '@_foo'
148
148
  end
149
-
149
+
150
150
  context "embeddable?" do
151
151
  should "be true if class is embeddable" do
152
152
  base = Base.new(:many, :medias)
153
153
  base.embeddable?.should be_true
154
154
  end
155
-
155
+
156
156
  should "be false if class is not embeddable" do
157
157
  base = Base.new(:many, :statuses)
158
158
  base.embeddable?.should be_false
159
-
159
+
160
160
  base = Base.new(:belongs_to, :project)
161
161
  base.embeddable?.should be_false
162
162
  end
163
163
  end
164
-
164
+
165
165
  context "proxy_class" do
166
- should "be ManyDocumentsProxy for many" do
166
+ should "be ManyDocumentsProxy for many" do
167
167
  base = Base.new(:many, :statuses)
168
168
  base.proxy_class.should == ManyDocumentsProxy
169
169
  end
170
-
170
+
171
171
  should "be ManyPolymorphicProxy for polymorphic many" do
172
172
  base = Base.new(:many, :messages, :polymorphic => true)
173
173
  base.proxy_class.should == ManyPolymorphicProxy
174
174
  end
175
-
175
+
176
176
  should "be ManyEmbeddedProxy for many embedded" do
177
177
  base = Base.new(:many, :medias)
178
178
  base.proxy_class.should == ManyEmbeddedProxy
179
179
  end
180
-
180
+
181
181
  should "be ManyEmbeddedPolymorphicProxy for polymorphic many embedded" do
182
182
  base = Base.new(:many, :medias, :polymorphic => true)
183
183
  base.proxy_class.should == ManyEmbeddedPolymorphicProxy
184
184
  end
185
-
185
+
186
186
  should "be BelongsToProxy for belongs_to" do
187
187
  base = Base.new(:belongs_to, :project)
188
188
  base.proxy_class.should == BelongsToProxy
189
189
  end
190
-
190
+
191
191
  should "be BelongsToPolymorphicProxy for polymorphic belongs_to" do
192
192
  base = Base.new(:belongs_to, :target, :polymorphic => true)
193
193
  base.proxy_class.should == BelongsToPolymorphicProxy
194
194
  end
195
-
195
+
196
196
  should "be OneProxy for one" do
197
- base = Base.new(:one, :target, :polymorphic => true)
197
+ base = Base.new(:one, :status, :polymorphic => true)
198
198
  base.proxy_class.should == OneProxy
199
199
  end
200
-
200
+
201
+ should "be OneEmbeddedProxy for one embedded" do
202
+ base = Base.new(:one, :media)
203
+ base.proxy_class.should == OneEmbeddedProxy
204
+ end
205
+
201
206
  should "be InArrayProxy for many with :in option" do
202
207
  base = Base.new(:many, :messages, :in => :message_ids)
203
208
  base.proxy_class.should == InArrayProxy
204
209
  end
205
210
  end
206
-
207
- end
211
+
212
+ end
@@ -27,77 +27,77 @@ class ProxyTest < Test::Unit::TestCase
27
27
  @nil_proxy = FakeNilProxy.new(@owner, @association)
28
28
  @blank_proxy = FakeBlankProxy.new(@owner, @association)
29
29
  end
30
-
30
+
31
31
  should 'return true for === target' do
32
32
  @proxy = FakeProxy.new(@owner, @association)
33
33
  @proxy.should === Array
34
34
  end
35
-
35
+
36
36
  should "set target to nil when reset is called" do
37
37
  @proxy.reset
38
38
  @proxy.target.should be_nil
39
39
  end
40
-
40
+
41
41
  should "be able to inspect the proxy" do
42
42
  @proxy.inspect.should == '[1, 2]'
43
43
  end
44
-
44
+
45
45
  context "nil?" do
46
46
  should "be true if nil" do
47
47
  @nil_proxy.nil?.should be_true
48
48
  end
49
-
49
+
50
50
  should "be false if not nil" do
51
51
  @proxy.nil?.should be_false
52
52
  end
53
53
  end
54
-
54
+
55
55
  context "blank?" do
56
56
  should "be true if blank" do
57
57
  @blank_proxy.blank?.should be_true
58
58
  @nil_proxy.blank?.should be_true
59
59
  end
60
-
60
+
61
61
  should "be false if not blank" do
62
62
  @proxy.blank?.should be_false
63
63
  end
64
64
  end
65
-
65
+
66
66
  context "present?" do
67
67
  should "be true if present" do
68
68
  @proxy.present?.should be_true
69
69
  end
70
-
70
+
71
71
  should "be false if not present" do
72
72
  @blank_proxy.present?.should be_false
73
73
  @nil_proxy.present?.should be_false
74
74
  end
75
75
  end
76
-
76
+
77
77
  should "delegate respond_to? to target" do
78
78
  @proxy.respond_to?(:each).should be_true
79
79
  @proxy.respond_to?(:size).should be_true
80
80
  @proxy.respond_to?(:gsub).should be_false
81
81
  end
82
-
82
+
83
83
  should "alias proxy owner to owner" do
84
84
  @proxy.proxy_owner.should == @owner
85
85
  end
86
-
86
+
87
87
  should "alias proxy target to target" do
88
88
  @proxy.proxy_target.should == @target
89
89
  end
90
-
90
+
91
91
  context "send" do
92
92
  should "work if proxy responds to method" do
93
93
  @proxy.send(:reset)
94
94
  @proxy.target.should be_nil
95
95
  end
96
-
96
+
97
97
  should "work if the target responds to the method" do
98
98
  @proxy.send(:size).should == 2
99
99
  end
100
-
100
+
101
101
  should "not work if neither the proxy or target respond to method" do
102
102
  lambda { @proxy.send(:gsub) }.should raise_error
103
103
  end
@@ -2,18 +2,18 @@ require 'test_helper'
2
2
  require 'active_support/version'
3
3
 
4
4
  class JsonSerializationTest < Test::Unit::TestCase
5
-
6
- # Helper function in case things change in the future
5
+
6
+ # Helper function in case things change in the future
7
7
  # - replacing all those to_json calls was a nightmare
8
- def convert_to_json object, options = {}
8
+ def convert_to_json(object, options={})
9
9
  ActiveSupport::JSON.encode(object, options)
10
10
  end
11
-
11
+
12
12
  class Tag
13
13
  include MongoMapper::EmbeddedDocument
14
14
  key :name, String
15
15
  end
16
-
16
+
17
17
  class Contact
18
18
  include MongoMapper::Document
19
19
  key :name, String
@@ -21,10 +21,10 @@ class JsonSerializationTest < Test::Unit::TestCase
21
21
  key :created_at, Time
22
22
  key :awesome, Boolean
23
23
  key :preferences, Hash
24
-
24
+
25
25
  many :tags, :class_name => 'JsonSerializationTest::Tag'
26
26
  end
27
-
27
+
28
28
  def setup
29
29
  Contact.include_root_in_json = false
30
30
  @contact = Contact.new(
@@ -35,12 +35,12 @@ class JsonSerializationTest < Test::Unit::TestCase
35
35
  :preferences => { :shows => 'anime' }
36
36
  )
37
37
  end
38
-
38
+
39
39
  should "include demodulized root" do
40
40
  Contact.include_root_in_json = true
41
41
  assert_match %r{^\{"contact":\s?\{}, convert_to_json(@contact)
42
42
  end
43
-
43
+
44
44
  should "encode all encodable attributes" do
45
45
  json = convert_to_json(@contact)
46
46
 
@@ -51,7 +51,7 @@ class JsonSerializationTest < Test::Unit::TestCase
51
51
  assert_match %r{"awesome":true}, json
52
52
  assert_match %r{"preferences":\{"shows":"anime"\}}, json
53
53
  end
54
-
54
+
55
55
  should "allow attribute filtering with only" do
56
56
  json = convert_to_json(@contact, :only => [:name, :age])
57
57
 
@@ -62,7 +62,7 @@ class JsonSerializationTest < Test::Unit::TestCase
62
62
  assert_no_match %r{"created_at"}, json
63
63
  assert_no_match %r{"preferences"}, json
64
64
  end
65
-
65
+
66
66
  should "allow attribute filtering with except" do
67
67
  json = convert_to_json(@contact, :except => [:name, :age])
68
68
 
@@ -73,30 +73,30 @@ class JsonSerializationTest < Test::Unit::TestCase
73
73
  assert_match %r{"created_at"}, json
74
74
  assert_match %r{"preferences"}, json
75
75
  end
76
-
76
+
77
77
  context "_id key" do
78
78
  should "not be included by default" do
79
79
  json = convert_to_json(@contact)
80
80
  assert_no_match %r{"_id":}, json
81
81
  end
82
-
82
+
83
83
  should "not be included even if :except is used" do
84
84
  json = convert_to_json(@contact, :except => :name)
85
85
  assert_no_match %r{"_id":}, json
86
86
  end
87
87
  end
88
-
88
+
89
89
  context "id method" do
90
90
  setup do
91
91
  def @contact.label; "Has cheezburger"; end
92
92
  def @contact.favorite_quote; "Constraints are liberating"; end
93
93
  end
94
-
94
+
95
95
  should "be included by default" do
96
96
  json = convert_to_json(@contact)
97
97
  assert_match %r{"id"}, json
98
98
  end
99
-
99
+
100
100
  should "be included when single method included" do
101
101
  json = convert_to_json(@contact, :methods => :label)
102
102
  assert_match %r{"id"}, json
@@ -104,7 +104,7 @@ class JsonSerializationTest < Test::Unit::TestCase
104
104
  assert_match %r{"name":"Konata Izumi"}, json
105
105
  assert_no_match %r{"favorite_quote":"Constraints are liberating"}, json
106
106
  end
107
-
107
+
108
108
  should "be included when multiple methods included" do
109
109
  json = convert_to_json(@contact, :methods => [:label, :favorite_quote])
110
110
  assert_match %r{"id"}, json
@@ -112,29 +112,29 @@ class JsonSerializationTest < Test::Unit::TestCase
112
112
  assert_match %r{"favorite_quote":"Constraints are liberating"}, json
113
113
  assert_match %r{"name":"Konata Izumi"}, json
114
114
  end
115
-
115
+
116
116
  should "not be included if :only is present" do
117
117
  json = convert_to_json(@contact, :only => :name)
118
118
  assert_no_match %r{"id":}, json
119
119
  end
120
-
120
+
121
121
  should "be represented by a string" do
122
122
  json = convert_to_json(@contact)
123
123
  assert_match %r{"id":"}, json
124
- end
125
- end
126
-
124
+ end
125
+ end
126
+
127
127
  context "including methods" do
128
128
  setup do
129
129
  def @contact.label; "Has cheezburger"; end
130
130
  def @contact.favorite_quote; "Constraints are liberating"; end
131
131
  end
132
-
132
+
133
133
  should "include single method" do
134
134
  json = convert_to_json(@contact, :methods => :label)
135
135
  assert_match %r{"label":"Has cheezburger"}, json
136
136
  end
137
-
137
+
138
138
  should "include multiple methods" do
139
139
  json = convert_to_json(@contact, :only => :name, :methods => [:label, :favorite_quote])
140
140
  assert_match %r{"label":"Has cheezburger"}, json
@@ -146,7 +146,7 @@ class JsonSerializationTest < Test::Unit::TestCase
146
146
  assert_no_match %r{"preferences"}, json
147
147
  end
148
148
  end
149
-
149
+
150
150
  context "array of records" do
151
151
  setup do
152
152
  @contacts = [
@@ -160,7 +160,7 @@ class JsonSerializationTest < Test::Unit::TestCase
160
160
  assert_match %r{\{"name":"David"\}}, json
161
161
  assert_match %r{\{"name":"Mary"\}}, json
162
162
  end
163
-
163
+
164
164
  should "allow attribute filtering with except" do
165
165
  json = convert_to_json(@contacts, :except => [:name, :preferences, :awesome, :created_at, :updated_at])
166
166
  assert_match %r{"age":39}, json
@@ -172,7 +172,7 @@ class JsonSerializationTest < Test::Unit::TestCase
172
172
  assert_no_match %r{"updated_at":}, json
173
173
  end
174
174
  end
175
-
175
+
176
176
  should "allow options for hash of records" do
177
177
  contacts = {
178
178
  1 => Contact.new(:name => 'David', :age => 39),
@@ -183,7 +183,7 @@ class JsonSerializationTest < Test::Unit::TestCase
183
183
  assert_match %r{\{"name":"David"\}}, json
184
184
  assert_no_match %r{"2":}, json
185
185
  end
186
-
186
+
187
187
  should "include embedded attributes" do
188
188
  contact = Contact.new(:name => 'John', :age => 27)
189
189
  contact.tags = [Tag.new(:name => 'awesome'), Tag.new(:name => 'ruby')]
@@ -192,7 +192,7 @@ class JsonSerializationTest < Test::Unit::TestCase
192
192
  assert_match %r{"name":"awesome"}, json
193
193
  assert_match %r{"name":"ruby"}, json
194
194
  end
195
-
195
+
196
196
  should "include dynamic attributes" do
197
197
  contact = Contact.new(:name => 'John', :age => 27, :foo => 'bar')
198
198
  contact['smell'] = 'stinky'
@@ -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
@@ -5,7 +5,7 @@ class DescendantAppendsTest < Test::Unit::TestCase
5
5
  should "default descendants to a new set" do
6
6
  MongoMapper::Document.descendants.should be_instance_of(Set)
7
7
  end
8
-
8
+
9
9
  should 'allow extensions to Document to be appended' do
10
10
  module Extension; def test_this_extension; end end
11
11
  MongoMapper::Document.append_extensions(Extension)
@@ -34,12 +34,12 @@ class DescendantAppendsTest < Test::Unit::TestCase
34
34
  article.new.should respond_to(:test_this_inclusion)
35
35
  end
36
36
  end
37
-
37
+
38
38
  context "EmbeddedDocument" do
39
39
  should "default descendants to a new set" do
40
40
  MongoMapper::EmbeddedDocument.descendants.should be_instance_of(Set)
41
41
  end
42
-
42
+
43
43
  should 'allow extensions to Document to be appended' do
44
44
  module Extension; def test_this_extension; end end
45
45
  MongoMapper::EmbeddedDocument.append_extensions(Extension)