95bd703b26
Docs Check / Markdown lint (push) Successful in 1m14s
Build and Push Docker Image / build (push) Successful in 1m52s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 1m55s
CI / Security audit (push) Successful in 2m25s
Docs Check / Mermaid diagram parse check (push) Successful in 3m6s
CI / Swagger Validation & Coverage (push) Successful in 3m22s
CI / Tests & coverage (push) Successful in 3m45s
179 lines
5.2 KiB
JavaScript
179 lines
5.2 KiB
JavaScript
// Copyright (c) 2026 Gordon Bolton. MIT License.
|
|
/**
|
|
* @vitest-environment jsdom
|
|
* Tests for client/src/ui/requests.js
|
|
*
|
|
* Verifies requests dashboard rendering, tooltips, dates, and deep links.
|
|
*/
|
|
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
import { renderRequests } from '../../../client/src/ui/requests.js';
|
|
import { state } from '../../../client/src/state.js';
|
|
|
|
vi.mock('../../../client/src/state.js', () => {
|
|
return {
|
|
state: {
|
|
ombiRequests: { movie: [], tv: [] },
|
|
selectedRequestTypes: ['movie', 'tv'],
|
|
selectedRequestStatuses: ['pending', 'approved', 'available', 'denied'],
|
|
requestSortMode: 'requestedDate_desc',
|
|
requestSearchQuery: '',
|
|
ombiBaseUrl: 'https://ombi.test',
|
|
isAdmin: false
|
|
}
|
|
};
|
|
});
|
|
|
|
describe('requests rendering', () => {
|
|
let requestsList, noRequests;
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
|
|
document.body.innerHTML = `
|
|
<div id="requests-list"></div>
|
|
<div id="no-requests" style="display: none;"><p></p></div>
|
|
`;
|
|
|
|
requestsList = document.getElementById('requests-list');
|
|
noRequests = document.getElementById('no-requests');
|
|
|
|
state.ombiRequests = { movie: [], tv: [] };
|
|
state.isAdmin = false;
|
|
state.ombiBaseUrl = 'https://ombi.test';
|
|
});
|
|
|
|
it('renders "No requests found." when request arrays are empty', () => {
|
|
renderRequests();
|
|
|
|
expect(requestsList.childNodes.length).toBe(0);
|
|
expect(noRequests.style.display).toBe('block');
|
|
expect(noRequests.querySelector('p').textContent).toBe('No requests found.');
|
|
});
|
|
|
|
it('renders request card with correctly formatted date, media type, and requester', () => {
|
|
state.ombiRequests = {
|
|
movie: [
|
|
{
|
|
id: 101,
|
|
title: 'Movie Test',
|
|
year: '2026',
|
|
requestedUser: { alias: 'john_doe' },
|
|
requestedDate: '2026-05-27T10:15:30.000Z',
|
|
quality: '1080p',
|
|
theMovieDbId: 555,
|
|
requested: true
|
|
}
|
|
],
|
|
tv: []
|
|
};
|
|
|
|
renderRequests();
|
|
|
|
expect(requestsList.childNodes.length).toBe(1);
|
|
const card = requestsList.childNodes[0];
|
|
expect(card.querySelector('.request-title').textContent).toBe('Movie Test');
|
|
expect(card.querySelector('.request-year').textContent).toBe('2026');
|
|
expect(card.querySelector('.request-user').textContent).toBe('Requested by: john_doe');
|
|
|
|
// Check formatted date
|
|
const dateEl = card.querySelector('.request-date');
|
|
expect(dateEl).toBeTruthy();
|
|
expect(dateEl.textContent).toContain('Date: 2026-05-27');
|
|
|
|
// Check view in Ombi link
|
|
const ombiLink = card.querySelector('.ombi-link');
|
|
expect(ombiLink).toBeTruthy();
|
|
expect(ombiLink.href).toBe('https://ombi.test/details/movie/555');
|
|
});
|
|
|
|
it('renders "Unknown (Ombi)" with tooltip when requester is missing', () => {
|
|
state.ombiRequests = {
|
|
movie: [],
|
|
tv: [
|
|
{
|
|
id: 201,
|
|
title: 'TV Test No User',
|
|
requestedDate: '2026-05-27T12:00:00.000Z',
|
|
requested: true
|
|
}
|
|
]
|
|
};
|
|
|
|
renderRequests();
|
|
|
|
expect(requestsList.childNodes.length).toBe(1);
|
|
const card = requestsList.childNodes[0];
|
|
const userEl = card.querySelector('.request-user');
|
|
expect(userEl).toBeTruthy();
|
|
expect(userEl.textContent).toBe('Requested by: Unknown (Ombi)');
|
|
expect(userEl.title).toBe('No user information received from Ombi');
|
|
expect(userEl.style.textDecoration).toBe('underline dotted');
|
|
});
|
|
|
|
it('does NOT render Sonarr/Radarr deep links for non-admin users', () => {
|
|
state.isAdmin = false;
|
|
state.ombiRequests = {
|
|
movie: [
|
|
{
|
|
id: 101,
|
|
title: 'Movie Test',
|
|
theMovieDbId: 555,
|
|
arrLink: 'http://radarr:7878/movie/slug',
|
|
arrType: 'radarr',
|
|
requested: true
|
|
}
|
|
],
|
|
tv: []
|
|
};
|
|
|
|
renderRequests();
|
|
|
|
const card = requestsList.childNodes[0];
|
|
expect(card.querySelector('.radarr-link')).toBeNull();
|
|
});
|
|
|
|
it('renders Sonarr/Radarr deep links next to Ombi link for administrators', () => {
|
|
state.isAdmin = true;
|
|
state.ombiRequests = {
|
|
movie: [
|
|
{
|
|
id: 101,
|
|
title: 'Movie Test',
|
|
theMovieDbId: 555,
|
|
arrLink: 'http://radarr:7878/movie/slug',
|
|
arrType: 'radarr',
|
|
requested: true
|
|
}
|
|
],
|
|
tv: [
|
|
{
|
|
id: 202,
|
|
title: 'TV Show Test',
|
|
theMovieDbId: 666,
|
|
arrLink: 'http://sonarr:8989/series/slug',
|
|
arrType: 'sonarr',
|
|
requested: true
|
|
}
|
|
]
|
|
};
|
|
|
|
renderRequests();
|
|
|
|
expect(requestsList.childNodes.length).toBe(2);
|
|
|
|
// Check Radarr link
|
|
const movieCard = requestsList.childNodes[0];
|
|
const radarrLink = movieCard.querySelector('.radarr-link');
|
|
expect(radarrLink).toBeTruthy();
|
|
expect(radarrLink.href).toBe('http://radarr:7878/movie/slug');
|
|
expect(radarrLink.title).toBe('View in Radarr');
|
|
|
|
// Check Sonarr link
|
|
const tvCard = requestsList.childNodes[1];
|
|
const sonarrLink = tvCard.querySelector('.sonarr-link');
|
|
expect(sonarrLink).toBeTruthy();
|
|
expect(sonarrLink.href).toBe('http://sonarr:8989/series/slug');
|
|
expect(sonarrLink.title).toBe('View in Sonarr');
|
|
});
|
|
});
|