tenacity 0.4.1 → 0.5.0

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 (71) hide show
  1. data/.gitignore +1 -0
  2. data/EXTEND.rdoc +18 -21
  3. data/Gemfile +0 -2
  4. data/README.rdoc +3 -1
  5. data/Rakefile +7 -0
  6. data/history.txt +17 -0
  7. data/lib/tenacity.rb +4 -0
  8. data/lib/tenacity/associates_proxy.rb +5 -7
  9. data/lib/tenacity/association.rb +9 -47
  10. data/lib/tenacity/associations/belongs_to.rb +1 -2
  11. data/lib/tenacity/associations/has_many.rb +27 -21
  12. data/lib/tenacity/associations/has_one.rb +3 -2
  13. data/lib/tenacity/class_methods.rb +14 -60
  14. data/lib/tenacity/errors.rb +8 -0
  15. data/lib/tenacity/instance_methods.rb +42 -12
  16. data/lib/tenacity/orm_ext/activerecord.rb +11 -32
  17. data/lib/tenacity/orm_ext/couchrest.rb +14 -22
  18. data/lib/tenacity/orm_ext/datamapper.rb +14 -31
  19. data/lib/tenacity/orm_ext/helpers.rb +3 -3
  20. data/lib/tenacity/orm_ext/mongo_mapper.rb +16 -22
  21. data/lib/tenacity/orm_ext/mongoid.rb +10 -18
  22. data/lib/tenacity/orm_ext/ripple.rb +270 -0
  23. data/lib/tenacity/orm_ext/sequel.rb +21 -33
  24. data/lib/tenacity/orm_ext/toystore.rb +114 -0
  25. data/lib/tenacity/version.rb +1 -1
  26. data/tenacity.gemspec +10 -3
  27. data/test/association_features/belongs_to_test.rb +12 -0
  28. data/test/association_features/has_many_test.rb +32 -2
  29. data/test/association_features/has_one_test.rb +18 -4
  30. data/test/associations/has_one_test.rb +0 -1
  31. data/test/core/classmethods_test.rb +7 -0
  32. data/test/fixtures/active_record_has_many_target.rb +4 -0
  33. data/test/fixtures/active_record_has_one_target.rb +4 -0
  34. data/test/fixtures/active_record_object.rb +8 -0
  35. data/test/fixtures/couch_rest_has_many_target.rb +4 -0
  36. data/test/fixtures/couch_rest_has_one_target.rb +4 -0
  37. data/test/fixtures/couch_rest_object.rb +8 -0
  38. data/test/fixtures/data_mapper_has_many_target.rb +10 -0
  39. data/test/fixtures/data_mapper_has_one_target.rb +10 -0
  40. data/test/fixtures/data_mapper_object.rb +8 -0
  41. data/test/fixtures/mongo_mapper_has_many_target.rb +4 -0
  42. data/test/fixtures/mongo_mapper_has_one_target.rb +4 -0
  43. data/test/fixtures/mongo_mapper_object.rb +8 -0
  44. data/test/fixtures/mongoid_has_many_target.rb +4 -0
  45. data/test/fixtures/mongoid_has_one_target.rb +4 -0
  46. data/test/fixtures/mongoid_object.rb +8 -0
  47. data/test/fixtures/no_associations.rb +4 -0
  48. data/test/fixtures/ripple_has_many_target.rb +24 -0
  49. data/test/fixtures/ripple_has_one_target.rb +24 -0
  50. data/test/fixtures/ripple_object.rb +42 -0
  51. data/test/fixtures/sequel_has_many_target.rb +4 -0
  52. data/test/fixtures/sequel_has_one_target.rb +4 -0
  53. data/test/fixtures/sequel_object.rb +8 -0
  54. data/test/fixtures/toystore_has_many_target.rb +28 -0
  55. data/test/fixtures/toystore_has_one_target.rb +28 -0
  56. data/test/fixtures/toystore_object.rb +46 -0
  57. data/test/helpers/active_record_test_helper.rb +12 -95
  58. data/test/helpers/data_mapper_test_helper.rb +0 -64
  59. data/test/helpers/ripple_test_helper.rb +19 -0
  60. data/test/helpers/sequel_test_helper.rb +13 -60
  61. data/test/helpers/toystore_test_helper.rb +17 -0
  62. data/test/orm_ext/activerecord_test.rb +16 -26
  63. data/test/orm_ext/couchrest_test.rb +10 -29
  64. data/test/orm_ext/datamapper_test.rb +16 -29
  65. data/test/orm_ext/mongo_mapper_test.rb +11 -29
  66. data/test/orm_ext/mongoid_test.rb +11 -29
  67. data/test/orm_ext/ripple_test.rb +140 -0
  68. data/test/orm_ext/sequel_test.rb +15 -26
  69. data/test/orm_ext/toystore_test.rb +103 -0
  70. data/test/test_helper.rb +35 -23
  71. metadata +99 -133
@@ -0,0 +1,17 @@
1
+ def require_toystore
2
+ begin
3
+ require 'toystore'
4
+ yield
5
+ rescue LoadError
6
+ end
7
+ end
8
+
9
+ begin
10
+ require 'toystore'
11
+
12
+ FileUtils.mkdir_p("log")
13
+ Toy.logger = ::Logger.new(File.join("log", "toystore.log"))
14
+ rescue LoadError
15
+ puts "WARNING: Toystore could not be loaded. Skipping tests."
16
+ end
17
+
@@ -37,11 +37,12 @@ class ActiveRecordTest < Test::Unit::TestCase
37
37
  end
38
38
 
39
39
  should "be able to find all associates of an object" do
40
- object = ActiveRecordObject.create
41
- has_many_target_1 = ActiveRecordHasManyTarget.create(:active_record_object_id => object.id)
42
- has_many_target_2 = ActiveRecordHasManyTarget.create(:active_record_object_id => object.id)
43
- has_many_target_3 = ActiveRecordHasManyTarget.create(:active_record_object_id => '9999999')
44
- assert_set_equal [has_many_target_1, has_many_target_2], ActiveRecordHasManyTarget._t_find_all_by_associate(:active_record_object_id, object.id)
40
+ object_1 = ActiveRecordObject.create
41
+ object_2 = ActiveRecordObject.create
42
+ has_many_target_1 = ActiveRecordHasManyTarget.create(:active_record_object_id => object_1.id)
43
+ has_many_target_2 = ActiveRecordHasManyTarget.create(:active_record_object_id => object_1.id)
44
+ has_many_target_3 = ActiveRecordHasManyTarget.create(:active_record_object_id => object_2.id)
45
+ assert_set_equal [has_many_target_1, has_many_target_2], ActiveRecordHasManyTarget._t_find_all_by_associate(:active_record_object_id, object_1.id)
45
46
  end
46
47
 
47
48
  should "return an empty array able to find the associates of an object" do
@@ -51,35 +52,24 @@ class ActiveRecordTest < Test::Unit::TestCase
51
52
  should "be able to reload an object from the database" do
52
53
  object = ActiveRecordHasOneTarget.create
53
54
  object.mongo_mapper_object_id = 'abc123'
54
- object.reload
55
+ object._t_reload
55
56
  assert_nil object.mongo_mapper_object_id
56
57
  end
57
58
 
58
- should "be able to clear the associates of a given object" do
59
- object = ActiveRecordObject.create
60
- object._t_associate_many(association, ['abc123', 'def456', 'ghi789'])
59
+ should "be able to get the ids of the objects associated with the given object" do
60
+ object = ActiveRecordObject.create!
61
+ has_many_target_1 = ActiveRecordHasManyTarget.create!
62
+ has_many_target_2 = ActiveRecordHasManyTarget.create!
63
+ has_many_target_3 = ActiveRecordHasManyTarget.create!
64
+ object.mongo_mapper_has_many_targets = [has_many_target_1, has_many_target_2, has_many_target_3]
61
65
  object.save
62
- object._t_clear_associates(association)
63
- assert_set_equal [], object._t_get_associate_ids(association)
64
- end
65
66
 
66
- should "be able to associate many objects with the given object" do
67
- object = ActiveRecordObject.create
68
- object._t_associate_many(association, ['abc123', 'def456', 'ghi789'])
69
- rows = ActiveRecordObject.connection.execute("select mongo_mapper_has_many_target_id from active_record_objects_mongo_mapper_has_many_targets where active_record_object_id = #{object.id}")
70
- ids = []; rows.each { |r| ids << r[0] }; ids
71
- assert_set_equal ['abc123', 'def456', 'ghi789'], ids
72
- end
73
-
74
- should "be able to get the ids of the objects associated with the given object" do
75
- object = ActiveRecordObject.create
76
- object._t_associate_many(association, ['abc123', 'def456', 'ghi789'])
77
- assert_set_equal ['abc123', 'def456', 'ghi789'], object._t_get_associate_ids(association)
67
+ assert_set_equal [has_many_target_1.id, has_many_target_2.id, has_many_target_3.id], ActiveRecordHasManyTarget._t_find_all_ids_by_associate("active_record_object_id", object.id)
78
68
  end
79
69
 
80
70
  should "return an empty array if there are no objects associated with the given object ids" do
81
71
  object = ActiveRecordObject.create
82
- assert_set_equal [], object._t_get_associate_ids(association)
72
+ assert_set_equal [], ActiveRecordHasManyTarget._t_find_all_ids_by_associate("active_record_object_id", object.id)
83
73
  end
84
74
 
85
75
  should "be able to delete a set of objects, issuing their callbacks" do
@@ -106,7 +96,7 @@ class ActiveRecordTest < Test::Unit::TestCase
106
96
  private
107
97
 
108
98
  def association
109
- Tenacity::Association.new(:t_has_many, :mongo_mapper_has_many_targets, ActiveRecordObject)
99
+ Tenacity::Association.new(:t_has_many, :active_record_has_many_targets, ActiveRecordObject)
110
100
  end
111
101
 
112
102
  end
@@ -37,11 +37,12 @@ class CouchRestTest < Test::Unit::TestCase
37
37
  end
38
38
 
39
39
  should "be able to find all associates of an object" do
40
- object = CouchRestObject.create({})
41
- target_1 = CouchRestHasManyTarget.create(:couch_rest_object_id => object.id)
42
- target_2 = CouchRestHasManyTarget.create(:couch_rest_object_id => object.id)
43
- target_3 = CouchRestHasManyTarget.create(:couch_rest_object_id => 'abc123')
44
- assert_set_equal [target_1, target_2], CouchRestHasManyTarget._t_find_all_by_associate(:couch_rest_object_id, object.id)
40
+ object_1 = CouchRestObject.create({})
41
+ object_2 = CouchRestObject.create({})
42
+ target_1 = CouchRestHasManyTarget.create(:couch_rest_object_id => object_1.id)
43
+ target_2 = CouchRestHasManyTarget.create(:couch_rest_object_id => object_1.id)
44
+ target_3 = CouchRestHasManyTarget.create(:couch_rest_object_id => object_2.id)
45
+ assert_set_equal [target_1, target_2], CouchRestHasManyTarget._t_find_all_by_associate(:couch_rest_object_id, object_1.id)
45
46
  end
46
47
 
47
48
  should "return an empty array if unable to find the associates of an object" do
@@ -57,40 +58,20 @@ class CouchRestTest < Test::Unit::TestCase
57
58
  assert_equal "123", object["abc"]
58
59
  end
59
60
 
60
- should "be able to associate many objects with the given object" do
61
- target_1 = CouchRestHasManyTarget.create({})
62
- target_2 = CouchRestHasManyTarget.create({})
63
- target_3 = CouchRestHasManyTarget.create({})
64
- object = CouchRestObject.create({})
65
- object._t_associate_many(association, [target_1.id, target_2.id, target_3.id])
66
- assert_set_equal [target_1.id.to_s, target_2.id.to_s, target_3.id.to_s], object.t_couch_rest_has_many_target_ids
67
- end
68
-
69
61
  should "be able to get the ids of the objects associated with the given object" do
70
62
  target_1 = CouchRestHasManyTarget.create({})
71
63
  target_2 = CouchRestHasManyTarget.create({})
72
64
  target_3 = CouchRestHasManyTarget.create({})
73
65
  object = CouchRestObject.create({})
74
66
 
75
- object._t_associate_many(association, [target_1.id, target_2.id, target_3.id])
76
- assert_set_equal [target_1.id.to_s, target_2.id.to_s, target_3.id.to_s], object._t_get_associate_ids(association)
67
+ object.couch_rest_has_many_targets = [target_1, target_2, target_3]
68
+ object.save
69
+ assert_set_equal [target_1.id, target_2.id, target_3.id], CouchRestHasManyTarget._t_find_all_ids_by_associate("couch_rest_object_id", object.id)
77
70
  end
78
71
 
79
72
  should "return an empty array when trying to fetch associate ids for an object with no associates" do
80
73
  object = CouchRestObject.create({})
81
- assert_equal [], object._t_get_associate_ids(association)
82
- end
83
-
84
- should "be able to clear the associates of an object" do
85
- target_1 = CouchRestHasManyTarget.create({})
86
- target_2 = CouchRestHasManyTarget.create({})
87
- target_3 = CouchRestHasManyTarget.create({})
88
- object = CouchRestObject.create({})
89
-
90
- object._t_associate_many(association, [target_1.id, target_2.id, target_3.id])
91
- assert_set_equal [target_1.id.to_s, target_2.id.to_s, target_3.id.to_s], object._t_get_associate_ids(association)
92
- object._t_clear_associates(association)
93
- assert_equal [], object._t_get_associate_ids(association)
74
+ assert_equal [], CouchRestHasManyTarget._t_find_all_ids_by_associate("couch_rest_object_id", object.id)
94
75
  end
95
76
 
96
77
  should "be able to delete a set of objects, issuing their callbacks" do
@@ -37,11 +37,12 @@ class DataMapperTest < Test::Unit::TestCase
37
37
  end
38
38
 
39
39
  should "be able to find all associates of an object" do
40
- object = DataMapperObject.create
41
- has_many_target_1 = DataMapperHasManyTarget.create(:data_mapper_object_id => object.id)
42
- has_many_target_2 = DataMapperHasManyTarget.create(:data_mapper_object_id => object.id)
43
- has_many_target_3 = DataMapperHasManyTarget.create(:data_mapper_object_id => '9999999')
44
- assert_set_equal [has_many_target_1, has_many_target_2], DataMapperHasManyTarget._t_find_all_by_associate(:data_mapper_object_id, object.id)
40
+ object_1 = DataMapperObject.create
41
+ object_2 = DataMapperObject.create
42
+ has_many_target_1 = DataMapperHasManyTarget.create(:data_mapper_object_id => object_1.id)
43
+ has_many_target_2 = DataMapperHasManyTarget.create(:data_mapper_object_id => object_1.id)
44
+ has_many_target_3 = DataMapperHasManyTarget.create(:data_mapper_object_id => object_2.id)
45
+ assert_set_equal [has_many_target_1, has_many_target_2], DataMapperHasManyTarget._t_find_all_by_associate(:data_mapper_object_id, object_1.id)
45
46
  end
46
47
 
47
48
  should "return an empty array able to find the associates of an object" do
@@ -50,16 +51,16 @@ class DataMapperTest < Test::Unit::TestCase
50
51
 
51
52
  should "be able to reload an object from the database" do
52
53
  object = DataMapperHasOneTarget.create
53
- other_object = MongoMapperObject.create
54
+ other_object = DataMapperObject.create
54
55
  object.mongo_mapper_object_id = other_object.id
55
56
  assert_equal other_object.id.to_s, object.mongo_mapper_object_id
56
- object.reload
57
+ object._t_reload
57
58
  assert_nil object.mongo_mapper_object_id
58
59
  end
59
60
 
60
61
  should "return an empty array if there are no objects associated with the given object ids" do
61
62
  object = DataMapperObject.create
62
- assert_set_equal [], object._t_get_associate_ids(association)
63
+ assert_set_equal [], DataMapperHasManyTarget._t_find_all_ids_by_associate("data_mapper_object_id", object.id)
63
64
  end
64
65
 
65
66
  should "be able to delete a set of objects, issuing their callbacks" do
@@ -84,30 +85,16 @@ class DataMapperTest < Test::Unit::TestCase
84
85
 
85
86
  context "that works with t_has_many associations" do
86
87
  setup do
87
- @has_many_target_1 = MongoMapperHasManyTarget.create
88
- @has_many_target_2 = MongoMapperHasManyTarget.create
89
- @has_many_target_3 = MongoMapperHasManyTarget.create
90
- end
91
-
92
- should "be able to clear the associates of a given object" do
93
- object = DataMapperObject.create
94
- object._t_associate_many(association, [@has_many_target_1.id, @has_many_target_2.id, @has_many_target_3.id])
95
- object.save
96
- object._t_clear_associates(association)
97
- assert_set_equal [], object._t_get_associate_ids(association)
98
- end
99
-
100
- should "be able to associate many objects with the given object" do
101
- object = DataMapperObject.create
102
- object._t_associate_many(association, [@has_many_target_1.id, @has_many_target_2.id, @has_many_target_3.id])
103
- rows = DataMapperObject.repository.adapter.select("select mongo_mapper_has_many_target_id from data_mapper_objects_mongo_mapper_has_many_targets where data_mapper_object_id = #{object.id}")
104
- assert_set_equal [@has_many_target_1.id.to_s, @has_many_target_2.id.to_s, @has_many_target_3.id.to_s], rows
88
+ @has_many_target_1 = DataMapperHasManyTarget.create
89
+ @has_many_target_2 = DataMapperHasManyTarget.create
90
+ @has_many_target_3 = DataMapperHasManyTarget.create
105
91
  end
106
92
 
107
93
  should "be able to get the ids of the objects associated with the given object" do
108
94
  object = DataMapperObject.create
109
- object._t_associate_many(association, [@has_many_target_1.id, @has_many_target_2.id, @has_many_target_3.id])
110
- assert_set_equal [@has_many_target_1.id.to_s, @has_many_target_2.id.to_s, @has_many_target_3.id.to_s], object._t_get_associate_ids(association)
95
+ object.mongo_mapper_has_many_targets = [@has_many_target_1, @has_many_target_2, @has_many_target_3]
96
+ object.save
97
+ assert_set_equal [@has_many_target_1.id, @has_many_target_2.id, @has_many_target_3.id], DataMapperHasManyTarget._t_find_all_ids_by_associate("data_mapper_object_id", object.id)
111
98
  end
112
99
  end
113
100
  end
@@ -115,7 +102,7 @@ class DataMapperTest < Test::Unit::TestCase
115
102
  private
116
103
 
117
104
  def association
118
- Tenacity::Association.new(:t_has_many, :mongo_mapper_has_many_targets, DataMapperObject)
105
+ Tenacity::Association.new(:t_has_many, :data_mapper_has_many_targets, DataMapperObject)
119
106
  end
120
107
 
121
108
  end
@@ -37,10 +37,12 @@ class MongoMapperTest < Test::Unit::TestCase
37
37
  end
38
38
 
39
39
  should "be able to find the associates of an object" do
40
- target_1 = MongoMapperHasOneTarget.create(:mongo_mapper_object_id => '101')
41
- target_2 = MongoMapperHasOneTarget.create(:mongo_mapper_object_id => '101')
42
- target_3 = MongoMapperHasOneTarget.create(:mongo_mapper_object_id => '102')
43
- assert_set_equal [target_1, target_2], MongoMapperHasOneTarget._t_find_all_by_associate(:mongo_mapper_object_id, '101')
40
+ object_1 = MongoMapperObject.create
41
+ object_2 = MongoMapperObject.create
42
+ target_1 = MongoMapperHasOneTarget.create(:mongo_mapper_object_id => object_1.id)
43
+ target_2 = MongoMapperHasOneTarget.create(:mongo_mapper_object_id => object_1.id)
44
+ target_3 = MongoMapperHasOneTarget.create(:mongo_mapper_object_id => object_2.id)
45
+ assert_set_equal [target_1, target_2], MongoMapperHasOneTarget._t_find_all_by_associate(:mongo_mapper_object_id, object_1.id)
44
46
  end
45
47
 
46
48
  should "return an empty array if the object has no associates" do
@@ -51,44 +53,24 @@ class MongoMapperTest < Test::Unit::TestCase
51
53
  target = MongoMapperHasOneTarget.create
52
54
  target.mongo_mapper_object_id = '101'
53
55
  assert_equal '101', target.mongo_mapper_object_id
54
- target.reload
56
+ target._t_reload
55
57
  assert_nil target.mongo_mapper_object_id
56
58
  end
57
59
 
58
- should "be able to associate many objects with the given object" do
59
- target_1 = MongoMapperHasManyTarget.create
60
- target_2 = MongoMapperHasManyTarget.create
61
- target_3 = MongoMapperHasManyTarget.create
62
- object = MongoMapperObject.create
63
- object._t_associate_many(association, [target_1.id, target_2.id, target_3.id])
64
- assert_set_equal [target_1.id, target_2.id, target_3.id], object.t_mongo_mapper_has_many_target_ids
65
- end
66
-
67
60
  should "be able to get the ids of the objects associated with the given object" do
68
61
  target_1 = MongoMapperHasManyTarget.create
69
62
  target_2 = MongoMapperHasManyTarget.create
70
63
  target_3 = MongoMapperHasManyTarget.create
71
64
  object = MongoMapperObject.create
65
+ object.mongo_mapper_has_many_targets = [target_1, target_2, target_3]
66
+ object.save
72
67
 
73
- object._t_associate_many(association, [target_1.id, target_2.id, target_3.id])
74
- assert_set_equal [target_1.id, target_2.id, target_3.id], object._t_get_associate_ids(association)
68
+ assert_set_equal [target_1.id, target_2.id, target_3.id], MongoMapperHasManyTarget._t_find_all_ids_by_associate("mongo_mapper_object_id", object.id)
75
69
  end
76
70
 
77
71
  should "return an empty array when trying to fetch associate ids for an object with no associates" do
78
72
  object = MongoMapperObject.create
79
- assert_equal [], object._t_get_associate_ids(association)
80
- end
81
-
82
- should "be able to clear the associates of an object" do
83
- target_1 = MongoMapperHasManyTarget.create
84
- target_2 = MongoMapperHasManyTarget.create
85
- target_3 = MongoMapperHasManyTarget.create
86
- object = MongoMapperObject.create
87
-
88
- object._t_associate_many(association, [target_1.id, target_2.id, target_3.id])
89
- assert_set_equal [target_1.id, target_2.id, target_3.id], object._t_get_associate_ids(association)
90
- object._t_clear_associates(association)
91
- assert_equal [], object._t_get_associate_ids(association)
73
+ assert_equal [], MongoMapperHasManyTarget._t_find_all_ids_by_associate("mongo_mapper_object_id", object.id)
92
74
  end
93
75
 
94
76
  should "be able to delete a set of objects, issuing their callbacks" do
@@ -38,10 +38,12 @@ require_mongoid do
38
38
  end
39
39
 
40
40
  should "be able to find the associates of an object" do
41
- target_1 = MongoidHasOneTarget.create(:mongoid_object_id => '101')
42
- target_2 = MongoidHasOneTarget.create(:mongoid_object_id => '101')
43
- target_3 = MongoidHasOneTarget.create(:mongoid_object_id => '102')
44
- assert_set_equal [target_1, target_2], MongoidHasOneTarget._t_find_all_by_associate(:mongoid_object_id, '101')
41
+ object_1 = MongoidObject.create
42
+ object_2 = MongoidObject.create
43
+ target_1 = MongoidHasOneTarget.create(:mongoid_object_id => object_1.id)
44
+ target_2 = MongoidHasOneTarget.create(:mongoid_object_id => object_1.id)
45
+ target_3 = MongoidHasOneTarget.create(:mongoid_object_id => object_2.id)
46
+ assert_set_equal [target_1, target_2], MongoidHasOneTarget._t_find_all_by_associate(:mongoid_object_id, object_1.id)
45
47
  end
46
48
 
47
49
  should "return an empty array if the object has no associates" do
@@ -52,44 +54,24 @@ require_mongoid do
52
54
  target = MongoidHasOneTarget.create
53
55
  target.mongoid_object_id = '101'
54
56
  assert_equal '101', target.mongoid_object_id
55
- target.reload
57
+ target._t_reload
56
58
  assert_nil target.mongoid_object_id
57
59
  end
58
60
 
59
- should "be able to associate many objects with the given object" do
60
- target_1 = MongoidHasManyTarget.create
61
- target_2 = MongoidHasManyTarget.create
62
- target_3 = MongoidHasManyTarget.create
63
- object = MongoidObject.create
64
- object._t_associate_many(association, [target_1.id, target_2.id, target_3.id])
65
- assert_set_equal [target_1.id, target_2.id, target_3.id], object.t_mongoid_has_many_target_ids
66
- end
67
-
68
61
  should "be able to get the ids of the objects associated with the given object" do
69
62
  target_1 = MongoidHasManyTarget.create
70
63
  target_2 = MongoidHasManyTarget.create
71
64
  target_3 = MongoidHasManyTarget.create
72
65
  object = MongoidObject.create
66
+ object.mongoid_has_many_targets = [target_1, target_2, target_3]
67
+ object.save
73
68
 
74
- object._t_associate_many(association, [target_1.id, target_2.id, target_3.id])
75
- assert_set_equal [target_1.id, target_2.id, target_3.id], object._t_get_associate_ids(association)
69
+ assert_set_equal [target_1.id, target_2.id, target_3.id], MongoidHasManyTarget._t_find_all_ids_by_associate("mongoid_object_id", object.id)
76
70
  end
77
71
 
78
72
  should "return an empty array when trying to fetch associate ids for an object with no associates" do
79
73
  object = MongoidObject.create
80
- assert_equal [], object._t_get_associate_ids(association)
81
- end
82
-
83
- should "be able to clear the associates of an object" do
84
- target_1 = MongoidHasManyTarget.create
85
- target_2 = MongoidHasManyTarget.create
86
- target_3 = MongoidHasManyTarget.create
87
- object = MongoidObject.create
88
-
89
- object._t_associate_many(association, [target_1.id, target_2.id, target_3.id])
90
- assert_set_equal [target_1.id, target_2.id, target_3.id], object._t_get_associate_ids(association)
91
- object._t_clear_associates(association)
92
- assert_equal [], object._t_get_associate_ids(association)
74
+ assert_equal [], MongoidHasManyTarget._t_find_all_ids_by_associate("mongoid_object_id", object.id)
93
75
  end
94
76
 
95
77
  should "be able to delete a set of objects, issuing their callbacks" do
@@ -0,0 +1,140 @@
1
+ require 'test_helper'
2
+
3
+ require_ripple do
4
+ class RippleTest < Test::Unit::TestCase
5
+
6
+ context "The Ripple extension" do
7
+ setup do
8
+ setup_ripple_fixtures
9
+ end
10
+
11
+ should "be able to find the object in the database" do
12
+ object = RippleObject.create
13
+ assert_equal object, RippleObject._t_find(object.id)
14
+ end
15
+
16
+ should "return nil if the specified id could not be found in the database" do
17
+ assert_nil RippleObject._t_find('something')
18
+ end
19
+
20
+ should "be able to find multiple objects in the database" do
21
+ object_1 = RippleObject.create
22
+ object_2 = RippleObject.create
23
+ assert_set_equal [object_1, object_2], RippleObject._t_find_bulk([object_1.id, object_2.id, 'bogus_key'])
24
+ end
25
+
26
+ should "return an empty array if none of the specified object ids could be found in the database" do
27
+ assert_equal [], RippleObject._t_find_bulk(['bogus_key_1', 'bogus_key_2', 'bogus_key_3'])
28
+ end
29
+
30
+ should "be able to find the first associate of an object" do
31
+ object = RippleObject.create
32
+ target = RippleHasOneTarget.create(:ripple_object_id => object.id)
33
+ assert_equal target, RippleHasOneTarget._t_find_first_by_associate(:ripple_object_id, object.id)
34
+ end
35
+
36
+ should "return nil if the first associate of an object could not be found" do
37
+ assert_nil RippleHasOneTarget._t_find_first_by_associate(:ripple_object_id, 12345)
38
+ end
39
+
40
+ should "be able to find the associates of an object" do
41
+ object_1 = RippleObject.create
42
+ object_2 = RippleObject.create
43
+ target_1 = RippleHasOneTarget.create(:ripple_object => object_1)
44
+ target_2 = RippleHasOneTarget.create(:ripple_object => object_1)
45
+ target_3 = RippleHasOneTarget.create(:ripple_object => object_2)
46
+ assert_set_equal [target_1, target_2], RippleHasOneTarget._t_find_all_by_associate(:ripple_object_id, object_1.id)
47
+ end
48
+
49
+ should "return an empty array if the object has no associates" do
50
+ assert_equal [], RippleHasOneTarget._t_find_all_by_associate(:ripple_object_id, '1234')
51
+ end
52
+
53
+ should "be able to reload an object from the database" do
54
+ target = RippleHasOneTarget.create
55
+ target.ripple_object_id = '101'
56
+ assert_equal '101', target.ripple_object_id
57
+ target._t_reload
58
+ assert_nil target.ripple_object_id
59
+ end
60
+
61
+ should "be able to get the ids of the objects associated with the given object" do
62
+ target_1 = RippleHasManyTarget.create
63
+ target_2 = RippleHasManyTarget.create
64
+ target_3 = RippleHasManyTarget.create
65
+ object = RippleObject.create
66
+ object.ripple_has_many_targets = [target_1, target_2, target_3]
67
+ object.save
68
+
69
+ assert_set_equal [target_1.id, target_2.id, target_3.id], RippleHasManyTarget._t_find_all_ids_by_associate("ripple_object_id", object.id)
70
+ end
71
+
72
+ should "return an empty array when trying to fetch associate ids for an object with no associates" do
73
+ object = RippleObject.create
74
+ assert_equal [], RippleHasManyTarget._t_find_all_ids_by_associate("ripple_object_id", object.id)
75
+ end
76
+
77
+ should "be able to delete a set of objects, issuing their callbacks" do
78
+ object_1 = RippleObject.create
79
+ object_2 = RippleObject.create
80
+ object_3 = RippleObject.create
81
+
82
+ assert RippleObject.bucket.exist?(object_1.id)
83
+ assert RippleObject.bucket.exist?(object_2.id)
84
+ assert RippleObject.bucket.exist?(object_3.id)
85
+ RippleObject._t_delete([object_1.id, object_2.id, object_3.id])
86
+ assert !RippleObject.bucket.exist?(object_1.id)
87
+ assert !RippleObject.bucket.exist?(object_2.id)
88
+ assert !RippleObject.bucket.exist?(object_3.id)
89
+ end
90
+
91
+ should "be able to delete a setup of objects, without issuing their callbacks" do
92
+ object_1 = RippleObject.create
93
+ object_2 = RippleObject.create
94
+ object_3 = RippleObject.create
95
+
96
+ assert RippleObject.bucket.exist?(object_1.id)
97
+ assert RippleObject.bucket.exist?(object_2.id)
98
+ assert RippleObject.bucket.exist?(object_3.id)
99
+ RippleObject._t_delete([object_1.id, object_2.id, object_3.id], false)
100
+ assert !RippleObject.bucket.exist?(object_1.id)
101
+ assert !RippleObject.bucket.exist?(object_2.id)
102
+ assert !RippleObject.bucket.exist?(object_3.id)
103
+ end
104
+
105
+ should "create associate indexes when source object is saved" do
106
+ target_1 = RippleHasManyTarget.create
107
+ target_2 = RippleHasManyTarget.create
108
+ target_3 = RippleHasManyTarget.create
109
+ object = RippleObject.create
110
+ object.ripple_has_many_targets = [target_1, target_2, target_3]
111
+ object.save
112
+
113
+ bucket = ::Ripple.client.bucket('tenacity_test_ripple_has_many_target_ripple_object_id')
114
+ assert_set_equal [target_1.id, target_2.id, target_3.id], bucket.get(object.id).data
115
+ end
116
+
117
+ should "destroy associate indexes when source object is saved" do
118
+ target_1 = RippleHasManyTarget.create
119
+ target_2 = RippleHasManyTarget.create
120
+ target_3 = RippleHasManyTarget.create
121
+ object = RippleObject.create
122
+ object.ripple_has_many_targets = [target_1, target_2, target_3]
123
+ object.save
124
+
125
+ bucket = ::Ripple.client.bucket('tenacity_test_ripple_has_many_target_ripple_object_id')
126
+ assert_set_equal [target_1.id, target_2.id, target_3.id], bucket.get(object.id).data
127
+ target_2.destroy
128
+ assert_set_equal [target_1.id, target_3.id], bucket.get(object.id).data
129
+
130
+ target_1.destroy
131
+ target_3.destroy
132
+ assert_set_equal [], bucket.get(object.id).data
133
+ end
134
+ end
135
+
136
+ def association
137
+ Tenacity::Association.new(:t_has_many, :ripple_has_many_targets, RippleObject)
138
+ end
139
+ end
140
+ end