@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.
@@ -6,14 +6,14 @@ var import_types2 = require("@usertour/types");
6
6
  // src/conditions/attribute.ts
7
7
  var import_types = require("@usertour/types");
8
8
  var import_date_fns = require("date-fns");
9
- function evaluateFilterConditions(conditions, attributes, userAttributes) {
9
+ function evaluateFilterConditions(conditions, options) {
10
10
  if (!conditions || !conditions.length) {
11
11
  return true;
12
12
  }
13
- const result = evaluateAttributeConditionsGroup(conditions, attributes, userAttributes);
13
+ const result = evaluateAttributeConditionsGroup(conditions, options);
14
14
  return evaluateFilterResult(result);
15
15
  }
16
- function evaluateAttributeConditionsGroup(conditions, attributes, userAttributes) {
16
+ function evaluateAttributeConditionsGroup(conditions, options) {
17
17
  if (!conditions || !conditions.length) {
18
18
  return false;
19
19
  }
@@ -21,7 +21,7 @@ function evaluateAttributeConditionsGroup(conditions, attributes, userAttributes
21
21
  const OR = [];
22
22
  for (const condition of conditions) {
23
23
  const { operators } = condition;
24
- const item = condition.type !== "group" ? evaluateAttributeCondition(condition, attributes, userAttributes) : evaluateAttributeConditionsGroup(condition.conditions || [], attributes, userAttributes);
24
+ const item = condition.type !== "group" ? evaluateAttributeCondition(condition, options) : evaluateAttributeConditionsGroup(condition.conditions || [], options);
25
25
  if (!item) {
26
26
  continue;
27
27
  }
@@ -43,20 +43,27 @@ function evaluateAttributeConditionsGroup(conditions, attributes, userAttributes
43
43
  }
44
44
  return filter;
45
45
  }
46
- function evaluateAttributeCondition(condition, attributes, userAttributes) {
46
+ function evaluateAttributeCondition(condition, options) {
47
47
  const { data } = condition;
48
48
  if (!data) {
49
49
  return false;
50
50
  }
51
51
  const { logic, value, attrId, value2, listValues = [] } = data;
52
- if (!attrId) {
52
+ const {
53
+ attributes,
54
+ userAttributes = {},
55
+ companyAttributes = {},
56
+ membershipAttributes = {}
57
+ } = options;
58
+ if (!attrId || !attributes) {
53
59
  return false;
54
60
  }
55
61
  const attr = attributes.find((attr2) => attr2.id === attrId);
56
62
  if (!attr) {
57
63
  return false;
58
64
  }
59
- const actualValue = getAttributeValue(attr.codeName, userAttributes);
65
+ const bizAttributes = attr.bizType === import_types.AttributeBizTypes.Company ? companyAttributes : attr.bizType === import_types.AttributeBizTypes.Membership ? membershipAttributes : userAttributes;
66
+ const actualValue = getAttributeValue(attr.codeName, bizAttributes);
60
67
  if (attr.dataType === import_types.BizAttributeTypes.String) {
61
68
  return evaluateStringCondition(logic, actualValue, value);
62
69
  }
@@ -74,8 +81,8 @@ function evaluateAttributeCondition(condition, attributes, userAttributes) {
74
81
  }
75
82
  return false;
76
83
  }
77
- function getAttributeValue(codeName, userAttributes) {
78
- return userAttributes == null ? void 0 : userAttributes[codeName];
84
+ function getAttributeValue(codeName, attributes) {
85
+ return attributes == null ? void 0 : attributes[codeName];
79
86
  }
80
87
  function evaluateStringCondition(logic, actualValue, expectedValue) {
81
88
  const stringValue = actualValue === null || actualValue === void 0 ? "" : String(actualValue);
@@ -243,32 +250,64 @@ var testAttributes = [
243
250
  {
244
251
  id: "email-attr",
245
252
  codeName: "email",
246
- dataType: import_types2.BizAttributeTypes.String
253
+ dataType: import_types2.BizAttributeTypes.String,
254
+ bizType: import_types2.AttributeBizTypes.User
247
255
  },
248
256
  {
249
257
  id: "age-attr",
250
258
  codeName: "age",
251
- dataType: import_types2.BizAttributeTypes.Number
259
+ dataType: import_types2.BizAttributeTypes.Number,
260
+ bizType: import_types2.AttributeBizTypes.User
252
261
  },
253
262
  {
254
263
  id: "isPremium-attr",
255
264
  codeName: "isPremium",
256
- dataType: import_types2.BizAttributeTypes.Boolean
265
+ dataType: import_types2.BizAttributeTypes.Boolean,
266
+ bizType: import_types2.AttributeBizTypes.User
257
267
  },
258
268
  {
259
269
  id: "roles-attr",
260
270
  codeName: "roles",
261
- dataType: import_types2.BizAttributeTypes.List
271
+ dataType: import_types2.BizAttributeTypes.List,
272
+ bizType: import_types2.AttributeBizTypes.User
262
273
  },
263
274
  {
264
275
  id: "signUpDate-attr",
265
276
  codeName: "signUpDate",
266
- dataType: import_types2.BizAttributeTypes.DateTime
277
+ dataType: import_types2.BizAttributeTypes.DateTime,
278
+ bizType: import_types2.AttributeBizTypes.User
267
279
  },
268
280
  {
269
281
  id: "score-attr",
270
282
  codeName: "score",
271
- dataType: import_types2.BizAttributeTypes.Number
283
+ dataType: import_types2.BizAttributeTypes.Number,
284
+ bizType: import_types2.AttributeBizTypes.User
285
+ },
286
+ // Company attributes
287
+ {
288
+ id: "company-name-attr",
289
+ codeName: "companyName",
290
+ dataType: import_types2.BizAttributeTypes.String,
291
+ bizType: import_types2.AttributeBizTypes.Company
292
+ },
293
+ {
294
+ id: "company-size-attr",
295
+ codeName: "companySize",
296
+ dataType: import_types2.BizAttributeTypes.Number,
297
+ bizType: import_types2.AttributeBizTypes.Company
298
+ },
299
+ // Membership attributes
300
+ {
301
+ id: "membership-level-attr",
302
+ codeName: "membershipLevel",
303
+ dataType: import_types2.BizAttributeTypes.String,
304
+ bizType: import_types2.AttributeBizTypes.Membership
305
+ },
306
+ {
307
+ id: "membership-duration-attr",
308
+ codeName: "membershipDuration",
309
+ dataType: import_types2.BizAttributeTypes.Number,
310
+ bizType: import_types2.AttributeBizTypes.Membership
272
311
  }
273
312
  ];
274
313
  var testUserAttributes = {
@@ -279,6 +318,20 @@ var testUserAttributes = {
279
318
  signUpDate: "2024-01-15T10:30:00Z",
280
319
  score: 85.5
281
320
  };
321
+ var testCompanyAttributes = {
322
+ companyName: "Example Corp",
323
+ companySize: 500
324
+ };
325
+ var testMembershipAttributes = {
326
+ membershipLevel: "premium",
327
+ membershipDuration: 12
328
+ };
329
+ var defaultOptions = {
330
+ attributes: testAttributes,
331
+ userAttributes: testUserAttributes,
332
+ companyAttributes: testCompanyAttributes,
333
+ membershipAttributes: testMembershipAttributes
334
+ };
282
335
  describe("Attribute Filter - Complete Test Suite", () => {
283
336
  describe("String conditions (8 cases)", () => {
284
337
  test('should evaluate "is" condition correctly', () => {
@@ -294,7 +347,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
294
347
  }
295
348
  }
296
349
  ];
297
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
350
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
298
351
  });
299
352
  test('should evaluate "not" condition correctly', () => {
300
353
  const condition = [
@@ -309,7 +362,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
309
362
  }
310
363
  }
311
364
  ];
312
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
365
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
313
366
  });
314
367
  test('should evaluate "contains" condition correctly', () => {
315
368
  const condition = [
@@ -324,7 +377,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
324
377
  }
325
378
  }
326
379
  ];
327
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
380
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
328
381
  });
329
382
  test('should evaluate "notContain" condition correctly', () => {
330
383
  const condition = [
@@ -339,7 +392,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
339
392
  }
340
393
  }
341
394
  ];
342
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
395
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
343
396
  });
344
397
  test('should evaluate "startsWith" condition correctly', () => {
345
398
  const condition = [
@@ -354,7 +407,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
354
407
  }
355
408
  }
356
409
  ];
357
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
410
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
358
411
  });
359
412
  test('should evaluate "endsWith" condition correctly', () => {
360
413
  const condition = [
@@ -369,7 +422,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
369
422
  }
370
423
  }
371
424
  ];
372
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
425
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
373
426
  });
374
427
  test('should evaluate "empty" condition correctly', () => {
375
428
  const condition = [
@@ -383,7 +436,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
383
436
  }
384
437
  }
385
438
  ];
386
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
439
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
387
440
  });
388
441
  test('should evaluate "any" condition correctly', () => {
389
442
  const condition = [
@@ -397,7 +450,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
397
450
  }
398
451
  }
399
452
  ];
400
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
453
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
401
454
  });
402
455
  });
403
456
  describe("Number conditions (9 cases)", () => {
@@ -414,7 +467,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
414
467
  }
415
468
  }
416
469
  ];
417
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
470
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
418
471
  });
419
472
  test('should evaluate "not" condition correctly', () => {
420
473
  const condition = [
@@ -429,7 +482,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
429
482
  }
430
483
  }
431
484
  ];
432
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
485
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
433
486
  });
434
487
  test('should evaluate "isLessThan" condition correctly', () => {
435
488
  const condition = [
@@ -444,7 +497,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
444
497
  }
445
498
  }
446
499
  ];
447
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
500
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
448
501
  });
449
502
  test('should evaluate "isLessThanOrEqualTo" condition correctly', () => {
450
503
  const condition = [
@@ -459,7 +512,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
459
512
  }
460
513
  }
461
514
  ];
462
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
515
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
463
516
  });
464
517
  test('should evaluate "isGreaterThan" condition correctly', () => {
465
518
  const condition = [
@@ -474,7 +527,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
474
527
  }
475
528
  }
476
529
  ];
477
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
530
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
478
531
  });
479
532
  test('should evaluate "isGreaterThanOrEqualTo" condition correctly', () => {
480
533
  const condition = [
@@ -489,7 +542,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
489
542
  }
490
543
  }
491
544
  ];
492
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
545
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
493
546
  });
494
547
  test('should evaluate "between" condition correctly', () => {
495
548
  const condition = [
@@ -505,7 +558,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
505
558
  }
506
559
  }
507
560
  ];
508
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
561
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
509
562
  });
510
563
  test('should evaluate "empty" condition correctly', () => {
511
564
  const condition = [
@@ -519,7 +572,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
519
572
  }
520
573
  }
521
574
  ];
522
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
575
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
523
576
  });
524
577
  test('should evaluate "any" condition correctly', () => {
525
578
  const condition = [
@@ -533,7 +586,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
533
586
  }
534
587
  }
535
588
  ];
536
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
589
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
537
590
  });
538
591
  });
539
592
  describe("Boolean conditions (4 cases)", () => {
@@ -549,7 +602,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
549
602
  }
550
603
  }
551
604
  ];
552
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
605
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
553
606
  });
554
607
  test('should evaluate "false" condition correctly', () => {
555
608
  const condition = [
@@ -563,7 +616,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
563
616
  }
564
617
  }
565
618
  ];
566
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
619
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
567
620
  });
568
621
  test('should evaluate "empty" condition correctly', () => {
569
622
  const condition = [
@@ -577,7 +630,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
577
630
  }
578
631
  }
579
632
  ];
580
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
633
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
581
634
  });
582
635
  test('should evaluate "any" condition correctly', () => {
583
636
  const condition = [
@@ -591,7 +644,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
591
644
  }
592
645
  }
593
646
  ];
594
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
647
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
595
648
  });
596
649
  });
597
650
  describe("List conditions (6 cases)", () => {
@@ -608,7 +661,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
608
661
  }
609
662
  }
610
663
  ];
611
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
664
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
612
665
  });
613
666
  test('should evaluate "includesAll" condition correctly', () => {
614
667
  const condition = [
@@ -623,7 +676,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
623
676
  }
624
677
  }
625
678
  ];
626
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
679
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
627
680
  });
628
681
  test('should evaluate "notIncludesAtLeastOne" condition correctly', () => {
629
682
  const condition = [
@@ -638,7 +691,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
638
691
  }
639
692
  }
640
693
  ];
641
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
694
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
642
695
  });
643
696
  test('should evaluate "notIncludesAll" condition correctly', () => {
644
697
  const condition = [
@@ -653,7 +706,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
653
706
  }
654
707
  }
655
708
  ];
656
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
709
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
657
710
  });
658
711
  test('should evaluate "empty" condition correctly', () => {
659
712
  const condition = [
@@ -667,7 +720,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
667
720
  }
668
721
  }
669
722
  ];
670
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
723
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
671
724
  });
672
725
  test('should evaluate "any" condition correctly', () => {
673
726
  const condition = [
@@ -681,7 +734,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
681
734
  }
682
735
  }
683
736
  ];
684
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
737
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
685
738
  });
686
739
  });
687
740
  describe("DateTime conditions (8 cases)", () => {
@@ -693,13 +746,13 @@ describe("Attribute Filter - Complete Test Suite", () => {
693
746
  operators: "and",
694
747
  data: {
695
748
  logic: "lessThan",
696
- value: 600,
697
- // 600 days ago (signUpDate is 575 days ago, which is < 600, so should be false)
749
+ value: 30,
750
+ // Check if signUpDate is within the last 30 days (it's not, so should be false)
698
751
  attrId: "signUpDate-attr"
699
752
  }
700
753
  }
701
754
  ];
702
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
755
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
703
756
  });
704
757
  test('should evaluate "exactly" condition correctly', () => {
705
758
  const condition = [
@@ -715,7 +768,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
715
768
  }
716
769
  }
717
770
  ];
718
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
771
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
719
772
  });
720
773
  test('should evaluate "moreThan" condition correctly', () => {
721
774
  const condition = [
@@ -731,7 +784,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
731
784
  }
732
785
  }
733
786
  ];
734
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
787
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
735
788
  });
736
789
  test('should evaluate "before" condition correctly', () => {
737
790
  const condition = [
@@ -746,7 +799,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
746
799
  }
747
800
  }
748
801
  ];
749
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
802
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
750
803
  });
751
804
  test('should evaluate "on" condition correctly', () => {
752
805
  const condition = [
@@ -761,7 +814,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
761
814
  }
762
815
  }
763
816
  ];
764
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
817
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
765
818
  });
766
819
  test('should evaluate "after" condition correctly', () => {
767
820
  const condition = [
@@ -776,7 +829,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
776
829
  }
777
830
  }
778
831
  ];
779
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
832
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
780
833
  });
781
834
  test('should evaluate "empty" condition correctly', () => {
782
835
  const condition = [
@@ -790,7 +843,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
790
843
  }
791
844
  }
792
845
  ];
793
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
846
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
794
847
  });
795
848
  test('should evaluate "any" condition correctly', () => {
796
849
  const condition = [
@@ -804,7 +857,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
804
857
  }
805
858
  }
806
859
  ];
807
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
860
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
808
861
  });
809
862
  });
810
863
  describe("Complex conditions with AND/OR logic", () => {
@@ -839,7 +892,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
839
892
  ]
840
893
  }
841
894
  ];
842
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
895
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
843
896
  });
844
897
  test("should evaluate OR condition correctly", () => {
845
898
  const condition = [
@@ -872,7 +925,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
872
925
  ]
873
926
  }
874
927
  ];
875
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
928
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
876
929
  });
877
930
  test("should evaluate mixed AND/OR condition correctly", () => {
878
931
  const condition = [
@@ -923,15 +976,15 @@ describe("Attribute Filter - Complete Test Suite", () => {
923
976
  ]
924
977
  }
925
978
  ];
926
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(true);
979
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
927
980
  });
928
981
  });
929
982
  describe("Edge cases and error handling", () => {
930
983
  test("should handle empty conditions array", () => {
931
- expect(evaluateFilterConditions([], testAttributes, testUserAttributes)).toBe(true);
984
+ expect(evaluateFilterConditions([], defaultOptions)).toBe(true);
932
985
  });
933
986
  test("should handle null/undefined conditions", () => {
934
- expect(evaluateFilterConditions(null, testAttributes, testUserAttributes)).toBe(true);
987
+ expect(evaluateFilterConditions(null, defaultOptions)).toBe(true);
935
988
  });
936
989
  test("should handle missing attribute", () => {
937
990
  const condition = [
@@ -946,7 +999,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
946
999
  }
947
1000
  }
948
1001
  ];
949
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
1002
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
950
1003
  });
951
1004
  test("should handle missing user attribute value", () => {
952
1005
  const userAttributesWithoutEmail = {
@@ -965,17 +1018,21 @@ describe("Attribute Filter - Complete Test Suite", () => {
965
1018
  }
966
1019
  }
967
1020
  ];
968
- expect(evaluateFilterConditions(condition, testAttributes, userAttributesWithoutEmail)).toBe(
969
- false
970
- );
1021
+ expect(
1022
+ evaluateFilterConditions(condition, {
1023
+ ...defaultOptions,
1024
+ userAttributes: userAttributesWithoutEmail
1025
+ })
1026
+ ).toBe(false);
971
1027
  });
972
1028
  test("should handle invalid data type", () => {
973
1029
  const invalidAttribute = [
974
1030
  {
975
1031
  id: "invalid-attr",
976
1032
  codeName: "invalid",
977
- dataType: 999
978
- // Invalid data type
1033
+ dataType: 999,
1034
+ // Invalid data type for testing
1035
+ bizType: import_types2.AttributeBizTypes.User
979
1036
  }
980
1037
  ];
981
1038
  const condition = [
@@ -990,7 +1047,12 @@ describe("Attribute Filter - Complete Test Suite", () => {
990
1047
  }
991
1048
  }
992
1049
  ];
993
- expect(evaluateFilterConditions(condition, invalidAttribute, testUserAttributes)).toBe(false);
1050
+ expect(
1051
+ evaluateFilterConditions(condition, {
1052
+ ...defaultOptions,
1053
+ attributes: invalidAttribute
1054
+ })
1055
+ ).toBe(false);
994
1056
  });
995
1057
  test("should handle invalid logic", () => {
996
1058
  const condition = [
@@ -1005,7 +1067,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
1005
1067
  }
1006
1068
  }
1007
1069
  ];
1008
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
1070
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
1009
1071
  });
1010
1072
  test("should handle missing data in condition", () => {
1011
1073
  const condition = [
@@ -1016,7 +1078,7 @@ describe("Attribute Filter - Complete Test Suite", () => {
1016
1078
  data: void 0
1017
1079
  }
1018
1080
  ];
1019
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
1081
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
1020
1082
  });
1021
1083
  test("should handle missing attrId in condition", () => {
1022
1084
  const condition = [
@@ -1030,7 +1092,383 @@ describe("Attribute Filter - Complete Test Suite", () => {
1030
1092
  }
1031
1093
  }
1032
1094
  ];
1033
- expect(evaluateFilterConditions(condition, testAttributes, testUserAttributes)).toBe(false);
1095
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
1096
+ });
1097
+ });
1098
+ describe("Company attributes evaluation", () => {
1099
+ test("should evaluate company string attribute correctly", () => {
1100
+ const condition = [
1101
+ {
1102
+ id: "company-condition-1",
1103
+ type: "condition",
1104
+ operators: "and",
1105
+ data: {
1106
+ logic: "is",
1107
+ value: "Example Corp",
1108
+ attrId: "company-name-attr"
1109
+ }
1110
+ }
1111
+ ];
1112
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
1113
+ });
1114
+ test("should evaluate company number attribute correctly", () => {
1115
+ const condition = [
1116
+ {
1117
+ id: "company-condition-2",
1118
+ type: "condition",
1119
+ operators: "and",
1120
+ data: {
1121
+ logic: "isGreaterThan",
1122
+ value: 100,
1123
+ attrId: "company-size-attr"
1124
+ }
1125
+ }
1126
+ ];
1127
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
1128
+ });
1129
+ test("should handle missing company attribute value", () => {
1130
+ const condition = [
1131
+ {
1132
+ id: "company-condition-3",
1133
+ type: "condition",
1134
+ operators: "and",
1135
+ data: {
1136
+ logic: "is",
1137
+ value: "Test Corp",
1138
+ attrId: "company-name-attr"
1139
+ }
1140
+ }
1141
+ ];
1142
+ const optionsWithoutCompany = {
1143
+ ...defaultOptions,
1144
+ companyAttributes: {}
1145
+ };
1146
+ expect(evaluateFilterConditions(condition, optionsWithoutCompany)).toBe(false);
1147
+ });
1148
+ });
1149
+ describe("Membership attributes evaluation", () => {
1150
+ test("should evaluate membership string attribute correctly", () => {
1151
+ const condition = [
1152
+ {
1153
+ id: "membership-condition-1",
1154
+ type: "condition",
1155
+ operators: "and",
1156
+ data: {
1157
+ logic: "is",
1158
+ value: "premium",
1159
+ attrId: "membership-level-attr"
1160
+ }
1161
+ }
1162
+ ];
1163
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
1164
+ });
1165
+ test("should evaluate membership number attribute correctly", () => {
1166
+ const condition = [
1167
+ {
1168
+ id: "membership-condition-2",
1169
+ type: "condition",
1170
+ operators: "and",
1171
+ data: {
1172
+ logic: "isGreaterThanOrEqualTo",
1173
+ value: 12,
1174
+ attrId: "membership-duration-attr"
1175
+ }
1176
+ }
1177
+ ];
1178
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
1179
+ });
1180
+ test("should handle missing membership attribute value", () => {
1181
+ const condition = [
1182
+ {
1183
+ id: "membership-condition-3",
1184
+ type: "condition",
1185
+ operators: "and",
1186
+ data: {
1187
+ logic: "is",
1188
+ value: "premium",
1189
+ attrId: "membership-level-attr"
1190
+ }
1191
+ }
1192
+ ];
1193
+ const optionsWithoutMembership = {
1194
+ ...defaultOptions,
1195
+ membershipAttributes: {}
1196
+ };
1197
+ expect(evaluateFilterConditions(condition, optionsWithoutMembership)).toBe(false);
1198
+ });
1199
+ });
1200
+ describe("Mixed attribute types in conditions", () => {
1201
+ test("should evaluate mixed user and company attributes with AND logic", () => {
1202
+ const condition = [
1203
+ {
1204
+ id: "mixed-condition-1",
1205
+ type: "group",
1206
+ operators: "and",
1207
+ data: {},
1208
+ conditions: [
1209
+ {
1210
+ id: "mixed-condition-1-1",
1211
+ type: "condition",
1212
+ operators: "and",
1213
+ data: {
1214
+ logic: "contains",
1215
+ value: "example.com",
1216
+ attrId: "email-attr"
1217
+ }
1218
+ },
1219
+ {
1220
+ id: "mixed-condition-1-2",
1221
+ type: "condition",
1222
+ operators: "and",
1223
+ data: {
1224
+ logic: "isGreaterThan",
1225
+ value: 100,
1226
+ attrId: "company-size-attr"
1227
+ }
1228
+ }
1229
+ ]
1230
+ }
1231
+ ];
1232
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
1233
+ });
1234
+ test("should evaluate mixed user, company, and membership attributes with OR logic", () => {
1235
+ const condition = [
1236
+ {
1237
+ id: "mixed-condition-2",
1238
+ type: "group",
1239
+ operators: "or",
1240
+ data: {},
1241
+ conditions: [
1242
+ {
1243
+ id: "mixed-condition-2-1",
1244
+ type: "condition",
1245
+ operators: "or",
1246
+ data: {
1247
+ logic: "is",
1248
+ value: "wrong@email.com",
1249
+ attrId: "email-attr"
1250
+ }
1251
+ },
1252
+ {
1253
+ id: "mixed-condition-2-2",
1254
+ type: "condition",
1255
+ operators: "or",
1256
+ data: {
1257
+ logic: "is",
1258
+ value: "Example Corp",
1259
+ attrId: "company-name-attr"
1260
+ }
1261
+ },
1262
+ {
1263
+ id: "mixed-condition-2-3",
1264
+ type: "condition",
1265
+ operators: "or",
1266
+ data: {
1267
+ logic: "is",
1268
+ value: "premium",
1269
+ attrId: "membership-level-attr"
1270
+ }
1271
+ }
1272
+ ]
1273
+ }
1274
+ ];
1275
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
1276
+ });
1277
+ });
1278
+ describe("evaluateAttributeCondition function tests", () => {
1279
+ test("should evaluate single attribute condition correctly", () => {
1280
+ const condition = {
1281
+ id: "single-condition-1",
1282
+ type: "condition",
1283
+ operators: "and",
1284
+ data: {
1285
+ logic: "is",
1286
+ value: "user@example.com",
1287
+ attrId: "email-attr"
1288
+ }
1289
+ };
1290
+ expect(evaluateAttributeCondition(condition, defaultOptions)).toBe(true);
1291
+ });
1292
+ test("should handle missing data in single condition", () => {
1293
+ const condition = {
1294
+ id: "single-condition-2",
1295
+ type: "condition",
1296
+ operators: "and",
1297
+ data: void 0
1298
+ };
1299
+ expect(evaluateAttributeCondition(condition, defaultOptions)).toBe(false);
1300
+ });
1301
+ test("should handle missing attribute in single condition", () => {
1302
+ const condition = {
1303
+ id: "single-condition-3",
1304
+ type: "condition",
1305
+ operators: "and",
1306
+ data: {
1307
+ logic: "is",
1308
+ value: "test",
1309
+ attrId: "non-existent-attr"
1310
+ }
1311
+ };
1312
+ expect(evaluateAttributeCondition(condition, defaultOptions)).toBe(false);
1313
+ });
1314
+ test("should handle missing attributes array", () => {
1315
+ const condition = {
1316
+ id: "single-condition-4",
1317
+ type: "condition",
1318
+ operators: "and",
1319
+ data: {
1320
+ logic: "is",
1321
+ value: "test",
1322
+ attrId: "email-attr"
1323
+ }
1324
+ };
1325
+ const optionsWithoutAttributes = {
1326
+ ...defaultOptions,
1327
+ attributes: void 0
1328
+ };
1329
+ expect(evaluateAttributeCondition(condition, optionsWithoutAttributes)).toBe(false);
1330
+ });
1331
+ test("should evaluate company attribute in single condition", () => {
1332
+ const condition = {
1333
+ id: "single-condition-5",
1334
+ type: "condition",
1335
+ operators: "and",
1336
+ data: {
1337
+ logic: "is",
1338
+ value: "Example Corp",
1339
+ attrId: "company-name-attr"
1340
+ }
1341
+ };
1342
+ expect(evaluateAttributeCondition(condition, defaultOptions)).toBe(true);
1343
+ });
1344
+ test("should evaluate membership attribute in single condition", () => {
1345
+ const condition = {
1346
+ id: "single-condition-6",
1347
+ type: "condition",
1348
+ operators: "and",
1349
+ data: {
1350
+ logic: "is",
1351
+ value: "premium",
1352
+ attrId: "membership-level-attr"
1353
+ }
1354
+ };
1355
+ expect(evaluateAttributeCondition(condition, defaultOptions)).toBe(true);
1356
+ });
1357
+ });
1358
+ describe("Additional edge cases for new functionality", () => {
1359
+ test("should handle empty attribute contexts", () => {
1360
+ const condition = [
1361
+ {
1362
+ id: "empty-context-1",
1363
+ type: "condition",
1364
+ operators: "and",
1365
+ data: {
1366
+ logic: "is",
1367
+ value: "test",
1368
+ attrId: "email-attr"
1369
+ }
1370
+ }
1371
+ ];
1372
+ const emptyOptions = {
1373
+ attributes: testAttributes,
1374
+ userAttributes: {},
1375
+ companyAttributes: {},
1376
+ membershipAttributes: {}
1377
+ };
1378
+ expect(evaluateFilterConditions(condition, emptyOptions)).toBe(false);
1379
+ });
1380
+ test("should handle missing attribute contexts", () => {
1381
+ const condition = [
1382
+ {
1383
+ id: "missing-context-1",
1384
+ type: "condition",
1385
+ operators: "and",
1386
+ data: {
1387
+ logic: "is",
1388
+ value: "test",
1389
+ attrId: "email-attr"
1390
+ }
1391
+ }
1392
+ ];
1393
+ const minimalOptions = {
1394
+ attributes: testAttributes
1395
+ };
1396
+ expect(evaluateFilterConditions(condition, minimalOptions)).toBe(false);
1397
+ });
1398
+ test("should handle complex nested groups with mixed attribute types", () => {
1399
+ const condition = [
1400
+ {
1401
+ id: "complex-nested-1",
1402
+ type: "group",
1403
+ operators: "and",
1404
+ data: {},
1405
+ conditions: [
1406
+ {
1407
+ id: "complex-nested-1-1",
1408
+ type: "group",
1409
+ operators: "or",
1410
+ data: {},
1411
+ conditions: [
1412
+ {
1413
+ id: "complex-nested-1-1-1",
1414
+ type: "condition",
1415
+ operators: "or",
1416
+ data: {
1417
+ logic: "contains",
1418
+ value: "example.com",
1419
+ attrId: "email-attr"
1420
+ }
1421
+ },
1422
+ {
1423
+ id: "complex-nested-1-1-2",
1424
+ type: "condition",
1425
+ operators: "or",
1426
+ data: {
1427
+ logic: "is",
1428
+ value: "Test Corp",
1429
+ attrId: "company-name-attr"
1430
+ }
1431
+ }
1432
+ ]
1433
+ },
1434
+ {
1435
+ id: "complex-nested-1-2",
1436
+ type: "condition",
1437
+ operators: "and",
1438
+ data: {
1439
+ logic: "is",
1440
+ value: "premium",
1441
+ attrId: "membership-level-attr"
1442
+ }
1443
+ }
1444
+ ]
1445
+ }
1446
+ ];
1447
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(true);
1448
+ });
1449
+ test("should handle empty group conditions", () => {
1450
+ const condition = [
1451
+ {
1452
+ id: "empty-group-1",
1453
+ type: "group",
1454
+ operators: "and",
1455
+ data: {},
1456
+ conditions: []
1457
+ }
1458
+ ];
1459
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
1460
+ });
1461
+ test("should handle group with undefined conditions", () => {
1462
+ const condition = [
1463
+ {
1464
+ id: "undefined-group-1",
1465
+ type: "group",
1466
+ operators: "and",
1467
+ data: {},
1468
+ conditions: void 0
1469
+ }
1470
+ ];
1471
+ expect(evaluateFilterConditions(condition, defaultOptions)).toBe(false);
1034
1472
  });
1035
1473
  });
1036
1474
  });