// 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 = `
`; 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'); }); });