import { expect, test } from "vitest"; import { parseWorkspaceYaml, serializeWorkspaceYaml } from "../src/workspaces/schema.js"; export const validYaml = `workspace: schema_version: 1 id: psd-clinical name: Policlinico San Donato description: Clinical data warehouse workspace language: it dwh: engine: postgres database: postgres schema: datawarehouse port: 5432 timeout_ms: 5000 supported_transports: - postgres_direct - rest_api - ssh_tunnel semantic_index: vector_store: engine: pgvector collection: clinical_documents dimensions: 768 distance: cosine port: 5432 timeout_ms: 5000 supported_transports: - pgvector_direct - rest_api - ssh_tunnel embedding: provider: ollama_compatible model: nomic-embed-text-v2-moe dimensions: 768 timeout_ms: 5000 llm_policy: default: zai/glm-5.2 allowed: - zai/glm-5.2 - openai/gpt-5 `; test("rejects a workspace whose embedding dimensions differ from its collection", () => { expect(() => parseWorkspaceYaml(validYaml.replace("dimensions: 768", "dimensions: 1536"))) .toThrow(/dimensions/i); }); test("rejects an LLM default outside its allowlist", () => { expect(() => parseWorkspaceYaml(validYaml.replace("- zai/glm-5.2", "- openai/gpt-5"))) .toThrow(/allowlist/i); }); test("rejects unknown keys and invalid immutable IDs", () => { expect(() => parseWorkspaceYaml(validYaml.replace(" language: it", " language: it\n label: PSD"))) .toThrow(/unrecognized key/i); expect(() => parseWorkspaceYaml(validYaml.replace("id: psd-clinical", "id: PSD"))) .toThrow(/id/i); }); test("accepts optional connection ports and timeouts but rejects unsafe values", () => { expect(parseWorkspaceYaml(validYaml).dwh.port).toBe(5432); expect(() => parseWorkspaceYaml(validYaml.replace("port: 5432", "port: 0"))) .toThrow(/port/i); expect(() => parseWorkspaceYaml(validYaml.replace("port: 5432", "port: 65536"))) .toThrow(/port/i); expect(() => parseWorkspaceYaml(validYaml.replace("timeout_ms: 5000", "timeout_ms: 0"))) .toThrow(/timeout/i); }); test("serializes canonical YAML that parses back to the same workspace", () => { const workspace = parseWorkspaceYaml(validYaml); const serialized = serializeWorkspaceYaml(workspace); expect(serializeWorkspaceYaml(parseWorkspaceYaml(serialized))).toBe(serialized); expect(parseWorkspaceYaml(serialized)).toEqual(workspace); });