Compare commits

..

4 Commits

Author SHA1 Message Date
Scrubs McBarkley 365d4a5023 fix(db): GRO-2722 schema-safe reset (TRUNCATE, no DROP) [uat→main]
CI / Lint & Typecheck (push) Successful in 19s
CI / Test (push) Successful in 20s
CI / Build & Push Docker Images (push) Successful in 29s
Merges GRO-2722 root-cause fix for GRO-2678 prod outage. DROP-based reset replaced with TRUNCATE RESTART IDENTITY CASCADE. All SDLC gates passed: UAT  (GRO-2725), Security  (GRO-2726), QA  (GRO-2724), CTO review .
2026-08-22 08:36:55 +00:00
Flea Flicker e0a8cd30ab feat(api): promote uat → main — /api/readyz DB health check (GRO-2687)
CI / Lint & Typecheck (push) Successful in 21s
CI / Test (push) Successful in 21s
CI / Build & Push Docker Images (push) Successful in 35s
All SDLC gates satisfied: QA approved (Lint Roller, review #5055), UAT passed (Shedward, GRO-2692), Security passed (Barkley, GRO-2698), CTO approved (review #5067 on head 9e948d6). cc @cpfarhood
2026-08-09 11:04:15 +00:00
Flea Flicker 3aaa440561 fix(db): GRO-2672 swap drizzle-orm migrate() for drizzle-kit migrate in reset.ts (uat→main)
CI / Lint & Typecheck (push) Successful in 18s
CI / Test (push) Successful in 20s
CI / Build & Push Docker Images (push) Successful in 29s
CTO-approved (gb_dogfather, review #5050). All pipeline phases passed: CI , QA  (PR #229), UAT  (GRO-2673), Security  (GRO-2674).
2026-08-06 09:53:11 +00:00
Flea Flicker 552a4d9f28 Merge pull request 'feat: GRO-2652 boot ECONNRESET resilience + CORS enforcement + OOBE endpoint (uat→main)' (#226) from uat into main
CI / Lint & Typecheck (push) Successful in 19s
CI / Test (push) Successful in 21s
CI / Build & Push Docker Images (push) Successful in 33s
CTO Approved (review 5044). UAT (Shedward) PASS. Security (Barkley) PASS.
2026-08-05 11:57:24 +00:00
2 changed files with 6 additions and 18 deletions
+3 -9
View File
@@ -1,4 +1,4 @@
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { describe, it, expect, vi, beforeEach } from "vitest";
import { Hono } from "hono";
import { authProviderRouter } from "../routes/authProvider.js";
@@ -227,7 +227,6 @@ describe("PUT /admin/auth-provider", () => {
describe("POST /admin/auth-provider/test", () => {
beforeEach(resetMock);
afterEach(() => vi.restoreAllMocks());
it("returns ok=false for unreachable issuer", async () => {
const app = makeApp(mockSuperUser);
@@ -243,12 +242,7 @@ describe("POST /admin/auth-provider/test", () => {
expect(body.error).toBeTruthy();
}, 15000); // timeout must exceed the 10s fetch timeout in the route handler
it("returns 200 when clientSecret is omitted (not required by test-connection schema)", async () => {
// Mock fetch so the route does not make a real network request.
vi.spyOn(global, "fetch").mockResolvedValueOnce({
ok: true,
json: async () => ({ issuer: "https://auth.example.com" }),
} as Response);
it("returns 400 for missing clientSecret (not required for test)", async () => {
const app = makeApp(mockSuperUser);
const { status } = await post(app, "/admin/auth-provider/test", {
providerId: "authentik",
@@ -256,7 +250,7 @@ describe("POST /admin/auth-provider/test", () => {
issuerUrl: "https://auth.example.com",
clientId: "client",
}, mockSuperUser);
expect(status).toBe(200);
expect(status).toBe(200); // clientSecret omitted intentionally for test
});
});
+3 -9
View File
@@ -1,4 +1,4 @@
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { describe, it, expect, vi, beforeEach } from "vitest";
import { Hono } from "hono";
import { authProviderRouter } from "../routes/authProvider.js";
@@ -227,7 +227,6 @@ describe("PUT /admin/auth-provider", () => {
describe("POST /admin/auth-provider/test", () => {
beforeEach(resetMock);
afterEach(() => vi.restoreAllMocks());
it("returns ok=false for unreachable issuer", async () => {
const app = makeApp(mockSuperUser);
@@ -243,12 +242,7 @@ describe("POST /admin/auth-provider/test", () => {
expect(body.error).toBeTruthy();
}, 15000); // timeout must exceed the 10s fetch timeout in the route handler
it("returns 200 when clientSecret is omitted (not required by test-connection schema)", async () => {
// Mock fetch so the route does not make a real network request.
vi.spyOn(global, "fetch").mockResolvedValueOnce({
ok: true,
json: async () => ({ issuer: "https://auth.example.com" }),
} as Response);
it("returns 400 for missing clientSecret (not required for test)", async () => {
const app = makeApp(mockSuperUser);
const { status } = await post(app, "/admin/auth-provider/test", {
providerId: "authentik",
@@ -256,7 +250,7 @@ describe("POST /admin/auth-provider/test", () => {
issuerUrl: "https://auth.example.com",
clientId: "client",
}, mockSuperUser);
expect(status).toBe(200);
expect(status).toBe(200); // clientSecret omitted intentionally for test
});
});