feat: add world travel database schema

This commit is contained in:
Bastian Wagner
2026-08-18 18:27:21 +02:00
parent 1210ba2d15
commit 492765d8ca
7 changed files with 399 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
import 'reflect-metadata';
import { readFileSync } from 'node:fs';
import { join } from 'node:path';
import { getMetadataArgsStorage } from 'typeorm';
import { Character } from '../../characters/entities/character.entity';
import { Travel } from '../../travel/entities/travel.entity';
import { LocationConnection } from '../../world/entities/location-connection.entity';
import { LocationDefinition } from '../../world/entities/location-definition.entity';
describe('visible vertical slice schema', () => {
it('maps the location key and relationship foreign keys explicitly', () => {
const metadata = getMetadataArgsStorage();
const locationIndex = metadata.indices.find((index) => {
const metadataIndex = index as typeof index & {
options?: { unique?: boolean };
unique?: boolean;
};
return (
index.target === LocationDefinition &&
index.columns?.includes('key') &&
(metadataIndex.options?.unique ?? metadataIndex.unique) === true
);
});
expect(locationIndex).toBeDefined();
const joinColumns = metadata.joinColumns
.filter((joinColumn) =>
[Character, LocationConnection, Travel].includes(
joinColumn.target as typeof Character,
),
)
.map((joinColumn) => joinColumn.name);
expect(joinColumns).toEqual(
expect.arrayContaining([
'current_location_id',
'from_location_id',
'to_location_id',
'character_id',
'origin_location_id',
'target_location_id',
]),
);
});
it('creates the complete schema with explicit reversible SQL', () => {
const migrationText = readFileSync(
join(__dirname, '1787072400000-CreateVisibleVerticalSlice.ts'),
'utf8',
);
expect(migrationText).toContain('CREATE TABLE "location_definitions"');
expect(migrationText).toContain('CREATE TABLE "characters"');
expect(migrationText).toContain('CREATE TABLE "location_connections"');
expect(migrationText).toContain('CREATE TABLE "travels"');
expect(migrationText).toContain(
'CREATE UNIQUE INDEX "IDX_location_connection_direction"',
);
expect(migrationText).toContain(
'CREATE UNIQUE INDEX "IDX_active_travel_per_character"',
);
expect(migrationText).toContain('DROP TYPE "travel_status_enum"');
expect(migrationText).not.toContain('synchronize');
});
});