import { INestApplication } from '@nestjs/common'; import { Test } from '@nestjs/testing'; import * as request from 'supertest'; import { AppModule } from '../src/app/app.module'; import { bootstrapApp } from '../src/bootstrap'; import { loginAdmin } from './test-helpers'; describe('Playback error logs', () => { let app: INestApplication; let adminToken: string; beforeAll(async () => { const moduleRef = await Test.createTestingModule({ imports: [AppModule], }).compile(); app = moduleRef.createNestApplication(); bootstrapApp(app); await app.init(); adminToken = await loginAdmin(app); }); afterAll(async () => { await app.close(); }); it('accepts playback error reports and exposes them to admin logs', async () => { const requestId = 'aac95ef4-c546-427d-88c7-25b15b396b91'; const createResponse = await request(app.getHttpServer()) .post('/api/app/v1/logs/playback-errors') .set('X-Request-Id', requestId) .send({ requestId, dramaId: 1, episodeId: 10, playUrl: 'https://cdn.example.com/video.mp4', playerErrorCode: 'MEDIA_DECODE_ERROR', message: 'Video decode failed', progressSeconds: 128, networkType: 'wifi', device: { platform: 'ios', model: 'iPhone', systemVersion: '17.0', appVersion: '1.0.0', }, occurredAt: '2026-06-30T00:00:00.000Z', }) .expect(201); expect(createResponse.body).toMatchObject({ code: 0, data: { id: expect.any(Number), requestId, }, message: 'success', requestId, }); const listResponse = await request(app.getHttpServer()) .get('/api/admin/v1/logs/playback-errors') .set('Authorization', `Bearer ${adminToken}`) .expect(200); expect(listResponse.body.data.list).toEqual( expect.arrayContaining([ expect.objectContaining({ requestId, playerErrorCode: 'MEDIA_DECODE_ERROR', progressSeconds: 128, }), ]), ); }); });