mongo_mapper-unstable 2010.3.8 → 2010.06.23

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -7,113 +7,134 @@ class OneProxyTest < Test::Unit::TestCase
7
7
  key :post_id, ObjectId
8
8
  end
9
9
  end
10
-
10
+
11
11
  should "default to nil" do
12
12
  @post_class.one :author, :class => @author_class
13
13
  @post_class.new.author.nil?.should be_true
14
14
  end
15
-
16
- should "send object id to target" do
15
+
16
+ should "allow assignment of associated document using a hash" do
17
17
  @post_class.one :author, :class => @author_class
18
-
19
- post = @post_class.new
20
- author = @author_class.new(:name => 'Frank')
21
- post.author = author
22
- author.save.should be_true
18
+
19
+ post = @post_class.new('author' => { 'name' => 'Frank' })
20
+ post.author.name.should == 'Frank'
21
+
23
22
  post.save.should be_true
24
-
25
- post.author.object_id.should == post.author.target.object_id
26
- end
27
-
28
- should "be able to replace the association" do
29
- @post_class.one :author, :class => @author_class
30
-
31
- post = @post_class.new
32
- author = @author_class.new(:name => 'Frank')
33
- post.author = author
34
23
  post.reload
35
-
36
- post.author.should == author
37
- post.author.nil?.should be_false
38
-
39
- new_author = @author_class.new(:name => 'Emily')
40
- post.author = new_author
41
- post.author.should == new_author
24
+
25
+ post.author.name.should == 'Frank'
26
+ end
27
+
28
+ context "replacing the association" do
29
+ context "with an object of the class" do
30
+ should "work" do
31
+ @post_class.one :author, :class => @author_class
32
+
33
+ post = @post_class.new
34
+ author = @author_class.new(:name => 'Frank')
35
+ post.author = author
36
+ post.reload
37
+
38
+ post.author.should == author
39
+ post.author.nil?.should be_false
40
+
41
+ new_author = @author_class.new(:name => 'Emily')
42
+ post.author = new_author
43
+ post.author.should == new_author
44
+ end
45
+ end
46
+
47
+ context "with a Hash" do
48
+ should "convert to an object of the class and work" do
49
+ @post_class.one :author, :class => @author_class
50
+
51
+ post = @post_class.new
52
+ post.author = {'name' => 'Frank'}
53
+ post.reload
54
+
55
+ post.author.name.should == 'Frank'
56
+ post.author.nil?.should be_false
57
+
58
+ post.author = {'name' => 'Emily'}
59
+ post.author.name.should == 'Emily'
60
+ end
61
+ end
42
62
  end
43
-
63
+
44
64
  should "have boolean method for testing presence" do
45
65
  @post_class.one :author, :class => @author_class
46
-
66
+
47
67
  post = @post_class.new
48
68
  post.author?.should be_false
49
-
69
+
50
70
  post.author = @author_class.new(:name => 'Frank')
51
71
  post.author?.should be_true
52
72
  end
53
-
73
+
54
74
  should "work with criteria" do
55
75
  @post_class.one :primary_author, :class => @author_class, :primary => true
56
- @post_class.one :author, :class => @author_class
57
-
76
+ @post_class.one :author, :class => @author_class, :primary => false
77
+
58
78
  post = @post_class.create
59
79
  author = @author_class.create(:name => 'Frank', :primary => false, :post_id => post.id)
60
80
  primary = @author_class.create(:name => 'Bill', :primary => true, :post_id => post.id)
81
+ post.reload
61
82
  post.author.should == author
62
83
  post.primary_author.should == primary
63
84
  end
64
-
85
+
65
86
  should "unset the association" do
66
87
  @post_class.one :author, :class => @author_class
67
88
  post = @post_class.new
68
89
  author = @author_class.new
69
90
  post.author = author
70
91
  post.reload
71
-
92
+
72
93
  post.author = nil
73
94
  post.author.nil?.should be_false
74
95
  end
75
-
96
+
76
97
  should "work with :dependent delete" do
77
98
  @post_class.one :author, :class => @author_class, :dependent => :delete
78
-
99
+
79
100
  post = @post_class.create
80
101
  author = @author_class.new
81
102
  post.author = author
82
103
  post.reload
83
-
104
+
84
105
  @author_class.any_instance.expects(:delete).once
85
106
  post.author = @author_class.new
86
107
  end
87
-
108
+
88
109
  should "work with :dependent destroy" do
89
110
  @post_class.one :author, :class => @author_class, :dependent => :destroy
90
-
111
+
91
112
  post = @post_class.create
92
113
  author = @author_class.new
93
114
  post.author = author
94
115
  post.reload
95
-
116
+
96
117
  @author_class.any_instance.expects(:destroy).once
97
118
  post.author = @author_class.new
98
119
  end
99
-
120
+
100
121
  should "work with :dependent nullify" do
101
122
  @post_class.one :author, :class => @author_class, :dependent => :nullify
102
-
123
+
103
124
  post = @post_class.create
104
125
  author = @author_class.new
105
126
  post.author = author
106
127
  post.reload
107
-
128
+
108
129
  post.author = @author_class.new
109
-
130
+
110
131
  author.reload
111
132
  author.post_id.should be_nil
112
133
  end
113
134
 
114
135
  should "be able to build" do
115
136
  @post_class.one :author, :class => @author_class
116
-
137
+
117
138
  post = @post_class.create
118
139
  author = post.author.build(:name => 'John')
119
140
  post.author.should be_instance_of(@author_class)
@@ -122,10 +143,10 @@ class OneProxyTest < Test::Unit::TestCase
122
143
  post.author.should == author
123
144
  post.author.post_id.should == post.id
124
145
  end
125
-
146
+
126
147
  should "be able to create" do
127
148
  @post_class.one :author, :class => @author_class
128
-
149
+
129
150
  post = @post_class.create
130
151
  author = post.author.create(:name => 'John')
131
152
  post.author.should be_instance_of(@author_class)
@@ -134,20 +155,20 @@ class OneProxyTest < Test::Unit::TestCase
134
155
  post.author.should == author
135
156
  post.author.post_id.should == post.id
136
157
  end
137
-
158
+
138
159
  context "#create!" do
139
160
  setup do
140
161
  @author_class.key :name, String, :required => true
141
162
  @post_class.one :author, :class => @author_class
142
163
  end
143
-
164
+
144
165
  should "raise exception if invalid" do
145
166
  post = @post_class.create
146
167
  assert_raises(MongoMapper::DocumentNotValid) do
147
168
  post.author.create!
148
169
  end
149
170
  end
150
-
171
+
151
172
  should "work if valid" do
152
173
  post = @post_class.create
153
174
  author = post.author.create!(:name => 'John')
@@ -0,0 +1,168 @@
1
+ require 'test_helper'
2
+
3
+ class AccessibleTest < Test::Unit::TestCase
4
+ context 'A document with accessible attributes' do
5
+ setup do
6
+ @doc_class = Doc do
7
+ key :name, String
8
+ key :admin, Boolean, :default => false
9
+
10
+ attr_accessible :name
11
+ end
12
+
13
+ @doc = @doc_class.create(:name => 'Steve Sloan')
14
+ end
15
+
16
+ should 'have accessible attributes class method' do
17
+ @doc_class.accessible_attributes.should == [:name].to_set
18
+ end
19
+
20
+ should "default accessible attributes to nil" do
21
+ Doc().accessible_attributes.should be_nil
22
+ end
23
+
24
+ should "have accessible_attributes instance method" do
25
+ @doc.accessible_attributes.should equal(@doc_class.accessible_attributes)
26
+ end
27
+
28
+ should "raise error if there are protected attributes" do
29
+ doc = Doc('Post')
30
+ doc.attr_protected :admin
31
+ lambda { doc.attr_accessible :name }.
32
+ should raise_error(/Declare either attr_protected or attr_accessible for Post/)
33
+ end
34
+
35
+ should "know if using accessible attributes" do
36
+ @doc_class.accessible_attributes?.should be(true)
37
+ Doc().accessible_attributes?.should be(false)
38
+ end
39
+
40
+ should "assign inaccessible attribute through accessor" do
41
+ @doc.admin = true
42
+ @doc.admin.should be_true
43
+ end
44
+
45
+ should "ignore inaccessible attribute on #initialize" do
46
+ doc = @doc_class.new(:name => 'John', :admin => true)
47
+ doc.admin.should be_false
48
+ doc.name.should == 'John'
49
+ end
50
+
51
+ should "not ignore inaccessible attributes on #initialize from the database" do
52
+ doc = @doc_class.new(:name => 'John')
53
+ doc.admin = true
54
+ doc.save!
55
+
56
+ doc = @doc_class.first(:name => 'John')
57
+ doc.admin.should be_true
58
+ doc.name.should == 'John'
59
+ end
60
+
61
+ should "ignore inaccessible attribute on #update_attributes" do
62
+ @doc.update_attributes(:name => 'Ren Hoek', :admin => true)
63
+ @doc.name.should == 'Ren Hoek'
64
+ @doc.admin.should be_false
65
+ end
66
+
67
+ should "ignore inaccessible attribute on #update_attributes!" do
68
+ @doc.update_attributes!(:name => 'Stimpson J. Cat', :admin => true)
69
+ @doc.name.should == 'Stimpson J. Cat'
70
+ @doc.admin.should be_false
71
+ end
72
+
73
+ should "be indifferent to whether the accessible keys are strings or symbols" do
74
+ @doc.update_attributes!("name" => 'Stimpson J. Cat', "admin" => true)
75
+ @doc.name.should == 'Stimpson J. Cat'
76
+ @doc.admin.should be_false
77
+ end
78
+
79
+ should "accept nil as constructor's argument without raising exception" do
80
+ lambda { @doc_class.new(nil) }.should_not raise_error
81
+ end
82
+ end
83
+
84
+ context "Single collection inherited accessible attributes" do
85
+ setup do
86
+ class ::GrandParent
87
+ include MongoMapper::Document
88
+ attr_accessible :name
89
+ key :name, String
90
+ key :site_id, ObjectId
91
+ end
92
+ GrandParent.collection.remove
93
+
94
+ class ::Child < ::GrandParent
95
+ attr_accessible :position
96
+ key :position, Integer
97
+ end
98
+
99
+ class ::GrandChild < ::Child; end
100
+
101
+ class ::OtherChild < ::GrandParent
102
+ attr_accessible :favorite_color
103
+ key :favorite_color, String
104
+ key :blog_id, ObjectId
105
+ end
106
+ end
107
+
108
+ teardown do
109
+ Object.send :remove_const, 'GrandParent' if defined?(::GrandParent)
110
+ Object.send :remove_const, 'Child' if defined?(::Child)
111
+ Object.send :remove_const, 'GrandChild' if defined?(::GrandChild)
112
+ Object.send :remove_const, 'OtherChild' if defined?(::OtherChild)
113
+ end
114
+
115
+ should "share keys down the inheritance trail" do
116
+ GrandParent.accessible_attributes.should == [:name].to_set
117
+ Child.accessible_attributes.should == [:name, :position].to_set
118
+ GrandChild.accessible_attributes.should == [:name, :position].to_set
119
+ OtherChild.accessible_attributes.should == [:name, :favorite_color].to_set
120
+ end
121
+ end
122
+
123
+ context "An embedded document with accessible attributes" do
124
+ setup do
125
+ @doc_class = Doc('Project')
126
+ @edoc_class = EDoc('Person') do
127
+ key :name, String
128
+ key :admin, Boolean, :default => false
129
+
130
+ attr_accessible :name
131
+ end
132
+ @doc_class.many :people, :class => @edoc_class
133
+
134
+ @doc = @doc_class.create(:title => 'MongoMapper')
135
+ @edoc = @edoc_class.new(:name => 'Steve Sloan')
136
+ @doc.people << @edoc
137
+ end
138
+
139
+ should "have accessible attributes class method" do
140
+ @edoc_class.accessible_attributes.should == [:name].to_set
141
+ end
142
+
143
+ should "default accessible attributes to nil" do
144
+ EDoc().accessible_attributes.should be_nil
145
+ end
146
+
147
+ should "have accessible attributes instance method" do
148
+ @edoc.accessible_attributes.should equal(@edoc_class.accessible_attributes)
149
+ end
150
+
151
+ should "assign inaccessible attribute through accessor" do
152
+ @edoc.admin = true
153
+ @edoc.admin.should be_true
154
+ end
155
+
156
+ should "ignore inaccessible attribute on #update_attributes" do
157
+ @edoc.update_attributes(:name => 'Ren Hoek', :admin => true)
158
+ @edoc.name.should == 'Ren Hoek'
159
+ @edoc.admin.should be_false
160
+ end
161
+
162
+ should "ignore inaccessible attribute on #update_attributes!" do
163
+ @edoc.update_attributes!(:name => 'Stimpson J. Cat', :admin => true)
164
+ @edoc.name.should == 'Stimpson J. Cat'
165
+ @edoc.admin.should be_false
166
+ end
167
+ end
168
+ end
@@ -1,43 +1,43 @@
1
1
  require 'test_helper'
2
2
  require 'models'
3
3
 
4
- class AssociationsTest < Test::Unit::TestCase
4
+ class AssociationsTest < Test::Unit::TestCase
5
5
  should "allow changing class names" do
6
6
  class AwesomeUser
7
7
  include MongoMapper::Document
8
-
8
+
9
9
  many :posts, :class_name => 'AssociationsTest::AwesomePost', :foreign_key => :creator_id
10
10
  end
11
11
  AwesomeUser.collection.remove
12
-
12
+
13
13
  class AwesomeTag
14
14
  include MongoMapper::EmbeddedDocument
15
-
15
+
16
16
  key :name, String
17
17
  key :post_id, ObjectId
18
-
18
+
19
19
  belongs_to :post, :class_name => 'AssociationsTest::AwesomeUser'
20
20
  end
21
-
21
+
22
22
  class AwesomePost
23
23
  include MongoMapper::Document
24
-
24
+
25
25
  key :creator_id, ObjectId
26
-
26
+
27
27
  belongs_to :creator, :class_name => 'AssociationsTest::AwesomeUser'
28
28
  many :tags, :class_name => 'AssociationsTest::AwesomeTag', :foreign_key => :post_id
29
29
  end
30
-
30
+
31
31
  AwesomeUser.collection.remove
32
32
  AwesomePost.collection.remove
33
-
33
+
34
34
  user = AwesomeUser.create
35
35
  tag1 = AwesomeTag.new(:name => 'awesome')
36
36
  tag2 = AwesomeTag.new(:name => 'grand')
37
37
  post1 = AwesomePost.create(:creator => user, :tags => [tag1])
38
38
  post2 = AwesomePost.create(:creator => user, :tags => [tag2])
39
39
  user.posts.should == [post1, post2]
40
-
40
+
41
41
  post1 = post1.reload
42
42
  post1.tags.should == [tag1]
43
43
  end
@@ -1,18 +1,18 @@
1
1
  require 'test_helper'
2
2
 
3
- class BinaryTest < Test::Unit::TestCase
3
+ class BinaryTest < Test::Unit::TestCase
4
4
  should "serialize and deserialize correctly" do
5
5
  klass = Doc do
6
6
  key :contents, Binary
7
7
  end
8
-
8
+
9
9
  doc = klass.new(:contents => '010101')
10
10
  doc.save
11
-
11
+
12
12
  doc = doc.reload
13
- doc.contents.to_s.should == ByteBuffer.new('010101').to_s
13
+ doc.contents.to_s.should == BSON::ByteBuffer.new('010101').to_s
14
14
  end
15
-
15
+
16
16
  context "Saving a document with a blank binary value" do
17
17
  setup do
18
18
  @document = Doc do
@@ -0,0 +1,76 @@
1
+ require 'test_helper'
2
+
3
+ class CachingTest < Test::Unit::TestCase
4
+ context "Caching" do
5
+ setup do
6
+ @klass = Class.new do
7
+ extend MongoMapper::Plugins
8
+ plugin MongoMapper::Plugins::Caching
9
+ end
10
+ @klass.stubs(:name).returns('Post')
11
+ @klass.any_instance.stubs(:[]).returns(nil)
12
+ @klass.any_instance.stubs(:[]=).returns(nil)
13
+ end
14
+
15
+ context "new" do
16
+ setup do
17
+ @doc = @klass.new
18
+ @doc.stubs(:new?).returns(true)
19
+ end
20
+
21
+ should "be class/new" do
22
+ @doc.cache_key.should == 'Post/new'
23
+ end
24
+
25
+ should "work with suffix" do
26
+ @doc.cache_key(:foo).
27
+ should == 'Post/new/foo'
28
+
29
+ @doc.cache_key(:foo, :bar).
30
+ should == 'Post/new/foo/bar'
31
+ end
32
+ end
33
+
34
+ context "not new" do
35
+ setup do
36
+ @object_id = BSON::ObjectID.new
37
+ @doc = @klass.new
38
+ @doc.stubs(:new?).returns(false)
39
+ @doc.stubs(:id).returns(@object_id)
40
+ end
41
+
42
+ context "with updated_at" do
43
+ setup do
44
+ time = Time.utc(2010, 6, 20, 8, 10, 7)
45
+ @doc.stubs(:[]).with(:updated_at).returns(time)
46
+ end
47
+
48
+ should "be class/id-timestamp" do
49
+ @doc.cache_key.should == "Post/#{@object_id}-20100620081007"
50
+ end
51
+
52
+ should "work with suffix" do
53
+ @doc.cache_key(:foo).
54
+ should == "Post/#{@object_id}-20100620081007/foo"
55
+
56
+ @doc.cache_key(:foo, :bar).
57
+ should == "Post/#{@object_id}-20100620081007/foo/bar"
58
+ end
59
+ end
60
+
61
+ context "without updated_at" do
62
+ should "be class/id" do
63
+ @doc.cache_key.should == "Post/#{@object_id}"
64
+ end
65
+
66
+ should "work with suffix" do
67
+ @doc.cache_key(:foo).
68
+ should == "Post/#{@object_id}/foo"
69
+
70
+ @doc.cache_key(:foo, :bar, :baz).
71
+ should == "Post/#{@object_id}/foo/bar/baz"
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end