From f88e2a8141379cb1644f817a1ef6637d52cb806e Mon Sep 17 00:00:00 2001 From: Schalli Date: Tue, 21 Jul 2026 10:56:13 +0200 Subject: [PATCH] =?UTF-8?q?test(10-03):=20add=20failing=20specs=20+=20real?= =?UTF-8?q?=20D=C3=96E=20fixtures=20for=20adapter/normalizer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Capture real, trimmed DÖE day-export fixtures (pubDay=2026-07-19, 8 notices spanning tender/award/planning/untagged-with-awards tag classes) under tenders/__fixtures__/, live-downloaded from oeffentlichevergabe.de - Define RawTenderRecord/NormalizedTenderFields/SourceType (tender.types.ts) and TenderSourceAdapter (day-cursor fetchTenders signature per RESEARCH Pattern 1) - RED: doe-opendata.adapter.spec.ts asserts D-02 exact-count filtering, HTTP-400 no-op, and a zip-bomb ceiling guard (T-10-07) - RED: tender-normalizer.service.spec.ts asserts eForms-primary deadline recovery where OCDS is null (RESEARCH Pattern 3), nullable deadline/value, dedupKey priority (ocid -> sourcePortal:sourceNoticeId), and a stable sha256 contentHash --- .../__fixtures__/doe-eforms-sample.zip | Bin 0 -> 51606 bytes .../tenders/__fixtures__/doe-ocds-sample.zip | Bin 0 -> 16291 bytes .../adapters/doe-opendata.adapter.spec.ts | 139 +++++++++++++++++ .../tender-source-adapter.interface.ts | 29 ++++ .../tenders/tender-normalizer.service.spec.ts | 146 ++++++++++++++++++ apps/api/src/tenders/tender.types.ts | 74 +++++++++ 6 files changed, 388 insertions(+) create mode 100644 apps/api/src/tenders/__fixtures__/doe-eforms-sample.zip create mode 100644 apps/api/src/tenders/__fixtures__/doe-ocds-sample.zip create mode 100644 apps/api/src/tenders/adapters/doe-opendata.adapter.spec.ts create mode 100644 apps/api/src/tenders/adapters/tender-source-adapter.interface.ts create mode 100644 apps/api/src/tenders/tender-normalizer.service.spec.ts create mode 100644 apps/api/src/tenders/tender.types.ts diff --git a/apps/api/src/tenders/__fixtures__/doe-eforms-sample.zip b/apps/api/src/tenders/__fixtures__/doe-eforms-sample.zip new file mode 100644 index 0000000000000000000000000000000000000000..7ff5f9e05dd65e1367b1664e5f8b362f7a6691bd GIT binary patch literal 51606 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 literal 0 HcmV?d00001 diff --git a/apps/api/src/tenders/adapters/doe-opendata.adapter.spec.ts b/apps/api/src/tenders/adapters/doe-opendata.adapter.spec.ts new file mode 100644 index 0000000..e008e08 --- /dev/null +++ b/apps/api/src/tenders/adapters/doe-opendata.adapter.spec.ts @@ -0,0 +1,139 @@ +import AdmZip from 'adm-zip'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { DoeOpenDataAdapter } from './doe-opendata.adapter'; + +/** + * Real, trimmed DÖE day-export fixtures (8 notices, captured live from + * oeffentlichevergabe.de/api/notice-exports for pubDay=2026-07-19, trimmed + * to a representative sample spanning D-02's tag classes): + * - 4x tag=["tender"] -> must survive the D-02 filter + * - 2x tag=["award"] -> must be excluded + * - 1x tag=["planning"] -> must be excluded + * - 1x no tag, populated awards -> must be excluded (Pitfall C) + */ +const FIXTURES_DIR = join(__dirname, '..', '__fixtures__'); +const EFORMS_FIXTURE = join(FIXTURES_DIR, 'doe-eforms-sample.zip'); +const OCDS_FIXTURE = join(FIXTURES_DIR, 'doe-ocds-sample.zip'); +const EXPECTED_TENDER_TAGGED_COUNT = 4; +const TEST_PUBDAY = '2026-07-19'; + +function stubFetchWithFixtures(): void { + const eformsBuffer = readFileSync(EFORMS_FIXTURE); + const ocdsBuffer = readFileSync(OCDS_FIXTURE); + + vi.stubGlobal( + 'fetch', + vi.fn(async (url: string) => { + const isEforms = url.includes('format=eforms.zip'); + const buffer = isEforms ? eformsBuffer : ocdsBuffer; + return { + ok: true, + status: 200, + arrayBuffer: async () => + buffer.buffer.slice( + buffer.byteOffset, + buffer.byteOffset + buffer.byteLength, + ), + } as Response; + }), + ); +} + +function stub400Fetch(): void { + vi.stubGlobal( + 'fetch', + vi.fn(async () => { + return { ok: false, status: 400 } as Response; + }), + ); +} + +describe('DoeOpenDataAdapter', () => { + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it('has sourceType doe-opendata', () => { + const adapter = new DoeOpenDataAdapter(); + expect(adapter.sourceType).toBe('doe-opendata'); + }); + + it('parses the fixture ZIPs into RawTenderRecord[], D-02 filtered to only tag=["tender"] notices', async () => { + stubFetchWithFixtures(); + const adapter = new DoeOpenDataAdapter(); + + const records = await adapter.fetchTenders(TEST_PUBDAY); + + // (a) parsed records exist, (b) D-02 filter keeps only tag=["tender"], + // exact count assertion against the real fixture's known composition. + expect(records).toHaveLength(EXPECTED_TENDER_TAGGED_COUNT); + for (const record of records) { + expect(record.sourceType).toBe('doe-opendata'); + expect(record.ocdsPayload).toBeTruthy(); + expect(record.eformsPayload).toBeTruthy(); + } + }); + + it('excludes award/planning/untagged-with-awards notices from the returned records', async () => { + stubFetchWithFixtures(); + const adapter = new DoeOpenDataAdapter(); + + const records = await adapter.fetchTenders(TEST_PUBDAY); + const noticeIds = records.map((r) => r.sourceNoticeId); + + // Known award-tagged notice ids from the fixture — must NOT appear. + expect(noticeIds).not.toContain('006803d3-5b37-4362-bea9-124a44de67cb'); + expect(noticeIds).not.toContain('00a66578-d011-4a35-9628-eadd057228a0'); + // Known planning-tagged notice id — must NOT appear. + expect(noticeIds).not.toContain('0891b60a-846a-47c0-8d90-11bbde87d560'); + // Known untagged-with-populated-awards notice id — must NOT appear (Pitfall C). + expect(noticeIds).not.toContain('01726f63-0dbc-4456-b355-67082823199f'); + }); + + it('returns [] without throwing when the DÖE endpoint responds 400 (today/future pubDay, expected no-op)', async () => { + stub400Fetch(); + const adapter = new DoeOpenDataAdapter(); + + const records = await adapter.fetchTenders('2026-07-21'); + + expect(records).toEqual([]); + }); + + it('rejects an archive whose declared uncompressed size exceeds the decompression-bomb ceiling, before extracting entries (T-10-07)', async () => { + // Highly compressible synthetic archive: real (not corrupted) zip whose + // entries declare well over the ~50MB ceiling in their uncompressed + // size header, while the on-disk/compressed archive itself stays tiny. + const bomb = new AdmZip(); + bomb.addFile('bomb.xml', Buffer.alloc(60 * 1024 * 1024, 0)); + const bombBuffer = bomb.toBuffer(); + + vi.stubGlobal( + 'fetch', + vi.fn(async () => { + return { + ok: true, + status: 200, + arrayBuffer: async () => + bombBuffer.buffer.slice( + bombBuffer.byteOffset, + bombBuffer.byteOffset + bombBuffer.byteLength, + ), + } as Response; + }), + ); + + const adapter = new DoeOpenDataAdapter(); + + await expect(adapter.fetchTenders(TEST_PUBDAY)).rejects.toThrow(); + }); + + it('never imports or uses axios (native fetch is the sole HTTP client convention)', () => { + const source = readFileSync( + join(__dirname, 'doe-opendata.adapter.ts'), + 'utf8', + ); + expect(source).not.toMatch(/from ['"]axios['"]/); + }); +}); diff --git a/apps/api/src/tenders/adapters/tender-source-adapter.interface.ts b/apps/api/src/tenders/adapters/tender-source-adapter.interface.ts new file mode 100644 index 0000000..3065114 --- /dev/null +++ b/apps/api/src/tenders/adapters/tender-source-adapter.interface.ts @@ -0,0 +1,29 @@ +import type { RawTenderRecord, SourceType } from '../tender.types'; + +/** + * Contract implemented by every tender source adapter (DÖE OpenData this + * phase; AI-NetServer/cosinex/RSS/email-alert in later phases). + * + * `fetchTenders` takes a day-cursor string (`YYYY-MM-DD`), NOT a `since: Date` + * timestamp — the DÖE OpenData API is a daily batch-export API with no + * incremental/since parameter (RESEARCH.md Pattern 1 corrects the + * `ARCHITECTURE.md` sketch's `since?: Date` signature). Day-cursor is kept + * as the shared interface shape so future adapters that ARE incremental + * (e.g. RSS) can still satisfy it by treating the day as a coarse filter, + * rather than forking the interface per source. + */ +export interface TenderSourceAdapter { + readonly sourceType: SourceType; + + /** + * Fetch and lightly parse all open-tender ("tender"-tagged", D-02) + * notices for the given calendar day (Europe/Berlin), already filtered — + * implementations must NOT return award/planning/untagged-with-awards + * notices. + * + * @param dayCursor - `YYYY-MM-DD`, must be strictly in the past (today/ + * future is rejected upstream by the DÖE API with HTTP 400). Implementations + * treat that 400 as an expected no-op and resolve to `[]`, never throw. + */ + fetchTenders(dayCursor: string): Promise; +} diff --git a/apps/api/src/tenders/tender-normalizer.service.spec.ts b/apps/api/src/tenders/tender-normalizer.service.spec.ts new file mode 100644 index 0000000..a26ed7f --- /dev/null +++ b/apps/api/src/tenders/tender-normalizer.service.spec.ts @@ -0,0 +1,146 @@ +import AdmZip from 'adm-zip'; +import { XMLParser } from 'fast-xml-parser'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { describe, expect, it } from 'vitest'; +import type { RawTenderRecord } from './tender.types'; +import { TenderNormalizerService } from './tender-normalizer.service'; + +/** + * Loads a real notice pair (eForms-DE XML + OCDS JSON) directly from the + * committed fixture ZIPs and assembles it into a RawTenderRecord — the same + * real-fixture precedent as the DKV PDF parser, kept independent of + * DoeOpenDataAdapter so this unit test exercises TenderNormalizerService in + * isolation as a pure mapping function. + */ +const FIXTURES_DIR = join(__dirname, '__fixtures__'); +const xmlParser = new XMLParser({ + removeNSPrefix: true, + ignoreAttributes: false, + attributeNamePrefix: '@_', +}); + +function loadRawNoticePair(basename: string): RawTenderRecord { + const eformsZip = new AdmZip( + readFileSync(join(FIXTURES_DIR, 'doe-eforms-sample.zip')), + ); + const ocdsZip = new AdmZip( + readFileSync(join(FIXTURES_DIR, 'doe-ocds-sample.zip')), + ); + + const xmlEntry = eformsZip.getEntry(`${basename}.xml`); + const jsonEntry = ocdsZip.getEntry(`${basename}.json`); + if (!xmlEntry || !jsonEntry) { + throw new Error(`Fixture entry missing for ${basename}`); + } + + const eformsPayload = xmlParser.parse(xmlEntry.getData().toString('utf8')); + const ocdsDocument = JSON.parse(jsonEntry.getData().toString('utf8')); + const release = ocdsDocument.releases[0]; + + return { + sourceType: 'doe-opendata', + sourcePortal: 'doe-opendata', + sourceNoticeId: release.id, + ocid: release.ocid, + sourceUrl: ocdsDocument.uri, + fetchedAt: new Date(), + publishedAt: ocdsDocument.publishedDate + ? new Date(ocdsDocument.publishedDate) + : null, + eformsPayload, + ocdsPayload: release, + }; +} + +// Real notice: eForms XML has a structured +// ProcurementProjectLot/TenderingProcess/TenderSubmissionDeadlinePeriod/EndDate +// (2026-08-18), while the paired OCDS release has no `tender.tenderPeriod` at +// all (RESEARCH.md Pattern 3 live cross-check). +const NOTICE_WITH_EFORMS_ONLY_DEADLINE = + '019f64ec-cd64-4c09-8fd7-4fd12d8eea64-01'; + +// Real notice: neither the eForms XML nor the OCDS release carries a +// deadline or estimated value (RESEARCH.md Pattern 4 — the common case). +const NOTICE_WITH_NO_DEADLINE_OR_VALUE = + '001c68dd-258a-4bf7-a264-478604ad9c3e-01'; + +describe('TenderNormalizerService', () => { + const service = new TenderNormalizerService(); + + it('recovers deadlineAt from eForms-DE XML when the OCDS release has no tenderPeriod (SCHEMA-01 key assertion)', () => { + const raw = loadRawNoticePair(NOTICE_WITH_EFORMS_ONLY_DEADLINE); + + const normalized = service.normalize(raw); + + expect(normalized.deadlineAt).not.toBeNull(); + expect(normalized.deadlineAt?.getUTCFullYear()).toBe(2026); + expect(normalized.deadlineAt?.getUTCMonth()).toBe(7); // August (0-indexed) + expect(normalized.deadlineAt?.getUTCDate()).toBe(18); + }); + + it('normalizes missing deadline/value to null, not thrown or zero', () => { + const raw = loadRawNoticePair(NOTICE_WITH_NO_DEADLINE_OR_VALUE); + + const normalized = service.normalize(raw); + + expect(normalized.deadlineAt).toBeNull(); + expect(normalized.estimatedValue).toBeNull(); + expect(normalized.title).toBeTruthy(); + }); + + it('dedupKey = ocid when present', () => { + const raw = loadRawNoticePair(NOTICE_WITH_EFORMS_ONLY_DEADLINE); + + const normalized = service.normalize(raw); + + expect(raw.ocid).toBeTruthy(); + expect(normalized.dedupKey).toBe(raw.ocid); + }); + + it('dedupKey falls back to sourcePortal:sourceNoticeId when ocid is absent', () => { + const raw = loadRawNoticePair(NOTICE_WITH_EFORMS_ONLY_DEADLINE); + const rawWithoutOcid: RawTenderRecord = { ...raw, ocid: undefined }; + + const normalized = service.normalize(rawWithoutOcid); + + expect(normalized.dedupKey).toBe( + `${raw.sourcePortal}:${raw.sourceNoticeId}`, + ); + }); + + it('contentHash is a stable sha256 over title+deadline+value+status', () => { + const raw = loadRawNoticePair(NOTICE_WITH_EFORMS_ONLY_DEADLINE); + + const first = service.normalize(raw); + const second = service.normalize(raw); + + expect(first.contentHash).toBe(second.contentHash); + expect(first.contentHash).toMatch(/^[a-f0-9]{64}$/); + }); + + it('contentHash changes when the deadline changes', () => { + const raw = loadRawNoticePair(NOTICE_WITH_EFORMS_ONLY_DEADLINE); + const original = service.normalize(raw); + + // Mutate the eForms deadline to simulate a Fristverlängerung (SCHEMA-02). + const mutatedEformsPayload = JSON.parse(JSON.stringify(raw.eformsPayload)); + const root = + mutatedEformsPayload[Object.keys(mutatedEformsPayload)[0]]; + const lots = Array.isArray(root.ProcurementProjectLot) + ? root.ProcurementProjectLot + : [root.ProcurementProjectLot]; + for (const lot of lots) { + lot.TenderingProcess.TenderSubmissionDeadlinePeriod.EndDate = + '2026-12-31+01:00'; + } + const mutatedRaw: RawTenderRecord = { + ...raw, + eformsPayload: mutatedEformsPayload, + }; + + const mutated = service.normalize(mutatedRaw); + + expect(mutated.contentHash).not.toBe(original.contentHash); + }); +}); diff --git a/apps/api/src/tenders/tender.types.ts b/apps/api/src/tenders/tender.types.ts new file mode 100644 index 0000000..70e8b6a --- /dev/null +++ b/apps/api/src/tenders/tender.types.ts @@ -0,0 +1,74 @@ +/** + * Shared types for the Ausschreibungs-Radar (tender ingestion) module. + * + * These interfaces are the single source of truth for the data shapes + * exchanged between source adapters, the normalizer, and (in Plan 04) the + * ingestion/upsert orchestrator. + */ + +/** + * Identifies which upstream source a raw record originated from. + * Only 'doe-opendata' exists in this phase (Phase 10); scraping/RSS/email + * sources are added in later phases (13/14) without changing this contract. + */ +export type SourceType = 'doe-opendata'; + +/** + * A single notice as fetched and lightly parsed from a source, before + * normalization. For the DÖE source this pairs the eForms-DE XML (primary + * structured-field source for deadline/value/procedureType, per RESEARCH + * Pattern 3) with the corresponding OCDS JSON release (primary source for + * `ocid`/buyer/party names). + */ +export interface RawTenderRecord { + sourceType: SourceType; + /** e.g. 'doe-opendata' */ + sourcePortal: string; + /** Stable per-notice id (OCDS release.id — no version suffix), used for the dedupKey fallback tier. */ + sourceNoticeId: string; + /** OCDS Open Contracting ID — present for DÖE, the primary dedup key when available. */ + ocid?: string; + /** Canonical URL to view/re-fetch this notice, when the source exposes one. */ + sourceUrl?: string; + /** When this record was fetched by the adapter (wall-clock, not notice publish date). */ + fetchedAt: Date; + /** The notice's own published date, when the source exposes one; null if absent. */ + publishedAt: Date | null; + /** Parsed eForms-DE XML document (fast-xml-parser output) for this notice, or null if unavailable/unpaired. */ + eformsPayload: unknown; + /** Parsed OCDS release object (the single `releases[0]` entry) for this notice. */ + ocdsPayload: unknown; +} + +/** + * The unified, normalized field shape a `TenderSourceAdapter`'s raw records + * are mapped into by `TenderNormalizerService`. This is the Tender column + * subset (SCHEMA-01) plus the computed dedup/change-detection keys. + */ +export interface NormalizedTenderFields { + sourcePortal: string; + sourceNoticeId: string; + /** OCDS Open Contracting ID, when present; null otherwise. */ + ocid: string | null; + /** Upsert target: ocid, else `${sourcePortal}:${sourceNoticeId}` (RESEARCH Pattern 2 priority order). */ + dedupKey: string; + title: string; + buyerName: string | null; + cpvCodes: string[]; + /** NUTS region code (e.g. "DEA41") from the buyer address — not yet mapped to a human Bundesland name. */ + region: string | null; + plz: string | null; + /** Deferred: NUTS→Bundesland name mapping is a Phase 11 filter-UI concern, not this phase's scope. */ + bundesland: string | null; + /** Frequently null (RESEARCH Pattern 4) — nullable is a correctness requirement, not optional hardening. */ + deadlineAt: Date | null; + /** Frequently null (RESEARCH Pattern 4) — nullable is a correctness requirement, not optional hardening. */ + estimatedValue: number | null; + procedureType: string | null; + /** Initial value is always 'active' at normalization time (SCHEMA-01). */ + status: string; + sourceUrl: string | null; + /** sha256(title + deadlineAt + estimatedValue + status) — SCHEMA-02 change-detection hook. */ + contentHash: string; + publishedAt: Date; +}