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