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();
});
});