tenacity 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/EXTEND.rdoc +10 -3
  2. data/Gemfile +1 -2
  3. data/README.rdoc +3 -2
  4. data/Rakefile +6 -0
  5. data/history.txt +11 -0
  6. data/lib/tenacity/associate_proxy.rb +1 -1
  7. data/lib/tenacity/associates_proxy.rb +4 -4
  8. data/lib/tenacity/associations/has_many.rb +7 -8
  9. data/lib/tenacity/associations/has_one.rb +4 -4
  10. data/lib/tenacity/class_methods.rb +1 -1
  11. data/lib/tenacity/errors.rb +4 -8
  12. data/lib/tenacity/instance_methods.rb +2 -2
  13. data/lib/tenacity/orm_ext/activerecord.rb +5 -1
  14. data/lib/tenacity/orm_ext/couchrest.rb +4 -0
  15. data/lib/tenacity/orm_ext/datamapper.rb +5 -1
  16. data/lib/tenacity/orm_ext/helpers.rb +3 -3
  17. data/lib/tenacity/orm_ext/mongo_mapper.rb +4 -0
  18. data/lib/tenacity/orm_ext/mongoid.rb +4 -0
  19. data/lib/tenacity/orm_ext/ripple.rb +4 -0
  20. data/lib/tenacity/orm_ext/sequel.rb +5 -1
  21. data/lib/tenacity/orm_ext/toystore.rb +4 -0
  22. data/lib/tenacity/version.rb +1 -1
  23. data/test/associations/belongs_to_test.rb +3 -3
  24. data/test/associations/has_many_test.rb +6 -6
  25. data/test/associations/has_one_test.rb +4 -4
  26. data/test/core/classmethods_test.rb +14 -0
  27. data/test/fixtures/active_record_object_with_string_id.rb +5 -0
  28. data/test/fixtures/couch_rest_object.rb +2 -0
  29. data/test/fixtures/data_mapper_object.rb +1 -0
  30. data/test/fixtures/data_mapper_object_with_string_id.rb +6 -0
  31. data/test/fixtures/mongo_mapper_object.rb +4 -0
  32. data/test/fixtures/mongoid_object.rb +2 -0
  33. data/test/fixtures/ripple_object.rb +2 -0
  34. data/test/fixtures/sequel_object_with_string_id.rb +3 -0
  35. data/test/fixtures/toystore_object.rb +2 -0
  36. data/test/helpers/active_record_test_helper.rb +4 -0
  37. data/test/helpers/data_mapper_test_helper.rb +1 -0
  38. data/test/helpers/sequel_test_helper.rb +5 -0
  39. data/test/orm_ext/activerecord_test.rb +16 -0
  40. data/test/orm_ext/datamapper_test.rb +16 -0
  41. data/test/orm_ext/mongo_mapper_test.rb +11 -0
  42. data/test/orm_ext/mongoid_test.rb +11 -0
  43. data/test/orm_ext/ripple_test.rb +147 -134
  44. data/test/orm_ext/sequel_test.rb +16 -0
  45. data/test/orm_ext/toystore_test.rb +11 -0
  46. data/test/test_helper.rb +8 -8
  47. metadata +46 -152
@@ -9,11 +9,11 @@ class HasOneTest < Test::Unit::TestCase
9
9
 
10
10
  @source_class = class_for_extension(source)
11
11
  @source = @source_class.create({})
12
- @target_class = class_for_extension(target, :has_one)
12
+ @target_class = class_for_extension(target, :t_has_one)
13
13
  @target = @target_class.create({})
14
14
 
15
- @foreign_key = foreign_key_for(target, :has_one)
16
- @foreign_key_id = foreign_key_id_for(target, :has_one)
15
+ @foreign_key = foreign_key_for(target, :t_has_one)
16
+ @foreign_key_id = foreign_key_id_for(target, :t_has_one)
17
17
  end
18
18
 
19
19
  should "be able to set and get the associated object" do
@@ -60,7 +60,7 @@ class HasOneTest < Test::Unit::TestCase
60
60
 
61
61
  assert_nil @source_class._t_find(serialize_id(@source))
62
62
  assert_not_nil @target_class._t_find(serialize_id(@target))
63
- assert_nil @target_class._t_find(serialize_id(@target)).send(foreign_key_id_for(target, :belongs_to))
63
+ assert_nil @target_class._t_find(serialize_id(@target)).send(foreign_key_id_for(target, :t_belongs_to))
64
64
  end
65
65
 
66
66
  context "with a polymorphic association" do
@@ -58,5 +58,19 @@ class ClassmethodsTest < Test::Unit::TestCase
58
58
  should("respond to destroy_all") { assert @targets.respond_to?(:destroy_all) }
59
59
  end
60
60
 
61
+ context "A class including Tenacity" do
62
+ should "be able to override the default object id type" do
63
+ active_record_object = ActiveRecordObjectWithStringId.new
64
+ active_record_object.id = 'abc999'
65
+ active_record_object.save!
66
+
67
+ mongo_mapper_object = MongoMapperObject.create
68
+ mongo_mapper_object.active_record_object_with_string_id = active_record_object
69
+ mongo_mapper_object.save
70
+
71
+ assert_equal active_record_object, MongoMapperObject._t_find(mongo_mapper_object.id).active_record_object_with_string_id
72
+ end
73
+ end
74
+
61
75
  end
62
76
 
@@ -0,0 +1,5 @@
1
+ class ActiveRecordObjectWithStringId < ActiveRecord::Base
2
+ include Tenacity
3
+
4
+ t_has_one :mongo_mapper_object
5
+ end
@@ -2,6 +2,8 @@ class CouchRestObject < CouchRest::Model::Base
2
2
  include Tenacity
3
3
  use_database COUCH_DB
4
4
 
5
+ property :prop, :type => String
6
+
5
7
  t_has_one :active_record_has_one_target
6
8
  t_has_one :couch_rest_has_one_target
7
9
  t_has_one :data_mapper_has_one_target
@@ -3,6 +3,7 @@ class DataMapperObject
3
3
  include Tenacity
4
4
 
5
5
  property :id, Serial
6
+ property :prop, String
6
7
 
7
8
  t_has_one :active_record_has_one_target
8
9
  t_has_one :couch_rest_has_one_target
@@ -0,0 +1,6 @@
1
+ class DataMapperObjectWithStringId
2
+ include DataMapper::Resource
3
+ include Tenacity
4
+
5
+ property :id, String, :key => true
6
+ end
@@ -2,6 +2,8 @@ class MongoMapperObject
2
2
  include MongoMapper::Document
3
3
  include Tenacity
4
4
 
5
+ key :prop, String
6
+
5
7
  t_has_one :active_record_has_one_target
6
8
  t_has_one :couch_rest_has_one_target
7
9
  t_has_one :data_mapper_has_one_target
@@ -37,4 +39,6 @@ class MongoMapperObject
37
39
  require_ripple { t_has_many :ripple_has_many_targets, :as => :ripple_has_many_target_testable }
38
40
  t_has_many :sequel_has_many_targets, :as => :sequel_has_many_target_testable
39
41
  require_toystore { t_has_many :toystore_has_many_targets, :as => :toystore_has_many_target_testable }
42
+
43
+ t_belongs_to :active_record_object_with_string_id
40
44
  end
@@ -3,6 +3,8 @@ require_mongoid do
3
3
  include Mongoid::Document
4
4
  include Tenacity
5
5
 
6
+ field :prop, :type => String
7
+
6
8
  t_has_one :active_record_has_one_target
7
9
  t_has_one :couch_rest_has_one_target
8
10
  t_has_one :data_mapper_has_one_target
@@ -3,6 +3,8 @@ require_ripple do
3
3
  include Ripple::Document
4
4
  include Tenacity
5
5
 
6
+ property :prop, String
7
+
6
8
  t_has_one :active_record_has_one_target
7
9
  t_has_one :couch_rest_has_one_target
8
10
  t_has_one :data_mapper_has_one_target
@@ -0,0 +1,3 @@
1
+ class SequelObjectWithStringId < Sequel::Model
2
+ include Tenacity
3
+ end
@@ -7,6 +7,8 @@ require_toystore do
7
7
 
8
8
  include Tenacity
9
9
 
10
+ attribute :prop, String
11
+
10
12
  t_has_one :active_record_has_one_target
11
13
  t_has_one :couch_rest_has_one_target
12
14
  t_has_one :data_mapper_has_one_target
@@ -26,6 +26,10 @@ ActiveRecord::Schema.define :version => 0 do
26
26
  t.string :prop
27
27
  end
28
28
 
29
+ create_table :active_record_object_with_string_ids, :force => true, :id => false do |t|
30
+ t.string :id, :limit => 36, :primary => true
31
+ end
32
+
29
33
  create_table :active_record_has_one_targets, :force => true do |t|
30
34
  t.integer :active_record_object_id
31
35
  t.string :couch_rest_object_id
@@ -12,6 +12,7 @@ def migrate_data_mapper_tables
12
12
  DataMapperHasManyTarget
13
13
  DataMapperHasOneTarget
14
14
  DataMapperObject
15
+ DataMapperObjectWithStringId
15
16
 
16
17
  DataMapper.auto_migrate!
17
18
  end
@@ -5,6 +5,11 @@ Sequel::Model.raise_on_save_failure = true
5
5
 
6
6
  DB.create_table :sequel_objects do
7
7
  primary_key :id
8
+ String :prop
9
+ end
10
+
11
+ DB.create_table :sequel_object_with_string_ids do
12
+ String :id, :primary_key => true
8
13
  end
9
14
 
10
15
  DB.create_table :sequel_has_one_targets do
@@ -91,6 +91,22 @@ class ActiveRecordTest < Test::Unit::TestCase
91
91
  ActiveRecordObject._t_delete([object_1.id, object_2.id, object_3.id], false)
92
92
  assert_equal old_count - 3, ActiveRecordObject.count
93
93
  end
94
+
95
+ should "save the object if it is dirty" do
96
+ object = ActiveRecordObject.create
97
+ object.prop = "something"
98
+ assert object._t_save_if_dirty
99
+ end
100
+
101
+ should "not save the object if it is not dirty" do
102
+ object = ActiveRecordObject.create
103
+ assert !object._t_save_if_dirty
104
+ end
105
+
106
+ should "be able to successfully determine the id type" do
107
+ assert_equal Integer, ActiveRecordObject._t_id_type
108
+ assert_equal String, ActiveRecordObjectWithStringId._t_id_type
109
+ end
94
110
  end
95
111
 
96
112
  private
@@ -83,6 +83,22 @@ class DataMapperTest < Test::Unit::TestCase
83
83
  assert_equal old_count - 3, DataMapperObject.count
84
84
  end
85
85
 
86
+ should "save the object if it is dirty" do
87
+ object = DataMapperObject.create
88
+ object.prop = "something"
89
+ assert object._t_save_if_dirty
90
+ end
91
+
92
+ should "not save the object if it is not dirty" do
93
+ object = DataMapperObject.create
94
+ assert !object._t_save_if_dirty
95
+ end
96
+
97
+ should "be able to successfully determine the id type" do
98
+ assert_equal Integer, DataMapperObject._t_id_type
99
+ assert_equal String, DataMapperObjectWithStringId._t_id_type
100
+ end
101
+
86
102
  context "that works with t_has_many associations" do
87
103
  setup do
88
104
  @has_many_target_1 = DataMapperHasManyTarget.create
@@ -92,6 +92,17 @@ class MongoMapperTest < Test::Unit::TestCase
92
92
  MongoMapperObject._t_delete([object_1.id, object_2.id, object_3.id], false)
93
93
  assert_equal old_count - 3, MongoMapperObject.count
94
94
  end
95
+
96
+ should "save the object if it is dirty" do
97
+ object = MongoMapperObject.create
98
+ object.prop = "something"
99
+ assert object._t_save_if_dirty
100
+ end
101
+
102
+ should "not save the object if it is not dirty" do
103
+ object = MongoMapperObject.create
104
+ assert !object._t_save_if_dirty
105
+ end
95
106
  end
96
107
 
97
108
  def association
@@ -93,6 +93,17 @@ require_mongoid do
93
93
  MongoidObject._t_delete([object_1.id, object_2.id, object_3.id], false)
94
94
  assert_equal old_count - 3, MongoidObject.count
95
95
  end
96
+
97
+ should "save the object if it is dirty" do
98
+ object = MongoidObject.create
99
+ object.prop = "something"
100
+ assert object._t_save_if_dirty
101
+ end
102
+
103
+ should "not save the object if it is not dirty" do
104
+ object = MongoidObject.create
105
+ assert !object._t_save_if_dirty
106
+ end
96
107
  end
97
108
 
98
109
  def association
@@ -1,140 +1,153 @@
1
1
  require 'test_helper'
2
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'])
3
+ if ENV['LONG'] == 'true'
4
+ require_ripple do
5
+ class RippleTest < Test::Unit::TestCase
6
+
7
+ context "The Ripple extension" do
8
+ setup do
9
+ setup_ripple_fixtures
10
+ end
11
+
12
+ should "be able to find the object in the database" do
13
+ object = RippleObject.create
14
+ assert_equal object, RippleObject._t_find(object.id)
15
+ end
16
+
17
+ should "return nil if the specified id could not be found in the database" do
18
+ assert_nil RippleObject._t_find('something')
19
+ end
20
+
21
+ should "be able to find multiple objects in the database" do
22
+ object_1 = RippleObject.create
23
+ object_2 = RippleObject.create
24
+ assert_set_equal [object_1, object_2], RippleObject._t_find_bulk([object_1.id, object_2.id, 'bogus_key'])
25
+ end
26
+
27
+ should "return an empty array if none of the specified object ids could be found in the database" do
28
+ assert_equal [], RippleObject._t_find_bulk(['bogus_key_1', 'bogus_key_2', 'bogus_key_3'])
29
+ end
30
+
31
+ should "be able to find the first associate of an object" do
32
+ object = RippleObject.create
33
+ target = RippleHasOneTarget.create(:ripple_object_id => object.id)
34
+ assert_equal target, RippleHasOneTarget._t_find_first_by_associate(:ripple_object_id, object.id)
35
+ end
36
+
37
+ should "return nil if the first associate of an object could not be found" do
38
+ assert_nil RippleHasOneTarget._t_find_first_by_associate(:ripple_object_id, 12345)
39
+ end
40
+
41
+ should "be able to find the associates of an object" do
42
+ object_1 = RippleObject.create
43
+ object_2 = RippleObject.create
44
+ target_1 = RippleHasOneTarget.create(:ripple_object => object_1)
45
+ target_2 = RippleHasOneTarget.create(:ripple_object => object_1)
46
+ target_3 = RippleHasOneTarget.create(:ripple_object => object_2)
47
+ assert_set_equal [target_1, target_2], RippleHasOneTarget._t_find_all_by_associate(:ripple_object_id, object_1.id)
48
+ end
49
+
50
+ should "return an empty array if the object has no associates" do
51
+ assert_equal [], RippleHasOneTarget._t_find_all_by_associate(:ripple_object_id, '1234')
52
+ end
53
+
54
+ should "be able to reload an object from the database" do
55
+ target = RippleHasOneTarget.create
56
+ target.ripple_object_id = '101'
57
+ assert_equal '101', target.ripple_object_id
58
+ target._t_reload
59
+ assert_nil target.ripple_object_id
60
+ end
61
+
62
+ should "be able to get the ids of the objects associated with the given object" do
63
+ target_1 = RippleHasManyTarget.create
64
+ target_2 = RippleHasManyTarget.create
65
+ target_3 = RippleHasManyTarget.create
66
+ object = RippleObject.create
67
+ object.ripple_has_many_targets = [target_1, target_2, target_3]
68
+ object.save
69
+
70
+ assert_set_equal [target_1.id, target_2.id, target_3.id], RippleHasManyTarget._t_find_all_ids_by_associate("ripple_object_id", object.id)
71
+ end
72
+
73
+ should "return an empty array when trying to fetch associate ids for an object with no associates" do
74
+ object = RippleObject.create
75
+ assert_equal [], RippleHasManyTarget._t_find_all_ids_by_associate("ripple_object_id", object.id)
76
+ end
77
+
78
+ should "be able to delete a set of objects, issuing their callbacks" do
79
+ object_1 = RippleObject.create
80
+ object_2 = RippleObject.create
81
+ object_3 = RippleObject.create
82
+
83
+ assert RippleObject.bucket.exist?(object_1.id)
84
+ assert RippleObject.bucket.exist?(object_2.id)
85
+ assert RippleObject.bucket.exist?(object_3.id)
86
+ RippleObject._t_delete([object_1.id, object_2.id, object_3.id])
87
+ assert !RippleObject.bucket.exist?(object_1.id)
88
+ assert !RippleObject.bucket.exist?(object_2.id)
89
+ assert !RippleObject.bucket.exist?(object_3.id)
90
+ end
91
+
92
+ should "be able to delete a setup of objects, without issuing their callbacks" do
93
+ object_1 = RippleObject.create
94
+ object_2 = RippleObject.create
95
+ object_3 = RippleObject.create
96
+
97
+ assert RippleObject.bucket.exist?(object_1.id)
98
+ assert RippleObject.bucket.exist?(object_2.id)
99
+ assert RippleObject.bucket.exist?(object_3.id)
100
+ RippleObject._t_delete([object_1.id, object_2.id, object_3.id], false)
101
+ assert !RippleObject.bucket.exist?(object_1.id)
102
+ assert !RippleObject.bucket.exist?(object_2.id)
103
+ assert !RippleObject.bucket.exist?(object_3.id)
104
+ end
105
+
106
+ should "create associate indexes when source object is saved" do
107
+ target_1 = RippleHasManyTarget.create
108
+ target_2 = RippleHasManyTarget.create
109
+ target_3 = RippleHasManyTarget.create
110
+ object = RippleObject.create
111
+ object.ripple_has_many_targets = [target_1, target_2, target_3]
112
+ object.save
113
+
114
+ bucket = ::Ripple.client.bucket('tenacity_test_ripple_has_many_target_ripple_object_id')
115
+ assert_set_equal [target_1.id, target_2.id, target_3.id], bucket.get(object.id).data
116
+ end
117
+
118
+ should "destroy associate indexes when source object is saved" do
119
+ target_1 = RippleHasManyTarget.create
120
+ target_2 = RippleHasManyTarget.create
121
+ target_3 = RippleHasManyTarget.create
122
+ object = RippleObject.create
123
+ object.ripple_has_many_targets = [target_1, target_2, target_3]
124
+ object.save
125
+
126
+ bucket = ::Ripple.client.bucket('tenacity_test_ripple_has_many_target_ripple_object_id')
127
+ assert_set_equal [target_1.id, target_2.id, target_3.id], bucket.get(object.id).data
128
+ target_2.destroy
129
+ assert_set_equal [target_1.id, target_3.id], bucket.get(object.id).data
130
+
131
+ target_1.destroy
132
+ target_3.destroy
133
+ assert_set_equal [], bucket.get(object.id).data
134
+ end
135
+
136
+ should "save the object if it is dirty" do
137
+ object = RippleObject.create
138
+ object.prop = "something"
139
+ assert object._t_save_if_dirty
140
+ end
141
+
142
+ should "not save the object if it is not dirty" do
143
+ object = RippleObject.create
144
+ assert !object._t_save_if_dirty
145
+ end
146
+ end
147
+
148
+ def association
149
+ Tenacity::Association.new(:t_has_many, :ripple_has_many_targets, RippleObject)
28
150
  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
151
  end
139
152
  end
140
153
  end