Add Transmission/NZBGet and per-client paths and much more

Extend multi-download-client support to include Transmission and NZBGet and introduce per-client custom download paths. Adds protocol mapping and new client types, Transmission/NZBGet integration services, API CRUD and validation changes, UI components/modal updates and live path previews, and manager routing by protocol. Includes DB migrations (download_path on download_history, interactive_search_access on users), schema updates, and related processor/service fixes and tests to ensure backward compatibility and proper path resolution.
This commit is contained in:
kikootwo
2026-02-09 19:45:43 -05:00
parent d7acd67aa4
commit 4b90b35748
117 changed files with 9346 additions and 1488 deletions
@@ -51,7 +51,7 @@ describe('IndexerConfigModal', () => {
expect(onClose).toHaveBeenCalledTimes(1);
});
it('validates that at least one category is selected', () => {
it('shows warning when all audiobook categories are deselected but still allows save', () => {
const onSave = vi.fn();
render(
@@ -72,11 +72,18 @@ describe('IndexerConfigModal', () => {
}
fireEvent.click(within(audiobookRow).getByRole('switch'));
// Warning should be shown instead of blocking save
expect(screen.getByText(/will not be searched for audiobooks/i)).toBeInTheDocument();
fireEvent.click(screen.getByRole('button', { name: 'Add Indexer' }));
// Component now shows specific error for audiobook categories
expect(screen.getByText('At least one audiobook category must be selected')).toBeInTheDocument();
expect(onSave).not.toHaveBeenCalled();
// Save should still be called with empty audiobook categories
expect(onSave).toHaveBeenCalledWith(
expect.objectContaining({
audiobookCategories: [],
})
);
});
it('forces RSS to false when the indexer does not support RSS', () => {