nexstream-api / backend /tests /api /video.integration.test.ts
circleci
deploy ccb248c
65fc551
Raw
History Blame Contribute Delete
2.74 kB
import { describe, it, expect } from 'vitest';
import request from 'supertest';
import app from '../../src/app.js';
describe('Video API Integration', () => {
it('GET /ping should return pong', async () => {
const res = await request(app).get('/ping');
expect(res.status).toBe(200);
expect(res.text).toBe('pong');
});
it('GET /health should return 200 ok', async () => {
const res = await request(app).get('/health');
expect(res.status).toBe(200);
expect(res.body.status).toBe('ok');
});
it('GET /info should return 400 for missing URL', async () => {
const res = await request(app).get('/info');
expect(res.status).toBe(400);
expect(res.body.error).toBe('No valid URL provided');
});
it('GET /info should return metadata for valid YouTube URL (Mocked via MSW)', async () => {
const url = 'https://www.youtube.com/watch?v=nTbA7qrEsP0';
const res = await request(app).get(`/info?url=${encodeURIComponent(url)}`);
expect(res.status).toBe(200);
expect(res.body.title).toContain('Mocked');
expect(res.body.id).toBe('nTbA7qrEsP0');
expect(res.body.formats.length).toBeGreaterThan(0);
});
it('GET /info should return metadata for valid Spotify URL (Mocked via MSW)', async () => {
const url = 'https://open.spotify.com/track/nTbA7qrEsP0';
const res = await request(app).get(`/info?url=${encodeURIComponent(url)}`);
expect(res.status).toBe(200);
expect(res.body.title).toContain('Mocked');
expect(res.body.isrc).toBeDefined();
});
it('POST /telemetry should return 204', async () => {
const res = await request(app)
.post('/telemetry')
.send({ event: 'test', data: {} });
expect(res.status).toBe(204);
});
it('GET /proxy should return 403 for an unsigned request', async () => {
const res = await request(app).get('/proxy');
expect(res.status).toBe(403);
});
it('GET /proxy should return 403 for a forged signature', async () => {
const res = await request(app).get(
'/proxy?targetUrl=https%3A%2F%2Fyoutube.com&formatId=18&exp=99999999999999&sig=forged'
);
expect(res.status).toBe(403);
});
it('POST /telemetry should reject bodies over the 1mb cap', async () => {
const res = await request(app)
.post('/telemetry')
.send({ event: 'x'.repeat(1_100_000) });
expect(res.status).toBeGreaterThanOrEqual(400);
});
it('GET /stream-urls should return 400 for missing url', async () => {
const res = await request(app).get('/stream-urls');
expect(res.status).toBe(400);
});
it('POST /convert should return 400 for missing url', async () => {
const res = await request(app).post('/convert').send({});
expect(res.status).toBe(400);
});
});