Files
SnapOtter/tests/unit/shared/telemetry-doc-drift.test.ts
T
SnapOtterandGitHub 44f5aea326 fix(ci): repair the chronically-failing nightly workflow (#624)
The scheduled Nightly had been red for over a week across nearly every job. This
root-causes and fixes each one. All were pre-existing: missing CI provisioning,
specs that drifted as the app grew, a job too heavy for its timeout, and a fuzz
that was never configured for file-upload endpoints. None came from the recent
security merge.

- Coverage + Docker Container E2E: install tesseract and its language packs so
  the built-in Fast OCR tests stop throwing spawn ENOENT; gate two repo-file and
  release-workflow tests that cannot run inside the slimmed container image.
- E2E (Full, Serial, Cross-Browser, Device Matrix): refresh specs that drifted
  behind the app (tool renames, the now admin-only Tools tab, dropped About copy,
  locator collisions scoped to the right region). One real product fix rode
  along: /config/auth was refetched six times per tool-page load, so cache it
  behind a single shared fetch, dropping the tool page from 13 to 8 API calls.
- Extended Matrix + Fuzz: shard the integration suite four ways so the full
  format x tool matrix plus property fuzz fits its budget instead of overrunning
  the 90-minute ceiling every night.
- Schemathesis: exclude the tools with bespoke handlers that process
  synchronously in-request (they hang the fuzz on adversarial input) and suppress
  Hypothesis's data-generation health checks, which fire because file-upload
  endpoints reject the fuzzer's random bytes. not_a_server_error still runs on
  every generated case (5000+ per run).
- Stabilize two long-tail flakes: raise the avif matrix per-test cap from 240s to
  600s, and assert toHaveCount(0) on the deleted user row so a transient success
  toast no longer trips a strict-mode violation.

Verified end to end: the full Nightly workflow is green on this branch (all 14
jobs), and PR CI is green.
2026-07-24 03:54:50 +08:00

25 lines
1.0 KiB
TypeScript

// @vitest-environment node
import { existsSync, readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import { ANALYTICS_EVENTS } from "@snapotter/shared";
import { describe, expect, it } from "vitest";
// Keep the contributor-facing event dictionary honest: every analytics event in
// ANALYTICS_EVENTS must be documented in TELEMETRY.md as a `code-span`. Adding an
// event without documenting it fails here.
describe("TELEMETRY.md event dictionary", () => {
it("documents every ANALYTICS_EVENTS value", () => {
// TELEMETRY.md is stripped from the shipped container image (.dockerignore),
// so this doc-drift check runs in PR CI, not inside the Docker Container E2E.
if (existsSync("/.dockerenv")) return;
const doc = readFileSync(
fileURLToPath(new URL("../../../TELEMETRY.md", import.meta.url)),
"utf8",
);
const undocumented = Object.values(ANALYTICS_EVENTS).filter(
(event) => !doc.includes(`\`${event}\``),
);
expect(undocumented).toEqual([]);
});
});