ionian/packages/server/tests/diff-router.integration.test.ts
monoid d28c255d21 feat: add app configuration management with Kysely integration
- Implemented `getAppConfig` and `upsertAppConfig` functions in `config.ts` for managing application settings in the database.
- Updated `mod.ts` to export the new configuration functions.
- Refactored `ComicConfig.ts` to load and update comic watch paths using the new configuration functions.
- Modified `comic_watcher.ts` to accept paths as parameters for creating watchers.
- Created a new settings router in `settings.ts` for managing application settings via HTTP requests.
- Integrated the settings router into the main server in `server.ts`.
- Updated the settings management to use the new database-backed configuration.
- Removed legacy configuration management code from `configRW.ts`.
- Added integration tests for the settings router and error handling.
- Updated `vitest` configuration for testing.
- Cleaned up unused type definitions in `pnpm-lock.yaml`.
2025-09-30 23:15:20 +09:00

102 lines
2.7 KiB
TypeScript

import { beforeEach, describe, expect, it, vi, afterEach } from "vitest";
import { Elysia } from "elysia";
import { createDiffRouter } from "../src/diff/router.ts";
import type { DiffManager } from "../src/diff/diff.ts";
const adminUser = { username: "admin", permission: [] as string[] };
const createTestApp = (diffManager: DiffManager) => {
const authPlugin = new Elysia({ name: "test-auth" })
.state("user", adminUser)
.derive(() => ({ user: adminUser }));
return new Elysia({ name: "diff-test" })
.use(authPlugin)
.use(createDiffRouter(diffManager));
};
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);
});
afterEach(async () => {
if (app?.server) {
await app.stop();
}
vi.clearAllMocks();
});
it("GET /diff/list returns grouped pending items", async () => {
const response = await app.handle(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.handle(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.handle(request);
expect(response.status).toBe(200);
const payload = await response.json();
expect(payload).toEqual({ ok: true });
expect(commitAllMock).toHaveBeenCalledWith("comic");
});
});