Fix typecheck: add missing unstable_url and unstable_pattern to route test args

React Router 7 now requires these properties on loader/action args.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ullrich Schäfer 2026-04-13 01:10:23 +02:00
parent 55463d1f56
commit 7b2fe1ce80
No known key found for this signature in database
GPG key ID: A32FF691A0F752D9

View file

@ -32,6 +32,11 @@ function authRequest(path: string, init?: RequestInit) {
});
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function routeArgs(request: Request, params: Record<string, string>, pattern: string): any {
return { request, params, context: {}, unstable_url: new URL(request.url), unstable_pattern: pattern };
}
beforeEach(() => {
vi.clearAllMocks();
mockGetAuthenticatedUser.mockResolvedValue(mockUser);
@ -50,7 +55,7 @@ describe("GET /api/v1/routes", () => {
]);
const { loader } = await import("./api.v1.routes._index.ts");
const resp = await loader({ request: authRequest("/api/v1/routes"), params: {}, context: {} }) as Response;
const resp = await loader(routeArgs(authRequest("/api/v1/routes"), {}, "api/v1/routes")) as Response;
const data = await resp.json();
expect(data.routes).toHaveLength(1);
@ -63,7 +68,7 @@ describe("GET /api/v1/routes", () => {
const { loader } = await import("./api.v1.routes._index.ts");
try {
await loader({ request: new Request("http://localhost:3000/api/v1/routes"), params: {}, context: {} });
await loader(routeArgs(new Request("http://localhost:3000/api/v1/routes"), {}, "api/v1/routes"));
expect.fail("should throw");
} catch (err) {
expect(err).toBeInstanceOf(Response);
@ -77,13 +82,12 @@ describe("POST /api/v1/routes", () => {
mockCreateRoute.mockResolvedValue("new-id");
const { action } = await import("./api.v1.routes._index.ts");
const resp = await action({
request: authRequest("/api/v1/routes", {
const resp = await action(routeArgs(
authRequest("/api/v1/routes", {
method: "POST",
body: JSON.stringify({ name: "New Route" }),
}),
params: {}, context: {},
}) as Response;
}), {}, "api/v1/routes",
)) as Response;
expect(resp.status).toBe(201);
const data = await resp.json();
@ -92,13 +96,12 @@ describe("POST /api/v1/routes", () => {
it("returns 400 on validation error", async () => {
const { action } = await import("./api.v1.routes._index.ts");
const resp = await action({
request: authRequest("/api/v1/routes", {
const resp = await action(routeArgs(
authRequest("/api/v1/routes", {
method: "POST",
body: JSON.stringify({ name: "" }),
}),
params: {}, context: {},
}) as Response;
}), {}, "api/v1/routes",
)) as Response;
expect(resp.status).toBe(400);
const data = await resp.json();
@ -118,10 +121,9 @@ describe("GET /api/v1/routes/:id", () => {
});
const { loader } = await import("./api.v1.routes.$id.ts");
const resp = await loader({
request: authRequest("/api/v1/routes/r1"),
params: { id: "r1" }, context: {},
}) as Response;
const resp = await loader(routeArgs(
authRequest("/api/v1/routes/r1"), { id: "r1" }, "api/v1/routes/:id",
)) as Response;
const data = await resp.json();
expect(data.id).toBe("r1");
@ -132,10 +134,9 @@ describe("GET /api/v1/routes/:id", () => {
it("returns 404 for missing route", async () => {
mockGetRouteWithVersions.mockResolvedValue(null);
const { loader } = await import("./api.v1.routes.$id.ts");
const resp = await loader({
request: authRequest("/api/v1/routes/missing"),
params: { id: "missing" }, context: {},
}) as Response;
const resp = await loader(routeArgs(
authRequest("/api/v1/routes/missing"), { id: "missing" }, "api/v1/routes/:id",
)) as Response;
expect(resp.status).toBe(404);
});
@ -145,10 +146,9 @@ describe("DELETE /api/v1/routes/:id", () => {
it("returns 204 on success", async () => {
mockDeleteRoute.mockResolvedValue(true);
const { action } = await import("./api.v1.routes.$id.ts");
const resp = await action({
request: authRequest("/api/v1/routes/r1", { method: "DELETE" }),
params: { id: "r1" }, context: {},
}) as Response;
const resp = await action(routeArgs(
authRequest("/api/v1/routes/r1", { method: "DELETE" }), { id: "r1" }, "api/v1/routes/:id",
)) as Response;
expect(resp.status).toBe(204);
});
@ -156,10 +156,9 @@ describe("DELETE /api/v1/routes/:id", () => {
it("returns 404 if not found", async () => {
mockDeleteRoute.mockResolvedValue(false);
const { action } = await import("./api.v1.routes.$id.ts");
const resp = await action({
request: authRequest("/api/v1/routes/missing", { method: "DELETE" }),
params: { id: "missing" }, context: {},
}) as Response;
const resp = await action(routeArgs(
authRequest("/api/v1/routes/missing", { method: "DELETE" }), { id: "missing" }, "api/v1/routes/:id",
)) as Response;
expect(resp.status).toBe(404);
});