Offer archive-set or whole-package offline cleanup
This commit is contained in:
@@ -9,6 +9,42 @@ import { getPackagesWithOfflineLinks } from "../src/shared/offline-packages";
|
||||
import type { SessionState } from "../src/shared/types";
|
||||
|
||||
describe("remove packages containing offline links", () => {
|
||||
it.each([
|
||||
["episode03.part1.rar", "episode03.part2.rar"],
|
||||
["episode03.rar", "episode03.r00"],
|
||||
["episode03.zip.001", "episode03.zip.002"],
|
||||
["episode03.7z.001", "episode03.7z.002"],
|
||||
["episode03.001", "episode03.002"]
|
||||
])("removes the archive set containing offline %s and keeps other episodes", async (first, second) => {
|
||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), "mdd-offline-archive-"));
|
||||
const manager = new DownloadManager({ ...defaultSettings(), outputDir: root, autoExtract: false }, emptySession(), createStoragePaths(path.join(root, "state")));
|
||||
try {
|
||||
const names = [first, second, "episode04.part1.rar", "episode04.part2.rar", "notes.txt"];
|
||||
manager.addPackages([{ name: "Season", links: names.map((name) => `https://dummy/${name}`), fileNames: names }]);
|
||||
const session = (manager as unknown as { session: SessionState }).session;
|
||||
const pkg = session.packages[session.packageOrder[0]];
|
||||
const ids = [...pkg.itemIds];
|
||||
fs.mkdirSync(pkg.outputDir, { recursive: true });
|
||||
for (const [index, id] of ids.entries()) {
|
||||
session.items[id].fileName = names[index];
|
||||
session.items[id].targetPath = path.join(pkg.outputDir, names[index]);
|
||||
session.items[id].onlineStatus = index === 1 ? "offline" : "online";
|
||||
fs.writeFileSync(session.items[id].targetPath, names[index]);
|
||||
}
|
||||
session.items[ids[0]].status = "completed";
|
||||
expect(manager.removeOfflinePackages([pkg.id])).toBe(1);
|
||||
await (manager as any).cleanupQueue;
|
||||
expect(pkg.itemIds).toEqual(ids.slice(2));
|
||||
expect(session.items[ids[0]]).toBeUndefined();
|
||||
expect(session.items[ids[1]]).toBeUndefined();
|
||||
expect(session.packageOrder).toEqual([pkg.id]);
|
||||
for (const name of names) expect(fs.readFileSync(path.join(pkg.outputDir, name), "utf8")).toBe(name);
|
||||
} finally {
|
||||
manager.clearPersistTimer();
|
||||
fs.rmSync(root, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
it("removes complete partial and offline packages, preserves files and rechecks the confirmed set", async () => {
|
||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), "mdd-offline-removal-"));
|
||||
const manager = new DownloadManager({ ...defaultSettings(), outputDir: root, autoExtract: false }, emptySession(), createStoragePaths(path.join(root, "state")));
|
||||
@@ -30,7 +66,7 @@ describe("remove packages containing offline links", () => {
|
||||
for (const file of preservedPaths) fs.writeFileSync(file, "keep this content");
|
||||
const active = { abortController: new AbortController(), abortReason: "none" };
|
||||
(manager as any).activeTasks.set(packages.partial.itemIds[1], active);
|
||||
expect(manager.removeOfflinePackages([...confirmed, confirmed[0], "missing"])).toBe(2);
|
||||
expect(manager.removeOfflinePackages([...confirmed, confirmed[0], "missing"], "package")).toBe(2);
|
||||
await (manager as any).cleanupQueue;
|
||||
expect(active.abortController.signal.aborted).toBe(true);
|
||||
expect(active.abortReason).toBe("stop");
|
||||
|
||||
Reference in New Issue
Block a user