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
@@ -1,19 +1,19 @@
1
1
  require 'test_helper'
2
2
 
3
- class ValidationsTest < Test::Unit::TestCase
3
+ class ValidationsTest < Test::Unit::TestCase
4
4
  context "Saving a new document that is invalid" do
5
5
  setup do
6
6
  @document = Doc do
7
7
  key :name, String, :required => true
8
8
  end
9
9
  end
10
-
10
+
11
11
  should "not insert document" do
12
12
  doc = @document.new
13
13
  doc.save
14
14
  @document.count.should == 0
15
15
  end
16
-
16
+
17
17
  should "populate document's errors" do
18
18
  doc = @document.new
19
19
  doc.errors.size.should == 0
@@ -28,7 +28,7 @@ class ValidationsTest < Test::Unit::TestCase
28
28
  key :name, String, :required => true
29
29
  end
30
30
  end
31
-
31
+
32
32
  should "raise error" do
33
33
  doc = @document.new
34
34
  lambda { doc.save! }.should raise_error(MongoMapper::DocumentNotValid)
@@ -41,7 +41,7 @@ class ValidationsTest < Test::Unit::TestCase
41
41
  key :name, String, :required => true
42
42
  end
43
43
  end
44
-
44
+
45
45
  should "raise error" do
46
46
  lambda { @document.create! }.should raise_error(MongoMapper::DocumentNotValid)
47
47
  end
@@ -51,29 +51,29 @@ class ValidationsTest < Test::Unit::TestCase
51
51
  instance.new_record?.should be_false
52
52
  end
53
53
  end
54
-
54
+
55
55
  context "Saving an existing document that is invalid" do
56
56
  setup do
57
57
  @document = Doc do
58
58
  key :name, String, :required => true
59
59
  end
60
-
60
+
61
61
  @doc = @document.create(:name => 'John Nunemaker')
62
62
  end
63
-
63
+
64
64
  should "not update document" do
65
65
  @doc.name = nil
66
66
  @doc.save
67
67
  @doc.reload.name.should == 'John Nunemaker'
68
68
  end
69
-
69
+
70
70
  should "populate document's errors" do
71
71
  @doc.name = nil
72
72
  @doc.save
73
73
  @doc.errors.full_messages.should == ["Name can't be empty"]
74
74
  end
75
75
  end
76
-
76
+
77
77
  context "Adding validation errors" do
78
78
  setup do
79
79
  @document = Doc do
@@ -83,38 +83,38 @@ class ValidationsTest < Test::Unit::TestCase
83
83
  end
84
84
  end
85
85
  end
86
-
86
+
87
87
  should "work with validate_on_create callback" do
88
88
  @document.validate_on_create :action_present
89
-
89
+
90
90
  doc = @document.new
91
91
  doc.action = nil
92
92
  doc.should have_error_on(:action)
93
-
93
+
94
94
  doc.action = 'kick'
95
95
  doc.should_not have_error_on(:action)
96
96
  doc.save
97
-
97
+
98
98
  doc.action = nil
99
99
  doc.should_not have_error_on(:action)
100
100
  end
101
-
101
+
102
102
  should "work with validate_on_update callback" do
103
103
  @document.validate_on_update :action_present
104
-
104
+
105
105
  doc = @document.new
106
106
  doc.action = nil
107
107
  doc.should_not have_error_on(:action)
108
108
  doc.save
109
-
109
+
110
110
  doc.action = nil
111
111
  doc.should have_error_on(:action)
112
-
112
+
113
113
  doc.action = 'kick'
114
114
  doc.should_not have_error_on(:action)
115
115
  end
116
116
  end
117
-
117
+
118
118
  context "validating uniqueness of" do
119
119
  setup do
120
120
  @document = Doc do
@@ -167,13 +167,13 @@ class ValidationsTest < Test::Unit::TestCase
167
167
  doc2 = @document.new("name" => "joe")
168
168
  doc2.should have_error_on(:name)
169
169
  end
170
-
170
+
171
171
  should "allow multiple blank entries if :allow_blank => true" do
172
172
  document = Doc do
173
173
  key :name
174
174
  validates_uniqueness_of :name, :allow_blank => :true
175
175
  end
176
-
176
+
177
177
  doc = document.new("name" => "")
178
178
  doc.save.should be_true
179
179
 
@@ -219,7 +219,7 @@ class ValidationsTest < Test::Unit::TestCase
219
219
  validates_uniqueness_of :name, :case_sensitive => false
220
220
  end
221
221
  end
222
-
222
+
223
223
  should "fail on entries that differ only in case" do
224
224
  doc = @document.new("name" => "BLAMMO")
225
225
  doc.save.should be_true
@@ -232,6 +232,19 @@ class ValidationsTest < Test::Unit::TestCase
232
232
  doc = @document.new("name" => nil)
233
233
  lambda { doc.valid? }.should_not raise_error
234
234
  end
235
+
236
+ should "not raise an error if special Regexp characters used" do
237
+ doc = @document.new("name" => '?')
238
+ lambda { doc.valid? }.should_not raise_error
239
+ end
240
+
241
+ should "check for uniqueness using entire string" do
242
+ doc = @document.new("name" => "John Doe")
243
+ doc.save.should be_true
244
+
245
+ doc2 = @document.new("name" => "John")
246
+ doc2.valid?.should be_true
247
+ end
235
248
  end
236
249
 
237
250
  context "scoped by a single attribute" do
@@ -246,7 +259,7 @@ class ValidationsTest < Test::Unit::TestCase
246
259
  should "fail if the same name exists in the scope" do
247
260
  doc = @document.new("name" => "joe", "scope" => "one")
248
261
  doc.save.should be_true
249
-
262
+
250
263
  @document \
251
264
  .stubs(:first) \
252
265
  .with(:name => 'joe', :scope => "one") \
@@ -279,11 +292,11 @@ class ValidationsTest < Test::Unit::TestCase
279
292
  validates_uniqueness_of :name, :scope => [:first_scope, :second_scope]
280
293
  end
281
294
  end
282
-
295
+
283
296
  should "fail if the same name exists in the scope" do
284
297
  doc = @document.new("name" => "joe", "first_scope" => "one", "second_scope" => "two")
285
298
  doc.save.should be_true
286
-
299
+
287
300
  @document \
288
301
  .stubs(:first) \
289
302
  .with(:name => 'joe', :first_scope => 'one', :second_scope => 'two') \
@@ -292,11 +305,11 @@ class ValidationsTest < Test::Unit::TestCase
292
305
  doc2 = @document.new("name" => "joe", "first_scope" => "one", "second_scope" => "two")
293
306
  doc2.should have_error_on(:name)
294
307
  end
295
-
308
+
296
309
  should "pass if the same name exists in a different scope" do
297
310
  doc = @document.new("name" => "joe", "first_scope" => "one", "second_scope" => "two")
298
311
  doc.save.should be_true
299
-
312
+
300
313
  @document \
301
314
  .stubs(:first) \
302
315
  .with(:name => 'joe', :first_scope => 'one', :second_scope => 'one') \
@@ -307,21 +320,21 @@ class ValidationsTest < Test::Unit::TestCase
307
320
  end
308
321
  end
309
322
  end
310
-
323
+
311
324
  context "validates uniqueness of with :unique shortcut" do
312
325
  should "work" do
313
326
  @document = Doc do
314
327
  key :name, String, :unique => true
315
328
  end
316
-
329
+
317
330
  doc = @document.create(:name => 'John')
318
331
  doc.should_not have_error_on(:name)
319
-
332
+
320
333
  @document \
321
334
  .stubs(:first) \
322
335
  .with(:name => 'John') \
323
336
  .returns(doc)
324
-
337
+
325
338
  second_john = @document.create(:name => 'John')
326
339
  second_john.should have_error_on(:name, 'has already been taken')
327
340
  end
data/test/models.rb CHANGED
@@ -1,23 +1,23 @@
1
1
  # custom type
2
2
  class WindowSize
3
3
  attr_reader :width, :height
4
-
4
+
5
5
  def self.to_mongo(value)
6
6
  value.to_a
7
7
  end
8
-
8
+
9
9
  def self.from_mongo(value)
10
10
  value.is_a?(self) ? value : WindowSize.new(value)
11
11
  end
12
-
12
+
13
13
  def initialize(*args)
14
14
  @width, @height = args.flatten
15
15
  end
16
-
16
+
17
17
  def to_a
18
18
  [width, height]
19
19
  end
20
-
20
+
21
21
  def ==(other)
22
22
  other.is_a?(self.class) && other.width == width && other.height == height
23
23
  end
@@ -67,7 +67,6 @@ class Message
67
67
 
68
68
  key :body, String
69
69
  key :position, Integer
70
- key :_type, String
71
70
  key :room_id, ObjectId
72
71
 
73
72
  belongs_to :room
@@ -87,17 +86,16 @@ class Room
87
86
  end
88
87
  end
89
88
  many :latest_messages, :class_name => 'Message', :order => 'position desc', :limit => 2
90
-
89
+
91
90
  many :accounts, :polymorphic => true, :extend => AccountsExtensions
92
91
  end
93
92
 
94
93
  class Account
95
94
  include MongoMapper::Document
96
-
97
- key :_type, String
95
+
98
96
  key :room_id, ObjectId
99
97
  key :last_logged_in, Time
100
-
98
+
101
99
  belongs_to :room
102
100
  end
103
101
  class AccountUser < Account; end
@@ -119,14 +117,14 @@ class Project
119
117
  include MongoMapper::Document
120
118
 
121
119
  key :name, String
122
-
120
+
123
121
  many :collaborators, :extend => CollaboratorsExtensions
124
122
  many :statuses, :order => 'position' do
125
123
  def open
126
124
  all(:name => %w(New Assigned))
127
125
  end
128
126
  end
129
-
127
+
130
128
  many :addresses do
131
129
  def find_all_by_state(state)
132
130
  # can't use select here for some reason
@@ -145,6 +143,12 @@ end
145
143
  class Status
146
144
  include MongoMapper::Document
147
145
 
146
+ scope :complete, where(:name => 'Complete')
147
+
148
+ def self.by_position(position)
149
+ where(:position => position)
150
+ end
151
+
148
152
  key :project_id, ObjectId
149
153
  key :target_id, ObjectId
150
154
  key :target_type, String
@@ -158,9 +162,7 @@ end
158
162
  class Media
159
163
  include MongoMapper::EmbeddedDocument
160
164
 
161
- key :_type, String
162
165
  key :file, String
163
-
164
166
  key :visible, Boolean
165
167
  end
166
168
 
@@ -179,7 +181,7 @@ end
179
181
 
180
182
  class Catalog
181
183
  include MongoMapper::Document
182
-
184
+
183
185
  many :medias, :polymorphic => true do
184
186
  def visible
185
187
  # for some reason we can't use select here
@@ -192,7 +194,6 @@ module TrModels
192
194
  class Transport
193
195
  include MongoMapper::EmbeddedDocument
194
196
 
195
- key :_type, String
196
197
  key :license_plate, String
197
198
  key :purchased_on, Date
198
199
  end
@@ -225,7 +226,7 @@ module TrModels
225
226
  find_all { |t| t.purchased_on < 2.years.ago.to_date }
226
227
  end
227
228
  end
228
-
229
+
229
230
  many :transports, :polymorphic => true, :class_name => "TrModels::Transport", :extend => TransportsExtension
230
231
  key :name, String
231
232
  end
@@ -1,10 +1,12 @@
1
1
  require 'test_helper'
2
+ # For testing against edge rails also.
3
+ # $:.unshift '/Users/jnunemaker/dev/ruby/rails/activemodel/lib'
2
4
  require 'active_model'
3
5
  require 'models'
4
6
 
5
7
  class ActiveModelLintTest < ActiveModel::TestCase
6
8
  include ActiveModel::Lint::Tests
7
-
9
+
8
10
  def setup
9
11
  @model = Post.new
10
12
  end
data/test/test_helper.rb CHANGED
@@ -1,26 +1,29 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../lib/mongo_mapper')
1
+ require 'rubygems'
2
+ gem 'activesupport', ENV['ACTIVE_SUPPORT_VERSION']
3
+ gem 'json', '~> 1.2.3'
4
+ gem 'jnunemaker-matchy', '~> 0.4.0'
5
+ gem 'shoulda', '~> 2.10.2'
6
+ gem 'timecop', '~> 0.3.1'
7
+ gem 'mocha', '~> 0.9.8'
2
8
 
3
- gem 'jnunemaker-matchy', '0.4.0'
4
- gem 'shoulda', '2.10.2'
5
- gem 'timecop', '0.3.1'
6
- gem 'mocha', '0.9.8'
9
+ $:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
10
+ require 'mongo_mapper'
11
+ require 'fileutils'
12
+ require 'ostruct'
13
+ require 'pp'
7
14
 
15
+ require 'active_support/version'
16
+ require 'json'
8
17
  require 'matchy'
9
18
  require 'shoulda'
10
19
  require 'timecop'
11
20
  require 'mocha'
12
- require 'pp'
13
-
14
- require 'support/custom_matchers'
15
- require 'support/timing'
16
21
 
17
22
  class Test::Unit::TestCase
18
- include CustomMatchers
19
-
20
23
  def Doc(name=nil, &block)
21
24
  klass = Class.new do
22
25
  include MongoMapper::Document
23
- set_collection_name "test#{rand(20)}"
26
+ set_collection_name :test
24
27
 
25
28
  if name
26
29
  class_eval "def self.name; '#{name}' end"
@@ -52,10 +55,50 @@ class Test::Unit::TestCase
52
55
  klass.collection.drop_indexes
53
56
  end
54
57
  end
58
+
59
+ custom_matcher :be_true do |receiver, matcher, args|
60
+ matcher.positive_failure_message = "Expected #{receiver} to be true but it wasn't"
61
+ matcher.negative_failure_message = "Expected #{receiver} not to be true but it was"
62
+ receiver.eql?(true)
63
+ end
64
+
65
+ custom_matcher :be_false do |receiver, matcher, args|
66
+ matcher.positive_failure_message = "Expected #{receiver} to be false but it wasn't"
67
+ matcher.negative_failure_message = "Expected #{receiver} not to be false but it was"
68
+ receiver.eql?(false)
69
+ end
70
+
71
+ custom_matcher :have_error_on do |receiver, matcher, args|
72
+ receiver.valid?
73
+ attribute = args[0]
74
+ expected_message = args[1]
75
+
76
+ if expected_message.nil?
77
+ matcher.positive_failure_message = "#{receiver} had no errors on #{attribute}"
78
+ matcher.negative_failure_message = "#{receiver} had errors on #{attribute} #{receiver.errors.inspect}"
79
+ !receiver.errors.on(attribute).blank?
80
+ else
81
+ actual = receiver.errors.on(attribute)
82
+ matcher.positive_failure_message = %Q(Expected error on #{attribute} to be "#{expected_message}" but was "#{actual}")
83
+ matcher.negative_failure_message = %Q(Expected error on #{attribute} not to be "#{expected_message}" but was "#{actual}")
84
+ actual == expected_message
85
+ end
86
+ end
87
+
88
+ custom_matcher :have_index do |receiver, matcher, args|
89
+ index_name = args[0]
90
+ matcher.positive_failure_message = "#{receiver} does not have index named #{index_name}, but should"
91
+ matcher.negative_failure_message = "#{receiver} does have index named #{index_name}, but should not"
92
+ !receiver.collection.index_information.detect { |index| index[0] == index_name }.nil?
93
+ end
55
94
  end
56
95
 
57
- test_dir = File.expand_path(File.dirname(__FILE__) + '/../tmp')
58
- FileUtils.mkdir_p(test_dir) unless File.exist?(test_dir)
96
+ log_dir = File.expand_path('../../log', __FILE__)
97
+ FileUtils.mkdir_p(log_dir) unless File.exist?(log_dir)
98
+ logger = Logger.new(log_dir + '/test.log')
99
+
100
+ MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017, :logger => logger)
101
+ MongoMapper.database = "mm-test-#{RUBY_VERSION.gsub('.', '-')}"
102
+ MongoMapper.database.collections.each { |c| c.drop_indexes }
59
103
 
60
- MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017, {:logger => Logger.new(test_dir + '/test.log')})
61
- MongoMapper.database = 'test'
104
+ puts "\n--- Active Support Version: #{ActiveSupport::VERSION::STRING} ---\n"