From 44e13cc67eb9873027790fbadfadcf45dd023fcc Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Mon, 15 Jun 2026 05:05:13 +0300 Subject: [PATCH] test: cover checked-in openapi artifacts --- apps/backend/src/openapi-artifacts.spec.ts | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 apps/backend/src/openapi-artifacts.spec.ts diff --git a/apps/backend/src/openapi-artifacts.spec.ts b/apps/backend/src/openapi-artifacts.spec.ts new file mode 100644 index 0000000..38caeec --- /dev/null +++ b/apps/backend/src/openapi-artifacts.spec.ts @@ -0,0 +1,34 @@ +import { readFileSync } from 'node:fs'; +import { join, resolve } from 'node:path'; + +describe('checked-in OpenAPI artifacts', () => { + const rootDir = resolve(process.cwd(), '../..'); + const frontendTypes = readFileSync(join(rootDir, 'apps/frontend/src/api/types.ts'), 'utf8'); + const openapiYaml = readFileSync(join(rootDir, 'docs/openapi/openapi.yaml'), 'utf8'); + + const requiredPaths = [ + '/api/v1/auth/register', + '/api/v1/auth/login', + '/api/v1/auth/refresh', + '/api/v1/auth/logout', + '/api/v1/auth/me', + '/api/v1/securities/screener', + '/api/v1/portfolios', + '/api/v1/portfolios/{id}', + '/api/v1/portfolios/{id}/positions', + '/api/v1/portfolios/{id}/positions/{positionId}', + '/api/v1/portfolios/{id}/analytics', + ]; + + it('frontend generated types include current protected domains', () => { + for (const path of requiredPaths) { + expect(frontendTypes).toContain(`'${path}'`); + } + }); + + it('static OpenAPI YAML snapshot includes current protected domains', () => { + for (const path of requiredPaths) { + expect(openapiYaml).toContain(`${path}:`); + } + }); +});