import type { Provenance, QueryRow } from "@/lib/types"; /** * Fixture builders for the provenance shapes, shared by the query-log, detail * and live-stream tests the way `features/activity/fakeEventSource.ts` is shared. * * The defaults describe the dullest possible query — an allowed name nothing * matched, answered upstream — so each test states only the fields it is about. */ type Sections = { [K in keyof Provenance]?: Partial; }; export function provenance(sections: Sections = {}): Provenance { return { request: { time: 1_700_000_000, domain: "example.com", client: "192.0.2.10", qtype: 1, qclass: 1, ...sections.request, }, group: { id: 1, name: "default", ...sections.group }, policy: { action: "allow", reason: "no_match", matched: "", source_id: null, source_name: "", ...sections.policy, }, rewrites: { cname_target: "", safe_search_target: "", ...sections.rewrites }, route: { kind: "upstream", forward_zone: "", upstream: "https://dns.example/dns-query", ...sections.route }, response: { rcode: 0, duration_us: 1234, ...sections.response }, }; } /** The flat stored row of the same dull query. */ export function queryRow(id: number, overrides: Partial = {}): QueryRow { return { id, ts: 1_700_000_000, domain: "example.com", client_ip: "192.0.2.10", qtype: 1, qclass: 1, rcode: 0, blocked: false, response_time_us: 1234, cache_hit: false, upstream: "https://dns.example/dns-query", policy_action: "allow", policy_reason: "no_match", route_kind: "upstream", ...overrides, }; }