test(api): add air-gapped mode integration route coverage
swadhinbiswas committed 8 months ago
3337d43
1 parent d77158f
commit 3337d43
1 file changed
+116 -0
Showing 1 changed file+116-0
▼tests/integration/air-gapped-api.test.ts
+116-0
| @@ -0,0 +1,116 @@ | ||
1 | +import { afterEach, describe, expect, it, vi } from "vitest"; | |
2 | +import { POST as externalCiChecksPost } from "@/pages/api/repos/[owner]/[repo]/external-ci/checks"; | |
3 | +import { POST as issueTrackerWebhookPost } from "@/pages/api/repos/[owner]/[repo]/integrations/issue-trackers/[provider]/webhook"; | |
4 | +import { POST as codeQualityWebhookPost } from "@/pages/api/repos/[owner]/[repo]/integrations/code-quality/webhooks/[provider]"; | |
5 | + | |
6 | +async function readJson(response: Response): Promise<any> { | |
7 | + return response.json(); | |
8 | +} | |
9 | + | |
10 | +describe("air-gapped mode API enforcement", () => { | |
11 | + afterEach(() => { | |
12 | + vi.unstubAllEnvs(); | |
13 | + }); | |
14 | + | |
15 | + it("returns 503 for external CI checks when AIR_GAPPED_MODE=true", async () => { | |
16 | + vi.stubEnv("AIR_GAPPED_MODE", "true"); | |
17 | + | |
18 | + const response = await externalCiChecksPost({ | |
19 | + params: { owner: "acme", repo: "demo" }, | |
20 | + request: new Request("http://localhost/api/repos/acme/demo/external-ci/checks", { | |
21 | + method: "POST", | |
22 | + }), | |
23 | + } as any); | |
24 | + | |
25 | + const body = await readJson(response); | |
26 | + expect(response.status).toBe(503); | |
27 | + expect(body?.error?.code).toBe("AIR_GAPPED_MODE"); | |
28 | + }); | |
29 | + | |
30 | + it("returns normal validation error for external CI checks when AIR_GAPPED_MODE=false", async () => { | |
31 | + vi.stubEnv("AIR_GAPPED_MODE", "false"); | |
32 | + | |
33 | + const response = await externalCiChecksPost({ | |
34 | + params: {}, | |
35 | + request: new Request("http://localhost/api/repos/external-ci/checks", { | |
36 | + method: "POST", | |
37 | + }), | |
38 | + } as any); | |
39 | + | |
40 | + const body = await readJson(response); | |
41 | + expect(response.status).toBe(400); | |
42 | + expect(body?.error?.code).toBe("BAD_REQUEST"); | |
43 | + }); | |
44 | + | |
45 | + it("returns 503 for issue tracker webhook when AIR_GAPPED_MODE=true", async () => { | |
46 | + vi.stubEnv("AIR_GAPPED_MODE", "true"); | |
47 | + | |
48 | + const response = await issueTrackerWebhookPost({ | |
49 | + params: { provider: "linear" }, | |
50 | + url: new URL("http://localhost/api/repos/acme/demo/integrations/issue-trackers/linear/webhook"), | |
51 | + request: new Request("http://localhost/api/repos/acme/demo/integrations/issue-trackers/linear/webhook", { | |
52 | + method: "POST", | |
53 | + headers: { "content-type": "application/json" }, | |
54 | + body: JSON.stringify({}), | |
55 | + }), | |
56 | + } as any); | |
57 | + | |
58 | + const body = await readJson(response); | |
59 | + expect(response.status).toBe(503); | |
60 | + expect(body?.error?.code).toBe("AIR_GAPPED_MODE"); | |
61 | + }); | |
62 | + | |
63 | + it("returns normal auth error for issue tracker webhook when AIR_GAPPED_MODE=false", async () => { | |
64 | + vi.stubEnv("AIR_GAPPED_MODE", "false"); | |
65 | + | |
66 | + const response = await issueTrackerWebhookPost({ | |
67 | + params: { provider: "linear" }, | |
68 | + url: new URL("http://localhost/api/repos/acme/demo/integrations/issue-trackers/linear/webhook"), | |
69 | + request: new Request("http://localhost/api/repos/acme/demo/integrations/issue-trackers/linear/webhook", { | |
70 | + method: "POST", | |
71 | + headers: { "content-type": "application/json" }, | |
72 | + body: JSON.stringify({}), | |
73 | + }), | |
74 | + } as any); | |
75 | + | |
76 | + const body = await readJson(response); | |
77 | + expect(response.status).toBe(401); | |
78 | + expect(body?.error?.code).toBe("UNAUTHORIZED"); | |
79 | + }); | |
80 | + | |
81 | + it("returns 503 for code quality webhook when AIR_GAPPED_MODE=true", async () => { | |
82 | + vi.stubEnv("AIR_GAPPED_MODE", "true"); | |
83 | + | |
84 | + const response = await codeQualityWebhookPost({ | |
85 | + params: { provider: "codecov" }, | |
86 | + url: new URL("http://localhost/api/repos/acme/demo/integrations/code-quality/webhooks/codecov"), | |
87 | + request: new Request("http://localhost/api/repos/acme/demo/integrations/code-quality/webhooks/codecov", { | |
88 | + method: "POST", | |
89 | + headers: { "content-type": "application/json" }, | |
90 | + body: JSON.stringify({}), | |
91 | + }), | |
92 | + } as any); | |
93 | + | |
94 | + const body = await readJson(response); | |
95 | + expect(response.status).toBe(503); | |
96 | + expect(body?.error?.code).toBe("AIR_GAPPED_MODE"); | |
97 | + }); | |
98 | + | |
99 | + it("returns normal auth error for code quality webhook when AIR_GAPPED_MODE=false", async () => { | |
100 | + vi.stubEnv("AIR_GAPPED_MODE", "false"); | |
101 | + | |
102 | + const response = await codeQualityWebhookPost({ | |
103 | + params: { provider: "codecov" }, | |
104 | + url: new URL("http://localhost/api/repos/acme/demo/integrations/code-quality/webhooks/codecov"), | |
105 | + request: new Request("http://localhost/api/repos/acme/demo/integrations/code-quality/webhooks/codecov", { | |
106 | + method: "POST", | |
107 | + headers: { "content-type": "application/json" }, | |
108 | + body: JSON.stringify({}), | |
109 | + }), | |
110 | + } as any); | |
111 | + | |
112 | + const body = await readJson(response); | |
113 | + expect(response.status).toBe(401); | |
114 | + expect(body?.error?.code).toBe("UNAUTHORIZED"); | |
115 | + }); | |
116 | +}); | |
0 | 117 | |