feat: add world travel database schema
This commit is contained in:
@@ -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');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user