@bash-app/bash-common 30.116.0 → 30.118.0
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.
- package/dist/extendedSchemas.d.ts +54 -0
- package/dist/extendedSchemas.d.ts.map +1 -1
- package/dist/extendedSchemas.js +10 -1
- package/dist/extendedSchemas.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/__tests__/paymentUtils.test.d.ts +6 -0
- package/dist/utils/__tests__/paymentUtils.test.d.ts.map +1 -0
- package/dist/utils/__tests__/paymentUtils.test.js +77 -0
- package/dist/utils/__tests__/paymentUtils.test.js.map +1 -0
- package/dist/utils/discountEngine/__tests__/bestPriceResolver.test.d.ts +2 -0
- package/dist/utils/discountEngine/__tests__/bestPriceResolver.test.d.ts.map +1 -0
- package/dist/utils/discountEngine/__tests__/bestPriceResolver.test.js +457 -0
- package/dist/utils/discountEngine/__tests__/bestPriceResolver.test.js.map +1 -0
- package/dist/utils/discountEngine/__tests__/eligibilityValidator.test.d.ts +2 -0
- package/dist/utils/discountEngine/__tests__/eligibilityValidator.test.d.ts.map +1 -0
- package/dist/utils/discountEngine/__tests__/eligibilityValidator.test.js +480 -0
- package/dist/utils/discountEngine/__tests__/eligibilityValidator.test.js.map +1 -0
- package/package.json +2 -2
- package/prisma/COMPREHENSIVE-MIGRATION-README.md +295 -0
- package/prisma/MIGRATION-FILES-GUIDE.md +76 -0
- package/prisma/comprehensive-migration-20260120.sql +5751 -0
- package/prisma/delta-migration-20260120.sql +302 -0
- package/prisma/schema.prisma +253 -13
- package/prisma/verify-migration.sql +132 -0
- package/src/extendedSchemas.ts +10 -1
- package/src/index.ts +4 -0
- package/src/utils/__tests__/paymentUtils.test.ts +95 -0
- package/src/utils/discountEngine/__tests__/bestPriceResolver.test.ts +558 -0
- package/src/utils/discountEngine/__tests__/eligibilityValidator.test.ts +655 -0
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { validatePromoCodeEligibility, validateOfferEligibility, validateOfferStacking, validateLoyaltyRequirements, validateMultipleOffers, getTimeRemaining, } from "../eligibilityValidator";
|
|
2
|
+
import { SpecialOfferType } from "@prisma/client";
|
|
3
|
+
describe("eligibilityValidator", () => {
|
|
4
|
+
describe("validatePromoCodeEligibility", () => {
|
|
5
|
+
const mockPromoCode = {
|
|
6
|
+
id: "promo-1",
|
|
7
|
+
code: "SUMMER20",
|
|
8
|
+
bashEventId: "event-1",
|
|
9
|
+
discountAmountPercentage: 20,
|
|
10
|
+
discountAmountInCents: null,
|
|
11
|
+
maxRedemptions: null,
|
|
12
|
+
redeemBy: null,
|
|
13
|
+
promoterId: null,
|
|
14
|
+
createdAt: new Date(),
|
|
15
|
+
updatedAt: new Date(),
|
|
16
|
+
};
|
|
17
|
+
it("should allow eligible promo code", () => {
|
|
18
|
+
const result = validatePromoCodeEligibility(mockPromoCode, "user-1", []);
|
|
19
|
+
expect(result.eligible).toBe(true);
|
|
20
|
+
expect(result.reason).toBeUndefined();
|
|
21
|
+
});
|
|
22
|
+
it("should reject expired promo code", () => {
|
|
23
|
+
const expiredPromo = {
|
|
24
|
+
...mockPromoCode,
|
|
25
|
+
redeemBy: new Date("2020-01-01"), // Past date
|
|
26
|
+
};
|
|
27
|
+
const result = validatePromoCodeEligibility(expiredPromo, "user-1", []);
|
|
28
|
+
expect(result.eligible).toBe(false);
|
|
29
|
+
expect(result.reason).toContain("expired");
|
|
30
|
+
});
|
|
31
|
+
it("should reject when max redemptions reached", () => {
|
|
32
|
+
const limitedPromo = {
|
|
33
|
+
...mockPromoCode,
|
|
34
|
+
maxRedemptions: 10,
|
|
35
|
+
};
|
|
36
|
+
const usedBy = Array.from({ length: 10 }, (_, i) => `user-${i}`);
|
|
37
|
+
const result = validatePromoCodeEligibility(limitedPromo, "user-11", usedBy);
|
|
38
|
+
expect(result.eligible).toBe(false);
|
|
39
|
+
expect(result.reason).toContain("maximum number of uses");
|
|
40
|
+
});
|
|
41
|
+
it("should allow when under max redemptions", () => {
|
|
42
|
+
const limitedPromo = {
|
|
43
|
+
...mockPromoCode,
|
|
44
|
+
maxRedemptions: 10,
|
|
45
|
+
};
|
|
46
|
+
const usedBy = ["user-1", "user-2"];
|
|
47
|
+
const result = validatePromoCodeEligibility(limitedPromo, "user-3", usedBy);
|
|
48
|
+
expect(result.eligible).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
it("should reject if user already used code", () => {
|
|
51
|
+
const usedBy = ["user-1", "user-2", "user-3"];
|
|
52
|
+
const result = validatePromoCodeEligibility(mockPromoCode, "user-2", usedBy);
|
|
53
|
+
expect(result.eligible).toBe(false);
|
|
54
|
+
expect(result.reason).toContain("already used");
|
|
55
|
+
});
|
|
56
|
+
it("should handle empty users list", () => {
|
|
57
|
+
const result = validatePromoCodeEligibility(mockPromoCode, "user-1", []);
|
|
58
|
+
expect(result.eligible).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it("should handle future expiry date", () => {
|
|
61
|
+
const futurePromo = {
|
|
62
|
+
...mockPromoCode,
|
|
63
|
+
redeemBy: new Date("2099-12-31"),
|
|
64
|
+
};
|
|
65
|
+
const result = validatePromoCodeEligibility(futurePromo, "user-1", []);
|
|
66
|
+
expect(result.eligible).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("validateOfferEligibility", () => {
|
|
70
|
+
const mockOffer = {
|
|
71
|
+
id: "offer-1",
|
|
72
|
+
ticketTierId: "tier-1",
|
|
73
|
+
offerType: SpecialOfferType.EARLY_BIRD,
|
|
74
|
+
title: "Early Bird",
|
|
75
|
+
description: null,
|
|
76
|
+
discountType: "PERCENTAGE",
|
|
77
|
+
discountValue: 20,
|
|
78
|
+
isActive: true,
|
|
79
|
+
displayBadge: true,
|
|
80
|
+
badgeText: "EARLY BIRD",
|
|
81
|
+
canStackWithPromoCodes: true,
|
|
82
|
+
canStackWithOtherOffers: false,
|
|
83
|
+
startDate: null,
|
|
84
|
+
endDate: null,
|
|
85
|
+
maxRedemptions: null,
|
|
86
|
+
currentRedemptions: 0,
|
|
87
|
+
createdAt: new Date(),
|
|
88
|
+
updatedAt: new Date(),
|
|
89
|
+
};
|
|
90
|
+
const currentDate = new Date("2024-07-15T12:00:00Z");
|
|
91
|
+
it("should allow eligible offer", () => {
|
|
92
|
+
const result = validateOfferEligibility(mockOffer, "user-1", 2, currentDate, 0);
|
|
93
|
+
expect(result.eligible).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
it("should reject inactive offer", () => {
|
|
96
|
+
const inactiveOffer = { ...mockOffer, isActive: false };
|
|
97
|
+
const result = validateOfferEligibility(inactiveOffer, "user-1", 2, currentDate, 0);
|
|
98
|
+
expect(result.eligible).toBe(false);
|
|
99
|
+
expect(result.reason).toContain("no longer active");
|
|
100
|
+
});
|
|
101
|
+
it("should reject offer before start date", () => {
|
|
102
|
+
const futureOffer = {
|
|
103
|
+
...mockOffer,
|
|
104
|
+
startDate: new Date("2024-08-01T00:00:00Z"),
|
|
105
|
+
};
|
|
106
|
+
const result = validateOfferEligibility(futureOffer, "user-1", 2, currentDate, 0);
|
|
107
|
+
expect(result.eligible).toBe(false);
|
|
108
|
+
expect(result.reason).toContain("starts on");
|
|
109
|
+
});
|
|
110
|
+
it("should reject offer after end date", () => {
|
|
111
|
+
const expiredOffer = {
|
|
112
|
+
...mockOffer,
|
|
113
|
+
endDate: new Date("2024-06-01T00:00:00Z"),
|
|
114
|
+
};
|
|
115
|
+
const result = validateOfferEligibility(expiredOffer, "user-1", 2, currentDate, 0);
|
|
116
|
+
expect(result.eligible).toBe(false);
|
|
117
|
+
expect(result.reason).toContain("ended on");
|
|
118
|
+
});
|
|
119
|
+
it("should reject early bird after cutoff", () => {
|
|
120
|
+
const earlyBirdOffer = {
|
|
121
|
+
...mockOffer,
|
|
122
|
+
availableUntil: new Date("2024-06-01T00:00:00Z"),
|
|
123
|
+
};
|
|
124
|
+
const result = validateOfferEligibility(earlyBirdOffer, "user-1", 2, currentDate, 0);
|
|
125
|
+
expect(result.eligible).toBe(false);
|
|
126
|
+
expect(result.reason).toContain("early bird period has ended");
|
|
127
|
+
});
|
|
128
|
+
it("should reject after price increase date", () => {
|
|
129
|
+
const countdownOffer = {
|
|
130
|
+
...mockOffer,
|
|
131
|
+
priceIncreasesAt: new Date("2024-06-01T00:00:00Z"),
|
|
132
|
+
};
|
|
133
|
+
const result = validateOfferEligibility(countdownOffer, "user-1", 2, currentDate, 0);
|
|
134
|
+
expect(result.eligible).toBe(false);
|
|
135
|
+
expect(result.reason).toContain("special pricing is no longer available");
|
|
136
|
+
});
|
|
137
|
+
it("should reject when max redemptions reached", () => {
|
|
138
|
+
const limitedOffer = {
|
|
139
|
+
...mockOffer,
|
|
140
|
+
maxRedemptions: 100,
|
|
141
|
+
currentRedemptions: 100,
|
|
142
|
+
};
|
|
143
|
+
const result = validateOfferEligibility(limitedOffer, "user-1", 2, currentDate, 0);
|
|
144
|
+
expect(result.eligible).toBe(false);
|
|
145
|
+
expect(result.reason).toContain("maximum number of uses");
|
|
146
|
+
});
|
|
147
|
+
it("should reject when user exceeded max per user", () => {
|
|
148
|
+
const perUserOffer = {
|
|
149
|
+
...mockOffer,
|
|
150
|
+
maxPerUser: 2,
|
|
151
|
+
};
|
|
152
|
+
const result = validateOfferEligibility(perUserOffer, "user-1", 2, currentDate, 2);
|
|
153
|
+
expect(result.eligible).toBe(false);
|
|
154
|
+
expect(result.reason).toContain("reached the maximum number of times");
|
|
155
|
+
});
|
|
156
|
+
it("should reject when limited quantity sold out", () => {
|
|
157
|
+
const soldOutOffer = {
|
|
158
|
+
...mockOffer,
|
|
159
|
+
limitedQuantity: 50,
|
|
160
|
+
currentRedemptions: 50,
|
|
161
|
+
};
|
|
162
|
+
const result = validateOfferEligibility(soldOutOffer, "user-1", 2, currentDate, 0);
|
|
163
|
+
expect(result.eligible).toBe(false);
|
|
164
|
+
expect(result.reason).toContain("sold out");
|
|
165
|
+
});
|
|
166
|
+
describe("Group Discount Validation", () => {
|
|
167
|
+
it("should reject when below minimum group size", () => {
|
|
168
|
+
const groupOffer = {
|
|
169
|
+
...mockOffer,
|
|
170
|
+
offerType: SpecialOfferType.GROUP_DISCOUNT,
|
|
171
|
+
minGroupSize: 5,
|
|
172
|
+
};
|
|
173
|
+
const result = validateOfferEligibility(groupOffer, "user-1", 3, currentDate, 0);
|
|
174
|
+
expect(result.eligible).toBe(false);
|
|
175
|
+
expect(result.reason).toContain("at least 5 tickets");
|
|
176
|
+
});
|
|
177
|
+
it("should reject when above maximum group size", () => {
|
|
178
|
+
const groupOffer = {
|
|
179
|
+
...mockOffer,
|
|
180
|
+
offerType: SpecialOfferType.GROUP_DISCOUNT,
|
|
181
|
+
minGroupSize: 4,
|
|
182
|
+
maxGroupSize: 10,
|
|
183
|
+
};
|
|
184
|
+
const result = validateOfferEligibility(groupOffer, "user-1", 15, currentDate, 0);
|
|
185
|
+
expect(result.eligible).toBe(false);
|
|
186
|
+
expect(result.reason).toContain("10 or fewer");
|
|
187
|
+
});
|
|
188
|
+
it("should allow within group size range", () => {
|
|
189
|
+
const groupOffer = {
|
|
190
|
+
...mockOffer,
|
|
191
|
+
offerType: SpecialOfferType.GROUP_DISCOUNT,
|
|
192
|
+
minGroupSize: 4,
|
|
193
|
+
maxGroupSize: 10,
|
|
194
|
+
};
|
|
195
|
+
const result = validateOfferEligibility(groupOffer, "user-1", 7, currentDate, 0);
|
|
196
|
+
expect(result.eligible).toBe(true);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe("BOGO Validation", () => {
|
|
200
|
+
it("should reject when below minimum BOGO quantity", () => {
|
|
201
|
+
const bogoOffer = {
|
|
202
|
+
...mockOffer,
|
|
203
|
+
offerType: SpecialOfferType.BOGO,
|
|
204
|
+
buyQuantity: 2,
|
|
205
|
+
getQuantity: 1,
|
|
206
|
+
};
|
|
207
|
+
const result = validateOfferEligibility(bogoOffer, "user-1", 2, currentDate, 0);
|
|
208
|
+
expect(result.eligible).toBe(false);
|
|
209
|
+
expect(result.reason).toContain("at least 3 tickets");
|
|
210
|
+
});
|
|
211
|
+
it("should allow when meeting BOGO requirements", () => {
|
|
212
|
+
const bogoOffer = {
|
|
213
|
+
...mockOffer,
|
|
214
|
+
offerType: SpecialOfferType.BOGO,
|
|
215
|
+
buyQuantity: 2,
|
|
216
|
+
getQuantity: 1,
|
|
217
|
+
};
|
|
218
|
+
const result = validateOfferEligibility(bogoOffer, "user-1", 3, currentDate, 0);
|
|
219
|
+
expect(result.eligible).toBe(true);
|
|
220
|
+
});
|
|
221
|
+
it("should handle default BOGO values", () => {
|
|
222
|
+
const bogoOffer = {
|
|
223
|
+
...mockOffer,
|
|
224
|
+
offerType: SpecialOfferType.BOGO,
|
|
225
|
+
buyQuantity: null,
|
|
226
|
+
getQuantity: null,
|
|
227
|
+
};
|
|
228
|
+
// Default is Buy 1 Get 1, so need 2 tickets
|
|
229
|
+
const result = validateOfferEligibility(bogoOffer, "user-1", 1, currentDate, 0);
|
|
230
|
+
expect(result.eligible).toBe(false);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
describe("validateOfferStacking", () => {
|
|
235
|
+
const mockOffer = {
|
|
236
|
+
id: "offer-1",
|
|
237
|
+
canStackWithPromoCodes: true,
|
|
238
|
+
canStackWithOtherOffers: true,
|
|
239
|
+
};
|
|
240
|
+
it("should allow stacking with promo codes when enabled", () => {
|
|
241
|
+
const result = validateOfferStacking(mockOffer, true, false);
|
|
242
|
+
expect(result.eligible).toBe(true);
|
|
243
|
+
});
|
|
244
|
+
it("should reject stacking with promo codes when disabled", () => {
|
|
245
|
+
const noStackOffer = { ...mockOffer, canStackWithPromoCodes: false };
|
|
246
|
+
const result = validateOfferStacking(noStackOffer, true, false);
|
|
247
|
+
expect(result.eligible).toBe(false);
|
|
248
|
+
expect(result.reason).toContain("cannot be combined with promo codes");
|
|
249
|
+
});
|
|
250
|
+
it("should allow stacking with other offers when enabled", () => {
|
|
251
|
+
const result = validateOfferStacking(mockOffer, false, true);
|
|
252
|
+
expect(result.eligible).toBe(true);
|
|
253
|
+
});
|
|
254
|
+
it("should reject stacking with other offers when disabled", () => {
|
|
255
|
+
const noStackOffer = { ...mockOffer, canStackWithOtherOffers: false };
|
|
256
|
+
const result = validateOfferStacking(noStackOffer, false, true);
|
|
257
|
+
expect(result.eligible).toBe(false);
|
|
258
|
+
expect(result.reason).toContain("cannot be combined with other offers");
|
|
259
|
+
});
|
|
260
|
+
it("should allow offer with no stacking", () => {
|
|
261
|
+
const result = validateOfferStacking(mockOffer, false, false);
|
|
262
|
+
expect(result.eligible).toBe(true);
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe("validateLoyaltyRequirements", () => {
|
|
266
|
+
const loyaltyOffer = {
|
|
267
|
+
id: "offer-1",
|
|
268
|
+
offerType: SpecialOfferType.LOYALTY,
|
|
269
|
+
requiresEventAttendance: 3,
|
|
270
|
+
hostSpecificLoyalty: false,
|
|
271
|
+
};
|
|
272
|
+
it("should skip validation for non-loyalty offers", () => {
|
|
273
|
+
const regularOffer = { ...loyaltyOffer, offerType: SpecialOfferType.EARLY_BIRD };
|
|
274
|
+
const result = validateLoyaltyRequirements(regularOffer, 0, false);
|
|
275
|
+
expect(result.eligible).toBe(true);
|
|
276
|
+
});
|
|
277
|
+
it("should reject when attendance requirement not met", () => {
|
|
278
|
+
const result = validateLoyaltyRequirements(loyaltyOffer, 2, false);
|
|
279
|
+
expect(result.eligible).toBe(false);
|
|
280
|
+
expect(result.reason).toContain("attended at least 3 events");
|
|
281
|
+
});
|
|
282
|
+
it("should allow when attendance requirement met", () => {
|
|
283
|
+
const result = validateLoyaltyRequirements(loyaltyOffer, 3, false);
|
|
284
|
+
expect(result.eligible).toBe(true);
|
|
285
|
+
});
|
|
286
|
+
it("should allow when attendance exceeds requirement", () => {
|
|
287
|
+
const result = validateLoyaltyRequirements(loyaltyOffer, 10, false);
|
|
288
|
+
expect(result.eligible).toBe(true);
|
|
289
|
+
});
|
|
290
|
+
it("should reject host-specific loyalty for non-host events", () => {
|
|
291
|
+
const hostLoyalty = { ...loyaltyOffer, hostSpecificLoyalty: true };
|
|
292
|
+
const result = validateLoyaltyRequirements(hostLoyalty, 5, false);
|
|
293
|
+
expect(result.eligible).toBe(false);
|
|
294
|
+
expect(result.reason).toContain("only applies to events by this host");
|
|
295
|
+
});
|
|
296
|
+
it("should allow host-specific loyalty for host events", () => {
|
|
297
|
+
const hostLoyalty = { ...loyaltyOffer, hostSpecificLoyalty: true };
|
|
298
|
+
const result = validateLoyaltyRequirements(hostLoyalty, 3, true);
|
|
299
|
+
expect(result.eligible).toBe(true);
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
describe("validateMultipleOffers", () => {
|
|
303
|
+
const offer1 = {
|
|
304
|
+
id: "offer-1",
|
|
305
|
+
isActive: true,
|
|
306
|
+
offerType: SpecialOfferType.EARLY_BIRD,
|
|
307
|
+
maxPerUser: 1,
|
|
308
|
+
};
|
|
309
|
+
const offer2 = {
|
|
310
|
+
id: "offer-2",
|
|
311
|
+
isActive: false,
|
|
312
|
+
offerType: SpecialOfferType.GROUP_DISCOUNT,
|
|
313
|
+
};
|
|
314
|
+
const offer3 = {
|
|
315
|
+
id: "offer-3",
|
|
316
|
+
isActive: true,
|
|
317
|
+
offerType: SpecialOfferType.FLASH_SALE,
|
|
318
|
+
limitedQuantity: 50,
|
|
319
|
+
currentRedemptions: 50,
|
|
320
|
+
};
|
|
321
|
+
it("should validate all offers and return results map", () => {
|
|
322
|
+
const userRedemptions = new Map([["offer-1", 0]]);
|
|
323
|
+
const currentDate = new Date();
|
|
324
|
+
const results = validateMultipleOffers([offer1, offer2, offer3], "user-1", 2, currentDate, userRedemptions);
|
|
325
|
+
expect(results.size).toBe(3);
|
|
326
|
+
expect(results.get("offer-1")?.eligible).toBe(true);
|
|
327
|
+
expect(results.get("offer-2")?.eligible).toBe(false); // Inactive
|
|
328
|
+
expect(results.get("offer-3")?.eligible).toBe(false); // Sold out
|
|
329
|
+
});
|
|
330
|
+
it("should track individual user redemptions", () => {
|
|
331
|
+
const userRedemptions = new Map([
|
|
332
|
+
["offer-1", 1], // Already used once
|
|
333
|
+
]);
|
|
334
|
+
const currentDate = new Date();
|
|
335
|
+
const results = validateMultipleOffers([offer1], "user-1", 2, currentDate, userRedemptions);
|
|
336
|
+
expect(results.get("offer-1")?.eligible).toBe(false); // Exceeded max per user
|
|
337
|
+
expect(results.get("offer-1")?.reason).toContain("maximum number of times");
|
|
338
|
+
});
|
|
339
|
+
it("should handle empty offers array", () => {
|
|
340
|
+
const results = validateMultipleOffers([], "user-1", 2, new Date(), new Map());
|
|
341
|
+
expect(results.size).toBe(0);
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
describe("getTimeRemaining", () => {
|
|
345
|
+
const baseOffer = {
|
|
346
|
+
id: "offer-1",
|
|
347
|
+
};
|
|
348
|
+
it("should calculate time remaining for future date", () => {
|
|
349
|
+
const currentDate = new Date("2024-07-15T12:00:00Z");
|
|
350
|
+
const expiryDate = new Date("2024-07-17T14:30:45Z");
|
|
351
|
+
const offer = { ...baseOffer, endDate: expiryDate };
|
|
352
|
+
const result = getTimeRemaining(offer, currentDate);
|
|
353
|
+
expect(result.expired).toBe(false);
|
|
354
|
+
expect(result.days).toBe(2);
|
|
355
|
+
expect(result.hours).toBe(2);
|
|
356
|
+
expect(result.minutes).toBe(30);
|
|
357
|
+
expect(result.seconds).toBe(45);
|
|
358
|
+
});
|
|
359
|
+
it("should mark as expired for past date", () => {
|
|
360
|
+
const currentDate = new Date("2024-07-15T12:00:00Z");
|
|
361
|
+
const expiryDate = new Date("2024-07-10T12:00:00Z");
|
|
362
|
+
const offer = { ...baseOffer, endDate: expiryDate };
|
|
363
|
+
const result = getTimeRemaining(offer, currentDate);
|
|
364
|
+
expect(result.expired).toBe(true);
|
|
365
|
+
expect(result.days).toBe(0);
|
|
366
|
+
expect(result.hours).toBe(0);
|
|
367
|
+
expect(result.minutes).toBe(0);
|
|
368
|
+
expect(result.seconds).toBe(0);
|
|
369
|
+
});
|
|
370
|
+
it("should handle no expiry date", () => {
|
|
371
|
+
const offer = { ...baseOffer, endDate: null };
|
|
372
|
+
const result = getTimeRemaining(offer, new Date());
|
|
373
|
+
expect(result.expired).toBe(false);
|
|
374
|
+
expect(result.days).toBe(999); // Pseudo-infinite
|
|
375
|
+
});
|
|
376
|
+
it("should prioritize endDate over other dates", () => {
|
|
377
|
+
const currentDate = new Date("2024-07-15T12:00:00Z");
|
|
378
|
+
const offer = {
|
|
379
|
+
...baseOffer,
|
|
380
|
+
endDate: new Date("2024-07-20T00:00:00Z"),
|
|
381
|
+
priceIncreasesAt: new Date("2024-07-18T00:00:00Z"),
|
|
382
|
+
availableUntil: new Date("2024-07-16T00:00:00Z"),
|
|
383
|
+
};
|
|
384
|
+
const result = getTimeRemaining(offer, currentDate);
|
|
385
|
+
expect(result.days).toBe(4); // Uses endDate (July 20)
|
|
386
|
+
});
|
|
387
|
+
it("should use priceIncreasesAt if no endDate", () => {
|
|
388
|
+
const currentDate = new Date("2024-07-15T12:00:00Z");
|
|
389
|
+
const offer = {
|
|
390
|
+
...baseOffer,
|
|
391
|
+
endDate: null,
|
|
392
|
+
priceIncreasesAt: new Date("2024-07-16T12:00:00Z"),
|
|
393
|
+
};
|
|
394
|
+
const result = getTimeRemaining(offer, currentDate);
|
|
395
|
+
expect(result.days).toBe(1);
|
|
396
|
+
expect(result.hours).toBe(0);
|
|
397
|
+
});
|
|
398
|
+
it("should use availableUntil if no other dates", () => {
|
|
399
|
+
const currentDate = new Date("2024-07-15T12:00:00Z");
|
|
400
|
+
const offer = {
|
|
401
|
+
...baseOffer,
|
|
402
|
+
endDate: null,
|
|
403
|
+
priceIncreasesAt: null,
|
|
404
|
+
availableUntil: new Date("2024-07-15T18:00:00Z"),
|
|
405
|
+
};
|
|
406
|
+
const result = getTimeRemaining(offer, currentDate);
|
|
407
|
+
expect(result.days).toBe(0);
|
|
408
|
+
expect(result.hours).toBe(6);
|
|
409
|
+
});
|
|
410
|
+
it("should handle seconds precision", () => {
|
|
411
|
+
const currentDate = new Date("2024-07-15T12:00:00Z");
|
|
412
|
+
const expiryDate = new Date("2024-07-15T12:01:30Z"); // 90 seconds
|
|
413
|
+
const offer = { ...baseOffer, endDate: expiryDate };
|
|
414
|
+
const result = getTimeRemaining(offer, currentDate);
|
|
415
|
+
expect(result.days).toBe(0);
|
|
416
|
+
expect(result.hours).toBe(0);
|
|
417
|
+
expect(result.minutes).toBe(1);
|
|
418
|
+
expect(result.seconds).toBe(30);
|
|
419
|
+
});
|
|
420
|
+
it("should handle exactly expired (zero diff)", () => {
|
|
421
|
+
const currentDate = new Date("2024-07-15T12:00:00Z");
|
|
422
|
+
const expiryDate = new Date("2024-07-15T12:00:00Z");
|
|
423
|
+
const offer = { ...baseOffer, endDate: expiryDate };
|
|
424
|
+
const result = getTimeRemaining(offer, currentDate);
|
|
425
|
+
expect(result.expired).toBe(true);
|
|
426
|
+
});
|
|
427
|
+
it("should calculate large time spans correctly", () => {
|
|
428
|
+
const currentDate = new Date("2024-07-15T12:00:00Z");
|
|
429
|
+
const expiryDate = new Date("2024-12-31T23:59:59Z"); // ~169 days
|
|
430
|
+
const offer = { ...baseOffer, endDate: expiryDate };
|
|
431
|
+
const result = getTimeRemaining(offer, currentDate);
|
|
432
|
+
expect(result.expired).toBe(false);
|
|
433
|
+
expect(result.days).toBeGreaterThan(100);
|
|
434
|
+
});
|
|
435
|
+
});
|
|
436
|
+
describe("Edge Cases and Boundary Conditions", () => {
|
|
437
|
+
it("should handle offers with all date fields null", () => {
|
|
438
|
+
const offer = {
|
|
439
|
+
id: "offer-1",
|
|
440
|
+
isActive: true,
|
|
441
|
+
offerType: SpecialOfferType.FLASH_SALE,
|
|
442
|
+
startDate: null,
|
|
443
|
+
endDate: null,
|
|
444
|
+
availableUntil: null,
|
|
445
|
+
priceIncreasesAt: null,
|
|
446
|
+
};
|
|
447
|
+
const result = validateOfferEligibility(offer, "user-1", 2, new Date(), 0);
|
|
448
|
+
expect(result.eligible).toBe(true);
|
|
449
|
+
});
|
|
450
|
+
it("should handle zero quantity", () => {
|
|
451
|
+
const offer = {
|
|
452
|
+
id: "offer-1",
|
|
453
|
+
isActive: true,
|
|
454
|
+
offerType: SpecialOfferType.GROUP_DISCOUNT,
|
|
455
|
+
minGroupSize: 4,
|
|
456
|
+
};
|
|
457
|
+
const result = validateOfferEligibility(offer, "user-1", 0, new Date(), 0);
|
|
458
|
+
expect(result.eligible).toBe(false);
|
|
459
|
+
});
|
|
460
|
+
it("should handle very large quantities", () => {
|
|
461
|
+
const offer = {
|
|
462
|
+
id: "offer-1",
|
|
463
|
+
isActive: true,
|
|
464
|
+
offerType: SpecialOfferType.GROUP_DISCOUNT,
|
|
465
|
+
minGroupSize: 4,
|
|
466
|
+
maxGroupSize: null,
|
|
467
|
+
};
|
|
468
|
+
const result = validateOfferEligibility(offer, "user-1", 10000, new Date(), 0);
|
|
469
|
+
expect(result.eligible).toBe(true); // No max, so allowed
|
|
470
|
+
});
|
|
471
|
+
it("should handle timezone differences in dates", () => {
|
|
472
|
+
const currentDate = new Date("2024-07-15T23:59:59Z");
|
|
473
|
+
const expiryDate = new Date("2024-07-16T00:00:01Z");
|
|
474
|
+
const offer = { id: "offer-1", endDate: expiryDate };
|
|
475
|
+
const result = validateOfferEligibility(offer, "user-1", 2, currentDate, 0);
|
|
476
|
+
expect(result.eligible).toBe(true); // Still valid by 2 seconds
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
//# sourceMappingURL=eligibilityValidator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eligibilityValidator.test.js","sourceRoot":"","sources":["../../../../src/utils/discountEngine/__tests__/eligibilityValidator.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bash-app/bash-common",
|
|
3
|
-
"version": "30.
|
|
3
|
+
"version": "30.118.0",
|
|
4
4
|
"description": "Common data and scripts to use on the frontend and backend",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"slugify": "^1.6.6"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@prisma/client": "6.19.1",
|
|
34
|
+
"@prisma/client": "^6.19.1",
|
|
35
35
|
"luxon": "^3.5.0",
|
|
36
36
|
"prisma": "6.19.1",
|
|
37
37
|
"react-tailwindcss-datepicker": "^1.6.6",
|