@adtrackify/at-service-common 3.18.19 → 3.19.1

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 (79) hide show
  1. package/dist/cjs/services/currency-exchange-rate-lookup-service.d.ts +1 -2
  2. package/dist/cjs/services/currency-exchange-rate-lookup-service.js +0 -28
  3. package/dist/cjs/services/currency-exchange-rate-lookup-service.js.map +1 -1
  4. package/dist/cjs/services/db/custom-measures-db-service.d.ts +10 -0
  5. package/dist/cjs/services/db/custom-measures-db-service.js +35 -0
  6. package/dist/cjs/services/db/custom-measures-db-service.js.map +1 -0
  7. package/dist/cjs/services/db/index.d.ts +1 -0
  8. package/dist/cjs/services/db/index.js +1 -0
  9. package/dist/cjs/services/db/index.js.map +1 -1
  10. package/dist/cjs/services/index.d.ts +0 -1
  11. package/dist/cjs/services/index.js +0 -1
  12. package/dist/cjs/services/index.js.map +1 -1
  13. package/dist/esm/services/currency-exchange-rate-lookup-service.d.ts +1 -2
  14. package/dist/esm/services/currency-exchange-rate-lookup-service.js +0 -28
  15. package/dist/esm/services/currency-exchange-rate-lookup-service.js.map +1 -1
  16. package/dist/esm/services/db/custom-measures-db-service.d.ts +10 -0
  17. package/dist/esm/services/db/custom-measures-db-service.js +31 -0
  18. package/dist/esm/services/db/custom-measures-db-service.js.map +1 -0
  19. package/dist/esm/services/db/index.d.ts +1 -0
  20. package/dist/esm/services/db/index.js +1 -0
  21. package/dist/esm/services/db/index.js.map +1 -1
  22. package/dist/esm/services/index.d.ts +0 -1
  23. package/dist/esm/services/index.js +0 -1
  24. package/dist/esm/services/index.js.map +1 -1
  25. package/package.json +2 -2
  26. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.d.ts +0 -1
  27. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.js +0 -3320
  28. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.js.map +0 -1
  29. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.d.ts +0 -1
  30. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.js +0 -115
  31. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.js.map +0 -1
  32. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.d.ts +0 -1
  33. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.js +0 -469
  34. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.js.map +0 -1
  35. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.d.ts +0 -1
  36. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.js +0 -35
  37. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.js.map +0 -1
  38. package/dist/cjs/services/cost/cost-calculation-types.d.ts +0 -69
  39. package/dist/cjs/services/cost/cost-calculation-types.js +0 -20
  40. package/dist/cjs/services/cost/cost-calculation-types.js.map +0 -1
  41. package/dist/cjs/services/cost/cost-calculator-service.d.ts +0 -24
  42. package/dist/cjs/services/cost/cost-calculator-service.js +0 -457
  43. package/dist/cjs/services/cost/cost-calculator-service.js.map +0 -1
  44. package/dist/cjs/services/cost/cost-currency-service.d.ts +0 -6
  45. package/dist/cjs/services/cost/cost-currency-service.js +0 -88
  46. package/dist/cjs/services/cost/cost-currency-service.js.map +0 -1
  47. package/dist/cjs/services/cost/cost-filter-service.d.ts +0 -10
  48. package/dist/cjs/services/cost/cost-filter-service.js +0 -122
  49. package/dist/cjs/services/cost/cost-filter-service.js.map +0 -1
  50. package/dist/cjs/services/cost/index.d.ts +0 -4
  51. package/dist/cjs/services/cost/index.js +0 -21
  52. package/dist/cjs/services/cost/index.js.map +0 -1
  53. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.d.ts +0 -1
  54. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.js +0 -3318
  55. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.js.map +0 -1
  56. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.d.ts +0 -1
  57. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.js +0 -113
  58. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.js.map +0 -1
  59. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.d.ts +0 -1
  60. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.js +0 -467
  61. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.js.map +0 -1
  62. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.d.ts +0 -1
  63. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.js +0 -33
  64. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.js.map +0 -1
  65. package/dist/esm/services/cost/cost-calculation-types.d.ts +0 -69
  66. package/dist/esm/services/cost/cost-calculation-types.js +0 -16
  67. package/dist/esm/services/cost/cost-calculation-types.js.map +0 -1
  68. package/dist/esm/services/cost/cost-calculator-service.d.ts +0 -24
  69. package/dist/esm/services/cost/cost-calculator-service.js +0 -451
  70. package/dist/esm/services/cost/cost-calculator-service.js.map +0 -1
  71. package/dist/esm/services/cost/cost-currency-service.d.ts +0 -6
  72. package/dist/esm/services/cost/cost-currency-service.js +0 -85
  73. package/dist/esm/services/cost/cost-currency-service.js.map +0 -1
  74. package/dist/esm/services/cost/cost-filter-service.d.ts +0 -10
  75. package/dist/esm/services/cost/cost-filter-service.js +0 -119
  76. package/dist/esm/services/cost/cost-filter-service.js.map +0 -1
  77. package/dist/esm/services/cost/index.d.ts +0 -4
  78. package/dist/esm/services/cost/index.js +0 -5
  79. package/dist/esm/services/cost/index.js.map +0 -1
@@ -1,467 +0,0 @@
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
@@ -1 +0,0 @@
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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"}
@@ -1,33 +0,0 @@
1
- jest.mock('../../services/db/currency-exchange-rates-db-service', () => ({
2
- CurrencyExchangeRatesDbService: jest.fn().mockImplementation(() => ({})),
3
- }));
4
- jest.mock('../../clients/third-party/exchange-rate-api-client', () => ({
5
- ExchangeRateApiClient: jest.fn().mockImplementation(() => ({})),
6
- }));
7
- import { CurrencyExchangeRateLookupService } from '../../services/currency-exchange-rate-lookup-service';
8
- const recordWithRates = (rates) => ({ rates });
9
- const buildService = () => new CurrencyExchangeRateLookupService('table', 'key', 'api-key', 1);
10
- describe('CurrencyExchangeRateLookupService.batchLookupCurrencyExchangeRatesMap', () => {
11
- it('returns an empty map for no currencies', async () => {
12
- const service = buildService();
13
- expect(await service.batchLookupCurrencyExchangeRatesMap([])).toEqual({});
14
- });
15
- it('builds a map keyed by upper-cased source currency', async () => {
16
- const service = buildService();
17
- jest.spyOn(service, 'lookupCurrencyExchangeRate').mockImplementation(async (currency) => recordWithRates({ USD: currency === 'eur' ? 1.1 : 0.8 }));
18
- const map = await service.batchLookupCurrencyExchangeRatesMap(['eur', 'gbp']);
19
- expect(map).toEqual({ EUR: { USD: 1.1 }, GBP: { USD: 0.8 } });
20
- });
21
- it('omits currencies that resolve to null', async () => {
22
- const service = buildService();
23
- jest.spyOn(service, 'lookupCurrencyExchangeRate').mockResolvedValue(null);
24
- expect(await service.batchLookupCurrencyExchangeRatesMap(['eur'])).toEqual({});
25
- });
26
- it('resolves across multiple batches', async () => {
27
- const service = buildService();
28
- jest.spyOn(service, 'lookupCurrencyExchangeRate').mockImplementation(async () => recordWithRates({ USD: 1 }));
29
- const map = await service.batchLookupCurrencyExchangeRatesMap(['a', 'b', 'c', 'd', 'e', 'f'], 2);
30
- expect(Object.keys(map).sort()).toEqual(['A', 'B', 'C', 'D', 'E', 'F']);
31
- });
32
- });
33
- //# sourceMappingURL=currency-exchange-rate-lookup-service.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"currency-exchange-rate-lookup-service.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/services/currency-exchange-rate-lookup-service.spec.ts"],"names":[],"mappings":"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"}