feat: complete TASK-WP2-01 project foundations
This commit is contained in:
@@ -7,6 +7,7 @@ import { Readable } from "node:stream";
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
|
||||
import { ManagedStorage } from "../../apps/api/src/managed-storage.js";
|
||||
import { ProjectService } from "../../apps/api/src/projects.js";
|
||||
import { RegistrationService } from "../../apps/api/src/registration.js";
|
||||
import { MockResendAdapter } from "../../apps/api/src/resend-adapter.js";
|
||||
import { registrationNotice } from "../../packages/shared-contracts/src/registration-notice.js";
|
||||
@@ -15,6 +16,7 @@ const fixedNow = Date.parse("2026-07-28T10:00:00.000Z");
|
||||
const roots: string[] = [];
|
||||
const services: RegistrationService[] = [];
|
||||
const storages: ManagedStorage[] = [];
|
||||
const projectServices: ProjectService[] = [];
|
||||
|
||||
function writeEvidence(environmentName: string, file: string, value: unknown) {
|
||||
const directory = process.env[environmentName];
|
||||
@@ -53,10 +55,13 @@ async function createRegisteredHarness(email = "delete-me@example.invalid") {
|
||||
registrationId: sent.registrationId,
|
||||
socialId: "@delete_me",
|
||||
});
|
||||
return { completed, databasePath, email, resend, root, service, storage };
|
||||
const projects = new ProjectService({ clock: () => fixedNow, databasePath });
|
||||
projectServices.push(projects);
|
||||
return { completed, databasePath, email, projects, resend, root, service, storage };
|
||||
}
|
||||
|
||||
afterEach(() => {
|
||||
for (const projects of projectServices.splice(0)) projects.close();
|
||||
for (const service of services.splice(0)) service.close();
|
||||
for (const storage of storages.splice(0)) storage.close();
|
||||
for (const root of roots.splice(0)) rmSync(root, { force: true, recursive: true });
|
||||
@@ -68,6 +73,7 @@ describe("TDD-WP1-DEL-001-account-delete", () => {
|
||||
const userId = harness.completed.user.userId;
|
||||
const secondSession = harness.service.issueAuthenticatedSession(userId, "user");
|
||||
const csrfToken = harness.service.issueUserCsrfToken(harness.completed.sessionToken);
|
||||
harness.projects.createProjectForGeneration({ ownerId: userId, prompt: "注销项目", ratio: "3:4", status: "failed" });
|
||||
const files = await Promise.all([
|
||||
harness.storage.commitStream({
|
||||
content: Readable.from(Buffer.from("reference")), expectedMimeType: "application/octet-stream",
|
||||
@@ -105,9 +111,10 @@ describe("TDD-WP1-DEL-001-account-delete", () => {
|
||||
credits: harness.service.database.prepare("SELECT COUNT(*) AS count FROM credit_accounts WHERE user_id = ?").get(userId).count,
|
||||
ledger: harness.service.database.prepare("SELECT COUNT(*) AS count FROM credit_ledger WHERE user_id = ?").get(userId).count,
|
||||
profiles: harness.service.database.prepare("SELECT COUNT(*) AS count FROM user_profiles WHERE user_id = ?").get(userId).count,
|
||||
projects: harness.service.database.prepare("SELECT COUNT(*) AS count FROM projects WHERE owner_id = ?").get(userId).count,
|
||||
sessions: harness.service.database.prepare("SELECT COUNT(*) AS count FROM sessions WHERE user_id = ?").get(userId).count,
|
||||
};
|
||||
expect(databaseState).toEqual({ account: 0, consents: 0, credits: 0, ledger: 0, profiles: 0, sessions: 0 });
|
||||
expect(databaseState).toEqual({ account: 0, consents: 0, credits: 0, ledger: 0, profiles: 0, projects: 0, sessions: 0 });
|
||||
expect(files.every((file) => harness.storage.resolveManagedFile(file.file_id) === undefined)).toBe(true);
|
||||
expect(harness.storage.inspectCounts().pending_cleanup).toBe(3);
|
||||
expect(harness.service.database.prepare("SELECT COUNT(*) AS count FROM users WHERE normalized_email = ?").get(harness.email).count).toBe(0);
|
||||
|
||||
Reference in New Issue
Block a user