UNPKG

@ideal-photography/shared

Version:

Shared MongoDB and utility logic for Ideal Photography PWAs: users, products, services, bookings, orders/cart, galleries, reviews, notifications, campaigns, settings, audit logs, minimart items/orders, and push notification subscriptions.

71 lines (61 loc) 2.5 kB
import { jest } from '@jest/globals'; // Create mock query builder with lean() method const createMockQueryBuilder = (resolveValue) => ({ lean: jest.fn(() => Promise.resolve(resolveValue)) }); // Mock mongoDB module before importing StockService jest.unstable_mockModule('../../mongoDB/index.js', () => { return { models: { Equipment: { findById: jest.fn() }, MinimartItem: { findById: jest.fn() }, Order: { findById: jest.fn(), findByIdAndUpdate: jest.fn(), updateOne: jest.fn() }, }, mongoose: { startSession: jest.fn().mockResolvedValue({ withTransaction: async (fn) => await fn(), endSession: jest.fn() }) }, }; }); // Import after mocking const { StockService } = await import('../StockService.js'); const { models } = await import('../../mongoDB/index.js'); describe('StockService.checkAvailability', () => { beforeEach(() => { jest.clearAllMocks(); }); it('returns available for equipment with enough stock', async () => { const equipmentData = { _id: '507f1f77bcf86cd799439011', inventory: { availableUnits: 10 } }; models.Equipment.findById.mockReturnValue(createMockQueryBuilder(equipmentData)); const res = await StockService.checkAvailability([ { productId: '507f1f77bcf86cd799439011', productType: 'equipment_rental', quantity: 2 }, ]); expect(res.available).toBe(true); expect(models.Equipment.findById).toHaveBeenCalledWith('507f1f77bcf86cd799439011'); }, 10000); // Increase timeout to 10s it('returns not available for minimart out of stock', async () => { const minimartData = { _id: '507f1f77bcf86cd799439012', inventory: { stockQuantity: 1 } }; models.MinimartItem.findById.mockReturnValue(createMockQueryBuilder(minimartData)); const res = await StockService.checkAvailability([ { productId: '507f1f77bcf86cd799439012', productType: 'minimart', quantity: 5 }, ]); expect(res.available).toBe(false); expect(models.MinimartItem.findById).toHaveBeenCalledWith('507f1f77bcf86cd799439012'); }, 10000); // Increase timeout to 10s });