@@ -14,18 +14,36 @@ describe("compile-api", async () => {
14
14
# scope: document
15
15
# custom:
16
16
# unknowns: [input.fruits]
17
+ # mask_rule: data.filters.mask
17
18
include if input.fruits.colour in input.fav_colours
18
19
include if {
19
20
not input.fav_colours
20
21
endswith(input.fruits.name, "apple")
21
22
}
23
+
24
+ mask.fruits.owner.replace.value := "***"
22
25
` ,
23
26
filters_sans_metadata : `package filters_no_md
24
27
include if input.fruits.colour in input.fav_colours
25
28
include if {
26
29
not input.fav_colours
27
30
endswith(input.fruits.name, "apple")
28
31
}
32
+ ` ,
33
+ filters_extra_masks : `package filters_extra_masks
34
+ # METADATA
35
+ # scope: document
36
+ # custom:
37
+ # unknowns: [input.fruits]
38
+ # mask_rule: data.filters_extra_masks.mask
39
+ include if input.fruits.colour in input.fav_colours
40
+ include if {
41
+ not input.fav_colours
42
+ endswith(input.fruits.name, "apple")
43
+ }
44
+
45
+ mask.fruits.price.replace.value := 0
46
+ mask.owner.phone.replace.value := "000-000"
29
47
` ,
30
48
} ;
31
49
@@ -45,7 +63,7 @@ include if {
45
63
46
64
before ( async ( ) => {
47
65
const opa = await prepareOPA (
48
- "ghcr.io/styrainc/enterprise-opa:1.37.0 " ,
66
+ "ghcr.io/styrainc/enterprise-opa:edge " ,
49
67
policies ,
50
68
) ;
51
69
container = opa . container ;
@@ -63,7 +81,9 @@ include if {
63
81
} ,
64
82
) ;
65
83
const { query, masks } = res as Filters ;
66
- assert . equal ( masks , undefined ) ;
84
+ assert . deepStrictEqual ( masks , {
85
+ fruits : { owner : { replace : { value : "***" } } } ,
86
+ } ) ;
67
87
assert . equal ( query , "WHERE fruits.colour IN (E'red', E'green')" ) ;
68
88
} ) ;
69
89
@@ -76,7 +96,9 @@ include if {
76
96
} ,
77
97
) ;
78
98
const { query, masks } = res as Filters ;
79
- assert . equal ( masks , undefined ) ;
99
+ assert . deepStrictEqual ( masks , {
100
+ fruits : { owner : { replace : { value : "***" } } } ,
101
+ } ) ;
80
102
assert . equal ( query , "WHERE fruits.name LIKE E'%apple'" ) ;
81
103
} ) ;
82
104
@@ -106,7 +128,9 @@ include if {
106
128
} ,
107
129
) ;
108
130
const { query, masks } = res as Filters ;
109
- assert . equal ( masks , undefined ) ;
131
+ assert . deepStrictEqual ( masks , {
132
+ fruits : { owner : { replace : { value : "***" } } } ,
133
+ } ) ;
110
134
assert . equal ( query , "WHERE F.C IN (E'red', E'green')" ) ;
111
135
} ) ;
112
136
@@ -122,8 +146,10 @@ include if {
122
146
} ,
123
147
) ;
124
148
const { query, masks, mask } = res as Filters & PrismaMask ;
125
- assert . equal ( masks , undefined ) ;
126
149
assert . notEqual ( mask , undefined ) ;
150
+ assert . deepStrictEqual ( masks , {
151
+ fruits : { owner : { replace : { value : "***" } } } ,
152
+ } ) ;
127
153
assert . deepEqual ( query , {
128
154
colour : {
129
155
in : [ "red" , "green" ] ,
@@ -146,7 +172,9 @@ include if {
146
172
} ,
147
173
) ;
148
174
const { query, masks, mask } = res as Filters & PrismaMask ;
149
- assert . equal ( masks , undefined ) ;
175
+ assert . deepStrictEqual ( masks , {
176
+ fruits : { owner : { replace : { value : "***" } } } ,
177
+ } ) ;
150
178
assert . notEqual ( mask , undefined ) ;
151
179
assert . deepEqual ( query , {
152
180
colour : {
@@ -162,14 +190,48 @@ include if {
162
190
"fruits" ,
163
191
) ;
164
192
const { query, masks, mask } = res as Filters & PrismaMask ;
165
- assert . equal ( masks , undefined ) ;
193
+ assert . deepStrictEqual ( masks , {
194
+ fruits : { owner : { replace : { value : "***" } } } ,
195
+ } ) ;
166
196
assert . notEqual ( mask , undefined ) ;
167
197
assert . deepEqual ( query , {
168
198
colour : {
169
199
in : [ "red" , "green" ] ,
170
200
} ,
171
201
} ) ;
172
202
} ) ;
203
+
204
+ it ( "returns ucast-prisma and supports direct and related masks" , async ( ) => {
205
+ const res = await new OPAClient ( serverURL ) . getFilters (
206
+ "filters_extra_masks/include" ,
207
+ { fav_colours : [ "red" , "green" ] } ,
208
+ "fruits" ,
209
+ ) ;
210
+ const { masks, mask } = res as Filters & PrismaMask ;
211
+ assert . deepStrictEqual ( masks , {
212
+ fruits : { price : { replace : { value : 0 } } } ,
213
+ owner : { phone : { replace : { value : "000-000" } } } ,
214
+ } ) ;
215
+
216
+ const fruit = {
217
+ id : 1 ,
218
+ name : "Apple" ,
219
+ colour : "red" ,
220
+ price : 100 ,
221
+ owner : {
222
+ name : "Jane" ,
223
+ phone : "123" ,
224
+ } ,
225
+ } ;
226
+ assert . deepEqual (
227
+ {
228
+ ...fruit ,
229
+ price : 0 ,
230
+ owner : { ...fruit . owner , phone : "000-000" } ,
231
+ } ,
232
+ mask ( fruit ) ,
233
+ ) ;
234
+ } ) ;
173
235
} ) ;
174
236
175
237
describe ( "multi-target" , ( ) => {
@@ -184,6 +246,9 @@ include if {
184
246
assert . deepStrictEqual ( res , {
185
247
postgresql : {
186
248
query : "WHERE fruits.colour IN (E'red', E'green')" ,
249
+ masks : {
250
+ fruits : { owner : { replace : { value : "***" } } } ,
251
+ } ,
187
252
} ,
188
253
ucast : {
189
254
query : {
@@ -192,6 +257,9 @@ include if {
192
257
type : "field" ,
193
258
value : [ "red" , "green" ] ,
194
259
} ,
260
+ masks : {
261
+ fruits : { owner : { replace : { value : "***" } } } ,
262
+ } ,
195
263
} ,
196
264
} ) ;
197
265
} ) ;
@@ -215,9 +283,15 @@ include if {
215
283
assert . deepStrictEqual ( res , {
216
284
postgresql : {
217
285
query : "WHERE fruits_pg.colour_pg IN (E'red', E'green')" ,
286
+ masks : {
287
+ fruits : { owner : { replace : { value : "***" } } } ,
288
+ } ,
218
289
} ,
219
290
mysql : {
220
291
query : "WHERE fruits_mysql.colour_mysql IN ('red', 'green')" ,
292
+ masks : {
293
+ fruits : { owner : { replace : { value : "***" } } } ,
294
+ } ,
221
295
} ,
222
296
} ) ;
223
297
} ) ;
@@ -249,6 +323,9 @@ include if {
249
323
const result = res ?. value ?. compileResultSQL ?. result ;
250
324
assert . deepEqual ( result , {
251
325
query : "WHERE fruits.colour IN (E'red', E'green')" ,
326
+ masks : {
327
+ fruits : { owner : { replace : { value : "***" } } } ,
328
+ } ,
252
329
} ) ;
253
330
} ) ;
254
331
} ) ;
0 commit comments