@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.
@@ -1,40 +1,76 @@
1
1
  import {
2
+ evaluateAttributeCondition,
2
3
  evaluateFilterConditions
3
- } from "../chunk-PBZSPV5R.js";
4
+ } from "../chunk-P46FJFKP.js";
4
5
  import "../chunk-XEO3YXBM.js";
5
6
 
6
7
  // src/__tests__/attribute.test.ts
7
- import { BizAttributeTypes } from "@usertour/types";
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(false);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(false);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(false);
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, testAttributes, testUserAttributes)).toBe(false);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(false);
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, testAttributes, testUserAttributes)).toBe(true);
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: 600,
463
- // 600 days ago (signUpDate is 575 days ago, which is < 600, so should be false)
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(false);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(false);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(true);
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([], testAttributes, testUserAttributes)).toBe(true);
747
+ expect(evaluateFilterConditions([], defaultOptions)).toBe(true);
698
748
  });
699
749
  test("should handle null/undefined conditions", () => {
700
- expect(evaluateFilterConditions(null, testAttributes, testUserAttributes)).toBe(true);
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, testAttributes, testUserAttributes)).toBe(false);
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(evaluateFilterConditions(condition, testAttributes, userAttributesWithoutEmail)).toBe(
735
- false
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(evaluateFilterConditions(condition, invalidAttribute, testUserAttributes)).toBe(false);
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, testAttributes, testUserAttributes)).toBe(false);
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, testAttributes, testUserAttributes)).toBe(false);
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, testAttributes, testUserAttributes)).toBe(false);
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
  });