import { afterEach, describe, expect, it } from 'vitest'; import 'vitest-fetch-mock'; import { PlexClient } from './plexClient'; describe('Plex SDK', () => { it('return sessions when player, user and session present', async () => { // arrange const client = new PlexClient('https://plex.local', 'MY_TOKEN'); fetchMock.mockOnceIf( 'https://plex.local/status/sessions?X-Plex-Token=MY_TOKEN', ` ` ); // act const response = await client.getSessions(); // assert expect(fetchMock.requests().length).toBe(1); expect(fetchMock.requests()[0].url).toBe( 'https://plex.local/status/sessions?X-Plex-Token=MY_TOKEN' ); expect(response).not.toBeNull(); expect(response.length).toBe(1); expect(response[0].id).toBe('2894294r2jf2038fj3098jgf3gt'); expect(response[0].username).toBe('example_usr'); expect(response[0].userProfilePicture).toBe('https://google.com'); expect(response[0].sessionName).toBe('Plex Web (Chrome)'); expect(response[0].currentlyPlaying).toMatchObject({ name: 'A long title', type: 'movie', metadata: { video: { bitrate: '20231', height: '1080', videoCodec: 'h264', videoFrameRate: '24p', width: '1920', }, audio: { audioChannels: '2', audioCodec: 'aac' }, transcoding: { audioChannels: '2', audioCodec: 'aac', audioDecision: 'transcode', container: 'mp4', context: 'streaming', duration: '100', error: false, height: '1080', sourceAudioCodec: 'dca', sourceVideoCodec: 'h264', timeStamp: '1679349635.2791338', transcodeHwRequested: false, videoCodec: 'h264', videoDecision: 'copy', width: '1920', }, }, }); }); it('return sessions when no player and session present', async () => { // arrange const client = new PlexClient('http://plex.local', 'ABCYZT'); fetchMock.mockResponseOnce(` `); // act const response = await client.getSessions(); // assert expect(fetchMock.requests().length).toBe(1); expect(fetchMock.requests()[0].url).toBe( 'http://plex.local/status/sessions?X-Plex-Token=ABCYZT' ); expect(response.length).toBe(1); expect(response[0]).toMatchObject({ id: undefined, username: 'Anonymous', userProfilePicture: undefined, sessionName: 'Plex Web (Chrome)', currentlyPlaying: { name: 'A long title', type: 'movie', }, }); }); it('return empty if no media container', async () => { // arrange const client = new PlexClient('http://plex.local', 'Homarr'); fetchMock.mockResponseOnce(''); // act const response = await client.getSessions(); // assert expect(fetchMock.requests().length).toBe(1); expect(response.length).toBe(0); }); afterEach(() => { fetchMock.mockRestore(); }); });