feat: v0.6.0 — data foundation: Drizzle ORM + SQLite (sql.js/WASM) persistence, first-run seed, read-only GET /api/state snapshot
This commit is contained in:
+51
-2
@@ -3,8 +3,12 @@ import { describe, expect, it } from 'vitest';
|
||||
import { openApiSpec } from './openapi';
|
||||
|
||||
describe('OpenAPI spec', () => {
|
||||
it('documents exactly the two public endpoints', () => {
|
||||
expect(Object.keys(openApiSpec.paths).sort()).toEqual(['/api/airports', '/api/version']);
|
||||
it('documents exactly the three public endpoints', () => {
|
||||
expect(Object.keys(openApiSpec.paths).sort()).toEqual([
|
||||
'/api/airports',
|
||||
'/api/state',
|
||||
'/api/version',
|
||||
]);
|
||||
});
|
||||
|
||||
it('keeps info.version in sync with package.json', () => {
|
||||
@@ -46,4 +50,49 @@ describe('OpenAPI spec', () => {
|
||||
expect(Object.keys(props)).toEqual(['version']);
|
||||
expect(props.version.type).toBe('string');
|
||||
});
|
||||
|
||||
it('describes /api/state as a StateSnapshot with account, simState, planes and contracts', () => {
|
||||
const schema = openApiSpec.paths['/api/state'].get.responses[200].content['application/json'].schema;
|
||||
expect(schema.$ref).toBe('#/components/schemas/StateSnapshot');
|
||||
|
||||
const snap = openApiSpec.components.schemas.StateSnapshot.properties;
|
||||
expect(Object.keys(snap).sort()).toEqual(['account', 'contracts', 'planes', 'simState']);
|
||||
expect(snap.account.$ref).toBe('#/components/schemas/AccountState');
|
||||
expect(snap.simState.$ref).toBe('#/components/schemas/SimState');
|
||||
expect(snap.planes.items.$ref).toBe('#/components/schemas/PlaneState');
|
||||
expect(snap.contracts.items.$ref).toBe('#/components/schemas/ContractState');
|
||||
|
||||
const plane = openApiSpec.components.schemas.PlaneState.properties;
|
||||
expect(Object.keys(plane).sort()).toEqual([
|
||||
'contractId',
|
||||
'fuel',
|
||||
'id',
|
||||
'lat',
|
||||
'locationIcao',
|
||||
'locationName',
|
||||
'lon',
|
||||
'maxFuel',
|
||||
'model',
|
||||
'status',
|
||||
]);
|
||||
|
||||
const contract = openApiSpec.components.schemas.ContractState.properties;
|
||||
expect(Object.keys(contract).sort()).toEqual([
|
||||
'cargoCount',
|
||||
'cargoType',
|
||||
'createdSimTime',
|
||||
'deadlineSimTime',
|
||||
'destIcao',
|
||||
'destName',
|
||||
'id',
|
||||
'originIcao',
|
||||
'originName',
|
||||
'planeId',
|
||||
'reward',
|
||||
'status',
|
||||
]);
|
||||
|
||||
const sim = openApiSpec.components.schemas.SimState.properties;
|
||||
expect(Object.keys(sim).sort()).toEqual(['clockMs', 'paused', 'timeScale']);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user