241 lines
7.8 KiB
JavaScript
241 lines
7.8 KiB
JavaScript
const fallbackStore = require("../../src/utils/fallback-store");
|
|
|
|
describe("Fallback Store", () => {
|
|
beforeEach(() => {
|
|
// Reset fallback store state before each test
|
|
fallbackStore.deactivate();
|
|
fallbackStore.events.clear();
|
|
fallbackStore.globalStats = {
|
|
totalEvents: 0,
|
|
totalTickets: 0,
|
|
totalSold: 0,
|
|
lastSeeded: null,
|
|
};
|
|
});
|
|
|
|
describe("Initialization", () => {
|
|
test("should start in inactive state", () => {
|
|
expect(fallbackStore.isActive).toBe(false);
|
|
expect(fallbackStore.events.size).toBe(0);
|
|
});
|
|
|
|
test("should have empty global stats", () => {
|
|
const stats = fallbackStore.getGlobalStats();
|
|
expect(stats.totalEvents).toBe(0);
|
|
expect(stats.totalTickets).toBe(0);
|
|
expect(stats.totalSold).toBe(0);
|
|
});
|
|
});
|
|
|
|
describe("Activation/Deactivation", () => {
|
|
test("should activate and deactivate correctly", () => {
|
|
fallbackStore.activate("Test activation");
|
|
expect(fallbackStore.isActive).toBe(true);
|
|
expect(fallbackStore.activationReason).toBe("Test activation");
|
|
|
|
fallbackStore.deactivate();
|
|
expect(fallbackStore.isActive).toBe(false);
|
|
expect(fallbackStore.activationReason).toBe(null);
|
|
});
|
|
|
|
test("should log activation and deactivation", () => {
|
|
const consoleSpy = jest.spyOn(console, "warn");
|
|
|
|
fallbackStore.activate("Test");
|
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
expect.stringContaining("Fallback store activated")
|
|
);
|
|
|
|
fallbackStore.deactivate();
|
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
expect.stringContaining("Fallback store deactivated")
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("Event Seeding", () => {
|
|
test("should seed events correctly", () => {
|
|
const eventId = "1";
|
|
const tickets = ["ticket1", "ticket2", "ticket3"];
|
|
const metadata = {
|
|
eventId: "1",
|
|
name: "Test Event",
|
|
description: "Test Description",
|
|
totalTickets: 3,
|
|
soldTickets: 0,
|
|
createdAt: "2024-01-01T00:00:00.000Z",
|
|
lastSoldAt: "never",
|
|
};
|
|
|
|
fallbackStore.seedEvent(eventId, tickets, metadata);
|
|
|
|
expect(fallbackStore.events.has(eventId)).toBe(true);
|
|
const event = fallbackStore.events.get(eventId);
|
|
expect(event.tickets).toEqual(tickets);
|
|
expect(event.metadata).toEqual(metadata);
|
|
expect(fallbackStore.globalStats.totalEvents).toBe(1);
|
|
expect(fallbackStore.globalStats.totalTickets).toBe(3);
|
|
});
|
|
|
|
test("should update global stats when seeding multiple events", () => {
|
|
const event1 = { eventId: "1", totalTickets: 5 };
|
|
const event2 = { eventId: "2", totalTickets: 3 };
|
|
|
|
fallbackStore.seedEvent("1", ["t1", "t2", "t3", "t4", "t5"], event1);
|
|
fallbackStore.seedEvent("2", ["t6", "t7", "t8"], event2);
|
|
|
|
expect(fallbackStore.globalStats.totalEvents).toBe(2);
|
|
expect(fallbackStore.globalStats.totalTickets).toBe(8);
|
|
});
|
|
});
|
|
|
|
describe("Ticket Purchase", () => {
|
|
beforeEach(() => {
|
|
// Seed a test event
|
|
const metadata = {
|
|
eventId: "1",
|
|
name: "Test Event",
|
|
description: "Test Description",
|
|
totalTickets: 3,
|
|
soldTickets: 0,
|
|
createdAt: "2024-01-01T00:00:00.000Z",
|
|
lastSoldAt: "never",
|
|
};
|
|
fallbackStore.seedEvent("1", ["ticket1", "ticket2", "ticket3"], metadata);
|
|
});
|
|
|
|
test("should purchase ticket successfully", () => {
|
|
const purchaseId = "test-purchase-123";
|
|
const result = fallbackStore.purchaseTicket("1", purchaseId);
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.ticket).toBeDefined();
|
|
expect(result.soldCount).toBe(1);
|
|
expect(result.remainingTickets).toBe(2);
|
|
|
|
// Verify ticket was removed
|
|
const event = fallbackStore.events.get("1");
|
|
expect(event.tickets).toHaveLength(2);
|
|
expect(event.tickets).not.toContain(result.ticket);
|
|
});
|
|
|
|
test("should prevent duplicate ticket sales", () => {
|
|
const purchaseId1 = "test-purchase-1";
|
|
const purchaseId2 = "test-purchase-2";
|
|
|
|
// First purchase should succeed
|
|
const result1 = fallbackStore.purchaseTicket("1", purchaseId1);
|
|
expect(result1.success).toBe(true);
|
|
|
|
// Second purchase should succeed (different purchase ID)
|
|
const result2 = fallbackStore.purchaseTicket("1", purchaseId2);
|
|
expect(result2.success).toBe(true);
|
|
|
|
// Verify different tickets were sold
|
|
expect(result1.ticket).not.toBe(result2.ticket);
|
|
expect(result1.ticket).toBeDefined();
|
|
expect(result2.ticket).toBeDefined();
|
|
});
|
|
|
|
test("should fail when no tickets available", () => {
|
|
// Purchase all available tickets
|
|
fallbackStore.purchaseTicket("1", "purchase1");
|
|
fallbackStore.purchaseTicket("1", "purchase2");
|
|
fallbackStore.purchaseTicket("1", "purchase3");
|
|
|
|
// Try to purchase when no tickets left
|
|
const result = fallbackStore.purchaseTicket("1", "purchase4");
|
|
expect(result.success).toBe(false);
|
|
expect(result.error).toBe("NO_TICKETS_AVAILABLE");
|
|
});
|
|
|
|
test("should fail for non-existent event", () => {
|
|
const result = fallbackStore.purchaseTicket("999", "test-purchase");
|
|
expect(result.success).toBe(false);
|
|
expect(result.error).toBe("EVENT_NOT_FOUND");
|
|
});
|
|
});
|
|
|
|
describe("Event Statistics", () => {
|
|
beforeEach(() => {
|
|
const metadata = {
|
|
eventId: "1",
|
|
name: "Test Event",
|
|
description: "Test Description",
|
|
totalTickets: 5,
|
|
soldTickets: 0,
|
|
createdAt: "2024-01-01T00:00:00.000Z",
|
|
lastSoldAt: "never",
|
|
};
|
|
fallbackStore.seedEvent("1", ["t1", "t2", "t3", "t4", "t5"], metadata);
|
|
});
|
|
|
|
test("should return correct event stats", () => {
|
|
const stats = fallbackStore.getEventStats("1");
|
|
expect(stats).toBeDefined();
|
|
expect(stats.eventId).toBe("1");
|
|
expect(stats.name).toBe("Test Event");
|
|
expect(stats.totalTickets).toBe(5);
|
|
expect(stats.remainingTickets).toBe(5);
|
|
expect(stats.soldTickets).toBe(0);
|
|
});
|
|
|
|
test("should return null for non-existent event", () => {
|
|
const stats = fallbackStore.getEventStats("999");
|
|
expect(stats).toBeNull();
|
|
});
|
|
|
|
test("should update stats after ticket purchase", () => {
|
|
fallbackStore.purchaseTicket("1", "test-purchase");
|
|
|
|
const stats = fallbackStore.getEventStats("1");
|
|
expect(stats.remainingTickets).toBe(4);
|
|
expect(stats.soldTickets).toBe(1);
|
|
});
|
|
});
|
|
|
|
describe("Global Statistics", () => {
|
|
test("should return correct global stats", () => {
|
|
const stats = fallbackStore.getGlobalStats();
|
|
expect(stats.totalEvents).toBe(0);
|
|
expect(stats.totalTickets).toBe(0);
|
|
expect(stats.totalSold).toBe(0);
|
|
expect(stats.lastSeeded).toBeNull();
|
|
});
|
|
|
|
test("should update global stats after seeding", () => {
|
|
const metadata = {
|
|
eventId: "1",
|
|
name: "Test Event",
|
|
totalTickets: 3,
|
|
soldTickets: 0,
|
|
createdAt: "2024-01-01T00:00:00.000Z",
|
|
lastSoldAt: "never",
|
|
};
|
|
fallbackStore.seedEvent("1", ["t1", "t2", "t3"], metadata);
|
|
|
|
const stats = fallbackStore.getGlobalStats();
|
|
expect(stats.totalEvents).toBe(1);
|
|
expect(stats.totalTickets).toBe(3);
|
|
});
|
|
});
|
|
|
|
describe("Status Information", () => {
|
|
test("should return correct status", () => {
|
|
const status = fallbackStore.getStatus();
|
|
expect(status.active).toBe(false);
|
|
expect(status.eventsCount).toBe(0);
|
|
expect(status.totalTickets).toBe(0);
|
|
expect(status.totalSold).toBe(0);
|
|
expect(status.activationReason).toBeNull();
|
|
});
|
|
|
|
test("should return correct status when active", () => {
|
|
fallbackStore.activate("Test reason");
|
|
const status = fallbackStore.getStatus();
|
|
expect(status.active).toBe(true);
|
|
expect(status.activationReason).toBe("Test reason");
|
|
});
|
|
});
|
|
});
|