@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
JavaScript
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
});