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
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