mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-08 04:32:42 +00:00
* Revert "revert: roll source tree back to v1.4.0 to restore production"
This reverts commit e444a90b10.
* fix(v1.4.2): summaries.WEIGHT + medications array guards + healthcheck IPv4
Three production bugs surfaced after the v1.4.0 deploy stabilized:
1. `TypeError: undefined is not an object (evaluating 'E?.summaries.WEIGHT')`
on /dashboard and /insights for users without weight readings —
the optional chain stopped at `data` when it needed to also cover
`data.summaries`. Fixed: `data?.summaries?.WEIGHT` (one level deeper).
2. `TypeError: y?.filter is not a function` on /medications — the
medications query value was non-array (likely a stale
service-worker response from an older API shape). Replaced with
`Array.isArray(medications) ? medications : []` so the page is
immune to any future shape drift.
3. Healthcheck-induced 503 outage (already in 1.4.1 — included here
so 1.4.2 is the single coherent release). The docker-compose
healthcheck used `localhost` which busybox-wget resolves to IPv6
::1; Next.js standalone listens on IPv4 0.0.0.0 only. Pinned
to 127.0.0.1.
This release also includes everything from v1.4.1 (which never
published a clean GHCR tag): the per-section admin extraction, the
testcontainers integration suite, the Playwright + axe-core E2E
foundation, the moodLog SSRF fix, the central error-redaction in
WideEventBuilder + Glitchtip, the medical-citation drift fixes
(ESH 2023, Saint-Maurice attribution, steps source), and the docs
sync.
Co-Authored-By: Marc-André Bombeck <mbombeck@gmail.com>
31 lines
1.1 KiB
TypeScript
31 lines
1.1 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
|
|
/**
|
|
* /api/version is the public, unauthenticated endpoint that drives
|
|
* the Settings → About surface and acts as the container's healthcheck
|
|
* target. If this breaks, every deployed image's healthcheck fails and
|
|
* Coolify pulls the container out of rotation.
|
|
*/
|
|
test.describe("public version endpoint", () => {
|
|
test("returns the running version + license", async ({ request }) => {
|
|
const res = await request.get("/api/version");
|
|
expect(res.status()).toBe(200);
|
|
|
|
const json = await res.json();
|
|
expect(json.data).toBeDefined();
|
|
expect(typeof json.data.version).toBe("string");
|
|
expect(json.data.version).toMatch(/^\d+\.\d+\.\d+/);
|
|
expect(json.data.license).toBeDefined();
|
|
});
|
|
|
|
test("does not require authentication", async ({ request }) => {
|
|
// No cookie, no Authorization header — must still respond 200 so
|
|
// the docker healthcheck and the in-app "check for updates" button
|
|
// both work without a session.
|
|
const res = await request.get("/api/version", {
|
|
headers: { "X-Client-Type": "anonymous" },
|
|
});
|
|
expect(res.status()).toBe(200);
|
|
});
|
|
});
|