Files
ThothII/harness/tests/fixtures/schema.sql
T
marcopan eb3bde90e2 test(harness): L0 testcontainers + L1 contract tests for ported db/mschema/rest (A9, spec §1)
Ports the leaf data-layer modules and validates them:
- mschema/ (models, eligibility, merge, render), db/ (connection, sampling,
  introspect, fetch_ca), rest/client.py -- renamed psdwp3->nsp, verbatim.
- L0 (testcontainers, real Postgres): db connection read-only enforcement
  (psd_ro cannot CREATE/INSERT), introspect against a known schema (tables,
  columns, types, comments, FKs, enum, composite PK), sampling most-frequent
  values + truncation reporting. 15 tests, ~4s.
- L1 (fake data): rest/client RPC contract (mocked transport -- X-API-Key
  header, payloads, base_url slash handling, HTTP/network error surfacing),
  mschema/render 3 formats (markdown, mschema-text, schema-dict) +
  eligibility rules (wide_text excluded, short_text/numeric/enum/temporal/
  boolean eligible, annotation override wins). 25 tests.

pyproject registers l0/l2 markers + addopts '-m not l2' (L2 opt-in).

Deferred to their dependency-porting tasks: test_rrf.py (search needs
vectorstore, B3) and the 11 CLI contract tests (need _guards/session, wired
when each command lands). 'Not assumed reliable' now has real teeth for the
data layer; CLI/search contracts follow.
2026-06-26 22:53:08 +02:00

59 lines
2.6 KiB
SQL

CREATE SCHEMA dw;
CREATE TABLE dw.dim_pazienti (
id_paziente BIGINT PRIMARY KEY,
nome VARCHAR(100),
citta VARCHAR(100)
);
COMMENT ON TABLE dw.dim_pazienti IS 'Anagrafica pazienti';
COMMENT ON COLUMN dw.dim_pazienti.citta IS 'Comune di residenza';
CREATE TABLE dw.dim_periodi (
anno INT NOT NULL,
mese INT NOT NULL,
descrizione VARCHAR(50),
PRIMARY KEY (anno, mese)
);
CREATE TYPE dw.tipo_ricovero AS ENUM ('ordinario', 'day_hospital', 'urgenza');
CREATE TABLE dw.fct_ricoveri (
id_ricovero BIGINT PRIMARY KEY,
id_paziente BIGINT REFERENCES dw.dim_pazienti (id_paziente),
anno INT,
mese INT,
diagnosi VARCHAR(200),
procedura TEXT,
reparto VARCHAR(50),
tipo dw.tipo_ricovero,
lettera_dimissione TEXT,
etl_last_update TIMESTAMP,
FOREIGN KEY (anno, mese) REFERENCES dw.dim_periodi (anno, mese)
);
COMMENT ON TABLE dw.fct_ricoveri IS 'Fatti: ricoveri ospedalieri';
COMMENT ON COLUMN dw.fct_ricoveri.diagnosi IS 'Diagnosi principale (testo)';
INSERT INTO dw.dim_pazienti VALUES
(1, 'Mario Rossi', 'Milano'),
(2, 'Anna Bianchi', 'Bergamo'),
(3, 'Luca Verdi', 'Brescia');
INSERT INTO dw.dim_periodi VALUES
(2025, 1, 'Gennaio 2025'), (2025, 2, 'Febbraio 2025');
INSERT INTO dw.fct_ricoveri VALUES
(10, 1, 2025, 1, 'fibrillazione atriale', 'ablazione transcatetere', 'cardiologia', 'ordinario',
'Si dimette il paziente in condizioni cliniche stabili dopo ablazione transcatetere della fibrillazione atriale; si raccomanda terapia anticoagulante orale e controllo cardiologico ambulatoriale a trenta giorni dalla dimissione.',
'2025-02-01 03:00:00'),
(11, 2, 2025, 1, 'infarto miocardico acuto', 'angioplastica coronarica', 'cardiologia', 'urgenza',
'Paziente ricoverato per infarto miocardico acuto trattato con angioplastica coronarica primaria e impianto di stent medicato; decorso post-procedurale regolare, si dimette con doppia antiaggregazione e indicazione a riabilitazione cardiologica.',
'2025-02-01 03:00:00'),
(12, 3, 2025, 2, 'fibrillazione ventricolare', 'defibrillazione', 'cardiologia', 'urgenza',
'Ricovero in urgenza per fibrillazione ventricolare con arresto cardiocircolatorio rianimato; stabilizzato in terapia intensiva cardiologica, si dimette con indicazione a impianto di defibrillatore e follow-up elettrofisiologico.',
'2025-03-01 03:00:00'),
(13, 1, 2025, 2, 'scompenso cardiaco', NULL, 'pronto soccorso', 'ordinario', NULL, '2025-03-01 03:00:00');
CREATE ROLE psd_ro LOGIN PASSWORD 'psd_ro';
GRANT USAGE ON SCHEMA dw TO psd_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA dw TO psd_ro;
ANALYZE;