97 lines
3.0 KiB
TypeScript
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 });
|
|
});
|
|
});
|