1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | /**
* Regression: /orgs/:slug/health must reach org-health, not be shadowed.
*
* org-health.tsx's `GET /orgs/:slug/health` was mounted AFTER
* healthDashboardRoutes' generic `GET /:owner/:repo/health`, so Hono bound
* `/orgs/acme/health` as owner="orgs", repo="acme" → repoExists("orgs","acme")
* false → 404. The entire org-health feature was dead (unreachable), and its
* own recompute POST redirected into that 404. Mount order now puts
* orgHealthRoutes first.
*
* An UNKNOWN slug can't distinguish the two handlers (both 404), so this test
* seeds a REAL org and asserts the org-health page renders (200 + its own
* "Engineering Health" markup). Under the old shadowed mount this 404'd.
* DB-gated: skips locally without DATABASE_URL, runs in CI/deploy.
*/
import { describe, it, expect } from "bun:test";
import app from "../app";
import { db } from "../db";
import { users, organizations } from "../db/schema";
import { eq } from "drizzle-orm";
const HAS_DB = Boolean(process.env.DATABASE_URL);
describe("org-health route is not shadowed by the repo health page", () => {
it.skipIf(!HAS_DB)(
"/orgs/:slug/health renders the org-health page (not a repo 404)",
async () => {
// Deterministic slug so a re-run can clean up first (no Math.random()).
const slug = "orghealth-route-test-org";
const uname = "orghealth-route-test-user";
// Clean any leftovers from a prior run.
await db.delete(organizations).where(eq(organizations.slug, slug));
await db.delete(users).where(eq(users.username, uname));
const [u] = await db
.insert(users)
.values({
username: uname,
email: `${uname}@example.test`,
passwordHash: "x",
})
.returning({ id: users.id });
await db.insert(organizations).values({
slug,
name: "Org Health Route Test",
createdById: u.id,
});
try {
const res = await app.request(`/orgs/${slug}/health`);
expect(res.status).toBe(200);
const body = await res.text();
expect(body).toContain("Engineering Health");
} finally {
await db.delete(organizations).where(eq(organizations.slug, slug));
await db.delete(users).where(eq(users.username, uname));
}
}
);
it("a genuine unknown repo health page still 404s through the repo handler", async () => {
// Proves orgHealthRoutes' literal /orgs prefix didn't swallow generic
// repo paths (this runs without a DB — it's a pure not-found path).
const res = await app.request("/nobody-xyz/nothing-xyz/health");
expect(res.status).toBe(404);
});
});
|