51 lines
1.8 KiB
TypeScript
51 lines
1.8 KiB
TypeScript
import { expect, it } from "vitest";
|
|
import type { Book } from "../src/api/types";
|
|
import { sections, sortBooks } from "../src/lib/shelf";
|
|
|
|
const b = (over: Partial<Book>): Book =>
|
|
({
|
|
id: 1,
|
|
path: "p",
|
|
title: "t",
|
|
format: "cbz",
|
|
size: 1,
|
|
pages: 1,
|
|
percent: 0,
|
|
added_at: "2026-01-01T00:00:00Z",
|
|
library_id: 1,
|
|
state: "ready",
|
|
cover_url: "",
|
|
page_url_fmt: "",
|
|
pages_url: "",
|
|
error: "",
|
|
...over,
|
|
}) as Book;
|
|
|
|
it("sortBooks: added 新→旧 / title zh 本地化 / progress 高→低且并列按 added", () => {
|
|
const old = b({ id: 1, added_at: "2026-01-01T00:00:00Z", title: "b" });
|
|
const nw = b({ id: 2, added_at: "2026-02-01T00:00:00Z", title: "a" });
|
|
expect(sortBooks([old, nw], "added").map((x) => x.id)).toEqual([2, 1]);
|
|
expect(sortBooks([old, nw], "title").map((x) => x.id)).toEqual([2, 1]);
|
|
expect(sortBooks([b({ id: 3, percent: 0.2 }), b({ id: 4, percent: 0.9 })], "progress").map((x) => x.id)).toEqual([
|
|
4, 3,
|
|
]);
|
|
const tie = [
|
|
b({ id: 5, percent: 0.5, added_at: "2026-01-01T00:00:00Z" }),
|
|
b({ id: 6, percent: 0.5, added_at: "2026-03-01T00:00:00Z" }),
|
|
];
|
|
expect(sortBooks(tie, "progress").map((x) => x.id)).toEqual([6, 5]);
|
|
});
|
|
|
|
it("sections: flat 单段无标题;dir 按目录分组且组内排序、根目录置顶", () => {
|
|
const books = [
|
|
b({ id: 1, path: "x/a.cbz" }),
|
|
b({ id: 2, path: "b.cbz", title: "B" }),
|
|
b({ id: 3, path: "x/c.cbz", title: "A" }),
|
|
];
|
|
// 容器 Intl zh 实测序 A < B < t (localeCompare("zh")),故 title 升序为 id3,id2,id1
|
|
expect(sections(books, "title", "flat")).toEqual([{ label: "", books: [books[2], books[1], books[0]] }]);
|
|
const g = sections(books, "title", "dir");
|
|
expect(g.map((s) => s.label)).toEqual(["", "x"]);
|
|
expect(g[1].books.map((x) => x.title)).toEqual(["A", "t"]); // x 组内按 title 排序
|
|
});
|