test: add jest test suite with controller specs and mocks
- add jest, ts-jest, supertest, and related dev dependencies - add test scripts (test, test:debug, test:watch) to package.json - add jest.config.js with ts-jest transform and module name mappers - add controller specs for auth, browser, environment, mcp, scenario, session - add mocks for jsdom, playwright, and readability - add test/tsconfig.json and exclude test dir from main tsconfig
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
import { INestApplication } from '@nestjs/common';
|
||||
import request from 'supertest';
|
||||
import { buildTestApp } from './app.harness';
|
||||
|
||||
describe('EnvironmentController', () => {
|
||||
let app: INestApplication;
|
||||
|
||||
beforeAll(async () => {
|
||||
app = await buildTestApp();
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await app.close();
|
||||
});
|
||||
|
||||
// ── POST /environments ─────────────────────────────────────────────────────
|
||||
|
||||
describe('POST /environments', () => {
|
||||
it('creates an environment and returns 201', async () => {
|
||||
const res = await request(app.getHttpServer())
|
||||
.post('/environments')
|
||||
.send({ name: 'env-a', urls: { id_url: 'https://id.example.com' } })
|
||||
.expect(201);
|
||||
|
||||
expect(res.body.id).toBeDefined();
|
||||
expect(res.body.name).toBe('env-a');
|
||||
expect(res.body.urls.id_url).toBe('https://id.example.com');
|
||||
});
|
||||
|
||||
it('returns 400 when name is missing', async () => {
|
||||
await request(app.getHttpServer())
|
||||
.post('/environments')
|
||||
.send({ urls: { id_url: 'https://id.example.com' } })
|
||||
.expect(400);
|
||||
});
|
||||
|
||||
it('returns 400 when urls is missing', async () => {
|
||||
await request(app.getHttpServer())
|
||||
.post('/environments')
|
||||
.send({ name: 'env-no-urls' })
|
||||
.expect(400);
|
||||
});
|
||||
|
||||
it('returns 400 when urls is not an object', async () => {
|
||||
await request(app.getHttpServer())
|
||||
.post('/environments')
|
||||
.send({ name: 'env-bad-urls', urls: 'not-an-object' })
|
||||
.expect(400);
|
||||
});
|
||||
|
||||
it('returns 409 when name already exists', async () => {
|
||||
await request(app.getHttpServer())
|
||||
.post('/environments')
|
||||
.send({ name: 'env-duplicate', urls: {} })
|
||||
.expect(201);
|
||||
|
||||
await request(app.getHttpServer())
|
||||
.post('/environments')
|
||||
.send({ name: 'env-duplicate', urls: {} })
|
||||
.expect(409);
|
||||
});
|
||||
});
|
||||
|
||||
// ── GET /environments ──────────────────────────────────────────────────────
|
||||
|
||||
describe('GET /environments', () => {
|
||||
it('returns 200 with an array', async () => {
|
||||
const res = await request(app.getHttpServer()).get('/environments').expect(200);
|
||||
expect(Array.isArray(res.body)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
// ── GET /environments/:id ──────────────────────────────────────────────────
|
||||
|
||||
describe('GET /environments/:id', () => {
|
||||
it('returns the created environment', async () => {
|
||||
const created = await request(app.getHttpServer())
|
||||
.post('/environments')
|
||||
.send({ name: 'env-get-one', urls: { cabinet_url: 'https://cabinet.example.com' } })
|
||||
.expect(201);
|
||||
|
||||
const res = await request(app.getHttpServer())
|
||||
.get(`/environments/${created.body.id}`)
|
||||
.expect(200);
|
||||
|
||||
expect(res.body.name).toBe('env-get-one');
|
||||
});
|
||||
|
||||
it('returns 404 for unknown id', async () => {
|
||||
await request(app.getHttpServer()).get('/environments/99999').expect(404);
|
||||
});
|
||||
|
||||
it('returns 400 for non-numeric id', async () => {
|
||||
await request(app.getHttpServer()).get('/environments/abc').expect(400);
|
||||
});
|
||||
});
|
||||
|
||||
// ── PATCH /environments/:id ────────────────────────────────────────────────
|
||||
|
||||
describe('PATCH /environments/:id', () => {
|
||||
it('updates name and returns 200', async () => {
|
||||
const created = await request(app.getHttpServer())
|
||||
.post('/environments')
|
||||
.send({ name: 'env-patch-me', urls: {} })
|
||||
.expect(201);
|
||||
|
||||
const res = await request(app.getHttpServer())
|
||||
.patch(`/environments/${created.body.id}`)
|
||||
.send({ name: 'env-patched' })
|
||||
.expect(200);
|
||||
|
||||
expect(res.body.name).toBe('env-patched');
|
||||
});
|
||||
|
||||
it('returns 404 for unknown id', async () => {
|
||||
await request(app.getHttpServer())
|
||||
.patch('/environments/99999')
|
||||
.send({ name: 'x' })
|
||||
.expect(404);
|
||||
});
|
||||
});
|
||||
|
||||
// ── DELETE /environments/:id ───────────────────────────────────────────────
|
||||
|
||||
describe('DELETE /environments/:id', () => {
|
||||
it('deletes and returns 204', async () => {
|
||||
const created = await request(app.getHttpServer())
|
||||
.post('/environments')
|
||||
.send({ name: 'env-delete-me', urls: {} })
|
||||
.expect(201);
|
||||
|
||||
await request(app.getHttpServer())
|
||||
.delete(`/environments/${created.body.id}`)
|
||||
.expect(204);
|
||||
|
||||
await request(app.getHttpServer())
|
||||
.get(`/environments/${created.body.id}`)
|
||||
.expect(404);
|
||||
});
|
||||
|
||||
it('returns 404 for unknown id', async () => {
|
||||
await request(app.getHttpServer()).delete('/environments/99999').expect(404);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user