Files
NianAIGC/tests/account-store.test.ts

97 lines
3.0 KiB
TypeScript

import { mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import {
createAsset,
createGenerationJob,
createImageTemplate,
listAssets,
listGenerationJobs,
listImageTemplates,
listUsageEvents,
recordUsageEvent
} from "@/lib/server/data-store";
import {
createPlatformOrganization,
createPlatformUser,
deletePlatformUser,
getPlatformUserById
} from "@/lib/server/account-store";
import type { PlatformUserRecord } from "@/lib/types";
let dataDirectory = "";
let user: PlatformUserRecord;
let archiveOwnerId = "";
describe("platform account ownership lifecycle", () => {
beforeEach(async () => {
dataDirectory = await mkdtemp(join(tmpdir(), "zhinian-account-store-"));
vi.stubEnv("ZHINIAN_DATA_DIR", dataDirectory);
vi.stubEnv("ZHINIAN_AUTH_REQUIRED", "1");
vi.stubEnv("ZHINIAN_AUTH_SESSION_SECRET", "test-platform-session-secret");
vi.stubEnv("ZHINIAN_DATA_BACKEND", "local");
const organization = await createPlatformOrganization("归档组织");
archiveOwnerId = organization.archiveOwnerId;
user = await createPlatformUser({
phone: "13800138000",
displayName: "待删除用户",
password: "ArchivePass123",
role: "user",
organizationId: organization.id
});
});
afterEach(async () => {
vi.unstubAllEnvs();
await rm(dataDirectory, { force: true, recursive: true });
});
it("removes login identity, archives business data, and retains usage history", async () => {
const asset = await createAsset({
ownerId: user.id,
kind: "image",
name: "待归档素材",
url: "https://example.com/archive.png",
source: "upload",
tags: [],
metadata: {}
});
const job = await createGenerationJob({
ownerId: user.id,
capability: "image.generate",
provider: "evolink",
reqKey: "gpt-image-2",
status: "succeeded",
inputAssetIds: [asset.id],
inputUrls: [],
outputAssetIds: [asset.id],
requestPayload: {}
});
await createImageTemplate({
ownerId: user.id,
name: "待归档模板",
prompt: "测试提示词",
settings: {},
sortOrder: 0
});
await recordUsageEvent({
ownerId: user.id,
jobId: job.id,
source: "platform",
capability: job.capability,
provider: job.provider,
quantity: 1,
estimatedUnit: "image"
});
await deletePlatformUser(user.id);
expect(await getPlatformUserById(user.id, { includeDisabled: true })).toBeNull();
expect((await listAssets(archiveOwnerId)).map((item) => item.id)).toEqual([asset.id]);
expect((await listGenerationJobs(archiveOwnerId)).map((item) => item.id)).toEqual([job.id]);
expect((await listImageTemplates(archiveOwnerId)).map((item) => item.name)).toEqual(["待归档模板"]);
expect((await listUsageEvents()).find((event) => event.jobId === job.id)).toMatchObject({ ownerId: user.id });
});
});