mission-control/tests/gateway-connect.spec.ts

108 lines
3.4 KiB
TypeScript

import { expect, test } from '@playwright/test'
import { API_KEY_HEADER } from './helpers'
test.describe('Gateway Connect API', () => {
const cleanup: number[] = []
test.afterEach(async ({ request }) => {
for (const id of cleanup) {
await request.delete('/api/gateways', {
headers: API_KEY_HEADER,
data: { id },
}).catch(() => {})
}
cleanup.length = 0
})
test('returns ws_url and token for selected gateway', async ({ request }) => {
const createRes = await request.post('/api/gateways', {
headers: API_KEY_HEADER,
data: {
name: `e2e-gw-${Date.now()}`,
host: 'https://example.tailnet.ts.net:4443/sessions',
port: 18789,
token: 'gw-token-123',
},
})
expect(createRes.status()).toBe(201)
const createBody = await createRes.json()
const gatewayId = createBody.gateway?.id as number
cleanup.push(gatewayId)
const connectRes = await request.post('/api/gateways/connect', {
headers: API_KEY_HEADER,
data: { id: gatewayId },
})
expect(connectRes.status()).toBe(200)
const connectBody = await connectRes.json()
expect(connectBody.ws_url).toBe('wss://example.tailnet.ts.net:4443')
expect(connectBody.token).toBe('gw-token-123')
expect(connectBody.token_set).toBe(true)
})
test('returns 404 for unknown gateway', async ({ request }) => {
const res = await request.post('/api/gateways/connect', {
headers: API_KEY_HEADER,
data: { id: 999999 },
})
expect(res.status()).toBe(404)
})
test('preserves token query param from gateway host URL', async ({ request }) => {
const createRes = await request.post('/api/gateways', {
headers: API_KEY_HEADER,
data: {
name: `e2e-gw-token-url-${Date.now()}`,
host: 'https://example.tailnet.ts.net:4443/sessions?token=url-token-123&foo=bar',
port: 18789,
},
})
expect(createRes.status()).toBe(201)
const createBody = await createRes.json()
const gatewayId = createBody.gateway?.id as number
cleanup.push(gatewayId)
const connectRes = await request.post('/api/gateways/connect', {
headers: API_KEY_HEADER,
data: { id: gatewayId },
})
expect(connectRes.status()).toBe(200)
const connectBody = await connectRes.json()
expect(connectBody.ws_url).toBe('wss://example.tailnet.ts.net:4443?token=url-token-123')
expect(connectBody.token).toBe('')
expect(connectBody.token_set).toBe(false)
})
test('uses wss when forwarded proto indicates https behind proxy', async ({ request }) => {
const createRes = await request.post('/api/gateways', {
headers: API_KEY_HEADER,
data: {
name: `e2e-gw-forwarded-proto-${Date.now()}`,
host: 'example.tailnet.ts.net',
port: 18789,
token: 'forwarded-proto-token',
},
})
expect(createRes.status()).toBe(201)
const createBody = await createRes.json()
const gatewayId = createBody.gateway?.id as number
cleanup.push(gatewayId)
const connectRes = await request.post('/api/gateways/connect', {
headers: {
...API_KEY_HEADER,
'x-forwarded-proto': 'https',
},
data: { id: gatewayId },
})
expect(connectRes.status()).toBe(200)
const connectBody = await connectRes.json()
expect(connectBody.ws_url).toBe('wss://example.tailnet.ts.net')
expect(connectBody.token).toBe('forwarded-proto-token')
expect(connectBody.token_set).toBe(true)
})
})