Stabilize route setup and attachment announcement handling

Load route modules during fixture setup so cold transforms cannot leave a timed-out request running against the next test mock state. Dismiss delayed product announcements through the normal Board UI in the attachment receipt fixture.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-09-30 01:32:15 -05:00
1 parent 6b1e96af0f
commit f401b831f2
3 files changed
+31 -8

No files matched your search

@@ -1,6 +1,6 @@
import express from "express";
import request from "supertest";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
function createSelectChain(rows: unknown[]) {
const query = {
@@ -44,6 +44,13 @@ function createInvite(overrides: Record<string, unknown> = {}) {
};
}
function loadAppModules() {
return Promise.all([
import("../routes/access.js"),
import("../middleware/index.js"),
]);
}
async function createApp(
db: Record<string, unknown>,
network: {
@@ -51,10 +58,7 @@ async function createApp(
requestHead: ReturnType<typeof vi.fn>;
},
) {
const [access, middleware] = await Promise.all([
import("../routes/access.js"),
import("../middleware/index.js"),
]);
const [access, middleware] = await loadAppModules();
const app = express();
app.use((req, _res, next) => {
(req as any).actor = { type: "anon" };
@@ -75,6 +79,11 @@ async function createApp(
}
describe.sequential("GET /invites/:token/test-resolution", () => {
beforeAll(async () => {
// Route transformation is fixture setup, not part of the network assertions.
await loadAppModules();
});
beforeEach(() => {
vi.clearAllMocks();
});
@@ -173,11 +173,15 @@ type TestActor =
runId: string | null;
};
async function createApp(actor?: TestActor) {
const [{ errorHandler }, { issueRoutes }] = await Promise.all([
function loadAppModules() {
return Promise.all([
import("../middleware/index.js"),
import("../routes/issues.js"),
]);
}
async function createApp(actor?: TestActor) {
const [{ errorHandler }, { issueRoutes }] = await loadAppModules();
const app = express();
app.use(express.json());
app.use((req, _res, next) => {
@@ -196,7 +200,7 @@ async function createApp(actor?: TestActor) {
}
describe("issue execution policy routes", () => {
beforeEach(() => {
beforeEach(async () => {
vi.resetModules();
vi.doUnmock("../services/index.js");
vi.doUnmock("../routes/issues.js");
@@ -263,6 +267,9 @@ describe("issue execution policy routes", () => {
};
});
mockAccessService.hasPermission.mockResolvedValue(false);
// Finish cold imports before a test configures its request-specific mocks.
// A timed-out import must not resume a request against the next test's mocks.
await loadAppModules();
});
it("reauthorizes a terminal verdict against the review policy held under the update lock", async () => {
@@ -27,6 +27,13 @@ async function body<T>(
}
async function setup(page: Page, request: APIRequestContext, classic: boolean) {
// Announcements can appear after navigation or reload and cover the classic
// composer's attachment button. Dismiss through the same UI as a Board user.
await page.addLocatorHandler(
page.getByRole("complementary", { name: "Paperclip announcements", exact: true })
.getByRole("button", { name: "Dismiss announcement", exact: true }),
async (dismiss) => { await dismiss.click(); },
);
const company = await body<{ id: string; issuePrefix: string }>(
await request.post("/api/companies", {
data: { name: `Board receipt browser ${randomUUID()}` },