feat : notify new update income

This commit is contained in:
2026-09-26 23:34:42 +07:00 Unverified
parent e99a5b76b1
commit 4ef1968b04
14 changed files with 499 additions and 33 deletions
+61
View File
@@ -0,0 +1,61 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
const publishDeploymentStatus = vi.fn();
vi.mock("@/lib/deployment/repository", () => ({ publishDeploymentStatus }));
const { POST } = await import("./route");
const deploymentId = "a".repeat(40);
function request(body: unknown, authorization?: string) {
return new Request("https://guide.sudloh.com/api/deployments/status", {
method: "POST",
headers: {
"Content-Type": "application/json",
...(authorization ? { Authorization: authorization } : {}),
},
body: JSON.stringify(body),
});
}
describe("deployment status webhook", () => {
beforeEach(() => {
process.env.DEPLOYMENT_WEBHOOK_SECRET = "test-deployment-secret";
publishDeploymentStatus.mockReset();
publishDeploymentStatus.mockResolvedValue({
accepted: true,
event: {
deploymentId,
status: "deploying",
updatedAt: "2026-09-26T12:00:00.000Z",
},
});
});
it("rejects missing or incorrect credentials", async () => {
expect((await POST(request({ deploymentId, status: "deploying" }))).status).toBe(401);
expect((await POST(request(
{ deploymentId, status: "deploying" },
"Bearer incorrect",
))).status).toBe(401);
expect(publishDeploymentStatus).not.toHaveBeenCalled();
});
it("rejects invalid lifecycle payloads", async () => {
const response = await POST(request(
{ deploymentId: "short", status: "unknown" },
"Bearer test-deployment-secret",
));
expect(response.status).toBe(400);
expect(publishDeploymentStatus).not.toHaveBeenCalled();
});
it("publishes an authenticated lifecycle update", async () => {
const response = await POST(request(
{ deploymentId, status: "deploying" },
"Bearer test-deployment-secret",
));
expect(response.status).toBe(202);
expect(publishDeploymentStatus).toHaveBeenCalledWith(deploymentId, "deploying");
});
});