104 lines
2.8 KiB
TypeScript
104 lines
2.8 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
import { Hono } from "hono";
|
|
import { createDiffRouter } from "../src/diff/router.ts";
|
|
import type { DiffManager } from "../src/diff/diff.ts";
|
|
import type { AppEnv, AuthStore } from "../src/login.ts";
|
|
|
|
const adminUser: AuthStore["user"] = { username: "admin", permission: [] };
|
|
|
|
const createTestApp = (diffManager: DiffManager) => {
|
|
const app = new Hono<AppEnv>();
|
|
|
|
app.use("*", async (c, next) => {
|
|
const auth: AuthStore = {
|
|
user: adminUser,
|
|
refreshed: false,
|
|
authenticated: true,
|
|
};
|
|
c.set("auth", auth);
|
|
await next();
|
|
});
|
|
|
|
app.route("/diff", createDiffRouter(diffManager));
|
|
|
|
return app;
|
|
};
|
|
|
|
describe("Diff router integration", () => {
|
|
let app: ReturnType<typeof createTestApp>
|
|
let diffManager: DiffManager;
|
|
let getAddedMock: ReturnType<typeof vi.fn>;
|
|
let commitMock: ReturnType<typeof vi.fn>;
|
|
let commitAllMock: ReturnType<typeof vi.fn>;
|
|
|
|
beforeEach(() => {
|
|
getAddedMock = vi.fn(() => [
|
|
{
|
|
type: "comic",
|
|
value: [
|
|
{ path: "alpha.zip", type: "archive" },
|
|
],
|
|
},
|
|
]);
|
|
commitMock = vi.fn(async () => 101);
|
|
commitAllMock = vi.fn(async () => [201, 202]);
|
|
|
|
diffManager = {
|
|
getAdded: getAddedMock,
|
|
commit: commitMock,
|
|
commitAll: commitAllMock,
|
|
} as unknown as DiffManager;
|
|
|
|
app = createTestApp(diffManager);
|
|
});
|
|
|
|
it("GET /diff/list returns grouped pending items", async () => {
|
|
const response = await app.fetch(new Request("http://localhost/diff/list"));
|
|
expect(response.status).toBe(200);
|
|
|
|
const payload = await response.json();
|
|
expect(payload).toEqual([
|
|
{
|
|
type: "comic",
|
|
value: [
|
|
{ path: "alpha.zip", type: "archive" },
|
|
],
|
|
},
|
|
]);
|
|
expect(getAddedMock).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it("POST /diff/commit commits each queued item", async () => {
|
|
const request = new Request("http://localhost/diff/commit", {
|
|
method: "POST",
|
|
headers: { "content-type": "application/json" },
|
|
body: JSON.stringify([
|
|
{ type: "comic", path: "alpha.zip" },
|
|
]),
|
|
});
|
|
|
|
commitMock.mockResolvedValueOnce(555);
|
|
|
|
const response = await app.fetch(request);
|
|
expect(response.status).toBe(200);
|
|
|
|
const payload = await response.json();
|
|
expect(payload).toEqual({ ok: true, docs: [555] });
|
|
expect(commitMock).toHaveBeenCalledWith("comic", "alpha.zip");
|
|
});
|
|
|
|
it("POST /diff/commitall flushes all entries for the type", async () => {
|
|
const request = new Request("http://localhost/diff/commitall", {
|
|
method: "POST",
|
|
headers: { "content-type": "application/json" },
|
|
body: JSON.stringify({ type: "comic" }),
|
|
});
|
|
|
|
const response = await app.fetch(request);
|
|
expect(response.status).toBe(200);
|
|
|
|
const payload = await response.json();
|
|
expect(payload).toEqual({ ok: true });
|
|
expect(commitAllMock).toHaveBeenCalledWith("comic");
|
|
});
|
|
});
|