Skip to content

Instantly share code, notes, and snippets.

@Pyrolistical
Created October 22, 2021 23:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Pyrolistical/433eaa2d5c0bf5d71ca8931fe3f848e8 to your computer and use it in GitHub Desktop.
Save Pyrolistical/433eaa2d5c0bf5d71ca8931fe3f848e8 to your computer and use it in GitHub Desktop.
ecommerce-escalation v1 test
import {jest} from '@jest/globals';
import Service, {InsufficientStock} from './service';
describe('checkout', () => {
test('fails when insufficient stock for desired product', async () => {
const repository = {
findInventoryByProductSku: jest.fn()
.mockResolvedValueOnce({
productSku: 'some product sku',
stock: 2
}),
updateInventoryStockByProductSku: jest.fn(),
createOrder: jest.fn()
};
const service = Service(repository);
await expect(service.checkout([
{
productSku: 'some product sku',
quantity: 10
}
], 'some shipping address', 'some payment details')).rejects.toThrow(InsufficientStock);
expect(repository.findInventoryByProductSku).toHaveBeenNthCalledWith(1, 'some product sku');
expect(repository.updateInventoryStockByProductSku).not.toHaveBeenCalled();
expect(repository.createOrder).not.toHaveBeenCalled();
});
test('creates order when all desired items are in stock', async () => {
const repository = {
findInventoryByProductSku: jest.fn()
.mockResolvedValueOnce({
productSku: 'some product sku',
stock: 30
}),
updateInventoryStockByProductSku: jest.fn()
.mockResolvedValueOnce(),
createOrder: jest.fn()
.mockResolvedValueOnce('some order id')
};
const service = Service(repository);
const result = await service.checkout([
{
productSku: 'some product sku',
quantity: 10
}
], 'some shipping address', 'some payment details');
expect(result).toBe('some order id');
expect(repository.findInventoryByProductSku).toHaveBeenNthCalledWith(1, 'some product sku');
expect(repository.updateInventoryStockByProductSku).toHaveBeenNthCalledWith(1, 'some product sku', 20);
expect(repository.createOrder).toHaveBeenNthCalledWith(1, {
lineItems: [
{
productSku: 'some product sku',
quantity: 10
},
],
shippingAddress: 'some shipping address',
paymentDetails: 'some payment details'
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment