88 lines
3.1 KiB
TypeScript
88 lines
3.1 KiB
TypeScript
import {describe, expect, it, beforeEach, mock} from 'bun:test';
|
|
import {Streams} from '../../../src/apis/Stream';
|
|
import type {PCastHttpRequests} from '../../../src/apis/PCastRequests';
|
|
import {HttpMethod} from '../../../src/net/http/HttpMethod';
|
|
|
|
describe('Streams', () => {
|
|
let mockHttpRequests: PCastHttpRequests;
|
|
let streams: Streams;
|
|
|
|
beforeEach(() => {
|
|
mockHttpRequests = {
|
|
request: mock(() => Promise.resolve({status: 'ok'}))
|
|
} as unknown as PCastHttpRequests;
|
|
|
|
streams = new Streams(mockHttpRequests);
|
|
});
|
|
|
|
describe('when publishing a URI', () => {
|
|
it('should send PUT request with media URI and token', async () => {
|
|
const mediaUri = 'https://example.com/video.mp4';
|
|
const token = 'auth-token-123';
|
|
|
|
await streams.publishUri(mediaUri, token);
|
|
|
|
expect(mockHttpRequests.request).toHaveBeenCalledWith(
|
|
HttpMethod.PUT,
|
|
'/stream/publish/uri/mp4',
|
|
expect.objectContaining({
|
|
body: JSON.stringify({
|
|
token,
|
|
uri: mediaUri,
|
|
options: []
|
|
})
|
|
})
|
|
);
|
|
});
|
|
|
|
it('should extract media type from URI extension', async () => {
|
|
await streams.publishUri('https://example.com/live/stream.m3u8', 'token');
|
|
|
|
expect(mockHttpRequests.request).toHaveBeenCalledWith(HttpMethod.PUT, '/stream/publish/uri/m3u8', expect.any(Object));
|
|
});
|
|
|
|
it('should handle various media types', async () => {
|
|
const testCases = [
|
|
{uri: 'https://example.com/video.webm', expectedType: 'webm'},
|
|
{uri: 'https://example.com/video.mkv', expectedType: 'mkv'},
|
|
{uri: 'https://example.com/video.ts', expectedType: 'ts'},
|
|
{uri: 'https://example.com/video.flv', expectedType: 'flv'}
|
|
];
|
|
|
|
for (const {uri, expectedType} of testCases) {
|
|
(mockHttpRequests.request as any).mockClear();
|
|
await streams.publishUri(uri, 'token');
|
|
|
|
expect(mockHttpRequests.request).toHaveBeenCalledWith(HttpMethod.PUT, `/stream/publish/uri/${expectedType}`, expect.any(Object));
|
|
}
|
|
});
|
|
|
|
it('should throw error when URI has no file extension', async () => {
|
|
const invalidUri = 'https://example.com/stream';
|
|
|
|
await expect(streams.publishUri(invalidUri, 'token')).rejects.toThrow('Invalid media URI');
|
|
});
|
|
|
|
it('should handle URIs with query parameters', async () => {
|
|
await streams.publishUri('https://example.com/video.mp4?token=abc&quality=hd', 'token');
|
|
|
|
expect(mockHttpRequests.request).toHaveBeenCalledWith(HttpMethod.PUT, '/stream/publish/uri/mp4', expect.any(Object));
|
|
});
|
|
|
|
it('should handle URIs with fragments', async () => {
|
|
await streams.publishUri('https://example.com/video.webm#start=10', 'token');
|
|
|
|
expect(mockHttpRequests.request).toHaveBeenCalledWith(HttpMethod.PUT, '/stream/publish/uri/webm', expect.any(Object));
|
|
});
|
|
|
|
it('should return the API response', async () => {
|
|
const mockResponse = {status: 'ok', streamId: 'stream-123'};
|
|
(mockHttpRequests.request as any).mockResolvedValue(mockResponse);
|
|
|
|
const result = await streams.publishUri('https://example.com/video.mp4', 'token');
|
|
|
|
expect(result).toEqual(mockResponse);
|
|
});
|
|
});
|
|
});
|