Files
manage/frontend/src/widgets/__tests__/QbittorrentActiveTorrentsWidget.test.tsx
T

108 lines
2.7 KiB
TypeScript

import { describe, it, expect, vi } from "vitest";
import { render, screen } from "@testing-library/react";
import { QbittorrentActiveTorrentsWidget } from "../QbittorrentActiveTorrentsWidget";
import type { WidgetInstance } from "../../types";
import * as useWidgets from "../../hooks/useWidgets";
vi.mock("../../hooks/useWidgets", () => ({
useWidgetData: vi.fn(),
}));
const widget: WidgetInstance = {
id: "w1",
service_id: "s1",
widget_kind: "active",
title: "Active Torrents",
config: {},
enabled: true,
sort_order: 0,
created_at: 0,
updated_at: 0,
};
function mockData(data: unknown, error?: string) {
vi.mocked(useWidgets.useWidgetData).mockReturnValue({
data: error
? { widget_id: "w1", error, fetched_at: 0 }
: { widget_id: "w1", data, fetched_at: 0 },
isLoading: false,
} as unknown as ReturnType<typeof useWidgets.useWidgetData>);
}
describe("QbittorrentActiveTorrentsWidget", () => {
it("renders skeleton while loading", () => {
vi.mocked(useWidgets.useWidgetData).mockReturnValue({
data: undefined,
isLoading: true,
} as unknown as ReturnType<typeof useWidgets.useWidgetData>);
render(
<QbittorrentActiveTorrentsWidget
widget={widget}
refreshIntervalMs={15000}
/>,
);
expect(
document.querySelector('[data-slot="skeleton"]'),
).toBeInTheDocument();
});
it("renders active torrent rows", () => {
mockData({
torrents: [
{
name: "Movie.mkv",
state: "downloading",
size: 1000,
progress: 0.5,
ratio: 1.25,
dl_speed: 500000,
up_speed: 1000,
},
{
name: "Show.mkv",
state: "uploading",
size: 2000,
progress: 1.0,
dl_speed: 0,
up_speed: 50000,
},
],
});
render(
<QbittorrentActiveTorrentsWidget
widget={widget}
refreshIntervalMs={15000}
/>,
);
expect(screen.getByText("Movie.mkv")).toBeInTheDocument();
expect(screen.getByText("Show.mkv")).toBeInTheDocument();
expect(screen.getByText("Downloading")).toBeInTheDocument();
expect(screen.getByText("Uploading")).toBeInTheDocument();
expect(screen.getByText(/Ratio 1\.25/)).toBeInTheDocument();
});
it("shows empty state when no active torrents", () => {
mockData({ torrents: [] });
render(
<QbittorrentActiveTorrentsWidget
widget={widget}
refreshIntervalMs={15000}
/>,
);
expect(
screen.getByText(/No torrents are currently downloading or uploading/i),
).toBeInTheDocument();
});
it("shows error alert on error", () => {
mockData(null, "qBittorrent fetch failed");
render(
<QbittorrentActiveTorrentsWidget
widget={widget}
refreshIntervalMs={15000}
/>,
);
expect(screen.getByText(/qBittorrent fetch failed/i)).toBeInTheDocument();
});
});