1+ module ForestLiana
2+ class ScopeValidatorTest < ActiveSupport ::TestCase
3+ test 'Request with aggregated condition filters should be allowed if it matches the scope exactly' do
4+ scope_validator = ForestLiana ::ScopeValidator . new ( {
5+ 'aggregator' => 'and' ,
6+ 'conditions' => [
7+ { 'field' => 'name' , 'value' => 'john' , 'operator' => 'equal' } ,
8+ { 'field' => 'price' , 'value' => '2500' , 'operator' => 'equal' }
9+ ]
10+ } , [ ] )
11+
12+ allowed = scope_validator . is_scope_in_request? ( {
13+ user_id : '1' ,
14+ filters : JSON . generate ( {
15+ aggregator : 'and' ,
16+ conditions : [
17+ { field : 'name' , value : 'john' , operator : 'equal' } ,
18+ { field : 'price' , value : '2500' , operator : 'equal' }
19+ ]
20+ } )
21+ } )
22+ assert allowed == true
23+ end
24+
25+ test 'Request with simple condition filter should be allowed if it matches the scope exactly' do
26+ scope_validator = ForestLiana ::ScopeValidator . new ( {
27+ 'aggregator' => 'and' ,
28+ 'conditions' => [
29+ { 'field' => 'field' , 'value' => 'value' , 'operator' => 'equal' }
30+ ]
31+ } , [ ] )
32+ allowed = scope_validator . is_scope_in_request? ( {
33+ user_id : '1' ,
34+ filters : JSON . generate ( {
35+ field : 'field' , value : 'value' , operator : 'equal'
36+ } )
37+ } )
38+ assert allowed == true
39+ end
40+
41+ test 'Request with multiples condition filters should be allowed if it contains the scope ' do
42+ scope_validator = ForestLiana ::ScopeValidator . new ( {
43+ 'aggregator' => 'and' ,
44+ 'conditions' => [
45+ { 'field' => 'name' , 'value' => 'doe' , 'operator' => 'equal' }
46+ ]
47+ } , [ ]
48+ )
49+
50+ allowed = scope_validator . is_scope_in_request? ( {
51+ user_id : '1' ,
52+ filters : JSON . generate ( {
53+ aggregator : 'and' ,
54+ conditions : [
55+ { field : 'name' , value : 'doe' , operator : 'equal' } ,
56+ { field : 'field2' , value : 'value2' , operator : 'equal' }
57+ ]
58+ } )
59+ } )
60+ assert allowed == true
61+ end
62+
63+ test 'Request with dynamic user values should be allowed if it matches the scope exactly' do
64+ scope_validator = ForestLiana ::ScopeValidator . new ( {
65+ 'aggregator' => 'and' ,
66+ 'conditions' => [
67+ { 'field' => 'name' , 'value' => '$currentUser.lastname' , 'operator' => 'equal' }
68+ ] ,
69+ } , {
70+ '1' => { '$currentUser.lastname' => 'john' }
71+ } )
72+
73+ allowed = scope_validator . is_scope_in_request? ( {
74+ user_id : '1' ,
75+ filters : JSON . generate ( {
76+ 'field' => 'name' , 'value' => 'john' , 'operator' => 'equal'
77+ } )
78+ } )
79+ assert allowed == true
80+ end
81+
82+ test 'Request with multiples aggregation and dynamic values should be allowed if it contains the scope' do
83+ scope_validator = ForestLiana ::ScopeValidator . new ( {
84+ 'aggregator' => 'or' ,
85+ 'conditions' => [
86+ { 'field' => 'price' , 'value' => '2500' , 'operator' => 'equal' } ,
87+ { 'field' => 'name' , 'value' => '$currentUser.lastname' , 'operator' => 'equal' }
88+ ]
89+ } , {
90+ '1' => { '$currentUser.lastname' => 'john' }
91+ } )
92+
93+ allowed = scope_validator . is_scope_in_request? ( {
94+ user_id : '1' ,
95+ filters : JSON . generate ( {
96+ aggregator : 'and' ,
97+ conditions : [
98+ { field : 'field' , value : 'value' , operator : 'equal' } ,
99+ {
100+ aggregator : 'or' ,
101+ conditions : [
102+ { field : 'price' , value : '2500' , operator : 'equal' } ,
103+ { field : 'name' , value : 'john' , operator : 'equal' }
104+ ]
105+ }
106+ ]
107+ } )
108+ } )
109+ assert allowed == true
110+ end
111+
112+ test 'Request that does not match the expect scope should not be allowed' do
113+ scope_validator = ForestLiana ::ScopeValidator . new ( {
114+ 'aggregator' => 'and' ,
115+ 'conditions' => [
116+ { 'field' => 'name' , 'value' => 'john' , 'operator' => 'equal' } ,
117+ { 'field' => 'price' , 'value' => '2500' , 'operator' => 'equal' }
118+ ]
119+ } , [ ] )
120+
121+ allowed = scope_validator . is_scope_in_request? ( {
122+ user_id : '1' ,
123+ filters : JSON . generate ( {
124+ aggregator : 'and' ,
125+ conditions : [
126+ { field : 'name' , value : 'definitely_not_john' , operator : 'equal' } ,
127+ { field : 'price' , value : '0' , operator : 'equal' }
128+ ]
129+ } )
130+ } )
131+ assert allowed == false
132+ end
133+
134+ test 'Request that are missing part of the scope should not be allowed' do
135+ scope_validator = ForestLiana ::ScopeValidator . new ( {
136+ 'aggregator' => 'and' ,
137+ 'conditions' => [
138+ { 'field' => 'name' , 'value' => 'john' , 'operator' => 'equal' } ,
139+ { 'field' => 'price' , 'value' => '2500' , 'operator' => 'equal' }
140+ ]
141+ } , [ ] )
142+
143+ allowed = scope_validator . is_scope_in_request? ( {
144+ user_id : '1' ,
145+ filters : JSON . generate ( {
146+ aggregator : 'and' ,
147+ conditions : [
148+ { field : 'name' , value : 'john' , operator : 'equal' } ,
149+ ]
150+ } )
151+ } )
152+ assert allowed == false
153+ end
154+
155+ test 'Request that does not have a top aggregator being "and" should not be allowed' do
156+ scope_validator = ForestLiana ::ScopeValidator . new ( {
157+ 'aggregator' => 'and' ,
158+ 'conditions' => [
159+ { 'field' => 'price' , 'value' => '2500' , 'operator' => 'equal' } ,
160+ { 'field' => 'name' , 'value' => '$currentUser.lastname' , 'operator' => 'equal' }
161+ ]
162+ } , {
163+ '1' => { '$currentUser.lastname' => 'john' }
164+ } )
165+
166+ allowed = scope_validator . is_scope_in_request? ( {
167+ user_id : '1' ,
168+ filters : JSON . generate ( {
169+ aggregator : 'or' ,
170+ conditions : [
171+ { field : 'field' , value : 'value' , operator : 'equal' } ,
172+ {
173+ aggregator : 'and' ,
174+ conditions : [
175+ { field : 'price' , value : '2500' , operator : 'equal' } ,
176+ { field : 'name' , value : 'john' , operator : 'equal' }
177+ ]
178+ }
179+ ]
180+ } )
181+ } )
182+ assert allowed == false
183+ end
184+ end
185+ end
0 commit comments