Add backend unit/integration tests, Playwright e2e tests, README, cookie Secure fix
SonarQube Analysis / sonarqube (push) Successful in 4m20s

This commit is contained in:
2026-08-13 22:35:38 +00:00
parent 2adbf24b23
commit 921022c658
25 changed files with 6600 additions and 57 deletions
+66
View File
@@ -0,0 +1,66 @@
import request from 'supertest';
import app from '../../src/app';
import { pool } from '../../src/db';
import { resetDb, closeDb } from './setup/testDb';
beforeEach(async () => {
await resetDb();
});
afterAll(async () => {
await pool.end();
await closeDb();
});
describe('GET /api/items', () => {
it('returns an empty array when there are no items', async () => {
const res = await request(app).get('/api/items');
expect(res.status).toBe(200);
expect(res.body).toEqual([]);
});
it('returns items with an empty images array when none are attached', async () => {
await pool.query(
`INSERT INTO items (name, description, price_cents) VALUES ('Vintage Lamp', 'A one-of-a-kind lamp.', 4500)`
);
const res = await request(app).get('/api/items');
expect(res.status).toBe(200);
expect(res.body).toHaveLength(1);
expect(res.body[0]).toMatchObject({
name: 'Vintage Lamp',
price_cents: 4500,
status: 'available',
images: []
});
});
it('returns 404 for a nonexistent item', async () => {
const res = await request(app).get('/api/items/99999');
expect(res.status).toBe(404);
});
});
describe('demo checkout', () => {
it('marks an available item as sold', async () => {
const { rows } = await pool.query(
`INSERT INTO items (name, price_cents) VALUES ('Test Item', 1000) RETURNING id`
);
const itemId = rows[0].id;
const res = await request(app).post(`/api/checkout/demo/${itemId}/purchase`);
expect(res.status).toBe(200);
expect(res.body.status).toBe('sold');
const check = await request(app).get(`/api/items/${itemId}`);
expect(check.body.status).toBe('sold');
});
it('refuses to sell an item that is already sold', async () => {
const { rows } = await pool.query(
`INSERT INTO items (name, price_cents, status) VALUES ('Already Sold', 1000, 'sold') RETURNING id`
);
const itemId = rows[0].id;
const res = await request(app).post(`/api/checkout/demo/${itemId}/purchase`);
expect(res.status).toBe(409);
});
});