mongoid_ability 0.3.6 → 0.3.7

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c3966d3f6bc2143789632f8075458b796341c98
4
- data.tar.gz: 6b8f7778d4a847da6616be4441b11b90ba979bb4
3
+ metadata.gz: d30d247467a000a4905761928d401f3a6adbbc10
4
+ data.tar.gz: a14eed2b95bd69392acc82b46d192902fef23a66
5
5
  SHA512:
6
- metadata.gz: 3d9f643e20c1f6d8e0b255f5c2843f63db7836dd8a61d4961582f639b474f3ebb76d2ab595011319b631e1a65219b91e1307c73366f8544d0f66aaf0b016a550
7
- data.tar.gz: 631e86ebe4293354623d1b6f0b8b6f5b146795f5f86330b506e1fe1f3a2455d9b3095f3aa67c0f8ecdd349098e7883db34323f76a7ed7a47bbc001fdc6793543
6
+ metadata.gz: 297e80b5fec91daeb637f9394fdac3021df1ba902b20f743855fc1951e0da7adcd401b8207bb034e46357aba1247c3aad20cefbd28507add1a17f0815d66737e
7
+ data.tar.gz: d8800d4844678c18e62eace9ae607e404fe469986a138fb0b9c3f2625c0986d897f16331b275fbbce266227beb72fce2032e01457ca1c2d9f154035101835890
@@ -7,38 +7,27 @@ module MongoidAbility
7
7
  # =====================================================================
8
8
 
9
9
  def call
10
- return base_class.criteria unless and_conditions.present?
11
10
  base_class.criteria.where(conditions)
12
11
  end
13
12
 
14
13
  def conditions
15
- and_conditions
14
+ { '$and' => [{ '$or' => [closed_types_condition, open_types_and_ids_condition] }, closed_ids_condition] }
16
15
  end
17
16
 
18
17
  private # =============================================================
19
18
 
20
- def and_conditions
21
- return unless conditions = [or_conditions, closed_ids_condition].compact.presence
22
- { '$and' => conditions }
23
- end
24
-
25
- def or_conditions
26
- return unless conditions = [closed_types_condition, open_ids_condition].compact.presence
27
- { '$or' => conditions }
28
- end
29
-
30
19
  def closed_types_condition
31
- return unless values.closed_types.present?
32
20
  { _type: { '$nin' => values.closed_types } }
33
21
  end
34
22
 
35
- def open_ids_condition
36
- return unless values.open_types_and_ids.present?
37
- { _id: { '$in' => values.open_types_and_ids.map(&:id) } }
23
+ def open_types_and_ids_condition
24
+ {
25
+ _type: { '$in' => values.open_types_and_ids.map(&:type) },
26
+ _id: { '$in' => values.open_types_and_ids.map(&:id) }
27
+ }
38
28
  end
39
29
 
40
30
  def closed_ids_condition
41
- return unless values.closed_ids.present?
42
31
  { _id: { '$nin' => values.closed_ids } }
43
32
  end
44
33
 
@@ -1,3 +1,3 @@
1
1
  module MongoidAbility
2
- VERSION = "0.3.6"
2
+ VERSION = "0.3.7"
3
3
  end
@@ -1,4 +1,4 @@
1
- require "test_helper"
1
+ require 'test_helper'
2
2
 
3
3
  module MongoidAbility
4
4
  describe Ability do
@@ -12,7 +12,7 @@ module MongoidAbility
12
12
  describe 'default locks' do
13
13
  before do
14
14
  # NOTE: we might need to use the .default_lock macro in case we propagate down directly
15
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :update, outcome: true) ]
15
+ MySubject.default_locks = [MyLock.new(subject_type: MySubject, action: :update, outcome: true)]
16
16
  MySubject1.default_locks = []
17
17
  MySubject2.default_locks = []
18
18
  end
@@ -26,9 +26,9 @@ module MongoidAbility
26
26
 
27
27
  describe 'when defined for all superclasses' do
28
28
  before do
29
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: false) ]
30
- MySubject1.default_locks = [ MyLock.new(subject_type: MySubject1, action: :read, outcome: true) ]
31
- MySubject2.default_locks = [ MyLock.new(subject_type: MySubject2, action: :read, outcome: false) ]
29
+ MySubject.default_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: false)]
30
+ MySubject1.default_locks = [MyLock.new(subject_type: MySubject1, action: :read, outcome: true)]
31
+ MySubject2.default_locks = [MyLock.new(subject_type: MySubject2, action: :read, outcome: false)]
32
32
  end
33
33
 
34
34
  it 'respects the definitions' do
@@ -40,9 +40,9 @@ module MongoidAbility
40
40
 
41
41
  describe 'when defined for some superclasses' do
42
42
  before do
43
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: false) ]
43
+ MySubject.default_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: false)]
44
44
  MySubject1.default_locks = []
45
- MySubject2.default_locks = [ MyLock.new(subject_type: MySubject2, action: :read, outcome: true) ]
45
+ MySubject2.default_locks = [MyLock.new(subject_type: MySubject2, action: :read, outcome: true)]
46
46
  end
47
47
 
48
48
  it 'propagates default locks to subclasses' do
@@ -57,10 +57,10 @@ module MongoidAbility
57
57
  describe 'user locks' do
58
58
  describe 'when defined for superclass' do
59
59
  before do
60
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: false) ]
60
+ MySubject.default_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: false)]
61
61
  MySubject1.default_locks = []
62
62
  MySubject2.default_locks = []
63
- owner.my_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: true) ]
63
+ owner.my_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: true)]
64
64
  end
65
65
 
66
66
  it 'applies the superclass lock' do
@@ -74,10 +74,10 @@ module MongoidAbility
74
74
  describe 'inherited owner locks' do
75
75
  describe 'when multiple inherited owners' do
76
76
  before do
77
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: false) ]
77
+ MySubject.default_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: false)]
78
78
  owner.my_roles = [
79
- MyRole.new(my_locks: [ MyLock.new(subject_type: MySubject, action: :read, outcome: true) ]),
80
- MyRole.new(my_locks: [ MyLock.new(subject_type: MySubject, action: :read, outcome: false) ])
79
+ MyRole.new(my_locks: [MyLock.new(subject_type: MySubject, action: :read, outcome: true)]),
80
+ MyRole.new(my_locks: [MyLock.new(subject_type: MySubject, action: :read, outcome: false)])
81
81
  ]
82
82
  end
83
83
 
@@ -88,10 +88,10 @@ module MongoidAbility
88
88
 
89
89
  describe 'when defined for superclass' do
90
90
  before do
91
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: false) ]
91
+ MySubject.default_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: false)]
92
92
  MySubject1.default_locks = []
93
93
  MySubject2.default_locks = []
94
- owner.my_roles = [ MyRole.new(my_locks: [ MyLock.new(subject_type: MySubject, action: :read, outcome: true) ]) ]
94
+ owner.my_roles = [MyRole.new(my_locks: [MyLock.new(subject_type: MySubject, action: :read, outcome: true)])]
95
95
  end
96
96
 
97
97
  it 'applies the superclass lock' do
@@ -105,9 +105,9 @@ module MongoidAbility
105
105
  describe 'combined locks' do
106
106
  describe 'user and role locks' do
107
107
  before do
108
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: false) ]
109
- owner.my_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: false) ]
110
- owner.my_roles = [ MyRole.new(my_locks: [ MyLock.new(subject_type: MySubject, action: :read, outcome: true) ]) ]
108
+ MySubject.default_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: false)]
109
+ owner.my_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: false)]
110
+ owner.my_roles = [MyRole.new(my_locks: [MyLock.new(subject_type: MySubject, action: :read, outcome: true)])]
111
111
  end
112
112
 
113
113
  it 'prefers user locks' do
@@ -117,8 +117,8 @@ module MongoidAbility
117
117
 
118
118
  describe 'roles and default locks' do
119
119
  before do
120
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: false) ]
121
- owner.my_roles = [ MyRole.new(my_locks: [ MyLock.new(subject_type: MySubject, action: :read, outcome: true) ]) ]
120
+ MySubject.default_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: false)]
121
+ owner.my_roles = [MyRole.new(my_locks: [MyLock.new(subject_type: MySubject, action: :read, outcome: true)])]
122
122
  end
123
123
 
124
124
  it 'prefers role locks' do
@@ -126,6 +126,5 @@ module MongoidAbility
126
126
  end
127
127
  end
128
128
  end
129
-
130
129
  end
131
130
  end
@@ -9,7 +9,7 @@ module MongoidAbility
9
9
  let(:options) { Hash.new }
10
10
 
11
11
  before do
12
- MySubject.default_locks = [ MyLock.new(subject_type: MySubject, action: :read, outcome: true) ]
12
+ MySubject.default_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: true)]
13
13
  end
14
14
 
15
15
  subject { AccessibleQueryBuilder.call(base_class, ability, action, options) }
@@ -17,5 +17,56 @@ module MongoidAbility
17
17
  it 'returns Mongoid::Criteria' do
18
18
  subject.must_be_kind_of Mongoid::Criteria
19
19
  end
20
+
21
+ # ---------------------------------------------------------------------
22
+
23
+ describe 'closed_types' do
24
+ let(:my_subject) { MySubject.create! }
25
+ let(:my_subject_1) { MySubject1.create! }
26
+
27
+ before do
28
+ my_subject; my_subject_1
29
+ owner.my_locks = [MyLock.new(subject_type: MySubject, action: :read, outcome: false)]
30
+ end
31
+
32
+ it 'does not return subject with that id' do
33
+ MySubject.accessible_by(ability, :read).wont_include my_subject
34
+ MySubject.accessible_by(ability, :read).wont_include my_subject_1
35
+ MySubject1.accessible_by(ability, :read).wont_include my_subject_1
36
+ end
37
+ end
38
+
39
+ describe 'closed_ids' do
40
+ let(:my_subject_a) { MySubject.create! }
41
+ let(:my_subject_b) { MySubject.create! }
42
+
43
+ before do
44
+ my_subject_a; my_subject_b
45
+ owner.my_locks = [MyLock.new(subject: my_subject_a, action: :read, outcome: false)]
46
+ end
47
+
48
+ it 'does not return subject with that id' do
49
+ MySubject.accessible_by(ability, :read).wont_include my_subject_a
50
+ MySubject.accessible_by(ability, :read).must_include my_subject_b
51
+ end
52
+ end
53
+
54
+ describe 'closed_types & open_ids' do
55
+ let(:my_subject) { MySubject.create! }
56
+ let(:my_subject_1) { MySubject1.create! }
57
+
58
+ before do
59
+ owner.my_locks = [
60
+ MyLock.new(subject_type: MySubject, action: :read, outcome: false),
61
+ MyLock.new(subject: my_subject, action: :read, outcome: true),
62
+ MyLock.new(subject: my_subject_1, action: :read, outcome: true)
63
+ ]
64
+ end
65
+
66
+ it 'does not return subject with that id' do
67
+ MySubject.accessible_by(ability, :read).must_include my_subject
68
+ MySubject.accessible_by(ability, :read).must_include my_subject_1
69
+ end
70
+ end
20
71
  end
21
72
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_ability
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomáš Celizna
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-01 00:00:00.000000000 Z
11
+ date: 2016-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cancancan