mongoid_ability 0.3.12 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,49 +1,50 @@
1
- require "test_helper"
1
+ require 'test_helper'
2
2
 
3
3
  module MongoidAbility
4
4
  describe ResolveInheritedLocks do
5
-
6
5
  describe 'when defined on class' do
7
6
  let(:owner) { MyOwner.new }
8
7
  let(:my_subject) { MySubject.new }
9
8
 
10
- before { MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :my_read, outcome: true) ] }
9
+ let(:default_locks) { [MyLock.new(subject_type: MySubject, action: :my_read, outcome: true)] }
11
10
 
12
- # ---------------------------------------------------------------------
13
-
14
11
  it 'returns it' do
15
- ResolveInheritedLocks.call(owner, :my_read, MySubject, nil).must_equal true
16
- ResolveInheritedLocks.call(owner, :my_read, MySubject, my_subject).must_equal true
12
+ MySubject.stub :default_locks, default_locks do
13
+ ResolveInheritedLocks.call(owner, :my_read, MySubject, nil).calculated_outcome.must_equal true
14
+ ResolveInheritedLocks.call(owner, :my_read, MySubject, my_subject).calculated_outcome.must_equal true
15
+ end
17
16
  end
18
17
 
19
- # ---------------------------------------------------------------------
20
-
21
18
  describe 'when defined on one of the inherited owners' do
22
19
  let(:inherited_owner_1) { MyOwner.new }
23
20
  let(:inherited_owner_2) { MyOwner.new }
24
21
  let(:owner) { MyOwner.new(my_roles: [inherited_owner_1, inherited_owner_2]) }
25
22
  let(:my_subject) { MySubject.new }
26
23
 
27
- before { inherited_owner_1.my_locks = [ MyLock.new(action: :my_read, subject_type: MySubject, outcome: false) ] }
24
+ let(:lock) { MyLock.new(action: :my_read, subject_type: MySubject, outcome: false) }
25
+
26
+ before { inherited_owner_1.my_locks = [lock] }
28
27
 
29
28
  it 'returns it' do
30
- ResolveInheritedLocks.call(owner, :my_read, MySubject, nil).must_equal false
31
- ResolveInheritedLocks.call(owner, :my_read, MySubject, my_subject).must_equal false
29
+ MySubject.stub :default_locks, default_locks do
30
+ ResolveInheritedLocks.call(owner, :my_read, MySubject, nil).must_equal lock
31
+ ResolveInheritedLocks.call(owner, :my_read, MySubject, my_subject.id).must_equal lock
32
+ end
32
33
  end
33
34
 
34
- # ---------------------------------------------------------------------
35
-
36
35
  describe 'when defined on user' do
37
- before { owner.my_locks = [ MyLock.new(action: :my_read, subject_type: MySubject, outcome: true) ] }
36
+ let(:lock) { MyLock.new(action: :my_read, subject_type: MySubject, outcome: false) }
37
+
38
+ before { owner.my_locks = [lock] }
38
39
 
39
40
  it 'returns it' do
40
- ResolveInheritedLocks.call(owner, :my_read, MySubject, nil).must_equal true
41
- ResolveInheritedLocks.call(owner, :my_read, MySubject, my_subject).must_equal true
41
+ MySubject.stub :default_locks, default_locks do
42
+ ResolveInheritedLocks.call(owner, :my_read, MySubject, nil).must_equal lock
43
+ ResolveInheritedLocks.call(owner, :my_read, MySubject, my_subject.id).must_equal lock
44
+ end
42
45
  end
43
46
  end
44
-
45
47
  end
46
48
  end
47
-
48
49
  end
49
50
  end
@@ -1,4 +1,4 @@
1
- require "test_helper"
1
+ require 'test_helper'
2
2
 
3
3
  module MongoidAbility
4
4
  describe ResolveOwnerLocks do
@@ -6,45 +6,51 @@ module MongoidAbility
6
6
  let(:my_subject) { MySubject.new }
7
7
 
8
8
  subject { ResolveOwnerLocks.call(owner, :read, MySubject, nil) }
9
- let(:resolver_for_subject_id) { ResolveOwnerLocks.call(owner, :read, MySubject, my_subject) }
10
-
11
- # =====================================================================
12
-
13
- describe '#outcome' do
14
- before do
15
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: false) ]
16
- end
9
+ let(:resolver_for_subject_id) { ResolveOwnerLocks.call(owner, :read, MySubject, my_subject.id) }
10
+ let(:default_locks) { [MyLock.new(subject_type: MySubject, action: :read, outcome: false)] }
17
11
 
12
+ describe '#lock' do
18
13
  describe 'no locks' do
19
- it { subject.must_be_nil }
14
+ it 'must be nil' do
15
+ MySubject.stub :default_locks, default_locks do
16
+ subject.must_be_nil
17
+ end
18
+ end
20
19
  end
21
20
 
22
21
  describe 'id locks' do
23
22
  it 'returns outcome' do
24
- owner.my_locks = [ MyLock.new(action: :read, subject: my_subject, outcome: true) ]
25
- resolver_for_subject_id.must_equal true
23
+ MySubject.stub :default_locks, default_locks do
24
+ owner.my_locks = [MyLock.new(action: :read, subject: my_subject, outcome: true)]
25
+ resolver_for_subject_id.calculated_outcome.must_equal true
26
+ end
26
27
  end
27
28
 
28
29
  it 'prefers negative outcome' do
29
- owner.my_locks = [ MyLock.new(action: :read, subject: my_subject, outcome: true),
30
- MyLock.new(action: :read, subject: my_subject, outcome: false) ]
31
- resolver_for_subject_id.must_equal false
30
+ MySubject.stub :default_locks, default_locks do
31
+ owner.my_locks = [MyLock.new(action: :read, subject: my_subject, outcome: true),
32
+ MyLock.new(action: :read, subject: my_subject, outcome: false)]
33
+ resolver_for_subject_id.calculated_outcome.must_equal false
34
+ end
32
35
  end
33
36
  end
34
37
 
35
38
  describe 'class locks' do
36
39
  it 'returns outcome' do
37
- owner.my_locks = [ MyLock.new(action: :read, subject_type: MySubject, outcome: true) ]
38
- subject.must_equal true
40
+ MySubject.stub :default_locks, default_locks do
41
+ owner.my_locks = [MyLock.new(action: :read, subject_type: MySubject, outcome: true)]
42
+ subject.calculated_outcome.must_equal true
43
+ end
39
44
  end
40
45
 
41
46
  it 'prefers negative outcome' do
42
- owner.my_locks = [ MyLock.new(action: :read, subject_type: MySubject, outcome: true),
43
- MyLock.new(action: :read, subject_type: MySubject, outcome: false) ]
44
- subject.must_equal false
47
+ MySubject.stub :default_locks, default_locks do
48
+ owner.my_locks = [MyLock.new(action: :read, subject_type: MySubject, outcome: true),
49
+ MyLock.new(action: :read, subject_type: MySubject, outcome: false)]
50
+ subject.calculated_outcome.must_equal false
51
+ end
45
52
  end
46
53
  end
47
54
  end
48
-
49
55
  end
50
56
  end
@@ -1,25 +1,23 @@
1
1
  require 'test_helper'
2
2
 
3
3
  module MongoidAbility
4
- describe ResolveLocks do
5
-
4
+ describe Resolver do
6
5
  let(:owner) { MyOwner.new }
7
6
 
8
7
  describe 'errors' do
9
8
  it 'raises NameError for invalid subject_type' do
10
- -> { ResolveLocks.call(owner, :read, 'Foo') }.must_raise NameError
9
+ -> { Resolver.call(owner, :read, 'Foo') }.must_raise NameError
11
10
  end
12
11
 
13
12
  it 'raises StandardError when subject_type does not have default_locks' do
14
- -> { ResolveLocks.call(owner, :read, Object) }.must_raise StandardError
13
+ -> { Resolver.call(owner, :read, Object) }.must_raise StandardError
15
14
  end
16
15
 
17
16
  it 'raises StandardError when subject_type class or its ancestors does not have default_lock' do
18
17
  MySubject.stub(:default_locks, []) do
19
- -> { ResolveLocks.call(owner, :read, MySubject) }.must_raise StandardError
18
+ -> { Resolver.call(owner, :read, MySubject) }.must_raise StandardError
20
19
  end
21
20
  end
22
21
  end
23
-
24
22
  end
25
23
  end
@@ -11,137 +11,136 @@ module MongoidAbility
11
11
  let(:owner) { MyOwner.new(my_roles: [role_1, role_2]) }
12
12
  let(:ability) { Ability.new(owner) }
13
13
 
14
- # =====================================================================
14
+ let(:my_subject_default_locks) { [] }
15
+ let(:my_subject_1_default_locks) { [] }
16
+ let(:my_subject_2_default_locks) { [] }
17
+
18
+ before { my_subject; my_subject1; my_subject2 }
15
19
 
16
20
  describe 'default open locks' do
17
- before do
18
- # NOTE: we might need to use the .default_lock macro in case we propagate down directly
19
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :update, outcome: true) ]
20
- MySubject1.default_locks = []
21
- MySubject2.default_locks = []
22
-
23
- my_subject
24
- my_subject1
25
- my_subject2
26
- end
21
+ # NOTE: we might need to use the .default_lock macro in case we propagate down directly
22
+ let(:my_subject_default_locks) { [MyLock.new(subject_type: MySubject, action: :update, outcome: true)] }
27
23
 
28
24
  it 'propagates from superclass to all subclasses' do
29
- MySubject.accessible_by(ability, :update).to_a.must_include my_subject
30
- MySubject.accessible_by(ability, :update).to_a.must_include my_subject1
31
- MySubject.accessible_by(ability, :update).to_a.must_include my_subject2
32
-
33
- MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject
34
- MySubject1.accessible_by(ability, :update).to_a.must_include my_subject1
35
- MySubject1.accessible_by(ability, :update).to_a.must_include my_subject2
36
-
37
- MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject
38
- MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject1
39
- MySubject2.accessible_by(ability, :update).to_a.must_include my_subject2
25
+ MySubject.stub :default_locks, my_subject_default_locks do
26
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
27
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
28
+ MySubject.accessible_by(ability, :update).to_a.must_include my_subject
29
+ MySubject.accessible_by(ability, :update).to_a.must_include my_subject1
30
+ MySubject.accessible_by(ability, :update).to_a.must_include my_subject2
31
+
32
+ MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject
33
+ MySubject1.accessible_by(ability, :update).to_a.must_include my_subject1
34
+ MySubject1.accessible_by(ability, :update).to_a.must_include my_subject2
35
+
36
+ MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject
37
+ MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject1
38
+ MySubject2.accessible_by(ability, :update).to_a.must_include my_subject2
39
+ end
40
+ end
41
+ end
40
42
  end
41
43
  end
42
44
 
43
45
  describe 'default closed locks' do
44
- before do
45
- # NOTE: we might need to use the .default_lock macro in case we propagate down directly
46
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :update, outcome: false) ]
47
- MySubject1.default_locks = []
48
- MySubject2.default_locks = []
49
-
50
- my_subject
51
- my_subject1
52
- my_subject2
53
- end
46
+ # NOTE: we might need to use the .default_lock macro in case we propagate down directly
47
+ let(:my_subject_default_locks) { [MyLock.new(subject_type: MySubject, action: :update, outcome: false)] }
54
48
 
55
49
  it 'propagates from superclass to all subclasses' do
56
- MySubject.accessible_by(ability, :update).to_a.wont_include my_subject
57
- MySubject.accessible_by(ability, :update).to_a.wont_include my_subject1
58
- MySubject.accessible_by(ability, :update).to_a.wont_include my_subject2
59
-
60
- MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject
61
- MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject1
62
- MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject2
63
-
64
- MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject
65
- MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject1
66
- MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject2
50
+ MySubject.stub :default_locks, my_subject_default_locks do
51
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
52
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
53
+ MySubject.accessible_by(ability, :update).to_a.wont_include my_subject
54
+ MySubject.accessible_by(ability, :update).to_a.wont_include my_subject1
55
+ MySubject.accessible_by(ability, :update).to_a.wont_include my_subject2
56
+
57
+ MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject
58
+ MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject1
59
+ MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject2
60
+
61
+ MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject
62
+ MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject1
63
+ MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject2
64
+ end
65
+ end
66
+ end
67
67
  end
68
68
  end
69
69
 
70
70
  describe 'default combined locks' do
71
- before do
72
- # NOTE: we might need to use the .default_lock macro in case we propagate down directly
73
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :update, outcome: false) ]
74
- MySubject1.default_locks = [ MyLock.new(subject_type: MySubject, action: :update, outcome: true) ]
75
- MySubject2.default_locks = [ MyLock.new(subject_type: MySubject, action: :update, outcome: false) ]
76
-
77
- my_subject
78
- my_subject1
79
- my_subject2
80
- end
71
+ # NOTE: we might need to use the .default_lock macro in case we propagate down directly
72
+ let(:my_subject_default_locks) { [MyLock.new(subject_type: MySubject, action: :update, outcome: false)] }
73
+ let(:my_subject_1_default_locks) { [MyLock.new(subject_type: MySubject, action: :update, outcome: true)] }
74
+ let(:my_subject_2_default_locks) { [MyLock.new(subject_type: MySubject, action: :update, outcome: false)] }
81
75
 
82
76
  it 'propagates from superclass to all subclasses' do
83
- MySubject.accessible_by(ability, :update).to_a.wont_include my_subject
84
- MySubject.accessible_by(ability, :update).to_a.must_include my_subject1
85
- MySubject.accessible_by(ability, :update).to_a.wont_include my_subject2
86
-
87
- MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject
88
- MySubject1.accessible_by(ability, :update).to_a.must_include my_subject1
89
- MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject2
90
-
91
- MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject
92
- MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject1
93
- MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject2
77
+ MySubject.stub :default_locks, my_subject_default_locks do
78
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
79
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
80
+ MySubject.accessible_by(ability, :update).to_a.wont_include my_subject
81
+ MySubject.accessible_by(ability, :update).to_a.must_include my_subject1
82
+ MySubject.accessible_by(ability, :update).to_a.wont_include my_subject2
83
+
84
+ MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject
85
+ MySubject1.accessible_by(ability, :update).to_a.must_include my_subject1
86
+ MySubject1.accessible_by(ability, :update).to_a.wont_include my_subject2
87
+
88
+ MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject
89
+ MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject1
90
+ MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject2
91
+ end
92
+ end
93
+ end
94
94
  end
95
95
  end
96
96
 
97
- # ---------------------------------------------------------------------
98
-
99
97
  describe 'closed id locks' do
100
- let(:role_1) { MyRole.new(my_locks: [ MyLock.new(subject: my_subject, action: :update, outcome: false) ]) }
101
-
102
- before do
103
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :update, outcome: true) ]
104
- MySubject1.default_locks = []
105
- MySubject2.default_locks = []
106
-
107
- my_subject
108
- my_subject1
109
- my_subject2
110
- end
98
+ let(:role_1) { MyRole.new(my_locks: [MyLock.new(subject: my_subject, action: :update, outcome: false)]) }
99
+ let(:my_subject_default_locks) { [MyLock.new(subject_type: MySubject, action: :update, outcome: true)] }
111
100
 
112
101
  it 'applies id locks' do
113
- MySubject.accessible_by(ability, :update).to_a.wont_include my_subject
114
- MySubject.accessible_by(ability, :update).to_a.must_include my_subject1
115
- MySubject.accessible_by(ability, :update).to_a.must_include my_subject2
102
+ MySubject.stub :default_locks, my_subject_default_locks do
103
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
104
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
105
+ MySubject.accessible_by(ability, :update).to_a.wont_include my_subject
106
+ MySubject.accessible_by(ability, :update).to_a.must_include my_subject1
107
+ MySubject.accessible_by(ability, :update).to_a.must_include my_subject2
108
+ end
109
+ end
110
+ end
116
111
  end
117
112
  end
118
113
 
119
114
  describe 'open id locks' do
120
- let(:role_1) { MyRole.new(my_locks: [ MyLock.new(subject: my_subject1, action: :update, outcome: true) ]) }
121
-
122
- before do
123
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :update, outcome: false) ]
124
- MySubject1.default_locks = []
125
- MySubject2.default_locks = []
126
-
127
- my_subject
128
- my_subject1
129
- my_subject2
130
- end
115
+ let(:role_1) { MyRole.new(my_locks: [MyLock.new(subject: my_subject1, action: :update, outcome: true)]) }
116
+ let(:my_subject_default_locks) { [MyLock.new(subject_type: MySubject, action: :update, outcome: false)] }
131
117
 
132
118
  it 'applies id locks' do
133
- MySubject.accessible_by(ability, :update).to_a.wont_include my_subject
134
- MySubject1.accessible_by(ability, :update).to_a.must_include my_subject1
135
- MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject2
119
+ MySubject.stub :default_locks, my_subject_default_locks do
120
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
121
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
122
+ MySubject.accessible_by(ability, :update).to_a.wont_include my_subject
123
+ MySubject1.accessible_by(ability, :update).to_a.must_include my_subject1
124
+ MySubject2.accessible_by(ability, :update).to_a.wont_include my_subject2
125
+ end
126
+ end
127
+ end
136
128
  end
137
129
  end
138
130
 
139
- # =====================================================================
140
-
141
131
  describe 'prefix' do
132
+ let(:prefix) { :subject }
133
+ let(:my_subject_default_locks) { [MyLock.new(subject_type: MySubject, action: :update, outcome: true)] }
134
+
142
135
  it 'allows to pass prefix' do
143
- skip 'not sure how to best test this'
144
- MySubject.accessible_by(ability, :update, prefix: :subject).must_equal 'foo'
136
+ MySubject.stub :default_locks, my_subject_default_locks do
137
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
138
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
139
+ selector = MySubject.accessible_by(ability, :update, prefix: prefix).selector
140
+ selector.must_equal('$and' => [{ '$or' => [{ "#{prefix}_type" => { '$nin' => [] } }, { "#{prefix}_type" => { '$in' => [] }, "#{prefix}_id" => { '$in' => [] } }] }, { "#{prefix}_id" => { '$nin' => [] } }])
141
+ end
142
+ end
143
+ end
145
144
  end
146
145
  end
147
146
  end
@@ -2,48 +2,79 @@ require 'test_helper'
2
2
 
3
3
  module MongoidAbility
4
4
  describe Subject do
5
- describe '.default_lock' do
6
- before do
7
- MySubject.default_locks = []
8
- MySubject1.default_locks = []
9
- MySubject2.default_locks = []
10
-
11
- MySubject.default_lock MyLock, :read, true
12
- MySubject.default_lock MyLock, :update, true
13
- MySubject1.default_lock MyLock1, :update, false
14
- end
5
+ let(:my_subject_default_locks) { [] }
6
+ let(:my_subject_1_default_locks) { [] }
7
+ let(:my_subject_2_default_locks) { [] }
15
8
 
9
+ describe '.default_lock' do
16
10
  it 'stores them' do
17
- MySubject.default_locks.map(&:action).map(&:to_s).sort.must_equal %w(read update)
18
- MySubject1.default_locks.map(&:action).map(&:to_s).sort.must_equal %w(update)
11
+ MySubject.stub :default_locks, my_subject_default_locks do
12
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
13
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
14
+ MySubject.default_lock MyLock, :read, true
15
+ MySubject.default_lock MyLock, :update, true
16
+ MySubject1.default_lock MyLock1, :update, false
17
+
18
+ MySubject.default_locks.map(&:action).map(&:to_s).sort.must_equal %w(read update)
19
+ MySubject1.default_locks.map(&:action).map(&:to_s).sort.must_equal %w(update)
20
+ end
21
+ end
22
+ end
19
23
  end
20
24
  end
21
25
 
22
26
  describe 'prevents conflicts' do
23
- before do
24
- MySubject.default_locks = []
25
- MySubject.default_lock MyLock, :read, false
26
- MySubject.default_lock MyLock1, :read, false
27
-
28
- MySubject1.default_locks = []
29
- MySubject1.default_lock MyLock, :read, true
30
- end
31
-
32
27
  it 'does not allow multiple locks for same action' do
33
- MySubject.default_locks.count { |l| l.action == :read }.must_equal 1
28
+ MySubject.stub :default_locks, my_subject_default_locks do
29
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
30
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
31
+ MySubject.default_lock MyLock1, :read, false
32
+ MySubject1.default_lock MyLock, :read, true
33
+
34
+ MySubject.default_locks.count { |l| l.action == :read }.must_equal 1
35
+ end
36
+ end
37
+ end
34
38
  end
35
39
 
36
40
  it 'replace existing locks with new attributes' do
37
- MySubject.default_locks.detect { |l| l.action == :read }.outcome.must_equal false
41
+ MySubject.stub :default_locks, my_subject_default_locks do
42
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
43
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
44
+ MySubject.default_lock MyLock1, :read, false
45
+ MySubject1.default_lock MyLock, :read, true
46
+
47
+ MySubject.default_locks.detect { |l| l.action == :read }.outcome.must_equal false
48
+ end
49
+ end
50
+ end
38
51
  end
39
52
 
40
53
  it 'replaces existing locks with new one' do
41
- MySubject.default_locks.detect { |l| l.action == :read }.class.must_equal MyLock1
54
+ MySubject.stub :default_locks, my_subject_default_locks do
55
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
56
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
57
+ MySubject.default_lock MyLock1, :read, false
58
+ MySubject1.default_lock MyLock, :read, true
59
+
60
+ MySubject.default_locks.detect { |l| l.action == :read }.class.must_equal MyLock1
61
+ end
62
+ end
63
+ end
42
64
  end
43
65
 
44
66
  it 'replaces superclass locks' do
45
- MySubject1.default_locks.count.must_equal 1
46
- MySubject1.default_locks.detect { |l| l.action == :read }.outcome.must_equal true
67
+ MySubject.stub :default_locks, my_subject_default_locks do
68
+ MySubject1.stub :default_locks, my_subject_1_default_locks do
69
+ MySubject2.stub :default_locks, my_subject_2_default_locks do
70
+ MySubject.default_lock MyLock1, :read, false
71
+ MySubject1.default_lock MyLock, :read, true
72
+
73
+ MySubject1.default_locks.count.must_equal 1
74
+ MySubject1.default_locks.detect { |l| l.action == :read }.outcome.must_equal true
75
+ end
76
+ end
77
+ end
47
78
  end
48
79
  end
49
80