@adtrackify/at-service-common 4.0.3 → 4.0.5

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.
Files changed (125) hide show
  1. package/dist/cjs/__tests__/db/products-db-service.spec.d.ts +1 -0
  2. package/dist/cjs/__tests__/db/products-db-service.spec.js +90 -0
  3. package/dist/cjs/__tests__/db/products-db-service.spec.js.map +1 -0
  4. package/dist/cjs/__tests__/services/cost/cost-calculation-types.spec.d.ts +1 -0
  5. package/dist/cjs/__tests__/services/cost/cost-calculation-types.spec.js +24 -0
  6. package/dist/cjs/__tests__/services/cost/cost-calculation-types.spec.js.map +1 -0
  7. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.d.ts +1 -0
  8. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.js +3320 -0
  9. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.js.map +1 -0
  10. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.d.ts +1 -0
  11. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.js +115 -0
  12. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.js.map +1 -0
  13. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.d.ts +1 -0
  14. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.js +469 -0
  15. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.js.map +1 -0
  16. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.d.ts +1 -0
  17. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js +207 -0
  18. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js.map +1 -0
  19. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.d.ts +1 -0
  20. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.js +35 -0
  21. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.js.map +1 -0
  22. package/dist/cjs/services/cost/cost-calculation-types.d.ts +69 -0
  23. package/dist/cjs/services/cost/cost-calculation-types.js +20 -0
  24. package/dist/cjs/services/cost/cost-calculation-types.js.map +1 -0
  25. package/dist/cjs/services/cost/cost-calculator-service.d.ts +24 -0
  26. package/dist/cjs/services/cost/cost-calculator-service.js +457 -0
  27. package/dist/cjs/services/cost/cost-calculator-service.js.map +1 -0
  28. package/dist/cjs/services/cost/cost-currency-service.d.ts +6 -0
  29. package/dist/cjs/services/cost/cost-currency-service.js +88 -0
  30. package/dist/cjs/services/cost/cost-currency-service.js.map +1 -0
  31. package/dist/cjs/services/cost/cost-filter-service.d.ts +10 -0
  32. package/dist/cjs/services/cost/cost-filter-service.js +122 -0
  33. package/dist/cjs/services/cost/cost-filter-service.js.map +1 -0
  34. package/dist/cjs/services/cost/index.d.ts +5 -0
  35. package/dist/cjs/services/cost/index.js +22 -0
  36. package/dist/cjs/services/cost/index.js.map +1 -0
  37. package/dist/cjs/services/cost/order-cost/index.d.ts +2 -0
  38. package/dist/cjs/services/cost/order-cost/index.js +19 -0
  39. package/dist/cjs/services/cost/order-cost/index.js.map +1 -0
  40. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.d.ts +23 -0
  41. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.js +362 -0
  42. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.js.map +1 -0
  43. package/dist/cjs/services/cost/order-cost/order-cost-resolution-types.d.ts +37 -0
  44. package/dist/cjs/services/cost/order-cost/order-cost-resolution-types.js +3 -0
  45. package/dist/cjs/services/cost/order-cost/order-cost-resolution-types.js.map +1 -0
  46. package/dist/cjs/services/currency-exchange-rate-lookup-service.d.ts +2 -1
  47. package/dist/cjs/services/currency-exchange-rate-lookup-service.js +28 -0
  48. package/dist/cjs/services/currency-exchange-rate-lookup-service.js.map +1 -1
  49. package/dist/cjs/services/db/identity-cache-dynamodb-service.js +1 -1
  50. package/dist/cjs/services/db/identity-cache-dynamodb-service.js.map +1 -1
  51. package/dist/cjs/services/db/index.d.ts +2 -0
  52. package/dist/cjs/services/db/index.js +2 -0
  53. package/dist/cjs/services/db/index.js.map +1 -1
  54. package/dist/cjs/services/db/products-db-service-types.d.ts +10 -0
  55. package/dist/cjs/services/db/products-db-service-types.js +3 -0
  56. package/dist/cjs/services/db/products-db-service-types.js.map +1 -0
  57. package/dist/cjs/services/db/products-db-service.d.ts +19 -0
  58. package/dist/cjs/services/db/products-db-service.js +282 -0
  59. package/dist/cjs/services/db/products-db-service.js.map +1 -0
  60. package/dist/cjs/services/index.d.ts +1 -0
  61. package/dist/cjs/services/index.js +1 -0
  62. package/dist/cjs/services/index.js.map +1 -1
  63. package/dist/esm/__tests__/db/products-db-service.spec.d.ts +1 -0
  64. package/dist/esm/__tests__/db/products-db-service.spec.js +88 -0
  65. package/dist/esm/__tests__/db/products-db-service.spec.js.map +1 -0
  66. package/dist/esm/__tests__/services/cost/cost-calculation-types.spec.d.ts +1 -0
  67. package/dist/esm/__tests__/services/cost/cost-calculation-types.spec.js +22 -0
  68. package/dist/esm/__tests__/services/cost/cost-calculation-types.spec.js.map +1 -0
  69. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.d.ts +1 -0
  70. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.js +3318 -0
  71. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.js.map +1 -0
  72. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.d.ts +1 -0
  73. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.js +113 -0
  74. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.js.map +1 -0
  75. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.d.ts +1 -0
  76. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.js +467 -0
  77. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.js.map +1 -0
  78. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.d.ts +1 -0
  79. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js +205 -0
  80. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js.map +1 -0
  81. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.d.ts +1 -0
  82. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.js +33 -0
  83. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.js.map +1 -0
  84. package/dist/esm/services/cost/cost-calculation-types.d.ts +69 -0
  85. package/dist/esm/services/cost/cost-calculation-types.js +16 -0
  86. package/dist/esm/services/cost/cost-calculation-types.js.map +1 -0
  87. package/dist/esm/services/cost/cost-calculator-service.d.ts +24 -0
  88. package/dist/esm/services/cost/cost-calculator-service.js +451 -0
  89. package/dist/esm/services/cost/cost-calculator-service.js.map +1 -0
  90. package/dist/esm/services/cost/cost-currency-service.d.ts +6 -0
  91. package/dist/esm/services/cost/cost-currency-service.js +85 -0
  92. package/dist/esm/services/cost/cost-currency-service.js.map +1 -0
  93. package/dist/esm/services/cost/cost-filter-service.d.ts +10 -0
  94. package/dist/esm/services/cost/cost-filter-service.js +119 -0
  95. package/dist/esm/services/cost/cost-filter-service.js.map +1 -0
  96. package/dist/esm/services/cost/index.d.ts +5 -0
  97. package/dist/esm/services/cost/index.js +6 -0
  98. package/dist/esm/services/cost/index.js.map +1 -0
  99. package/dist/esm/services/cost/order-cost/index.d.ts +2 -0
  100. package/dist/esm/services/cost/order-cost/index.js +3 -0
  101. package/dist/esm/services/cost/order-cost/index.js.map +1 -0
  102. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.d.ts +23 -0
  103. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.js +356 -0
  104. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.js.map +1 -0
  105. package/dist/esm/services/cost/order-cost/order-cost-resolution-types.d.ts +37 -0
  106. package/dist/esm/services/cost/order-cost/order-cost-resolution-types.js +2 -0
  107. package/dist/esm/services/cost/order-cost/order-cost-resolution-types.js.map +1 -0
  108. package/dist/esm/services/currency-exchange-rate-lookup-service.d.ts +2 -1
  109. package/dist/esm/services/currency-exchange-rate-lookup-service.js +28 -0
  110. package/dist/esm/services/currency-exchange-rate-lookup-service.js.map +1 -1
  111. package/dist/esm/services/db/identity-cache-dynamodb-service.js +1 -1
  112. package/dist/esm/services/db/identity-cache-dynamodb-service.js.map +1 -1
  113. package/dist/esm/services/db/index.d.ts +2 -0
  114. package/dist/esm/services/db/index.js +2 -0
  115. package/dist/esm/services/db/index.js.map +1 -1
  116. package/dist/esm/services/db/products-db-service-types.d.ts +10 -0
  117. package/dist/esm/services/db/products-db-service-types.js +2 -0
  118. package/dist/esm/services/db/products-db-service-types.js.map +1 -0
  119. package/dist/esm/services/db/products-db-service.d.ts +19 -0
  120. package/dist/esm/services/db/products-db-service.js +278 -0
  121. package/dist/esm/services/db/products-db-service.js.map +1 -0
  122. package/dist/esm/services/index.d.ts +1 -0
  123. package/dist/esm/services/index.js +1 -0
  124. package/dist/esm/services/index.js.map +1 -1
  125. package/package.json +1 -1
@@ -0,0 +1,467 @@
1
+ import { COST_FILTER_MODE } from '@adtrackify/at-tracking-event-types';
2
+ import { CostFilterService } from '../../../services/cost/cost-filter-service';
3
+ jest.mock('../../../helpers/logging-helper', () => ({
4
+ Logger: { debug: jest.fn(), info: jest.fn(), warn: jest.fn(), error: jest.fn() },
5
+ }));
6
+ const createOrderContext = (overrides = {}) => ({
7
+ tags: [],
8
+ paymentGateways: [],
9
+ shippingTitles: [],
10
+ ...overrides,
11
+ });
12
+ const createLineItemContext = (overrides = {}) => ({
13
+ tags: [],
14
+ productId: '123',
15
+ variantId: '456',
16
+ ...overrides,
17
+ });
18
+ describe('CostFilterService', () => {
19
+ describe('matchSingleFilter', () => {
20
+ it('should return true for ALL mode regardless of value', () => {
21
+ const filter = { mode: COST_FILTER_MODE.ALL, values: ['a'] };
22
+ expect(CostFilterService.matchSingleFilter(filter, 'anything')).toBe(true);
23
+ expect(CostFilterService.matchSingleFilter(filter, undefined)).toBe(true);
24
+ });
25
+ it('should return true for INCLUDE when value matches', () => {
26
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['stripe', 'paypal'] };
27
+ expect(CostFilterService.matchSingleFilter(filter, 'stripe')).toBe(true);
28
+ });
29
+ it('should return false for INCLUDE when value does not match', () => {
30
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['stripe', 'paypal'] };
31
+ expect(CostFilterService.matchSingleFilter(filter, 'braintree')).toBe(false);
32
+ });
33
+ it('should return false for INCLUDE when value is undefined', () => {
34
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['stripe'] };
35
+ expect(CostFilterService.matchSingleFilter(filter, undefined)).toBe(false);
36
+ });
37
+ it('should return true for EXCLUDE when value does not match', () => {
38
+ const filter = { mode: COST_FILTER_MODE.EXCLUDE, values: ['stripe'] };
39
+ expect(CostFilterService.matchSingleFilter(filter, 'paypal')).toBe(true);
40
+ });
41
+ it('should return false for EXCLUDE when value matches', () => {
42
+ const filter = { mode: COST_FILTER_MODE.EXCLUDE, values: ['stripe'] };
43
+ expect(CostFilterService.matchSingleFilter(filter, 'stripe')).toBe(false);
44
+ });
45
+ it('should return true for EXCLUDE when value is undefined', () => {
46
+ const filter = { mode: COST_FILTER_MODE.EXCLUDE, values: ['stripe'] };
47
+ expect(CostFilterService.matchSingleFilter(filter, undefined)).toBe(true);
48
+ });
49
+ it('should be case-insensitive', () => {
50
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['Stripe'] };
51
+ expect(CostFilterService.matchSingleFilter(filter, 'STRIPE')).toBe(true);
52
+ expect(CostFilterService.matchSingleFilter(filter, 'stripe')).toBe(true);
53
+ });
54
+ });
55
+ describe('matchArrayFilter', () => {
56
+ it('should return true for ALL mode', () => {
57
+ const filter = { mode: COST_FILTER_MODE.ALL, values: ['a'] };
58
+ expect(CostFilterService.matchArrayFilter(filter, ['anything'])).toBe(true);
59
+ expect(CostFilterService.matchArrayFilter(filter, undefined)).toBe(true);
60
+ });
61
+ it('should return true for INCLUDE when any value matches', () => {
62
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['vip', 'priority'] };
63
+ expect(CostFilterService.matchArrayFilter(filter, ['vip', 'other'])).toBe(true);
64
+ });
65
+ it('should return false for INCLUDE when no value matches', () => {
66
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['vip', 'priority'] };
67
+ expect(CostFilterService.matchArrayFilter(filter, ['regular', 'other'])).toBe(false);
68
+ });
69
+ it('should return false for INCLUDE when values is empty', () => {
70
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['vip'] };
71
+ expect(CostFilterService.matchArrayFilter(filter, [])).toBe(false);
72
+ });
73
+ it('should return false for INCLUDE when values is undefined', () => {
74
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['vip'] };
75
+ expect(CostFilterService.matchArrayFilter(filter, undefined)).toBe(false);
76
+ });
77
+ it('should return true for EXCLUDE when no value matches', () => {
78
+ const filter = { mode: COST_FILTER_MODE.EXCLUDE, values: ['vip'] };
79
+ expect(CostFilterService.matchArrayFilter(filter, ['regular'])).toBe(true);
80
+ });
81
+ it('should return false for EXCLUDE when any value matches', () => {
82
+ const filter = { mode: COST_FILTER_MODE.EXCLUDE, values: ['vip'] };
83
+ expect(CostFilterService.matchArrayFilter(filter, ['vip', 'regular'])).toBe(false);
84
+ });
85
+ it('should return true for EXCLUDE when values is empty', () => {
86
+ const filter = { mode: COST_FILTER_MODE.EXCLUDE, values: ['vip'] };
87
+ expect(CostFilterService.matchArrayFilter(filter, [])).toBe(true);
88
+ });
89
+ it('should return true for EXCLUDE when values is undefined', () => {
90
+ const filter = { mode: COST_FILTER_MODE.EXCLUDE, values: ['vip'] };
91
+ expect(CostFilterService.matchArrayFilter(filter, undefined)).toBe(true);
92
+ });
93
+ it('should be case-insensitive', () => {
94
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['VIP'] };
95
+ expect(CostFilterService.matchArrayFilter(filter, ['vip'])).toBe(true);
96
+ });
97
+ });
98
+ describe('matchProductFilter', () => {
99
+ it('should return true for ALL mode', () => {
100
+ const filter = { mode: COST_FILTER_MODE.ALL, values: ['123'] };
101
+ expect(CostFilterService.matchProductFilter(filter, '999', '888')).toBe(true);
102
+ });
103
+ it('should match by productId only', () => {
104
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['123'] };
105
+ expect(CostFilterService.matchProductFilter(filter, '123', '456')).toBe(true);
106
+ });
107
+ it('should match by productId_variantId', () => {
108
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['123_456'] };
109
+ expect(CostFilterService.matchProductFilter(filter, '123', '456')).toBe(true);
110
+ });
111
+ it('should not match wrong productId_variantId', () => {
112
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['123_789'] };
113
+ expect(CostFilterService.matchProductFilter(filter, '123', '456')).toBe(false);
114
+ });
115
+ it('should return false for INCLUDE when productId is empty', () => {
116
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['123'] };
117
+ expect(CostFilterService.matchProductFilter(filter, '', '456')).toBe(false);
118
+ });
119
+ it('should return true for EXCLUDE when productId is empty', () => {
120
+ const filter = { mode: COST_FILTER_MODE.EXCLUDE, values: ['123'] };
121
+ expect(CostFilterService.matchProductFilter(filter, '', '456')).toBe(true);
122
+ });
123
+ it('should return true for EXCLUDE when product does not match', () => {
124
+ const filter = { mode: COST_FILTER_MODE.EXCLUDE, values: ['123'] };
125
+ expect(CostFilterService.matchProductFilter(filter, '999', '456')).toBe(true);
126
+ });
127
+ it('should return false for EXCLUDE when product matches', () => {
128
+ const filter = { mode: COST_FILTER_MODE.EXCLUDE, values: ['123'] };
129
+ expect(CostFilterService.matchProductFilter(filter, '123', '456')).toBe(false);
130
+ });
131
+ it('should handle mixed productId and productId_variantId filter values', () => {
132
+ const filter = { mode: COST_FILTER_MODE.INCLUDE, values: ['100', '200_300'] };
133
+ expect(CostFilterService.matchProductFilter(filter, '100', '999')).toBe(true);
134
+ expect(CostFilterService.matchProductFilter(filter, '200', '300')).toBe(true);
135
+ expect(CostFilterService.matchProductFilter(filter, '200', '999')).toBe(false);
136
+ });
137
+ });
138
+ describe('matchesFilters', () => {
139
+ it('should return true when filters is undefined', () => {
140
+ expect(CostFilterService.matchesFilters(undefined, createOrderContext(), null)).toBe(true);
141
+ });
142
+ it('should return true when filters is empty object', () => {
143
+ expect(CostFilterService.matchesFilters({}, createOrderContext(), null)).toBe(true);
144
+ });
145
+ it('should check orderTags filter', () => {
146
+ const filters = {
147
+ orderTags: { mode: COST_FILTER_MODE.INCLUDE, values: ['vip'] },
148
+ };
149
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ tags: ['vip', 'sale'] }), null)).toBe(true);
150
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ tags: ['regular'] }), null)).toBe(false);
151
+ });
152
+ it('should check orderSourceNames filter', () => {
153
+ const filters = {
154
+ orderSourceNames: { mode: COST_FILTER_MODE.INCLUDE, values: ['web'] },
155
+ };
156
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ sourceName: 'web' }), null)).toBe(true);
157
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ sourceName: 'pos' }), null)).toBe(false);
158
+ });
159
+ it('should check orderPaymentGateways filter', () => {
160
+ const filters = {
161
+ orderPaymentGateways: { mode: COST_FILTER_MODE.INCLUDE, values: ['stripe'] },
162
+ };
163
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ paymentGateways: ['stripe', 'shop_pay'] }), null)).toBe(true);
164
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ paymentGateways: ['paypal'] }), null)).toBe(false);
165
+ });
166
+ it('should check orderShippingTitles filter', () => {
167
+ const filters = {
168
+ orderShippingTitles: { mode: COST_FILTER_MODE.INCLUDE, values: ['Standard'] },
169
+ };
170
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shippingTitles: ['Standard'] }), null)).toBe(true);
171
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shippingTitles: ['Express'] }), null)).toBe(false);
172
+ });
173
+ it('should check countries filter', () => {
174
+ const filters = {
175
+ countries: { mode: COST_FILTER_MODE.INCLUDE, values: ['US', 'CA'] },
176
+ };
177
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'US' }), null)).toBe(true);
178
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'GB' }), null)).toBe(false);
179
+ });
180
+ it('should use AND logic between multiple order filters', () => {
181
+ const filters = {
182
+ orderTags: { mode: COST_FILTER_MODE.INCLUDE, values: ['vip'] },
183
+ countries: { mode: COST_FILTER_MODE.INCLUDE, values: ['US'] },
184
+ };
185
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ tags: ['vip'], shipCountryCode: 'US' }), null)).toBe(true);
186
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ tags: ['vip'], shipCountryCode: 'GB' }), null)).toBe(false);
187
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ tags: ['regular'], shipCountryCode: 'US' }), null)).toBe(false);
188
+ });
189
+ it('should skip product filters when lineItem is null and no lineItems array provided', () => {
190
+ const filters = {
191
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
192
+ };
193
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null)).toBe(true);
194
+ });
195
+ it('should check productVendors filter', () => {
196
+ const filters = {
197
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
198
+ };
199
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), createLineItemContext({ vendor: 'Nike' }))).toBe(true);
200
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), createLineItemContext({ vendor: 'Adidas' }))).toBe(false);
201
+ });
202
+ it('should check productTypes filter', () => {
203
+ const filters = {
204
+ productTypes: { mode: COST_FILTER_MODE.INCLUDE, values: ['Shoes'] },
205
+ };
206
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), createLineItemContext({ productType: 'Shoes' }))).toBe(true);
207
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), createLineItemContext({ productType: 'Hats' }))).toBe(false);
208
+ });
209
+ it('should check productTags filter', () => {
210
+ const filters = {
211
+ productTags: { mode: COST_FILTER_MODE.INCLUDE, values: ['sale'] },
212
+ };
213
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), createLineItemContext({ tags: ['sale', 'new'] }))).toBe(true);
214
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), createLineItemContext({ tags: ['clearance'] }))).toBe(false);
215
+ });
216
+ it('should check productCategories filter', () => {
217
+ const filters = {
218
+ productCategories: { mode: COST_FILTER_MODE.INCLUDE, values: ['Apparel > Shoes'] },
219
+ };
220
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), createLineItemContext({ category: 'Apparel > Shoes' }))).toBe(true);
221
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), createLineItemContext({ category: 'Electronics' }))).toBe(false);
222
+ });
223
+ it('should check products filter', () => {
224
+ const filters = {
225
+ products: { mode: COST_FILTER_MODE.INCLUDE, values: ['123'] },
226
+ };
227
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), createLineItemContext({ productId: '123', variantId: '456' }))).toBe(true);
228
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), createLineItemContext({ productId: '999', variantId: '456' }))).toBe(false);
229
+ });
230
+ it('should require both order and line-item filters to pass', () => {
231
+ const filters = {
232
+ countries: { mode: COST_FILTER_MODE.INCLUDE, values: ['US'] },
233
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
234
+ };
235
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'US' }), createLineItemContext({ vendor: 'Nike' }))).toBe(true);
236
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'US' }), createLineItemContext({ vendor: 'Adidas' }))).toBe(false);
237
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'GB' }), createLineItemContext({ vendor: 'Nike' }))).toBe(false);
238
+ });
239
+ it('should handle all 5 order + all 5 line-item filters passing', () => {
240
+ const filters = {
241
+ orderTags: { mode: COST_FILTER_MODE.INCLUDE, values: ['vip'] },
242
+ orderSourceNames: { mode: COST_FILTER_MODE.INCLUDE, values: ['web'] },
243
+ orderPaymentGateways: { mode: COST_FILTER_MODE.INCLUDE, values: ['stripe'] },
244
+ orderShippingTitles: { mode: COST_FILTER_MODE.INCLUDE, values: ['Standard'] },
245
+ countries: { mode: COST_FILTER_MODE.INCLUDE, values: ['US'] },
246
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
247
+ productTypes: { mode: COST_FILTER_MODE.INCLUDE, values: ['Shoes'] },
248
+ productTags: { mode: COST_FILTER_MODE.INCLUDE, values: ['sale'] },
249
+ productCategories: { mode: COST_FILTER_MODE.INCLUDE, values: ['Apparel'] },
250
+ products: { mode: COST_FILTER_MODE.INCLUDE, values: ['123'] },
251
+ };
252
+ const order = createOrderContext({
253
+ tags: ['vip'],
254
+ sourceName: 'web',
255
+ paymentGateways: ['stripe'],
256
+ shippingTitles: ['Standard'],
257
+ shipCountryCode: 'US',
258
+ });
259
+ const lineItem = createLineItemContext({
260
+ vendor: 'Nike',
261
+ productType: 'Shoes',
262
+ tags: ['sale'],
263
+ category: 'Apparel',
264
+ productId: '123',
265
+ variantId: '456',
266
+ });
267
+ expect(CostFilterService.matchesFilters(filters, order, lineItem)).toBe(true);
268
+ });
269
+ it('should handle EXCLUDE mode for order tags', () => {
270
+ const filters = {
271
+ orderTags: { mode: COST_FILTER_MODE.EXCLUDE, values: ['test'] },
272
+ };
273
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ tags: ['vip'] }), null)).toBe(true);
274
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ tags: ['test'] }), null)).toBe(false);
275
+ });
276
+ it('should handle mixed INCLUDE and EXCLUDE filters', () => {
277
+ const filters = {
278
+ countries: { mode: COST_FILTER_MODE.INCLUDE, values: ['US'] },
279
+ orderTags: { mode: COST_FILTER_MODE.EXCLUDE, values: ['test'] },
280
+ };
281
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'US', tags: ['vip'] }), null)).toBe(true);
282
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'US', tags: ['test'] }), null)).toBe(false);
283
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'GB', tags: ['vip'] }), null)).toBe(false);
284
+ });
285
+ it('should evaluate product filters against lineItems array when lineItem is null', () => {
286
+ const filters = {
287
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
288
+ };
289
+ const lineItems = [
290
+ createLineItemContext({ vendor: 'Adidas' }),
291
+ createLineItemContext({ vendor: 'Nike' }),
292
+ ];
293
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, lineItems)).toBe(true);
294
+ });
295
+ it('should return false when no lineItem matches product filters via lineItems array', () => {
296
+ const filters = {
297
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
298
+ };
299
+ const lineItems = [
300
+ createLineItemContext({ vendor: 'Adidas' }),
301
+ createLineItemContext({ vendor: 'Puma' }),
302
+ ];
303
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, lineItems)).toBe(false);
304
+ });
305
+ it('should evaluate products filter against lineItems array', () => {
306
+ const filters = {
307
+ products: { mode: COST_FILTER_MODE.INCLUDE, values: ['P100'] },
308
+ };
309
+ const matching = [createLineItemContext({ productId: 'P100', variantId: 'V1' })];
310
+ const nonMatching = [createLineItemContext({ productId: 'P999', variantId: 'V1' })];
311
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, matching)).toBe(true);
312
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, nonMatching)).toBe(false);
313
+ });
314
+ it('should evaluate productTags filter against lineItems array', () => {
315
+ const filters = {
316
+ productTags: { mode: COST_FILTER_MODE.INCLUDE, values: ['fragile'] },
317
+ };
318
+ const matching = [createLineItemContext({ tags: ['fragile', 'heavy'] })];
319
+ const nonMatching = [createLineItemContext({ tags: ['lightweight'] })];
320
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, matching)).toBe(true);
321
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, nonMatching)).toBe(false);
322
+ });
323
+ it('should evaluate productTypes filter against lineItems array', () => {
324
+ const filters = {
325
+ productTypes: { mode: COST_FILTER_MODE.INCLUDE, values: ['Electronics'] },
326
+ };
327
+ const matching = [createLineItemContext({ productType: 'Electronics' })];
328
+ const nonMatching = [createLineItemContext({ productType: 'Clothing' })];
329
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, matching)).toBe(true);
330
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, nonMatching)).toBe(false);
331
+ });
332
+ it('should evaluate productCategories filter against lineItems array', () => {
333
+ const filters = {
334
+ productCategories: { mode: COST_FILTER_MODE.INCLUDE, values: ['Home > Kitchen'] },
335
+ };
336
+ const matching = [createLineItemContext({ category: 'Home > Kitchen' })];
337
+ const nonMatching = [createLineItemContext({ category: 'Sports' })];
338
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, matching)).toBe(true);
339
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, nonMatching)).toBe(false);
340
+ });
341
+ it('should evaluate EXCLUDE product filters against lineItems array', () => {
342
+ const filters = {
343
+ productVendors: { mode: COST_FILTER_MODE.EXCLUDE, values: ['Nike'] },
344
+ };
345
+ const mixed = [
346
+ createLineItemContext({ vendor: 'Adidas' }),
347
+ createLineItemContext({ vendor: 'Nike' }),
348
+ ];
349
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, mixed)).toBe(true);
350
+ const allNike = [
351
+ createLineItemContext({ vendor: 'Nike' }),
352
+ createLineItemContext({ vendor: 'Nike' }),
353
+ ];
354
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, allNike)).toBe(false);
355
+ });
356
+ it('should combine order filters + product filters via lineItems array', () => {
357
+ const filters = {
358
+ countries: { mode: COST_FILTER_MODE.INCLUDE, values: ['US'] },
359
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
360
+ };
361
+ const lineItems = [createLineItemContext({ vendor: 'Nike' })];
362
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'US' }), null, lineItems)).toBe(true);
363
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'GB' }), null, lineItems)).toBe(false);
364
+ const noMatch = [createLineItemContext({ vendor: 'Adidas' })];
365
+ expect(CostFilterService.matchesFilters(filters, createOrderContext({ shipCountryCode: 'US' }), null, noMatch)).toBe(false);
366
+ });
367
+ it('should combine multiple product filters with AND logic via lineItems array', () => {
368
+ const filters = {
369
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
370
+ productTypes: { mode: COST_FILTER_MODE.INCLUDE, values: ['Shoes'] },
371
+ };
372
+ const bothMatch = [createLineItemContext({ vendor: 'Nike', productType: 'Shoes' })];
373
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, bothMatch)).toBe(true);
374
+ const partialMatch = [createLineItemContext({ vendor: 'Nike', productType: 'Hats' })];
375
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, partialMatch)).toBe(false);
376
+ const mixed = [
377
+ createLineItemContext({ vendor: 'Adidas', productType: 'Hats' }),
378
+ createLineItemContext({ vendor: 'Nike', productType: 'Shoes' }),
379
+ ];
380
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, mixed)).toBe(true);
381
+ });
382
+ it('should return true when lineItems array is empty and product filters exist', () => {
383
+ const filters = {
384
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
385
+ };
386
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), null, [])).toBe(true);
387
+ });
388
+ it('should not use lineItems array when lineItem is provided (single lineItem takes precedence)', () => {
389
+ const filters = {
390
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
391
+ };
392
+ const lineItem = createLineItemContext({ vendor: 'Adidas' });
393
+ const lineItems = [createLineItemContext({ vendor: 'Nike' })];
394
+ expect(CostFilterService.matchesFilters(filters, createOrderContext(), lineItem, lineItems)).toBe(false);
395
+ });
396
+ });
397
+ describe('hasProductFilters', () => {
398
+ it('should return false for undefined filters', () => {
399
+ expect(CostFilterService.hasProductFilters(undefined)).toBe(false);
400
+ });
401
+ it('should return false for empty filters', () => {
402
+ expect(CostFilterService.hasProductFilters({})).toBe(false);
403
+ });
404
+ it('should return false for order-only filters', () => {
405
+ const filters = {
406
+ orderTags: { mode: COST_FILTER_MODE.INCLUDE, values: ['vip'] },
407
+ countries: { mode: COST_FILTER_MODE.INCLUDE, values: ['US'] },
408
+ };
409
+ expect(CostFilterService.hasProductFilters(filters)).toBe(false);
410
+ });
411
+ it('should return true for productVendors', () => {
412
+ expect(CostFilterService.hasProductFilters({ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] } })).toBe(true);
413
+ });
414
+ it('should return true for productTypes', () => {
415
+ expect(CostFilterService.hasProductFilters({ productTypes: { mode: COST_FILTER_MODE.INCLUDE, values: ['Shoes'] } })).toBe(true);
416
+ });
417
+ it('should return true for productTags', () => {
418
+ expect(CostFilterService.hasProductFilters({ productTags: { mode: COST_FILTER_MODE.INCLUDE, values: ['sale'] } })).toBe(true);
419
+ });
420
+ it('should return true for productCategories', () => {
421
+ expect(CostFilterService.hasProductFilters({ productCategories: { mode: COST_FILTER_MODE.INCLUDE, values: ['Apparel'] } })).toBe(true);
422
+ });
423
+ it('should return true for products', () => {
424
+ expect(CostFilterService.hasProductFilters({ products: { mode: COST_FILTER_MODE.INCLUDE, values: ['123'] } })).toBe(true);
425
+ });
426
+ });
427
+ describe('matchLineItemFilters', () => {
428
+ it('should return true when no product filters defined', () => {
429
+ expect(CostFilterService.matchLineItemFilters({}, createLineItemContext())).toBe(true);
430
+ });
431
+ it('should check productVendors', () => {
432
+ const filters = { productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] } };
433
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ vendor: 'Nike' }))).toBe(true);
434
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ vendor: 'Adidas' }))).toBe(false);
435
+ });
436
+ it('should check productTypes', () => {
437
+ const filters = { productTypes: { mode: COST_FILTER_MODE.INCLUDE, values: ['Shoes'] } };
438
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ productType: 'Shoes' }))).toBe(true);
439
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ productType: 'Hats' }))).toBe(false);
440
+ });
441
+ it('should check productTags', () => {
442
+ const filters = { productTags: { mode: COST_FILTER_MODE.INCLUDE, values: ['sale'] } };
443
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ tags: ['sale'] }))).toBe(true);
444
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ tags: ['clearance'] }))).toBe(false);
445
+ });
446
+ it('should check productCategories', () => {
447
+ const filters = { productCategories: { mode: COST_FILTER_MODE.INCLUDE, values: ['Apparel'] } };
448
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ category: 'Apparel' }))).toBe(true);
449
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ category: 'Electronics' }))).toBe(false);
450
+ });
451
+ it('should check products', () => {
452
+ const filters = { products: { mode: COST_FILTER_MODE.INCLUDE, values: ['123'] } };
453
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ productId: '123' }))).toBe(true);
454
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ productId: '999' }))).toBe(false);
455
+ });
456
+ it('should use AND logic across all product filters', () => {
457
+ const filters = {
458
+ productVendors: { mode: COST_FILTER_MODE.INCLUDE, values: ['Nike'] },
459
+ productTypes: { mode: COST_FILTER_MODE.INCLUDE, values: ['Shoes'] },
460
+ productTags: { mode: COST_FILTER_MODE.INCLUDE, values: ['sale'] },
461
+ };
462
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ vendor: 'Nike', productType: 'Shoes', tags: ['sale'] }))).toBe(true);
463
+ expect(CostFilterService.matchLineItemFilters(filters, createLineItemContext({ vendor: 'Nike', productType: 'Hats', tags: ['sale'] }))).toBe(false);
464
+ });
465
+ });
466
+ });
467
+ //# sourceMappingURL=cost-filter-service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-filter-service.spec.js","sourceRoot":"","sources":["../../../../../src/__tests__/services/cost/cost-filter-service.spec.ts"],"names":[],"mappings":"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"}