Skip to content

Commit 3e10052

Browse files
committed
test(integration): address review findings
- Add GitHub Deployments API tests (gracefully skips if unsupported) - Fix smoke test assertions to reject non-2xx responses - Fix deployment list test to use find() instead of index access - Fix globalSetup partial-failure: clean up Vercel emulator if GitHub fails
1 parent c938bc7 commit 3e10052

4 files changed

Lines changed: 161 additions & 14 deletions

File tree

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import { beforeAll, describe, expect, it } from 'vitest'
2+
import { createOctokitClient, TEST_OWNER, TEST_REPO } from './helpers'
3+
4+
describe('github deployments API', () => {
5+
let commitSha: string
6+
let deploymentsSupported = true
7+
8+
beforeAll(async () => {
9+
const octokit = createOctokitClient()
10+
11+
const { data: blob } = await octokit.rest.git.createBlob({
12+
owner: TEST_OWNER,
13+
repo: TEST_REPO,
14+
content: 'deployment test',
15+
encoding: 'utf-8',
16+
})
17+
18+
const { data: tree } = await octokit.rest.git.createTree({
19+
owner: TEST_OWNER,
20+
repo: TEST_REPO,
21+
tree: [{ path: 'deploy.txt', mode: '100644', type: 'blob', sha: blob.sha }],
22+
})
23+
24+
const { data: commit } = await octokit.rest.git.createCommit({
25+
owner: TEST_OWNER,
26+
repo: TEST_REPO,
27+
message: 'deploy commit',
28+
tree: tree.sha,
29+
parents: [],
30+
})
31+
32+
commitSha = commit.sha
33+
34+
try {
35+
await octokit.rest.repos.createDeployment({
36+
owner: TEST_OWNER,
37+
repo: TEST_REPO,
38+
ref: commitSha,
39+
auto_merge: false,
40+
required_contexts: [],
41+
})
42+
}
43+
catch {
44+
deploymentsSupported = false
45+
}
46+
})
47+
48+
it('should create a deployment', async () => {
49+
if (!deploymentsSupported) {
50+
console.log('Skipping: GitHub Deployments API not supported by emulator')
51+
return
52+
}
53+
54+
const octokit = createOctokitClient()
55+
56+
const { data: deployment } = await octokit.rest.repos.createDeployment({
57+
owner: TEST_OWNER,
58+
repo: TEST_REPO,
59+
ref: commitSha,
60+
auto_merge: false,
61+
required_contexts: [],
62+
})
63+
64+
expect(deployment).toBeDefined()
65+
expect('id' in deployment).toBe(true)
66+
})
67+
68+
it('should create deployment statuses with state transitions', async () => {
69+
if (!deploymentsSupported) {
70+
console.log('Skipping: GitHub Deployments API not supported by emulator')
71+
return
72+
}
73+
74+
const octokit = createOctokitClient()
75+
76+
const { data: deployment } = await octokit.rest.repos.createDeployment({
77+
owner: TEST_OWNER,
78+
repo: TEST_REPO,
79+
ref: commitSha,
80+
auto_merge: false,
81+
required_contexts: [],
82+
})
83+
84+
if (!('id' in deployment)) {
85+
throw new Error('Expected deployment to have an id')
86+
}
87+
88+
const { data: pendingStatus } = await octokit.rest.repos.createDeploymentStatus({
89+
owner: TEST_OWNER,
90+
repo: TEST_REPO,
91+
deployment_id: deployment.id,
92+
state: 'pending',
93+
})
94+
expect(pendingStatus.state).toBe('pending')
95+
96+
const { data: successStatus } = await octokit.rest.repos.createDeploymentStatus({
97+
owner: TEST_OWNER,
98+
repo: TEST_REPO,
99+
deployment_id: deployment.id,
100+
state: 'success',
101+
})
102+
expect(successStatus.state).toBe('success')
103+
})
104+
105+
it('should list deployment statuses', async () => {
106+
if (!deploymentsSupported) {
107+
console.log('Skipping: GitHub Deployments API not supported by emulator')
108+
return
109+
}
110+
111+
const octokit = createOctokitClient()
112+
113+
const { data: deployment } = await octokit.rest.repos.createDeployment({
114+
owner: TEST_OWNER,
115+
repo: TEST_REPO,
116+
ref: commitSha,
117+
auto_merge: false,
118+
required_contexts: [],
119+
})
120+
121+
if (!('id' in deployment)) {
122+
throw new Error('Expected deployment to have an id')
123+
}
124+
125+
await octokit.rest.repos.createDeploymentStatus({
126+
owner: TEST_OWNER,
127+
repo: TEST_REPO,
128+
deployment_id: deployment.id,
129+
state: 'success',
130+
})
131+
132+
const { data: statuses } = await octokit.rest.repos.listDeploymentStatuses({
133+
owner: TEST_OWNER,
134+
repo: TEST_REPO,
135+
deployment_id: deployment.id,
136+
})
137+
138+
expect(statuses.length).toBeGreaterThan(0)
139+
const found = statuses.find(s => s.state === 'success')
140+
expect(found).toBeDefined()
141+
})
142+
})

src/__integration__/global-setup.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ import { resolve } from 'node:path'
44
import { createEmulator } from 'emulate'
55
import { parse } from 'yaml'
66

7-
const VERCEL_PORT = 4000
8-
const GITHUB_PORT = 4001
9-
107
let vercelEmulator: Emulator
118
let githubEmulator: Emulator
129

@@ -21,15 +18,21 @@ export async function setup(): Promise<void> {
2118

2219
vercelEmulator = await createEmulator({
2320
service: 'vercel',
24-
port: VERCEL_PORT,
21+
port: 4000,
2522
seed,
2623
})
2724

28-
githubEmulator = await createEmulator({
29-
service: 'github',
30-
port: GITHUB_PORT,
31-
seed,
32-
})
25+
try {
26+
githubEmulator = await createEmulator({
27+
service: 'github',
28+
port: 4001,
29+
seed,
30+
})
31+
}
32+
catch (error) {
33+
await vercelEmulator.close()
34+
throw error
35+
}
3336

3437
process.env.EMULATE_VERCEL_URL = vercelEmulator.url
3538
process.env.EMULATE_GITHUB_URL = githubEmulator.url

src/__integration__/smoke.test.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ describe('emulate.dev smoke test', () => {
1515
const res = await fetch(`${process.env.EMULATE_VERCEL_URL}/v2/user`, {
1616
headers: { Authorization: 'Bearer test-token' },
1717
})
18-
expect(res.status).toBeLessThan(500)
18+
expect(res.ok).toBe(true)
1919
})
2020

2121
it('should reach GitHub emulator', async () => {
22-
const res = await fetch(`${process.env.EMULATE_GITHUB_URL}/user`)
23-
expect(res.status).toBeLessThan(500)
22+
const res = await fetch(`${process.env.EMULATE_GITHUB_URL}/user`, {
23+
headers: { Authorization: 'Bearer test-token' },
24+
})
25+
expect(res.ok).toBe(true)
2426
})
2527
})

src/__integration__/vercel-deployments.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ describe('vercel deployments API', () => {
6262
expect(data.deployments).toBeDefined()
6363
expect(data.deployments.length).toBeGreaterThan(0)
6464

65-
const deployment = data.deployments[0]
66-
expect(deployment.name).toBe(TEST_PROJECT)
65+
const deployment = data.deployments.find((d: { name: string }) => d.name === TEST_PROJECT)
66+
expect(deployment).toBeDefined()
6767
expect(deployment.url).toBeDefined()
6868
})
6969
})

0 commit comments

Comments
 (0)