pwnash-mongo_mapper 0.7.5 → 0.7.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/lib/mongo_mapper.rb +6 -8
  2. data/lib/mongo_mapper/document.rb +6 -281
  3. data/lib/mongo_mapper/embedded_document.rb +5 -45
  4. data/lib/mongo_mapper/extensions.rb +190 -0
  5. data/lib/mongo_mapper/plugins.rb +27 -18
  6. data/lib/mongo_mapper/plugins/associations.rb +7 -6
  7. data/lib/mongo_mapper/plugins/associations/base.rb +1 -0
  8. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +1 -0
  9. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +1 -0
  10. data/lib/mongo_mapper/plugins/associations/collection.rb +1 -0
  11. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +1 -0
  12. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +2 -1
  13. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +1 -0
  14. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +4 -4
  15. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +1 -0
  16. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +1 -0
  17. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +1 -0
  18. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +1 -0
  19. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +1 -0
  20. data/lib/mongo_mapper/plugins/associations/proxy.rb +1 -0
  21. data/lib/mongo_mapper/plugins/callbacks.rb +4 -3
  22. data/lib/mongo_mapper/plugins/clone.rb +1 -0
  23. data/lib/mongo_mapper/plugins/descendants.rb +1 -0
  24. data/lib/mongo_mapper/plugins/dirty.rb +1 -0
  25. data/lib/mongo_mapper/plugins/document.rb +40 -0
  26. data/lib/mongo_mapper/plugins/dynamic_querying.rb +42 -0
  27. data/lib/mongo_mapper/{support/find.rb → plugins/dynamic_querying/dynamic_finder.rb} +2 -36
  28. data/lib/mongo_mapper/plugins/embedded_document.rb +48 -0
  29. data/lib/mongo_mapper/plugins/equality.rb +1 -0
  30. data/lib/mongo_mapper/plugins/identity_map.rb +8 -11
  31. data/lib/mongo_mapper/plugins/indexes.rb +11 -0
  32. data/lib/mongo_mapper/plugins/inspect.rb +1 -0
  33. data/lib/mongo_mapper/plugins/keys.rb +7 -9
  34. data/lib/mongo_mapper/plugins/keys/key.rb +12 -2
  35. data/lib/mongo_mapper/plugins/logger.rb +1 -0
  36. data/lib/mongo_mapper/plugins/modifiers.rb +3 -2
  37. data/lib/mongo_mapper/plugins/pagination.rb +1 -0
  38. data/lib/mongo_mapper/plugins/pagination/proxy.rb +1 -0
  39. data/lib/mongo_mapper/plugins/persistence.rb +1 -0
  40. data/lib/mongo_mapper/plugins/protected.rb +1 -0
  41. data/lib/mongo_mapper/plugins/query_logger.rb +5 -10
  42. data/lib/mongo_mapper/plugins/querying.rb +236 -0
  43. data/lib/mongo_mapper/plugins/rails.rb +1 -0
  44. data/lib/mongo_mapper/plugins/sci.rb +31 -0
  45. data/lib/mongo_mapper/plugins/serialization.rb +1 -0
  46. data/lib/mongo_mapper/plugins/timestamps.rb +1 -0
  47. data/lib/mongo_mapper/plugins/userstamps.rb +1 -0
  48. data/lib/mongo_mapper/plugins/validations.rb +5 -1
  49. data/lib/mongo_mapper/query.rb +53 -120
  50. data/lib/mongo_mapper/support.rb +2 -213
  51. data/lib/mongo_mapper/support/descendant_appends.rb +3 -6
  52. data/lib/mongo_mapper/version.rb +2 -1
  53. metadata +156 -190
  54. data/.gitignore +0 -10
  55. data/Rakefile +0 -37
  56. data/mongo_mapper.gemspec +0 -216
  57. data/performance/read_write.rb +0 -52
  58. data/specs.watchr +0 -51
  59. data/test/NOTE_ON_TESTING +0 -1
  60. data/test/active_model_lint_test.rb +0 -13
  61. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +0 -63
  62. data/test/functional/associations/test_belongs_to_proxy.rb +0 -101
  63. data/test/functional/associations/test_in_array_proxy.rb +0 -325
  64. data/test/functional/associations/test_many_documents_as_proxy.rb +0 -229
  65. data/test/functional/associations/test_many_documents_proxy.rb +0 -536
  66. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +0 -176
  67. data/test/functional/associations/test_many_embedded_proxy.rb +0 -256
  68. data/test/functional/associations/test_many_polymorphic_proxy.rb +0 -302
  69. data/test/functional/associations/test_one_embedded_proxy.rb +0 -68
  70. data/test/functional/associations/test_one_proxy.rb +0 -196
  71. data/test/functional/test_associations.rb +0 -44
  72. data/test/functional/test_binary.rb +0 -27
  73. data/test/functional/test_callbacks.rb +0 -151
  74. data/test/functional/test_dirty.rb +0 -163
  75. data/test/functional/test_document.rb +0 -1219
  76. data/test/functional/test_embedded_document.rb +0 -210
  77. data/test/functional/test_identity_map.rb +0 -507
  78. data/test/functional/test_indexing.rb +0 -44
  79. data/test/functional/test_logger.rb +0 -20
  80. data/test/functional/test_modifiers.rb +0 -416
  81. data/test/functional/test_pagination.rb +0 -93
  82. data/test/functional/test_protected.rb +0 -163
  83. data/test/functional/test_string_id_compatibility.rb +0 -67
  84. data/test/functional/test_timestamps.rb +0 -64
  85. data/test/functional/test_userstamps.rb +0 -28
  86. data/test/functional/test_validations.rb +0 -342
  87. data/test/models.rb +0 -227
  88. data/test/support/custom_matchers.rb +0 -37
  89. data/test/support/timing.rb +0 -16
  90. data/test/test_helper.rb +0 -64
  91. data/test/unit/associations/test_base.rb +0 -212
  92. data/test/unit/associations/test_proxy.rb +0 -105
  93. data/test/unit/serializers/test_json_serializer.rb +0 -202
  94. data/test/unit/test_descendant_appends.rb +0 -71
  95. data/test/unit/test_document.rb +0 -225
  96. data/test/unit/test_dynamic_finder.rb +0 -123
  97. data/test/unit/test_embedded_document.rb +0 -657
  98. data/test/unit/test_keys.rb +0 -216
  99. data/test/unit/test_mongo_mapper.rb +0 -118
  100. data/test/unit/test_pagination.rb +0 -160
  101. data/test/unit/test_plugins.rb +0 -50
  102. data/test/unit/test_query.rb +0 -374
  103. data/test/unit/test_rails.rb +0 -181
  104. data/test/unit/test_rails_compatibility.rb +0 -52
  105. data/test/unit/test_serialization.rb +0 -51
  106. data/test/unit/test_support.rb +0 -390
  107. data/test/unit/test_time_zones.rb +0 -39
  108. data/test/unit/test_validations.rb +0 -544
@@ -1,105 +0,0 @@
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
@@ -1,202 +0,0 @@
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
@@ -1,71 +0,0 @@
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
@@ -1,225 +0,0 @@
1
- require 'test_helper'
2
- require 'models'
3
-
4
- class DocumentTest < Test::Unit::TestCase
5
- context "The Document Class" do
6
- setup do
7
- @document = Doc()
8
- end
9
-
10
- should "return false for embeddable" do
11
- Doc().embeddable?.should be_false
12
- end
13
-
14
- should "have logger method" do
15
- @document.logger.should == MongoMapper.logger
16
- @document.logger.should be_instance_of(Logger)
17
- end
18
-
19
- should "use default database by default" do
20
- @document.database.should == MongoMapper.database
21
- end
22
-
23
- should "have a connection" do
24
- @document.connection.should be_instance_of(Mongo::Connection)
25
- end
26
-
27
- should "allow setting different connection without affecting the default" do
28
- conn = Mongo::Connection.new
29
- @document.connection conn
30
- @document.connection.should == conn
31
- @document.connection.should_not == MongoMapper.connection
32
- end
33
-
34
- should "allow setting a different database without affecting the default" do
35
- @document.set_database_name 'test2'
36
- @document.database_name.should == 'test2'
37
- @document.database.name.should == 'test2'
38
-
39
- another_document = Doc()
40
- another_document.database.should == MongoMapper.database
41
- end
42
-
43
- should "default collection name to class name tableized" do
44
- class ::Item
45
- include MongoMapper::Document
46
- end
47
-
48
- Item.collection.should be_instance_of(Mongo::Collection)
49
- Item.collection.name.should == 'items'
50
- end
51
-
52
- should "default collection name of namespaced class to tableized with dot separation" do
53
- module ::BloggyPoo
54
- class Post
55
- include MongoMapper::Document
56
- end
57
- end
58
-
59
- BloggyPoo::Post.collection.should be_instance_of(Mongo::Collection)
60
- BloggyPoo::Post.collection.name.should == 'bloggy_poo.posts'
61
- end
62
-
63
- should "allow setting the collection name" do
64
- @document.set_collection_name('foobar')
65
- @document.collection.should be_instance_of(Mongo::Collection)
66
- @document.collection.name.should == 'foobar'
67
- end
68
- end # Document class
69
-
70
- context "Documents that inherit from other documents" do
71
- should "default collection name to inherited class" do
72
- Message.collection_name.should == 'messages'
73
- Enter.collection_name.should == 'messages'
74
- Exit.collection_name.should == 'messages'
75
- Chat.collection_name.should == 'messages'
76
- end
77
-
78
- should "default associations to inherited class" do
79
- Message.associations.keys.should include("room")
80
- Enter.associations.keys.should include("room")
81
- Exit.associations.keys.should include("room")
82
- Chat.associations.keys.should include("room")
83
- end
84
- end
85
-
86
- context "descendants" do
87
- should "default to an empty array" do
88
- Enter.descendants.should == []
89
- end
90
-
91
- should "be recorded" do
92
- Message.descendants.should == [Enter, Exit, Chat]
93
- end
94
- end
95
-
96
- context "An instance of a document" do
97
- setup do
98
- @document = Doc do
99
- key :name, String
100
- key :age, Integer
101
- end
102
- end
103
-
104
- should "create id during initialization" do
105
- @document.new._id.should be_instance_of(BSON::ObjectID)
106
- end
107
-
108
- should "have access to logger" do
109
- doc = @document.new
110
- doc.logger.should == @document.logger
111
- doc.logger.should be_instance_of(Logger)
112
- end
113
-
114
- should "have access to the class's collection" do
115
- doc = @document.new
116
- doc.collection.name.should == @document.collection.name
117
- end
118
-
119
- should "use default values if defined for keys" do
120
- @document.key :active, Boolean, :default => true
121
-
122
- @document.new.active.should be_true
123
- @document.new(:active => false).active.should be_false
124
- end
125
-
126
- should "use default values if defined even when custom data type" do
127
- @document.key :window, WindowSize, :default => WindowSize.new(600, 480)
128
-
129
- doc = @document.new
130
- doc.window.should == WindowSize.new(600, 480)
131
- end
132
-
133
- context "root document" do
134
- should "set self to the root document on embedded documents" do
135
- klass = Doc()
136
- pets = EDoc()
137
-
138
- klass.many :pets, :class => pets
139
-
140
- doc = klass.new(:pets => [{}])
141
- doc.pets.first._root_document.should == doc
142
- end
143
- end
144
-
145
- context "new?" do
146
- should "be true if no id" do
147
- @document.new.new?.should be_true
148
- end
149
-
150
- should "be true if id but using custom id and not saved yet" do
151
- @document.key :_id, String
152
- doc = @document.new
153
- doc.id = '1234'
154
- doc.new?.should be_true
155
- end
156
- end
157
-
158
- context "clone" do
159
- should "be new" do
160
- doc = @document.create(:name => "foo", :age => 27)
161
- clone = doc.clone
162
- clone.should be_new
163
- end
164
-
165
- should "copy the attributes" do
166
- doc = @document.create(:name => "foo", :age => 27)
167
- clone = doc.clone
168
- clone.name.should == "foo"
169
- clone.age.should == 27
170
- end
171
- end
172
-
173
- should "call inspect on the document's attributes instead of to_s when inspecting the document" do
174
- doc = @document.new(:animals => %w(dog cat))
175
- doc.inspect.should include(%(animals: ["dog", "cat"]))
176
- end
177
-
178
- context "equality" do
179
- setup do
180
- @oid = BSON::ObjectID.new
181
- end
182
-
183
- should "delegate hash to _id" do
184
- doc = @document.new
185
- doc.hash.should == doc._id.hash
186
- end
187
-
188
- should "delegate eql to ==" do
189
- doc = @document.new
190
- other = @document.new
191
- doc.eql?(other).should == (doc == other)
192
- doc.eql?(doc).should == (doc == doc)
193
- end
194
-
195
- should "know if same object as another" do
196
- doc = @document.new
197
- doc.should equal(doc)
198
- doc.should_not equal(@document.new)
199
- end
200
-
201
- should "allow set operations on array of documents" do
202
- @document.key :parent_id, ObjectId
203
- @document.belongs_to :parent, :class => @document
204
-
205
- parent = @document.create
206
- child = @document.create(:parent => parent)
207
-
208
- ([child.parent] & [parent]).should == [parent]
209
- end
210
-
211
- should "be equal if id and class are the same" do
212
- (@document.new('_id' => @oid) == @document.new('_id' => @oid)).should be(true)
213
- end
214
-
215
- should "not be equal if class same but id different" do
216
- (@document.new('_id' => @oid) == @document.new('_id' => BSON::ObjectID.new)).should be(false)
217
- end
218
-
219
- should "not be equal if id same but class different" do
220
- another_document = Doc()
221
- (@document.new('_id' => @oid) == another_document.new('_id' => @oid)).should be(false)
222
- end
223
- end
224
- end # instance of a document
225
- end # DocumentTest