Add backend unit/integration tests, Playwright e2e tests, README, cookie Secure fix
SonarQube Analysis / sonarqube (push) Successful in 4m20s
SonarQube Analysis / sonarqube (push) Successful in 4m20s
This commit is contained in:
+94
@@ -0,0 +1,94 @@
|
||||
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('POST /api/customers/register', () => {
|
||||
it('creates an account with marketing consent unchecked by default', async () => {
|
||||
const res = await request(app).post('/api/customers/register').send({
|
||||
email: 'jane@example.com',
|
||||
password: 'supersecret123',
|
||||
name: 'Jane'
|
||||
});
|
||||
expect(res.status).toBe(200);
|
||||
expect(res.body.email).toBe('jane@example.com');
|
||||
expect(res.body.marketing_consent).toBe(false);
|
||||
expect(res.headers['set-cookie']).toBeDefined();
|
||||
});
|
||||
|
||||
it('respects an explicit marketing opt-in', async () => {
|
||||
const res = await request(app).post('/api/customers/register').send({
|
||||
email: 'opt-in@example.com',
|
||||
password: 'supersecret123',
|
||||
marketingConsent: true
|
||||
});
|
||||
expect(res.body.marketing_consent).toBe(true);
|
||||
});
|
||||
|
||||
it('rejects a duplicate email', async () => {
|
||||
await request(app).post('/api/customers/register').send({
|
||||
email: 'dupe@example.com',
|
||||
password: 'supersecret123'
|
||||
});
|
||||
const res = await request(app).post('/api/customers/register').send({
|
||||
email: 'dupe@example.com',
|
||||
password: 'anotherpassword'
|
||||
});
|
||||
expect(res.status).toBe(409);
|
||||
});
|
||||
|
||||
it('rejects a password under 8 characters', async () => {
|
||||
const res = await request(app).post('/api/customers/register').send({
|
||||
email: 'short@example.com',
|
||||
password: '123'
|
||||
});
|
||||
expect(res.status).toBe(400);
|
||||
});
|
||||
|
||||
it('rejects a malformed email', async () => {
|
||||
const res = await request(app).post('/api/customers/register').send({
|
||||
email: 'not-an-email',
|
||||
password: 'supersecret123'
|
||||
});
|
||||
expect(res.status).toBe(400);
|
||||
});
|
||||
});
|
||||
|
||||
describe('session-gated routes', () => {
|
||||
it('logs in and can access /me with the returned session cookie', async () => {
|
||||
const agent = request.agent(app);
|
||||
await agent.post('/api/customers/register').send({
|
||||
email: 'login-test@example.com',
|
||||
password: 'supersecret123'
|
||||
});
|
||||
const me = await agent.get('/api/customers/me');
|
||||
expect(me.status).toBe(200);
|
||||
expect(me.body.email).toBe('login-test@example.com');
|
||||
});
|
||||
|
||||
it('rejects /me with no session', async () => {
|
||||
const res = await request(app).get('/api/customers/me');
|
||||
expect(res.status).toBe(401);
|
||||
});
|
||||
|
||||
it('rejects login with the wrong password', async () => {
|
||||
await request(app).post('/api/customers/register').send({
|
||||
email: 'wrongpass@example.com',
|
||||
password: 'supersecret123'
|
||||
});
|
||||
const res = await request(app).post('/api/customers/login').send({
|
||||
email: 'wrongpass@example.com',
|
||||
password: 'incorrect-password'
|
||||
});
|
||||
expect(res.status).toBe(401);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user