60 lines · 2046 bytes
sha256 821c101cbea8ea949d62 hours ago
import request from 'supertest';
import { createApp } from './index';
import * as store from './store';
const app = createApp();
beforeEach(() => {
store.clear();
});
const validBody = {
merchantId: 'm_demo_001',
amountMinor: 1000,
currency: 'EUR',
pan: '4111111111111111',
};
test('POST /payments returns 201 with id', async () => {
const res = await request(app).post('/payments').send(validBody);
expect(res.status).toBe(201);
expect(res.body).toHaveProperty('id');
expect(typeof res.body.id).toBe('string');
});
test('GET /payments/:id returns the payment', async () => {
const created = await request(app).post('/payments').send(validBody);
const id = created.body.id as string;
const res = await request(app).get(`/payments/${id}`);
expect(res.status).toBe(200);
expect(res.body.id).toBe(id);
expect(res.body.merchantId).toBe(validBody.merchantId);
});
test('GET /payments/:id returns 404 for unknown id', async () => {
const res = await request(app).get('/payments/does-not-exist');
expect(res.status).toBe(404);
});
test('POST /payments returns 400 for unsupported currency', async () => {
const res = await request(app).post('/payments').send({ ...validBody, currency: 'JPY' });
expect(res.status).toBe(400);
expect(res.body.error).toMatch(/EUR, GBP or USD/);
});
test('GET /payments/:id/receipt returns masked PAN', async () => {
const created = await request(app).post('/payments').send(validBody);
const id = created.body.id as string;
const res = await request(app).get(`/payments/${id}/receipt`);
expect(res.status).toBe(200);
expect(res.body.id).toBe(id);
expect(res.body.merchantId).toBe(validBody.merchantId);
expect(res.body.amountMinor).toBe(validBody.amountMinor);
expect(res.body.currency).toBe(validBody.currency);
expect(res.body.maskedPan).toBe('411111******1111');
});
test('GET /payments/:id/receipt returns 404 for unknown id', async () => {
const res = await request(app).get('/payments/does-not-exist/receipt');
expect(res.status).toBe(404);
});