@usertour/helpers 0.0.29 → 0.0.30
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.
- package/dist/__tests__/attribute.test.cjs +505 -67
- package/dist/__tests__/attribute.test.js +495 -60
- package/dist/__tests__/condition.test.cjs +15 -12
- package/dist/__tests__/condition.test.js +9 -5
- package/dist/{chunk-PBZSPV5R.js → chunk-P46FJFKP.js} +20 -10
- package/dist/{chunk-E2IJQFKH.js → chunk-RVCKVUQF.js} +2 -6
- package/dist/conditions/attribute.cjs +16 -9
- package/dist/conditions/attribute.d.cts +5 -7
- package/dist/conditions/attribute.d.ts +5 -7
- package/dist/conditions/attribute.js +1 -1
- package/dist/conditions/condition.cjs +13 -10
- package/dist/conditions/condition.js +2 -2
- package/dist/conditions/index.cjs +13 -10
- package/dist/conditions/index.js +2 -2
- package/dist/index.cjs +13 -10
- package/dist/index.js +2 -2
- package/package.json +2 -2
|
@@ -1,40 +1,76 @@
|
|
|
1
1
|
import {
|
|
2
|
+
evaluateAttributeCondition,
|
|
2
3
|
evaluateFilterConditions
|
|
3
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-P46FJFKP.js";
|
|
4
5
|
import "../chunk-XEO3YXBM.js";
|
|
5
6
|
|
|
6
7
|
// src/__tests__/attribute.test.ts
|
|
7
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
BizAttributeTypes,
|
|
10
|
+
AttributeBizTypes
|
|
11
|
+
} from "@usertour/types";
|
|
8
12
|
var testAttributes = [
|
|
9
13
|
{
|
|
10
14
|
id: "email-attr",
|
|
11
15
|
codeName: "email",
|
|
12
|
-
dataType: BizAttributeTypes.String
|
|
16
|
+
dataType: BizAttributeTypes.String,
|
|
17
|
+
bizType: AttributeBizTypes.User
|
|
13
18
|
},
|
|
14
19
|
{
|
|
15
20
|
id: "age-attr",
|
|
16
21
|
codeName: "age",
|
|
17
|
-
dataType: BizAttributeTypes.Number
|
|
22
|
+
dataType: BizAttributeTypes.Number,
|
|
23
|
+
bizType: AttributeBizTypes.User
|
|
18
24
|
},
|
|
19
25
|
{
|
|
20
26
|
id: "isPremium-attr",
|
|
21
27
|
codeName: "isPremium",
|
|
22
|
-
dataType: BizAttributeTypes.Boolean
|
|
28
|
+
dataType: BizAttributeTypes.Boolean,
|
|
29
|
+
bizType: AttributeBizTypes.User
|
|
23
30
|
},
|
|
24
31
|
{
|
|
25
32
|
id: "roles-attr",
|
|
26
33
|
codeName: "roles",
|
|
27
|
-
dataType: BizAttributeTypes.List
|
|
34
|
+
dataType: BizAttributeTypes.List,
|
|
35
|
+
bizType: AttributeBizTypes.User
|
|
28
36
|
},
|
|
29
37
|
{
|
|
30
38
|
id: "signUpDate-attr",
|
|
31
39
|
codeName: "signUpDate",
|
|
32
|
-
dataType: BizAttributeTypes.DateTime
|
|
40
|
+
dataType: BizAttributeTypes.DateTime,
|
|
41
|
+
bizType: AttributeBizTypes.User
|
|
33
42
|
},
|
|
34
43
|
{
|
|
35
44
|
id: "score-attr",
|
|
36
45
|
codeName: "score",
|
|
37
|
-
dataType: BizAttributeTypes.Number
|
|
46
|
+
dataType: BizAttributeTypes.Number,
|
|
47
|
+
bizType: AttributeBizTypes.User
|
|
48
|
+
},
|
|
49
|
+
// Company attributes
|
|
50
|
+
{
|
|
51
|
+
id: "company-name-attr",
|
|
52
|
+
codeName: "companyName",
|
|
53
|
+
dataType: BizAttributeTypes.String,
|
|
54
|
+
bizType: AttributeBizTypes.Company
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "company-size-attr",
|
|
58
|
+
codeName: "companySize",
|
|
59
|
+
dataType: BizAttributeTypes.Number,
|
|
60
|
+
bizType: AttributeBizTypes.Company
|
|
61
|
+
},
|
|
62
|
+
// Membership attributes
|
|
63
|
+
{
|
|
64
|
+
id: "membership-level-attr",
|
|
65
|
+
codeName: "membershipLevel",
|
|
66
|
+
dataType: BizAttributeTypes.String,
|
|
67
|
+
bizType: AttributeBizTypes.Membership
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: "membership-duration-attr",
|
|
71
|
+
codeName: "membershipDuration",
|
|
72
|
+
dataType: BizAttributeTypes.Number,
|
|
73
|
+
bizType: AttributeBizTypes.Membership
|
|
38
74
|
}
|
|
39
75
|
];
|
|
40
76
|
var testUserAttributes = {
|
|
@@ -45,6 +81,20 @@ var testUserAttributes = {
|
|
|
45
81
|
signUpDate: "2024-01-15T10:30:00Z",
|
|
46
82
|
score: 85.5
|
|
47
83
|
};
|
|
84
|
+
var testCompanyAttributes = {
|
|
85
|
+
companyName: "Example Corp",
|
|
86
|
+
companySize: 500
|
|
87
|
+
};
|
|
88
|
+
var testMembershipAttributes = {
|
|
89
|
+
membershipLevel: "premium",
|
|
90
|
+
membershipDuration: 12
|
|
91
|
+
};
|
|
92
|
+
var defaultOptions = {
|
|
93
|
+
attributes: testAttributes,
|
|
94
|
+
userAttributes: testUserAttributes,
|
|
95
|
+
companyAttributes: testCompanyAttributes,
|
|
96
|
+
membershipAttributes: testMembershipAttributes
|
|
97
|
+
};
|
|
48
98
|
describe("Attribute Filter - Complete Test Suite", () => {
|
|
49
99
|
describe("String conditions (8 cases)", () => {
|
|
50
100
|
test('should evaluate "is" condition correctly', () => {
|
|
@@ -60,7 +110,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
60
110
|
}
|
|
61
111
|
}
|
|
62
112
|
];
|
|
63
|
-
expect(evaluateFilterConditions(condition,
|
|
113
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
64
114
|
});
|
|
65
115
|
test('should evaluate "not" condition correctly', () => {
|
|
66
116
|
const condition = [
|
|
@@ -75,7 +125,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
75
125
|
}
|
|
76
126
|
}
|
|
77
127
|
];
|
|
78
|
-
expect(evaluateFilterConditions(condition,
|
|
128
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
79
129
|
});
|
|
80
130
|
test('should evaluate "contains" condition correctly', () => {
|
|
81
131
|
const condition = [
|
|
@@ -90,7 +140,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
90
140
|
}
|
|
91
141
|
}
|
|
92
142
|
];
|
|
93
|
-
expect(evaluateFilterConditions(condition,
|
|
143
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
94
144
|
});
|
|
95
145
|
test('should evaluate "notContain" condition correctly', () => {
|
|
96
146
|
const condition = [
|
|
@@ -105,7 +155,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
105
155
|
}
|
|
106
156
|
}
|
|
107
157
|
];
|
|
108
|
-
expect(evaluateFilterConditions(condition,
|
|
158
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
109
159
|
});
|
|
110
160
|
test('should evaluate "startsWith" condition correctly', () => {
|
|
111
161
|
const condition = [
|
|
@@ -120,7 +170,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
120
170
|
}
|
|
121
171
|
}
|
|
122
172
|
];
|
|
123
|
-
expect(evaluateFilterConditions(condition,
|
|
173
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
124
174
|
});
|
|
125
175
|
test('should evaluate "endsWith" condition correctly', () => {
|
|
126
176
|
const condition = [
|
|
@@ -135,7 +185,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
135
185
|
}
|
|
136
186
|
}
|
|
137
187
|
];
|
|
138
|
-
expect(evaluateFilterConditions(condition,
|
|
188
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
139
189
|
});
|
|
140
190
|
test('should evaluate "empty" condition correctly', () => {
|
|
141
191
|
const condition = [
|
|
@@ -149,7 +199,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
149
199
|
}
|
|
150
200
|
}
|
|
151
201
|
];
|
|
152
|
-
expect(evaluateFilterConditions(condition,
|
|
202
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
153
203
|
});
|
|
154
204
|
test('should evaluate "any" condition correctly', () => {
|
|
155
205
|
const condition = [
|
|
@@ -163,7 +213,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
163
213
|
}
|
|
164
214
|
}
|
|
165
215
|
];
|
|
166
|
-
expect(evaluateFilterConditions(condition,
|
|
216
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
167
217
|
});
|
|
168
218
|
});
|
|
169
219
|
describe("Number conditions (9 cases)", () => {
|
|
@@ -180,7 +230,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
180
230
|
}
|
|
181
231
|
}
|
|
182
232
|
];
|
|
183
|
-
expect(evaluateFilterConditions(condition,
|
|
233
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
184
234
|
});
|
|
185
235
|
test('should evaluate "not" condition correctly', () => {
|
|
186
236
|
const condition = [
|
|
@@ -195,7 +245,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
195
245
|
}
|
|
196
246
|
}
|
|
197
247
|
];
|
|
198
|
-
expect(evaluateFilterConditions(condition,
|
|
248
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
199
249
|
});
|
|
200
250
|
test('should evaluate "isLessThan" condition correctly', () => {
|
|
201
251
|
const condition = [
|
|
@@ -210,7 +260,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
210
260
|
}
|
|
211
261
|
}
|
|
212
262
|
];
|
|
213
|
-
expect(evaluateFilterConditions(condition,
|
|
263
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
214
264
|
});
|
|
215
265
|
test('should evaluate "isLessThanOrEqualTo" condition correctly', () => {
|
|
216
266
|
const condition = [
|
|
@@ -225,7 +275,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
225
275
|
}
|
|
226
276
|
}
|
|
227
277
|
];
|
|
228
|
-
expect(evaluateFilterConditions(condition,
|
|
278
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
229
279
|
});
|
|
230
280
|
test('should evaluate "isGreaterThan" condition correctly', () => {
|
|
231
281
|
const condition = [
|
|
@@ -240,7 +290,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
240
290
|
}
|
|
241
291
|
}
|
|
242
292
|
];
|
|
243
|
-
expect(evaluateFilterConditions(condition,
|
|
293
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
244
294
|
});
|
|
245
295
|
test('should evaluate "isGreaterThanOrEqualTo" condition correctly', () => {
|
|
246
296
|
const condition = [
|
|
@@ -255,7 +305,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
255
305
|
}
|
|
256
306
|
}
|
|
257
307
|
];
|
|
258
|
-
expect(evaluateFilterConditions(condition,
|
|
308
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
259
309
|
});
|
|
260
310
|
test('should evaluate "between" condition correctly', () => {
|
|
261
311
|
const condition = [
|
|
@@ -271,7 +321,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
271
321
|
}
|
|
272
322
|
}
|
|
273
323
|
];
|
|
274
|
-
expect(evaluateFilterConditions(condition,
|
|
324
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
275
325
|
});
|
|
276
326
|
test('should evaluate "empty" condition correctly', () => {
|
|
277
327
|
const condition = [
|
|
@@ -285,7 +335,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
285
335
|
}
|
|
286
336
|
}
|
|
287
337
|
];
|
|
288
|
-
expect(evaluateFilterConditions(condition,
|
|
338
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
289
339
|
});
|
|
290
340
|
test('should evaluate "any" condition correctly', () => {
|
|
291
341
|
const condition = [
|
|
@@ -299,7 +349,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
299
349
|
}
|
|
300
350
|
}
|
|
301
351
|
];
|
|
302
|
-
expect(evaluateFilterConditions(condition,
|
|
352
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
303
353
|
});
|
|
304
354
|
});
|
|
305
355
|
describe("Boolean conditions (4 cases)", () => {
|
|
@@ -315,7 +365,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
315
365
|
}
|
|
316
366
|
}
|
|
317
367
|
];
|
|
318
|
-
expect(evaluateFilterConditions(condition,
|
|
368
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
319
369
|
});
|
|
320
370
|
test('should evaluate "false" condition correctly', () => {
|
|
321
371
|
const condition = [
|
|
@@ -329,7 +379,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
329
379
|
}
|
|
330
380
|
}
|
|
331
381
|
];
|
|
332
|
-
expect(evaluateFilterConditions(condition,
|
|
382
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
333
383
|
});
|
|
334
384
|
test('should evaluate "empty" condition correctly', () => {
|
|
335
385
|
const condition = [
|
|
@@ -343,7 +393,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
343
393
|
}
|
|
344
394
|
}
|
|
345
395
|
];
|
|
346
|
-
expect(evaluateFilterConditions(condition,
|
|
396
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
347
397
|
});
|
|
348
398
|
test('should evaluate "any" condition correctly', () => {
|
|
349
399
|
const condition = [
|
|
@@ -357,7 +407,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
357
407
|
}
|
|
358
408
|
}
|
|
359
409
|
];
|
|
360
|
-
expect(evaluateFilterConditions(condition,
|
|
410
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
361
411
|
});
|
|
362
412
|
});
|
|
363
413
|
describe("List conditions (6 cases)", () => {
|
|
@@ -374,7 +424,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
374
424
|
}
|
|
375
425
|
}
|
|
376
426
|
];
|
|
377
|
-
expect(evaluateFilterConditions(condition,
|
|
427
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
378
428
|
});
|
|
379
429
|
test('should evaluate "includesAll" condition correctly', () => {
|
|
380
430
|
const condition = [
|
|
@@ -389,7 +439,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
389
439
|
}
|
|
390
440
|
}
|
|
391
441
|
];
|
|
392
|
-
expect(evaluateFilterConditions(condition,
|
|
442
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
393
443
|
});
|
|
394
444
|
test('should evaluate "notIncludesAtLeastOne" condition correctly', () => {
|
|
395
445
|
const condition = [
|
|
@@ -404,7 +454,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
404
454
|
}
|
|
405
455
|
}
|
|
406
456
|
];
|
|
407
|
-
expect(evaluateFilterConditions(condition,
|
|
457
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
408
458
|
});
|
|
409
459
|
test('should evaluate "notIncludesAll" condition correctly', () => {
|
|
410
460
|
const condition = [
|
|
@@ -419,7 +469,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
419
469
|
}
|
|
420
470
|
}
|
|
421
471
|
];
|
|
422
|
-
expect(evaluateFilterConditions(condition,
|
|
472
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
423
473
|
});
|
|
424
474
|
test('should evaluate "empty" condition correctly', () => {
|
|
425
475
|
const condition = [
|
|
@@ -433,7 +483,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
433
483
|
}
|
|
434
484
|
}
|
|
435
485
|
];
|
|
436
|
-
expect(evaluateFilterConditions(condition,
|
|
486
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
437
487
|
});
|
|
438
488
|
test('should evaluate "any" condition correctly', () => {
|
|
439
489
|
const condition = [
|
|
@@ -447,7 +497,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
447
497
|
}
|
|
448
498
|
}
|
|
449
499
|
];
|
|
450
|
-
expect(evaluateFilterConditions(condition,
|
|
500
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
451
501
|
});
|
|
452
502
|
});
|
|
453
503
|
describe("DateTime conditions (8 cases)", () => {
|
|
@@ -459,13 +509,13 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
459
509
|
operators: "and",
|
|
460
510
|
data: {
|
|
461
511
|
logic: "lessThan",
|
|
462
|
-
value:
|
|
463
|
-
//
|
|
512
|
+
value: 30,
|
|
513
|
+
// Check if signUpDate is within the last 30 days (it's not, so should be false)
|
|
464
514
|
attrId: "signUpDate-attr"
|
|
465
515
|
}
|
|
466
516
|
}
|
|
467
517
|
];
|
|
468
|
-
expect(evaluateFilterConditions(condition,
|
|
518
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
469
519
|
});
|
|
470
520
|
test('should evaluate "exactly" condition correctly', () => {
|
|
471
521
|
const condition = [
|
|
@@ -481,7 +531,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
481
531
|
}
|
|
482
532
|
}
|
|
483
533
|
];
|
|
484
|
-
expect(evaluateFilterConditions(condition,
|
|
534
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
485
535
|
});
|
|
486
536
|
test('should evaluate "moreThan" condition correctly', () => {
|
|
487
537
|
const condition = [
|
|
@@ -497,7 +547,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
497
547
|
}
|
|
498
548
|
}
|
|
499
549
|
];
|
|
500
|
-
expect(evaluateFilterConditions(condition,
|
|
550
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
501
551
|
});
|
|
502
552
|
test('should evaluate "before" condition correctly', () => {
|
|
503
553
|
const condition = [
|
|
@@ -512,7 +562,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
512
562
|
}
|
|
513
563
|
}
|
|
514
564
|
];
|
|
515
|
-
expect(evaluateFilterConditions(condition,
|
|
565
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
516
566
|
});
|
|
517
567
|
test('should evaluate "on" condition correctly', () => {
|
|
518
568
|
const condition = [
|
|
@@ -527,7 +577,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
527
577
|
}
|
|
528
578
|
}
|
|
529
579
|
];
|
|
530
|
-
expect(evaluateFilterConditions(condition,
|
|
580
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
531
581
|
});
|
|
532
582
|
test('should evaluate "after" condition correctly', () => {
|
|
533
583
|
const condition = [
|
|
@@ -542,7 +592,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
542
592
|
}
|
|
543
593
|
}
|
|
544
594
|
];
|
|
545
|
-
expect(evaluateFilterConditions(condition,
|
|
595
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
546
596
|
});
|
|
547
597
|
test('should evaluate "empty" condition correctly', () => {
|
|
548
598
|
const condition = [
|
|
@@ -556,7 +606,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
556
606
|
}
|
|
557
607
|
}
|
|
558
608
|
];
|
|
559
|
-
expect(evaluateFilterConditions(condition,
|
|
609
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
560
610
|
});
|
|
561
611
|
test('should evaluate "any" condition correctly', () => {
|
|
562
612
|
const condition = [
|
|
@@ -570,7 +620,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
570
620
|
}
|
|
571
621
|
}
|
|
572
622
|
];
|
|
573
|
-
expect(evaluateFilterConditions(condition,
|
|
623
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
574
624
|
});
|
|
575
625
|
});
|
|
576
626
|
describe("Complex conditions with AND/OR logic", () => {
|
|
@@ -605,7 +655,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
605
655
|
]
|
|
606
656
|
}
|
|
607
657
|
];
|
|
608
|
-
expect(evaluateFilterConditions(condition,
|
|
658
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
609
659
|
});
|
|
610
660
|
test("should evaluate OR condition correctly", () => {
|
|
611
661
|
const condition = [
|
|
@@ -638,7 +688,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
638
688
|
]
|
|
639
689
|
}
|
|
640
690
|
];
|
|
641
|
-
expect(evaluateFilterConditions(condition,
|
|
691
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
642
692
|
});
|
|
643
693
|
test("should evaluate mixed AND/OR condition correctly", () => {
|
|
644
694
|
const condition = [
|
|
@@ -689,15 +739,15 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
689
739
|
]
|
|
690
740
|
}
|
|
691
741
|
];
|
|
692
|
-
expect(evaluateFilterConditions(condition,
|
|
742
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
693
743
|
});
|
|
694
744
|
});
|
|
695
745
|
describe("Edge cases and error handling", () => {
|
|
696
746
|
test("should handle empty conditions array", () => {
|
|
697
|
-
expect(evaluateFilterConditions([],
|
|
747
|
+
expect(evaluateFilterConditions([], defaultOptions)).toBe(true);
|
|
698
748
|
});
|
|
699
749
|
test("should handle null/undefined conditions", () => {
|
|
700
|
-
expect(evaluateFilterConditions(null,
|
|
750
|
+
expect(evaluateFilterConditions(null, defaultOptions)).toBe(true);
|
|
701
751
|
});
|
|
702
752
|
test("should handle missing attribute", () => {
|
|
703
753
|
const condition = [
|
|
@@ -712,7 +762,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
712
762
|
}
|
|
713
763
|
}
|
|
714
764
|
];
|
|
715
|
-
expect(evaluateFilterConditions(condition,
|
|
765
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
716
766
|
});
|
|
717
767
|
test("should handle missing user attribute value", () => {
|
|
718
768
|
const userAttributesWithoutEmail = {
|
|
@@ -731,17 +781,21 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
731
781
|
}
|
|
732
782
|
}
|
|
733
783
|
];
|
|
734
|
-
expect(
|
|
735
|
-
|
|
736
|
-
|
|
784
|
+
expect(
|
|
785
|
+
evaluateFilterConditions(condition, {
|
|
786
|
+
...defaultOptions,
|
|
787
|
+
userAttributes: userAttributesWithoutEmail
|
|
788
|
+
})
|
|
789
|
+
).toBe(false);
|
|
737
790
|
});
|
|
738
791
|
test("should handle invalid data type", () => {
|
|
739
792
|
const invalidAttribute = [
|
|
740
793
|
{
|
|
741
794
|
id: "invalid-attr",
|
|
742
795
|
codeName: "invalid",
|
|
743
|
-
dataType: 999
|
|
744
|
-
// Invalid data type
|
|
796
|
+
dataType: 999,
|
|
797
|
+
// Invalid data type for testing
|
|
798
|
+
bizType: AttributeBizTypes.User
|
|
745
799
|
}
|
|
746
800
|
];
|
|
747
801
|
const condition = [
|
|
@@ -756,7 +810,12 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
756
810
|
}
|
|
757
811
|
}
|
|
758
812
|
];
|
|
759
|
-
expect(
|
|
813
|
+
expect(
|
|
814
|
+
evaluateFilterConditions(condition, {
|
|
815
|
+
...defaultOptions,
|
|
816
|
+
attributes: invalidAttribute
|
|
817
|
+
})
|
|
818
|
+
).toBe(false);
|
|
760
819
|
});
|
|
761
820
|
test("should handle invalid logic", () => {
|
|
762
821
|
const condition = [
|
|
@@ -771,7 +830,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
771
830
|
}
|
|
772
831
|
}
|
|
773
832
|
];
|
|
774
|
-
expect(evaluateFilterConditions(condition,
|
|
833
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
775
834
|
});
|
|
776
835
|
test("should handle missing data in condition", () => {
|
|
777
836
|
const condition = [
|
|
@@ -782,7 +841,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
782
841
|
data: void 0
|
|
783
842
|
}
|
|
784
843
|
];
|
|
785
|
-
expect(evaluateFilterConditions(condition,
|
|
844
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
786
845
|
});
|
|
787
846
|
test("should handle missing attrId in condition", () => {
|
|
788
847
|
const condition = [
|
|
@@ -796,7 +855,383 @@ describe("Attribute Filter - Complete Test Suite", () => {
|
|
|
796
855
|
}
|
|
797
856
|
}
|
|
798
857
|
];
|
|
799
|
-
expect(evaluateFilterConditions(condition,
|
|
858
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
859
|
+
});
|
|
860
|
+
});
|
|
861
|
+
describe("Company attributes evaluation", () => {
|
|
862
|
+
test("should evaluate company string attribute correctly", () => {
|
|
863
|
+
const condition = [
|
|
864
|
+
{
|
|
865
|
+
id: "company-condition-1",
|
|
866
|
+
type: "condition",
|
|
867
|
+
operators: "and",
|
|
868
|
+
data: {
|
|
869
|
+
logic: "is",
|
|
870
|
+
value: "Example Corp",
|
|
871
|
+
attrId: "company-name-attr"
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
];
|
|
875
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
876
|
+
});
|
|
877
|
+
test("should evaluate company number attribute correctly", () => {
|
|
878
|
+
const condition = [
|
|
879
|
+
{
|
|
880
|
+
id: "company-condition-2",
|
|
881
|
+
type: "condition",
|
|
882
|
+
operators: "and",
|
|
883
|
+
data: {
|
|
884
|
+
logic: "isGreaterThan",
|
|
885
|
+
value: 100,
|
|
886
|
+
attrId: "company-size-attr"
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
];
|
|
890
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
891
|
+
});
|
|
892
|
+
test("should handle missing company attribute value", () => {
|
|
893
|
+
const condition = [
|
|
894
|
+
{
|
|
895
|
+
id: "company-condition-3",
|
|
896
|
+
type: "condition",
|
|
897
|
+
operators: "and",
|
|
898
|
+
data: {
|
|
899
|
+
logic: "is",
|
|
900
|
+
value: "Test Corp",
|
|
901
|
+
attrId: "company-name-attr"
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
];
|
|
905
|
+
const optionsWithoutCompany = {
|
|
906
|
+
...defaultOptions,
|
|
907
|
+
companyAttributes: {}
|
|
908
|
+
};
|
|
909
|
+
expect(evaluateFilterConditions(condition, optionsWithoutCompany)).toBe(false);
|
|
910
|
+
});
|
|
911
|
+
});
|
|
912
|
+
describe("Membership attributes evaluation", () => {
|
|
913
|
+
test("should evaluate membership string attribute correctly", () => {
|
|
914
|
+
const condition = [
|
|
915
|
+
{
|
|
916
|
+
id: "membership-condition-1",
|
|
917
|
+
type: "condition",
|
|
918
|
+
operators: "and",
|
|
919
|
+
data: {
|
|
920
|
+
logic: "is",
|
|
921
|
+
value: "premium",
|
|
922
|
+
attrId: "membership-level-attr"
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
];
|
|
926
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
927
|
+
});
|
|
928
|
+
test("should evaluate membership number attribute correctly", () => {
|
|
929
|
+
const condition = [
|
|
930
|
+
{
|
|
931
|
+
id: "membership-condition-2",
|
|
932
|
+
type: "condition",
|
|
933
|
+
operators: "and",
|
|
934
|
+
data: {
|
|
935
|
+
logic: "isGreaterThanOrEqualTo",
|
|
936
|
+
value: 12,
|
|
937
|
+
attrId: "membership-duration-attr"
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
];
|
|
941
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
942
|
+
});
|
|
943
|
+
test("should handle missing membership attribute value", () => {
|
|
944
|
+
const condition = [
|
|
945
|
+
{
|
|
946
|
+
id: "membership-condition-3",
|
|
947
|
+
type: "condition",
|
|
948
|
+
operators: "and",
|
|
949
|
+
data: {
|
|
950
|
+
logic: "is",
|
|
951
|
+
value: "premium",
|
|
952
|
+
attrId: "membership-level-attr"
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
];
|
|
956
|
+
const optionsWithoutMembership = {
|
|
957
|
+
...defaultOptions,
|
|
958
|
+
membershipAttributes: {}
|
|
959
|
+
};
|
|
960
|
+
expect(evaluateFilterConditions(condition, optionsWithoutMembership)).toBe(false);
|
|
961
|
+
});
|
|
962
|
+
});
|
|
963
|
+
describe("Mixed attribute types in conditions", () => {
|
|
964
|
+
test("should evaluate mixed user and company attributes with AND logic", () => {
|
|
965
|
+
const condition = [
|
|
966
|
+
{
|
|
967
|
+
id: "mixed-condition-1",
|
|
968
|
+
type: "group",
|
|
969
|
+
operators: "and",
|
|
970
|
+
data: {},
|
|
971
|
+
conditions: [
|
|
972
|
+
{
|
|
973
|
+
id: "mixed-condition-1-1",
|
|
974
|
+
type: "condition",
|
|
975
|
+
operators: "and",
|
|
976
|
+
data: {
|
|
977
|
+
logic: "contains",
|
|
978
|
+
value: "example.com",
|
|
979
|
+
attrId: "email-attr"
|
|
980
|
+
}
|
|
981
|
+
},
|
|
982
|
+
{
|
|
983
|
+
id: "mixed-condition-1-2",
|
|
984
|
+
type: "condition",
|
|
985
|
+
operators: "and",
|
|
986
|
+
data: {
|
|
987
|
+
logic: "isGreaterThan",
|
|
988
|
+
value: 100,
|
|
989
|
+
attrId: "company-size-attr"
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
]
|
|
993
|
+
}
|
|
994
|
+
];
|
|
995
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
996
|
+
});
|
|
997
|
+
test("should evaluate mixed user, company, and membership attributes with OR logic", () => {
|
|
998
|
+
const condition = [
|
|
999
|
+
{
|
|
1000
|
+
id: "mixed-condition-2",
|
|
1001
|
+
type: "group",
|
|
1002
|
+
operators: "or",
|
|
1003
|
+
data: {},
|
|
1004
|
+
conditions: [
|
|
1005
|
+
{
|
|
1006
|
+
id: "mixed-condition-2-1",
|
|
1007
|
+
type: "condition",
|
|
1008
|
+
operators: "or",
|
|
1009
|
+
data: {
|
|
1010
|
+
logic: "is",
|
|
1011
|
+
value: "wrong@email.com",
|
|
1012
|
+
attrId: "email-attr"
|
|
1013
|
+
}
|
|
1014
|
+
},
|
|
1015
|
+
{
|
|
1016
|
+
id: "mixed-condition-2-2",
|
|
1017
|
+
type: "condition",
|
|
1018
|
+
operators: "or",
|
|
1019
|
+
data: {
|
|
1020
|
+
logic: "is",
|
|
1021
|
+
value: "Example Corp",
|
|
1022
|
+
attrId: "company-name-attr"
|
|
1023
|
+
}
|
|
1024
|
+
},
|
|
1025
|
+
{
|
|
1026
|
+
id: "mixed-condition-2-3",
|
|
1027
|
+
type: "condition",
|
|
1028
|
+
operators: "or",
|
|
1029
|
+
data: {
|
|
1030
|
+
logic: "is",
|
|
1031
|
+
value: "premium",
|
|
1032
|
+
attrId: "membership-level-attr"
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
]
|
|
1036
|
+
}
|
|
1037
|
+
];
|
|
1038
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
1039
|
+
});
|
|
1040
|
+
});
|
|
1041
|
+
describe("evaluateAttributeCondition function tests", () => {
|
|
1042
|
+
test("should evaluate single attribute condition correctly", () => {
|
|
1043
|
+
const condition = {
|
|
1044
|
+
id: "single-condition-1",
|
|
1045
|
+
type: "condition",
|
|
1046
|
+
operators: "and",
|
|
1047
|
+
data: {
|
|
1048
|
+
logic: "is",
|
|
1049
|
+
value: "user@example.com",
|
|
1050
|
+
attrId: "email-attr"
|
|
1051
|
+
}
|
|
1052
|
+
};
|
|
1053
|
+
expect(evaluateAttributeCondition(condition, defaultOptions)).toBe(true);
|
|
1054
|
+
});
|
|
1055
|
+
test("should handle missing data in single condition", () => {
|
|
1056
|
+
const condition = {
|
|
1057
|
+
id: "single-condition-2",
|
|
1058
|
+
type: "condition",
|
|
1059
|
+
operators: "and",
|
|
1060
|
+
data: void 0
|
|
1061
|
+
};
|
|
1062
|
+
expect(evaluateAttributeCondition(condition, defaultOptions)).toBe(false);
|
|
1063
|
+
});
|
|
1064
|
+
test("should handle missing attribute in single condition", () => {
|
|
1065
|
+
const condition = {
|
|
1066
|
+
id: "single-condition-3",
|
|
1067
|
+
type: "condition",
|
|
1068
|
+
operators: "and",
|
|
1069
|
+
data: {
|
|
1070
|
+
logic: "is",
|
|
1071
|
+
value: "test",
|
|
1072
|
+
attrId: "non-existent-attr"
|
|
1073
|
+
}
|
|
1074
|
+
};
|
|
1075
|
+
expect(evaluateAttributeCondition(condition, defaultOptions)).toBe(false);
|
|
1076
|
+
});
|
|
1077
|
+
test("should handle missing attributes array", () => {
|
|
1078
|
+
const condition = {
|
|
1079
|
+
id: "single-condition-4",
|
|
1080
|
+
type: "condition",
|
|
1081
|
+
operators: "and",
|
|
1082
|
+
data: {
|
|
1083
|
+
logic: "is",
|
|
1084
|
+
value: "test",
|
|
1085
|
+
attrId: "email-attr"
|
|
1086
|
+
}
|
|
1087
|
+
};
|
|
1088
|
+
const optionsWithoutAttributes = {
|
|
1089
|
+
...defaultOptions,
|
|
1090
|
+
attributes: void 0
|
|
1091
|
+
};
|
|
1092
|
+
expect(evaluateAttributeCondition(condition, optionsWithoutAttributes)).toBe(false);
|
|
1093
|
+
});
|
|
1094
|
+
test("should evaluate company attribute in single condition", () => {
|
|
1095
|
+
const condition = {
|
|
1096
|
+
id: "single-condition-5",
|
|
1097
|
+
type: "condition",
|
|
1098
|
+
operators: "and",
|
|
1099
|
+
data: {
|
|
1100
|
+
logic: "is",
|
|
1101
|
+
value: "Example Corp",
|
|
1102
|
+
attrId: "company-name-attr"
|
|
1103
|
+
}
|
|
1104
|
+
};
|
|
1105
|
+
expect(evaluateAttributeCondition(condition, defaultOptions)).toBe(true);
|
|
1106
|
+
});
|
|
1107
|
+
test("should evaluate membership attribute in single condition", () => {
|
|
1108
|
+
const condition = {
|
|
1109
|
+
id: "single-condition-6",
|
|
1110
|
+
type: "condition",
|
|
1111
|
+
operators: "and",
|
|
1112
|
+
data: {
|
|
1113
|
+
logic: "is",
|
|
1114
|
+
value: "premium",
|
|
1115
|
+
attrId: "membership-level-attr"
|
|
1116
|
+
}
|
|
1117
|
+
};
|
|
1118
|
+
expect(evaluateAttributeCondition(condition, defaultOptions)).toBe(true);
|
|
1119
|
+
});
|
|
1120
|
+
});
|
|
1121
|
+
describe("Additional edge cases for new functionality", () => {
|
|
1122
|
+
test("should handle empty attribute contexts", () => {
|
|
1123
|
+
const condition = [
|
|
1124
|
+
{
|
|
1125
|
+
id: "empty-context-1",
|
|
1126
|
+
type: "condition",
|
|
1127
|
+
operators: "and",
|
|
1128
|
+
data: {
|
|
1129
|
+
logic: "is",
|
|
1130
|
+
value: "test",
|
|
1131
|
+
attrId: "email-attr"
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
];
|
|
1135
|
+
const emptyOptions = {
|
|
1136
|
+
attributes: testAttributes,
|
|
1137
|
+
userAttributes: {},
|
|
1138
|
+
companyAttributes: {},
|
|
1139
|
+
membershipAttributes: {}
|
|
1140
|
+
};
|
|
1141
|
+
expect(evaluateFilterConditions(condition, emptyOptions)).toBe(false);
|
|
1142
|
+
});
|
|
1143
|
+
test("should handle missing attribute contexts", () => {
|
|
1144
|
+
const condition = [
|
|
1145
|
+
{
|
|
1146
|
+
id: "missing-context-1",
|
|
1147
|
+
type: "condition",
|
|
1148
|
+
operators: "and",
|
|
1149
|
+
data: {
|
|
1150
|
+
logic: "is",
|
|
1151
|
+
value: "test",
|
|
1152
|
+
attrId: "email-attr"
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
];
|
|
1156
|
+
const minimalOptions = {
|
|
1157
|
+
attributes: testAttributes
|
|
1158
|
+
};
|
|
1159
|
+
expect(evaluateFilterConditions(condition, minimalOptions)).toBe(false);
|
|
1160
|
+
});
|
|
1161
|
+
test("should handle complex nested groups with mixed attribute types", () => {
|
|
1162
|
+
const condition = [
|
|
1163
|
+
{
|
|
1164
|
+
id: "complex-nested-1",
|
|
1165
|
+
type: "group",
|
|
1166
|
+
operators: "and",
|
|
1167
|
+
data: {},
|
|
1168
|
+
conditions: [
|
|
1169
|
+
{
|
|
1170
|
+
id: "complex-nested-1-1",
|
|
1171
|
+
type: "group",
|
|
1172
|
+
operators: "or",
|
|
1173
|
+
data: {},
|
|
1174
|
+
conditions: [
|
|
1175
|
+
{
|
|
1176
|
+
id: "complex-nested-1-1-1",
|
|
1177
|
+
type: "condition",
|
|
1178
|
+
operators: "or",
|
|
1179
|
+
data: {
|
|
1180
|
+
logic: "contains",
|
|
1181
|
+
value: "example.com",
|
|
1182
|
+
attrId: "email-attr"
|
|
1183
|
+
}
|
|
1184
|
+
},
|
|
1185
|
+
{
|
|
1186
|
+
id: "complex-nested-1-1-2",
|
|
1187
|
+
type: "condition",
|
|
1188
|
+
operators: "or",
|
|
1189
|
+
data: {
|
|
1190
|
+
logic: "is",
|
|
1191
|
+
value: "Test Corp",
|
|
1192
|
+
attrId: "company-name-attr"
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
]
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
id: "complex-nested-1-2",
|
|
1199
|
+
type: "condition",
|
|
1200
|
+
operators: "and",
|
|
1201
|
+
data: {
|
|
1202
|
+
logic: "is",
|
|
1203
|
+
value: "premium",
|
|
1204
|
+
attrId: "membership-level-attr"
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
]
|
|
1208
|
+
}
|
|
1209
|
+
];
|
|
1210
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
|
|
1211
|
+
});
|
|
1212
|
+
test("should handle empty group conditions", () => {
|
|
1213
|
+
const condition = [
|
|
1214
|
+
{
|
|
1215
|
+
id: "empty-group-1",
|
|
1216
|
+
type: "group",
|
|
1217
|
+
operators: "and",
|
|
1218
|
+
data: {},
|
|
1219
|
+
conditions: []
|
|
1220
|
+
}
|
|
1221
|
+
];
|
|
1222
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
1223
|
+
});
|
|
1224
|
+
test("should handle group with undefined conditions", () => {
|
|
1225
|
+
const condition = [
|
|
1226
|
+
{
|
|
1227
|
+
id: "undefined-group-1",
|
|
1228
|
+
type: "group",
|
|
1229
|
+
operators: "and",
|
|
1230
|
+
data: {},
|
|
1231
|
+
conditions: void 0
|
|
1232
|
+
}
|
|
1233
|
+
];
|
|
1234
|
+
expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
|
|
800
1235
|
});
|
|
801
1236
|
});
|
|
802
1237
|
});
|