diff --git a/server/routers/siteResource/getSiteResource.test.ts b/server/routers/siteResource/getSiteResource.test.ts new file mode 100644 index 000000000..4e63742da --- /dev/null +++ b/server/routers/siteResource/getSiteResource.test.ts @@ -0,0 +1,58 @@ +import { assertEquals } from "@test/assert"; +import { getSiteResourceParamsSchema } from "./getSiteResource"; + +function testSiteResourceIdOnlyParams() { + const result = getSiteResourceParamsSchema.safeParse({ + siteResourceId: "42" + }); + + assertEquals( + result.success, + true, + "siteResourceId-only integration routes should pass validation" + ); + + if (result.success) { + assertEquals( + result.data.siteResourceId, + 42, + "siteResourceId should be parsed as a number" + ); + assertEquals( + result.data.orgId, + undefined, + "orgId should remain optional" + ); + } +} + +function testOrgScopedParamsRemainSupported() { + const result = getSiteResourceParamsSchema.safeParse({ + siteResourceId: "42", + orgId: "org-id" + }); + + assertEquals( + result.success, + true, + "org-scoped routes should continue to pass validation" + ); +} + +function testInvalidSiteResourceId() { + const result = getSiteResourceParamsSchema.safeParse({ + siteResourceId: "not-a-number" + }); + + assertEquals( + result.success, + false, + "non-numeric siteResourceIds should fail validation" + ); +} + +testSiteResourceIdOnlyParams(); +testOrgScopedParamsRemainSupported(); +testInvalidSiteResourceId(); + +console.log("All getSiteResource parameter validation tests passed."); diff --git a/server/routers/siteResource/getSiteResource.ts b/server/routers/siteResource/getSiteResource.ts index 3074c19bf..8c5f1a0ac 100644 --- a/server/routers/siteResource/getSiteResource.ts +++ b/server/routers/siteResource/getSiteResource.ts @@ -10,7 +10,7 @@ import { fromError } from "zod-validation-error"; import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; -const getSiteResourceParamsSchema = z.strictObject({ +export const getSiteResourceParamsSchema = z.strictObject({ siteResourceId: z .string() .optional() @@ -22,15 +22,17 @@ const getSiteResourceParamsSchema = z.strictObject({ }); async function query(siteResourceId?: number, niceId?: string, orgId?: string) { - if (siteResourceId && orgId) { + if (siteResourceId) { const [siteResource] = await db .select() .from(siteResources) .where( - and( - eq(siteResources.siteResourceId, siteResourceId), - eq(siteResources.orgId, orgId) - ) + orgId + ? and( + eq(siteResources.siteResourceId, siteResourceId), + eq(siteResources.orgId, orgId) + ) + : eq(siteResources.siteResourceId, siteResourceId) ) .limit(1); return siteResource;