mongo_mapper 0.12.0 → 0.13.0.beta1

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 (154) hide show
  1. checksums.yaml +7 -0
  2. data/README.rdoc +35 -13
  3. data/bin/mmconsole +1 -1
  4. data/lib/mongo_mapper.rb +4 -0
  5. data/lib/mongo_mapper/connection.rb +17 -6
  6. data/lib/mongo_mapper/document.rb +1 -0
  7. data/lib/mongo_mapper/exceptions.rb +4 -1
  8. data/lib/mongo_mapper/extensions/binary.rb +1 -1
  9. data/lib/mongo_mapper/extensions/boolean.rb +20 -23
  10. data/lib/mongo_mapper/extensions/date.rb +3 -3
  11. data/lib/mongo_mapper/extensions/integer.rb +5 -1
  12. data/lib/mongo_mapper/extensions/kernel.rb +2 -0
  13. data/lib/mongo_mapper/extensions/ordered_hash.rb +23 -0
  14. data/lib/mongo_mapper/extensions/string.rb +2 -2
  15. data/lib/mongo_mapper/extensions/time.rb +7 -5
  16. data/lib/mongo_mapper/middleware/identity_map.rb +3 -4
  17. data/lib/mongo_mapper/plugins.rb +1 -1
  18. data/lib/mongo_mapper/plugins/associations.rb +11 -5
  19. data/lib/mongo_mapper/plugins/associations/base.rb +5 -3
  20. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +0 -0
  21. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +8 -8
  22. data/lib/mongo_mapper/plugins/associations/collection.rb +2 -0
  23. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +32 -7
  24. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +2 -2
  25. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +12 -12
  26. data/lib/mongo_mapper/plugins/associations/proxy.rb +5 -1
  27. data/lib/mongo_mapper/plugins/associations/single_association.rb +6 -6
  28. data/lib/mongo_mapper/plugins/clone.rb +4 -2
  29. data/lib/mongo_mapper/plugins/dirty.rb +22 -21
  30. data/lib/mongo_mapper/plugins/document.rb +4 -4
  31. data/lib/mongo_mapper/plugins/dumpable.rb +22 -0
  32. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +58 -9
  33. data/lib/mongo_mapper/plugins/identity_map.rb +42 -32
  34. data/lib/mongo_mapper/plugins/keys.rb +133 -54
  35. data/lib/mongo_mapper/plugins/keys/key.rb +68 -22
  36. data/lib/mongo_mapper/plugins/modifiers.rb +26 -19
  37. data/lib/mongo_mapper/plugins/persistence.rb +15 -5
  38. data/lib/mongo_mapper/plugins/querying.rb +15 -40
  39. data/lib/mongo_mapper/plugins/querying/{decorator.rb → decorated_plucky_query.rb} +24 -4
  40. data/lib/mongo_mapper/plugins/rails.rb +22 -2
  41. data/lib/mongo_mapper/plugins/safe.rb +8 -5
  42. data/lib/mongo_mapper/plugins/sci.rb +26 -4
  43. data/lib/mongo_mapper/plugins/scopes.rb +5 -4
  44. data/lib/mongo_mapper/plugins/timestamps.rb +11 -4
  45. data/lib/mongo_mapper/plugins/validations.rb +1 -1
  46. data/lib/mongo_mapper/utils.rb +12 -0
  47. data/lib/mongo_mapper/version.rb +1 -1
  48. data/lib/rails/generators/mongo_mapper/config/config_generator.rb +20 -7
  49. data/lib/rails/generators/mongo_mapper/config/templates/mongo.yml +6 -0
  50. data/lib/rails/generators/mongo_mapper/model/model_generator.rb +18 -1
  51. data/lib/rails/generators/mongo_mapper/model/templates/model.rb +9 -5
  52. data/{test/functional/test_accessible.rb → spec/functional/accessible_spec.rb} +29 -29
  53. data/{test/functional/associations/test_belongs_to_polymorphic_proxy.rb → spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb} +10 -10
  54. data/{test/functional/associations/test_belongs_to_proxy.rb → spec/functional/associations/belongs_to_proxy_spec.rb} +82 -64
  55. data/{test/functional/associations/test_in_array_proxy.rb → spec/functional/associations/in_array_proxy_spec.rb} +68 -68
  56. data/{test/functional/associations/test_many_documents_as_proxy.rb → spec/functional/associations/many_documents_as_proxy_spec.rb} +37 -38
  57. data/{test/functional/associations/test_many_documents_proxy.rb → spec/functional/associations/many_documents_proxy_spec.rb} +233 -146
  58. data/{test/functional/associations/test_many_embedded_polymorphic_proxy.rb → spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb} +19 -20
  59. data/{test/functional/associations/test_many_embedded_proxy.rb → spec/functional/associations/many_embedded_proxy_spec.rb} +23 -24
  60. data/{test/functional/associations/test_many_polymorphic_proxy.rb → spec/functional/associations/many_polymorphic_proxy_spec.rb} +45 -46
  61. data/{test/functional/associations/test_one_as_proxy.rb → spec/functional/associations/one_as_proxy_spec.rb} +75 -77
  62. data/{test/functional/associations/test_one_embedded_polymorphic_proxy.rb → spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb} +31 -32
  63. data/{test/functional/associations/test_one_embedded_proxy.rb → spec/functional/associations/one_embedded_proxy_spec.rb} +10 -10
  64. data/{test/functional/associations/test_one_proxy.rb → spec/functional/associations/one_proxy_spec.rb} +125 -102
  65. data/spec/functional/associations_spec.rb +48 -0
  66. data/{test/functional/test_binary.rb → spec/functional/binary_spec.rb} +6 -6
  67. data/spec/functional/caching_spec.rb +75 -0
  68. data/{test/functional/test_callbacks.rb → spec/functional/callbacks_spec.rb} +84 -26
  69. data/{test/functional/test_dirty.rb → spec/functional/dirty_spec.rb} +57 -42
  70. data/{test/functional/test_document.rb → spec/functional/document_spec.rb} +52 -52
  71. data/spec/functional/dumpable_spec.rb +24 -0
  72. data/{test/functional/test_dynamic_querying.rb → spec/functional/dynamic_querying_spec.rb} +14 -14
  73. data/{test/functional/test_embedded_document.rb → spec/functional/embedded_document_spec.rb} +51 -42
  74. data/{test/functional/test_equality.rb → spec/functional/equality_spec.rb} +4 -4
  75. data/spec/functional/extensions_spec.rb +16 -0
  76. data/{test/functional/test_identity_map.rb → spec/functional/identity_map_spec.rb} +73 -61
  77. data/spec/functional/indexes_spec.rb +48 -0
  78. data/spec/functional/keys_spec.rb +224 -0
  79. data/{test/functional/test_logger.rb → spec/functional/logger_spec.rb} +6 -6
  80. data/spec/functional/modifiers_spec.rb +550 -0
  81. data/spec/functional/pagination_spec.rb +89 -0
  82. data/spec/functional/protected_spec.rb +199 -0
  83. data/spec/functional/querying_spec.rb +1003 -0
  84. data/spec/functional/rails_spec.rb +55 -0
  85. data/spec/functional/safe_spec.rb +163 -0
  86. data/{test/functional/test_sci.rb → spec/functional/sci_spec.rb} +123 -34
  87. data/{test/functional/test_scopes.rb → spec/functional/scopes_spec.rb} +59 -26
  88. data/spec/functional/timestamps_spec.rb +97 -0
  89. data/{test/functional/test_touch.rb → spec/functional/touch_spec.rb} +13 -13
  90. data/spec/functional/userstamps_spec.rb +46 -0
  91. data/{test/functional/test_validations.rb → spec/functional/validations_spec.rb} +64 -64
  92. data/spec/spec_helper.rb +81 -0
  93. data/spec/support/matchers.rb +24 -0
  94. data/{test → spec/support}/models.rb +1 -6
  95. data/spec/unit/associations/base_spec.rb +146 -0
  96. data/spec/unit/associations/belongs_to_association_spec.rb +30 -0
  97. data/spec/unit/associations/many_association_spec.rb +64 -0
  98. data/spec/unit/associations/one_association_spec.rb +48 -0
  99. data/{test/unit/associations/test_proxy.rb → spec/unit/associations/proxy_spec.rb} +21 -21
  100. data/{test/unit/test_clone.rb → spec/unit/clone_spec.rb} +21 -11
  101. data/spec/unit/config_generator_spec.rb +24 -0
  102. data/{test/unit/test_document.rb → spec/unit/document_spec.rb} +42 -42
  103. data/{test/unit/test_dynamic_finder.rb → spec/unit/dynamic_finder_spec.rb} +28 -28
  104. data/{test/unit/test_embedded_document.rb → spec/unit/embedded_document_spec.rb} +102 -108
  105. data/{test/unit/test_equality.rb → spec/unit/equality_spec.rb} +7 -7
  106. data/{test/unit/test_exceptions.rb → spec/unit/exceptions_spec.rb} +3 -3
  107. data/{test/unit/test_extensions.rb → spec/unit/extensions_spec.rb} +85 -71
  108. data/spec/unit/identity_map_middleware_spec.rb +134 -0
  109. data/{test/unit/test_inspect.rb → spec/unit/inspect_spec.rb} +8 -8
  110. data/{test/unit/test_key.rb → spec/unit/key_spec.rb} +82 -52
  111. data/spec/unit/keys_spec.rb +155 -0
  112. data/spec/unit/model_generator_spec.rb +47 -0
  113. data/spec/unit/mongo_mapper_spec.rb +184 -0
  114. data/spec/unit/pagination_spec.rb +11 -0
  115. data/{test/unit/test_plugins.rb → spec/unit/plugins_spec.rb} +14 -14
  116. data/spec/unit/rails_compatibility_spec.rb +40 -0
  117. data/{test/unit/test_rails_reflect_on_association.rb → spec/unit/rails_reflect_on_association_spec.rb} +9 -9
  118. data/{test/unit/test_rails.rb → spec/unit/rails_spec.rb} +31 -31
  119. data/spec/unit/serialization_spec.rb +169 -0
  120. data/spec/unit/serializers/json_serializer_spec.rb +218 -0
  121. data/spec/unit/serializers/xml_serializer_spec.rb +198 -0
  122. data/{test/unit/test_time_zones.rb → spec/unit/time_zones_spec.rb} +8 -8
  123. data/{test/unit/test_translation.rb → spec/unit/translation_spec.rb} +6 -6
  124. data/{test/unit/test_validations.rb → spec/unit/validations_spec.rb} +72 -59
  125. metadata +199 -179
  126. data/test/_NOTE_ON_TESTING +0 -1
  127. data/test/functional/test_associations.rb +0 -46
  128. data/test/functional/test_caching.rb +0 -77
  129. data/test/functional/test_indexes.rb +0 -50
  130. data/test/functional/test_modifiers.rb +0 -537
  131. data/test/functional/test_pagination.rb +0 -91
  132. data/test/functional/test_protected.rb +0 -201
  133. data/test/functional/test_querying.rb +0 -935
  134. data/test/functional/test_safe.rb +0 -76
  135. data/test/functional/test_timestamps.rb +0 -62
  136. data/test/functional/test_userstamps.rb +0 -44
  137. data/test/support/railtie.rb +0 -4
  138. data/test/support/railtie/autoloaded.rb +0 -2
  139. data/test/support/railtie/not_autoloaded.rb +0 -3
  140. data/test/support/railtie/parent.rb +0 -3
  141. data/test/test_active_model_lint.rb +0 -18
  142. data/test/test_helper.rb +0 -93
  143. data/test/unit/associations/test_base.rb +0 -146
  144. data/test/unit/associations/test_belongs_to_association.rb +0 -29
  145. data/test/unit/associations/test_many_association.rb +0 -63
  146. data/test/unit/associations/test_one_association.rb +0 -47
  147. data/test/unit/serializers/test_json_serializer.rb +0 -216
  148. data/test/unit/serializers/test_xml_serializer.rb +0 -196
  149. data/test/unit/test_identity_map_middleware.rb +0 -132
  150. data/test/unit/test_keys.rb +0 -65
  151. data/test/unit/test_mongo_mapper.rb +0 -157
  152. data/test/unit/test_pagination.rb +0 -11
  153. data/test/unit/test_rails_compatibility.rb +0 -38
  154. data/test/unit/test_serialization.rb +0 -166
@@ -1,29 +0,0 @@
1
- require 'test_helper'
2
- require 'models'
3
-
4
- class BelongsToAssociationTest < Test::Unit::TestCase
5
- include MongoMapper::Plugins::Associations
6
-
7
- context "class_name" do
8
- should "camelize the name" do
9
- BelongsToAssociation.new(:user).class_name.should == 'User'
10
- end
11
-
12
- should "be changeable using class_name option" do
13
- association = BelongsToAssociation.new(:user, :class_name => 'Person')
14
- association.class_name.should == 'Person'
15
- end
16
- end
17
-
18
- context "embeddable?" do
19
- should "be false even if class is embeddable" do
20
- base = BelongsToAssociation.new(:address)
21
- base.embeddable?.should be_false
22
- end
23
-
24
- should "be false if class is not embeddable" do
25
- base = BelongsToAssociation.new(:project)
26
- base.embeddable?.should be_false
27
- end
28
- end
29
- end
@@ -1,63 +0,0 @@
1
- require 'test_helper'
2
- require 'models'
3
-
4
- class ManyAssociationTest < Test::Unit::TestCase
5
- include MongoMapper::Plugins::Associations
6
-
7
- context "class_name" do
8
- should "camelize the name" do
9
- ManyAssociation.new(:smart_people).class_name.should == 'SmartPerson'
10
- end
11
-
12
- should "be changeable using class_name option" do
13
- base = ManyAssociation.new(:smart_people, :class_name => 'IntelligentPerson')
14
- base.class_name.should == 'IntelligentPerson'
15
- end
16
- end
17
-
18
- context "type_key_name" do
19
- should "be _type" do
20
- ManyAssociation.new(:foos).type_key_name.should == '_type'
21
- end
22
- end
23
-
24
- context "embeddable?" do
25
- should "be true if class is embeddable" do
26
- base = ManyAssociation.new(:medias)
27
- base.embeddable?.should be_true
28
- end
29
-
30
- should "be false if class is not embeddable" do
31
- base = ManyAssociation.new(:statuses)
32
- base.embeddable?.should be_false
33
- end
34
- end
35
-
36
- context "proxy_class" do
37
- should "be ManyDocumentsProxy for many" do
38
- base = ManyAssociation.new(:statuses)
39
- base.proxy_class.should == ManyDocumentsProxy
40
- end
41
-
42
- should "be ManyPolymorphicProxy for polymorphic many" do
43
- base = ManyAssociation.new(:messages, :polymorphic => true)
44
- base.proxy_class.should == ManyPolymorphicProxy
45
- end
46
-
47
- should "be ManyEmbeddedProxy for many embedded" do
48
- base = ManyAssociation.new(:medias)
49
- base.proxy_class.should == ManyEmbeddedProxy
50
- end
51
-
52
- should "be ManyEmbeddedPolymorphicProxy for polymorphic many embedded" do
53
- base = ManyAssociation.new(:medias, :polymorphic => true)
54
- base.proxy_class.should == ManyEmbeddedPolymorphicProxy
55
- end
56
-
57
- should "be InArrayProxy for many with :in option" do
58
- base = ManyAssociation.new(:messages, :in => :message_ids)
59
- base.proxy_class.should == InArrayProxy
60
- end
61
- end
62
-
63
- end
@@ -1,47 +0,0 @@
1
- require 'test_helper'
2
- require 'models'
3
-
4
- class OneAssociationTest < Test::Unit::TestCase
5
- include MongoMapper::Plugins::Associations
6
-
7
- context "type_key_name" do
8
- should "be _type" do
9
- OneAssociation.new(:foo).type_key_name.should == '_type'
10
- end
11
- end
12
-
13
- context "embeddable?" do
14
- should "be true if class is embeddable" do
15
- base = OneAssociation.new(:media)
16
- base.embeddable?.should be_true
17
- end
18
-
19
- should "be false if class is not embeddable" do
20
- base = OneAssociation.new(:project)
21
- base.embeddable?.should be_false
22
- end
23
- end
24
-
25
- context "proxy_class" do
26
- should "be OneProxy for one" do
27
- base = OneAssociation.new(:status)
28
- base.proxy_class.should == OneProxy
29
- end
30
-
31
- should "be OneAsProxy for one with :as option" do
32
- base = OneAssociation.new(:message, :as => :messagable)
33
- base.proxy_class.should == OneAsProxy
34
- end
35
-
36
- should "be OneEmbeddedProxy for one embedded" do
37
- base = OneAssociation.new(:media)
38
- base.proxy_class.should == OneEmbeddedProxy
39
- end
40
-
41
- should "be OneEmbeddedPolymorphicProxy for polymorphic one embedded" do
42
- base = OneAssociation.new(:media, :polymorphic => true)
43
- base.proxy_class.should == OneEmbeddedPolymorphicProxy
44
- end
45
- end
46
-
47
- end
@@ -1,216 +0,0 @@
1
- require 'test_helper'
2
-
3
- class JsonSerializationTest < Test::Unit::TestCase
4
-
5
- # Helper function in case things change in the future
6
- # - replacing all those to_json calls was a nightmare
7
- def convert_to_json(object, options={})
8
- ActiveSupport::JSON.encode(object, options)
9
- end
10
-
11
- class Tag
12
- include MongoMapper::EmbeddedDocument
13
- key :name, String
14
- end
15
-
16
- class Contact
17
- include MongoMapper::Document
18
- key :name, String
19
- key :age, Integer
20
- key :created_at, Time
21
- key :awesome, Boolean
22
- key :preferences, Hash
23
-
24
- many :tags, :class_name => 'JsonSerializationTest::Tag'
25
- end
26
-
27
- def setup
28
- Kernel.const_set('TopLevelContact', Doc('TopLevelContact'))
29
- TopLevelContact.key :name, String
30
-
31
- Contact.include_root_in_json = false
32
- @contact = Contact.new(
33
- :name => 'Konata Izumi',
34
- :age => 16,
35
- :created_at => Time.utc(2006, 8, 1),
36
- :awesome => true,
37
- :preferences => { :shows => 'anime' }
38
- )
39
- @top_level_contact = TopLevelContact.new(
40
- :name => 'Konata Izumi'
41
- )
42
- end
43
-
44
- def teardown
45
- Kernel.send(:remove_const, 'TopLevelContact') if Object.const_defined?('TopLevelContact')
46
- end
47
-
48
- should "include root for class with no module" do
49
- TopLevelContact.include_root_in_json = true
50
- assert_match %r{^\{"top_level_contact":\s?\{}, convert_to_json(@top_level_contact)
51
- end
52
-
53
- should "include demodulized root" do
54
- Contact.include_root_in_json = true
55
- assert_match %r{^\{"contact":\s?\{}, convert_to_json(@contact)
56
- end
57
-
58
- should "encode all encodable attributes" do
59
- json = convert_to_json(@contact)
60
-
61
- assert_no_match %r{"_id"}, json
62
- assert_match %r{"name":"Konata Izumi"}, json
63
- assert_match %r{"age":16}, json
64
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
65
- assert_match %r{"awesome":true}, json
66
- assert_match %r{"preferences":\{"shows":"anime"\}}, json
67
- end
68
-
69
- should "allow attribute filtering with only" do
70
- json = convert_to_json(@contact, :only => [:name, :age])
71
-
72
- assert_no_match %r{"_id"}, json
73
- assert_match %r{"name":"Konata Izumi"}, json
74
- assert_match %r{"age":16}, json
75
- assert_no_match %r{"awesome"}, json
76
- assert_no_match %r{"created_at"}, json
77
- assert_no_match %r{"preferences"}, json
78
- end
79
-
80
- should "allow attribute filtering with except" do
81
- json = convert_to_json(@contact, :except => [:name, :age])
82
-
83
- assert_no_match %r{"_id"}, json
84
- assert_no_match %r{"name"}, json
85
- assert_no_match %r{"age"}, json
86
- assert_match %r{"awesome"}, json
87
- assert_match %r{"created_at"}, json
88
- assert_match %r{"preferences"}, json
89
- end
90
-
91
- context "_id key" do
92
- should "not be included by default" do
93
- json = convert_to_json(@contact)
94
- assert_no_match %r{"_id":}, json
95
- end
96
-
97
- should "not be included even if :except is used" do
98
- json = convert_to_json(@contact, :except => :name)
99
- assert_no_match %r{"_id":}, json
100
- end
101
- end
102
-
103
- context "id method" do
104
- setup do
105
- def @contact.label; "Has cheezburger"; end
106
- def @contact.favorite_quote; "Constraints are liberating"; end
107
- end
108
-
109
- should "be included by default" do
110
- json = convert_to_json(@contact)
111
- assert_match %r{"id"}, json
112
- end
113
-
114
- should "be included when single method included" do
115
- json = convert_to_json(@contact, :methods => :label)
116
- assert_match %r{"id"}, json
117
- assert_match %r{"label":"Has cheezburger"}, json
118
- assert_match %r{"name":"Konata Izumi"}, json
119
- assert_no_match %r{"favorite_quote":"Constraints are liberating"}, json
120
- end
121
-
122
- should "be included when multiple methods included" do
123
- json = convert_to_json(@contact, :methods => [:label, :favorite_quote])
124
- assert_match %r{"id"}, json
125
- assert_match %r{"label":"Has cheezburger"}, json
126
- assert_match %r{"favorite_quote":"Constraints are liberating"}, json
127
- assert_match %r{"name":"Konata Izumi"}, json
128
- end
129
-
130
- should "not be included if :only is present" do
131
- json = convert_to_json(@contact, :only => :name)
132
- assert_no_match %r{"id":}, json
133
- end
134
-
135
- should "be represented by a string" do
136
- json = convert_to_json(@contact)
137
- assert_match %r{"id":"}, json
138
- end
139
- end
140
-
141
- context "including methods" do
142
- setup do
143
- def @contact.label; "Has cheezburger"; end
144
- def @contact.favorite_quote; "Constraints are liberating"; end
145
- end
146
-
147
- should "include single method" do
148
- json = convert_to_json(@contact, :methods => :label)
149
- assert_match %r{"label":"Has cheezburger"}, json
150
- end
151
-
152
- should "include multiple methods" do
153
- json = convert_to_json(@contact, :only => :name, :methods => [:label, :favorite_quote])
154
- assert_match %r{"label":"Has cheezburger"}, json
155
- assert_match %r{"favorite_quote":"Constraints are liberating"}, json
156
- assert_match %r{"name":"Konata Izumi"}, json
157
- assert_no_match %r{"age":16}, json
158
- assert_no_match %r{"awesome"}, json
159
- assert_no_match %r{"created_at"}, json
160
- assert_no_match %r{"preferences"}, json
161
- end
162
- end
163
-
164
- context "array of records" do
165
- setup do
166
- @contacts = [
167
- Contact.new(:name => 'David', :age => 39),
168
- Contact.new(:name => 'Mary', :age => 14)
169
- ]
170
- end
171
-
172
- should "allow attribute filtering with only" do
173
- json =convert_to_json(@contacts, :only => :name)
174
- assert_match %r{\{"name":"David"\}}, json
175
- assert_match %r{\{"name":"Mary"\}}, json
176
- end
177
-
178
- should "allow attribute filtering with except" do
179
- json = convert_to_json(@contacts, :except => [:name, :preferences, :awesome, :created_at, :updated_at])
180
- assert_match %r{"age":39}, json
181
- assert_match %r{"age":14}, json
182
- assert_no_match %r{"name":}, json
183
- assert_no_match %r{"preferences":}, json
184
- assert_no_match %r{"awesome":}, json
185
- assert_no_match %r{"created_at":}, json
186
- assert_no_match %r{"updated_at":}, json
187
- end
188
- end
189
-
190
- should "allow options for hash of records" do
191
- contacts = {
192
- 1 => Contact.new(:name => 'David', :age => 39),
193
- 2 => Contact.new(:name => 'Mary', :age => 14)
194
- }
195
- json = convert_to_json(contacts, :only => [1, :name])
196
- assert_match %r{"1":}, json
197
- assert_match %r{\{"name":"David"\}}, json
198
- assert_no_match %r{"2":}, json
199
- end
200
-
201
- should "include embedded attributes" do
202
- contact = Contact.new(:name => 'John', :age => 27)
203
- contact.tags = [Tag.new(:name => 'awesome'), Tag.new(:name => 'ruby')]
204
- json = convert_to_json(contact)
205
- assert_match %r{"tags":}, json
206
- assert_match %r{"name":"awesome"}, json
207
- assert_match %r{"name":"ruby"}, json
208
- end
209
-
210
- should "include dynamic attributes" do
211
- contact = Contact.new(:name => 'John', :age => 27, :foo => 'bar')
212
- contact['smell'] = 'stinky'
213
- json = convert_to_json(contact)
214
- assert_match %r{"smell":"stinky"}, json
215
- end
216
- end
@@ -1,196 +0,0 @@
1
- require 'test_helper'
2
-
3
- class XmlSerializationTest < Test::Unit::TestCase
4
- class Tag
5
- include MongoMapper::EmbeddedDocument
6
- key :name, String
7
- end
8
-
9
- class Contact
10
- include MongoMapper::Document
11
- key :name, String
12
- key :age, Integer
13
- key :created_at, Time
14
- key :awesome, Boolean
15
- key :preferences, Hash
16
-
17
- many :tags, :class_name => 'XmlSerializationTest::Tag'
18
- end
19
-
20
- def setup
21
- Kernel.const_set('TopLevelContact', Doc('TopLevelContact'))
22
- TopLevelContact.key :name, String
23
-
24
- Contact.include_root_in_json = false
25
- @contact = Contact.new(
26
- :name => 'Konata Izumi',
27
- :age => 16,
28
- :created_at => Time.utc(2006, 8, 1),
29
- :awesome => true,
30
- :preferences => { :shows => 'anime' }
31
- )
32
- @top_level_contact = TopLevelContact.new(
33
- :name => 'Konata Izumi'
34
- )
35
- end
36
-
37
- def teardown
38
- Kernel.send(:remove_const, 'TopLevelContact') if Object.const_defined?('TopLevelContact')
39
- end
40
-
41
- should "include root for class with no module" do
42
- assert_match %r{<top-level-contact>}, @top_level_contact.to_xml
43
- end
44
-
45
- should "include demodulized root" do
46
- assert_match %r{<contact>}, @contact.to_xml
47
- end
48
-
49
- should "encode all encodable attributes" do
50
- xml = @contact.to_xml
51
-
52
- assert_no_match %r{_id}, xml
53
- assert_match %r{<id>#{@contact.id}</id>}, xml
54
- assert_match %r{<name>Konata Izumi</name>}, xml
55
- assert_match %r{<age.*>16</age>}, xml
56
- assert_match %r(<created-at type="datetime">), xml
57
- assert_match %r{<awesome type="boolean">true</awesome>}, xml
58
- assert_match %r{<preferences>}, xml
59
- assert_match %r{<shows>anime</shows>}, xml
60
- end
61
-
62
- should "allow attribute filtering with only" do
63
- xml = @contact.to_xml(:only => [:name, :age])
64
-
65
- assert_no_match %r{<id>}, xml
66
- assert_match %r{<name>Konata Izumi</name>}, xml
67
- assert_match %r{<age type="integer">16</age>}, xml
68
- assert_no_match %r{awesome}, xml
69
- assert_no_match %r{created-at}, xml
70
- assert_no_match %r{preferences}, xml
71
- end
72
-
73
- should "allow attribute filtering with except" do
74
- xml = @contact.to_xml(:except => [:name, :age])
75
-
76
- assert_no_match %r{<name>Konata Izumi</name>}, xml
77
- assert_no_match %r{<age type="integer">16</age>}, xml
78
- assert_match %r{<id>}, xml
79
- assert_match %r{awesome}, xml
80
- assert_match %r{created-at}, xml
81
- assert_match %r{preferences}, xml
82
- end
83
-
84
- context "_id key" do
85
- should "not be included by default" do
86
- assert_no_match %r{_id}, @contact.to_xml
87
- end
88
-
89
- should "not be included even if :except is used" do
90
- assert_no_match %r{_id}, @contact.to_xml(:except => :name)
91
- end
92
- end
93
-
94
- context "id method" do
95
- setup do
96
- def @contact.label; "Has cheezburger"; end
97
- def @contact.favorite_quote; "Constraints are liberating"; end
98
- end
99
-
100
- should "be included by default" do
101
- assert_match %r{<id>#{@contact.id}</id>}, @contact.to_xml
102
- end
103
-
104
- should "be included when single method included" do
105
- xml = @contact.to_xml(:methods => :label)
106
- assert_match %r{<id>}, xml
107
- assert_match %r{<label>Has cheezburger</label>}, xml
108
- assert_match %r{<name>Konata Izumi</name>}, xml
109
- assert_no_match %r{favorite_quote}, xml
110
- end
111
-
112
- should "be included when multiple methods included" do
113
- xml = @contact.to_xml(:methods => [:label, :favorite_quote])
114
- assert_match %r{<id>}, xml
115
- assert_match %r{<label>Has cheezburger</label>}, xml
116
- assert_match %r{<name>Konata Izumi</name>}, xml
117
- assert_match %r{<favorite-quote>Constraints are liberating</favorite-quote>}, xml
118
- end
119
-
120
- should "not be included if :only is present" do
121
- assert_no_match %r{<id}, @contact.to_xml(:only => :name)
122
- end
123
-
124
- should "be represented by a string" do
125
- assert_match %r{<id>}, @contact.to_xml
126
- end
127
- end
128
-
129
- context "including methods" do
130
- setup do
131
- def @contact.label; "Has cheezburger"; end
132
- def @contact.favorite_quote; "Constraints are liberating"; end
133
- end
134
-
135
- should "include single method" do
136
- assert_match %r{<label>Has cheezburger</label>}, @contact.to_xml(:methods => :label)
137
- end
138
-
139
- should "include multiple methods" do
140
- xml = @contact.to_xml(:only => :name, :methods => [:label, :favorite_quote])
141
- assert_match %r{<label>Has cheezburger</label>}, xml
142
- assert_match %r{<favorite-quote>Constraints are liberating</favorite-quote>}, xml
143
- assert_match %r{<name>Konata Izumi</name>}, xml
144
- assert_no_match %r{age}, xml
145
- assert_no_match %r{awesome}, xml
146
- assert_no_match %r{created-at}, xml
147
- assert_no_match %r{preferences}, xml
148
-
149
- # Assert only one tag is created
150
- xml.scan(/favorite-quote/).size.should == 2
151
- end
152
- end
153
-
154
- context "array of records" do
155
- setup do
156
- @contacts = [
157
- Contact.new(:name => 'David', :age => 39),
158
- Contact.new(:name => 'Mary', :age => 14)
159
- ]
160
- end
161
-
162
- should "allow attribute filtering with only" do
163
- xml = @contacts.to_xml(:only => :name)
164
- assert_match %r{<name>David</name>}, xml
165
- assert_match %r{<name>Mary</name>}, xml
166
- end
167
-
168
- should "allow attribute filtering with except" do
169
- xml = @contacts.to_xml(:except => [:name, :preferences, :awesome, :created_at, :updated_at])
170
- assert_match %r{<age type="integer">39</age>}, xml
171
- assert_match %r{<age type="integer">14</age>}, xml
172
- assert_no_match %r{name}, xml
173
- assert_no_match %r{preferences}, xml
174
- assert_no_match %r{awesome}, xml
175
- assert_no_match %r{created-at}, xml
176
- assert_no_match %r{updated-at}, xml
177
- end
178
- end
179
-
180
- should "include embedded attributes" do
181
- contact = Contact.new(:name => 'John', :age => 27)
182
- contact.tags = [Tag.new(:name => 'awesome'), Tag.new(:name => 'ruby')]
183
- xml = contact.to_xml
184
- assert_match %r{<tags type="array">}, xml
185
- assert_match %r{<id>#{contact.tags[0].id}</id>}, xml
186
- assert_match %r{<id>#{contact.tags[1].id}</id>}, xml
187
- assert_match %r{<name>awesome</name>}, xml
188
- assert_match %r{<name>ruby</name>}, xml
189
- end
190
-
191
- should "include dynamic attributes" do
192
- contact = Contact.new(:name => 'John', :age => 27, :foo => 'bar')
193
- contact['smell'] = 'stinky'
194
- assert_match %r{<smell>stinky</smell>}, contact.to_xml
195
- end
196
- end