Files
web-cad/frontend/tests/projectTemplates.test.ts
T

86 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Task H2 Projekt-Templates: JSON-Presets für Branchen-Szenarien.
*
* Sechs Presets (halle/openair/saal/messe/buero/garten), jedes mit
* gridSize/unit, Layer-Set, enabled plugins und library folder seed.
* applyProjectTemplate überträgt die Layer in ein CADDocument
* (bestehende Layer werden ersetzt — Template = Startzustand).
*/
import { describe, it, expect } from 'vitest';
import { CADDocument } from '../src/kernel/document/CADDocument';
import { createInMemoryDoc } from './helpers/inMemoryDoc';
import {
PROJECT_TEMPLATES,
getProjectTemplate,
applyProjectTemplate,
type ProjectTemplate,
} from '../src/services/projectTemplates';
const EXPECTED_IDS = ['halle', 'openair', 'saal', 'messe', 'buero', 'garten'];
describe('H2: Projekt-Templates', () => {
it('enthält genau die 6 Branchen-Presets mit eindeutigen IDs', () => {
expect(PROJECT_TEMPLATES.map((t) => t.id).sort()).toEqual([...EXPECTED_IDS].sort());
expect(new Set(PROJECT_TEMPLATES.map((t) => t.id)).size).toBe(6);
});
it('jedes Preset hat Name, gridSize, unit, Layer (>=2), enabledPlugins und libraryFolderSeed', () => {
for (const tpl of PROJECT_TEMPLATES) {
expect(tpl.name.length).toBeGreaterThan(2);
expect(tpl.gridSize).toBeGreaterThan(0);
expect(['mm', 'cm', 'm']).toContain(tpl.unit);
expect(tpl.layers.length).toBeGreaterThanOrEqual(2);
expect(tpl.enabledPlugins.length).toBeGreaterThan(0);
expect(tpl.libraryFolderSeed.length).toBeGreaterThan(2);
// Layer haben gültige CADLayer-Struktur mit eindeutigen IDs
const layerIds = new Set(tpl.layers.map((l) => l.id));
expect(layerIds.size).toBe(tpl.layers.length);
expect(tpl.layers.every((l) => l.name.length > 0 && typeof l.visible === 'boolean')).toBe(true);
}
});
it('Szenario-spezifika: halle/openair/saal aktivieren event-tools, garten landscape', () => {
const halle = getProjectTemplate('halle')!;
expect(halle.enabledPlugins).toContain('event-tools');
const openair = getProjectTemplate('openair')!;
expect(openair.enabledPlugins).toContain('event-tools');
const saal = getProjectTemplate('saal')!;
expect(saal.enabledPlugins).toContain('event-tools');
const garten = getProjectTemplate('garten')!;
expect(garten.libraryFolderSeed.toLowerCase()).toContain('garten');
const buero = getProjectTemplate('buero')!;
expect(buero.unit).toBe('mm');
});
it('getProjectTemplate liefert undefined für unbekannte ID', () => {
expect(getProjectTemplate('gibts-nicht')).toBeUndefined();
});
});
describe('H2: applyProjectTemplate', () => {
it('setzt die Template-Layer im CADDocument (ersetzt bestehende)', () => {
const { ydoc } = createInMemoryDoc();
const doc = new CADDocument(ydoc);
// Bestehenden Layer simulieren
ydoc.data.layers.set('alt', {
id: 'alt', name: 'Alt', visible: true, locked: false,
color: '#fff', lineType: 'solid', transparency: 0, sortOrder: 0, parentId: null,
});
const tpl = getProjectTemplate('halle')!;
applyProjectTemplate(doc, tpl);
const layers = doc.getAllLayers();
expect(layers.map((l) => l.id)).toEqual(tpl.layers.map((l) => l.id));
expect(layers.find((l) => l.id === 'alt')).toBeUndefined();
});
it('Template-Layer sind danach über CADDocument lesbar', () => {
const { ydoc } = createInMemoryDoc();
const doc = new CADDocument(ydoc);
const tpl = getProjectTemplate('buero')!;
applyProjectTemplate(doc, tpl);
const first = doc.getLayer(tpl.layers[0].id);
expect(first).toBeDefined();
expect(first!.name).toBe(tpl.layers[0].name);
});
});