202 lines
7.0 KiB
TypeScript
202 lines
7.0 KiB
TypeScript
import { describe, expect, test } from "vitest";
|
|
import { FormValidationError, parseForm } from "@/shared/forms/validation";
|
|
import {
|
|
emojiPackFormSchema,
|
|
giftFormSchema,
|
|
resourceFormSchema,
|
|
resourceGrantFormSchema,
|
|
resourceGroupCreateFormSchema,
|
|
resourceShopItemsFormSchema,
|
|
} from "./schema.js";
|
|
|
|
describe("resource form schema", () => {
|
|
test("allows profile card resources", () => {
|
|
const payload = parseForm(resourceFormSchema, {
|
|
animationUrl: "https://media.haiyihy.com/resource/profile-card.pag",
|
|
badgeForm: "tile",
|
|
enabled: true,
|
|
metadataJson:
|
|
'{"profile_card_layout":{"source_width":1136,"source_height":1680,"color_content_width":750,"content_top":117,"content_bottom":1666,"content_height":1550,"content_top_ratio":0.069643,"content_height_ratio":0.922619,"detect_version":1}}',
|
|
name: "Profile Card",
|
|
previewUrl: "https://media.haiyihy.com/resource/profile-card-cover.png",
|
|
priceType: "free",
|
|
resourceCode: "profile_card_gold",
|
|
resourceType: "profile_card",
|
|
walletAssetAmount: "",
|
|
});
|
|
|
|
expect(payload.resourceType).toBe("profile_card");
|
|
expect(payload.metadataJson).toContain("profile_card_layout");
|
|
});
|
|
|
|
test("requires badge form for badge resources", () => {
|
|
const payload = parseForm(resourceFormSchema, {
|
|
animationUrl: "https://media.haiyihy.com/resource/badge.pag",
|
|
badgeForm: "strip",
|
|
badgeKind: "level",
|
|
enabled: true,
|
|
levelTrack: "wealth",
|
|
name: "VIP Badge",
|
|
previewUrl: "https://media.haiyihy.com/resource/badge.png",
|
|
priceType: "free",
|
|
resourceCode: "badge_vip",
|
|
resourceType: "badge",
|
|
walletAssetAmount: "",
|
|
});
|
|
|
|
expect(payload.badgeForm).toBe("strip");
|
|
expect(payload.badgeKind).toBe("level");
|
|
expect(payload.levelTrack).toBe("wealth");
|
|
expect(() =>
|
|
parseForm(resourceFormSchema, {
|
|
animationUrl: "https://media.haiyihy.com/resource/badge.pag",
|
|
enabled: true,
|
|
name: "VIP Badge",
|
|
previewUrl: "https://media.haiyihy.com/resource/badge.png",
|
|
priceType: "free",
|
|
resourceCode: "badge_vip",
|
|
resourceType: "badge",
|
|
walletAssetAmount: "",
|
|
}),
|
|
).toThrow(FormValidationError);
|
|
expect(() =>
|
|
parseForm(resourceFormSchema, {
|
|
animationUrl: "https://media.haiyihy.com/resource/badge.pag",
|
|
badgeForm: "strip",
|
|
badgeKind: "level",
|
|
enabled: true,
|
|
name: "VIP Badge",
|
|
previewUrl: "https://media.haiyihy.com/resource/badge.png",
|
|
priceType: "free",
|
|
resourceCode: "badge_vip_level",
|
|
resourceType: "badge",
|
|
walletAssetAmount: "",
|
|
}),
|
|
).toThrow(FormValidationError);
|
|
});
|
|
|
|
test("allows resource group resource items without wallet asset type", () => {
|
|
const payload = parseForm(resourceGroupCreateFormSchema, {
|
|
description: "",
|
|
enabled: true,
|
|
groupCode: "starter_pack",
|
|
items: [
|
|
{
|
|
durationDays: "7",
|
|
itemType: "resource",
|
|
resourceId: "11",
|
|
sortOrder: "0",
|
|
walletAssetAmount: "",
|
|
walletAssetType: "",
|
|
},
|
|
],
|
|
name: "Starter Pack",
|
|
sortOrder: "0",
|
|
});
|
|
|
|
expect(payload.items[0].walletAssetType).toBeUndefined();
|
|
});
|
|
|
|
test("rejects invalid wallet asset type with Chinese message", () => {
|
|
expect(() =>
|
|
parseForm(resourceGroupCreateFormSchema, {
|
|
description: "",
|
|
enabled: true,
|
|
groupCode: "starter_pack",
|
|
items: [
|
|
{
|
|
durationDays: "",
|
|
itemType: "wallet_asset",
|
|
resourceId: "",
|
|
sortOrder: "0",
|
|
walletAssetAmount: "100",
|
|
walletAssetType: "gold",
|
|
},
|
|
],
|
|
name: "Starter Pack",
|
|
sortOrder: "0",
|
|
}),
|
|
).toThrow(FormValidationError);
|
|
});
|
|
|
|
test("validates editable gift form fields", () => {
|
|
const payload = parseForm(giftFormSchema, {
|
|
chargeAssetType: "COIN",
|
|
coinPrice: "10",
|
|
effectTypes: ["animation"],
|
|
effectiveFrom: "",
|
|
effectiveTo: "",
|
|
enabled: true,
|
|
giftId: "rose",
|
|
giftPointAmount: "10",
|
|
giftTypeCode: "normal",
|
|
name: "Rose",
|
|
presentationJson: "{}",
|
|
priceVersion: "default",
|
|
regionIds: ["0", "1001"],
|
|
resourceId: "11",
|
|
sortOrder: "0",
|
|
});
|
|
|
|
expect(payload.regionIds).toEqual(["0", "1001"]);
|
|
});
|
|
|
|
test("validates emoji pack category and pricing type", () => {
|
|
const payload = parseForm(emojiPackFormSchema, {
|
|
animationUrl: "https://media.haiyihy.com/emoji/wave.svga",
|
|
category: "热门",
|
|
coverUrl: "https://media.haiyihy.com/emoji/wave.png",
|
|
name: "Wave",
|
|
pricingType: "paid",
|
|
regionIds: ["0"],
|
|
sortOrder: "0",
|
|
});
|
|
|
|
expect(payload.category).toBe("热门");
|
|
expect(payload.pricingType).toBe("paid");
|
|
});
|
|
|
|
test("validates resource grant form fields", () => {
|
|
const payload = parseForm(resourceGrantFormSchema, {
|
|
durationDays: "7",
|
|
quantity: "1",
|
|
reason: "manual",
|
|
resourceIds: ["11", "12"],
|
|
subjectType: "resource",
|
|
targetUserId: "1001",
|
|
});
|
|
|
|
expect(payload.subjectType).toBe("resource");
|
|
expect(payload.resourceIds).toEqual(["11", "12"]);
|
|
});
|
|
|
|
test("validates resource shop durations", () => {
|
|
const payload = parseForm(resourceShopItemsFormSchema, {
|
|
items: [
|
|
{
|
|
durationDays: "3",
|
|
effectiveFrom: "",
|
|
effectiveTo: "",
|
|
resourceId: "11",
|
|
sortOrder: "0",
|
|
},
|
|
],
|
|
});
|
|
|
|
expect(payload.items[0].durationDays).toBe("3");
|
|
expect(() =>
|
|
parseForm(resourceShopItemsFormSchema, {
|
|
items: [
|
|
{
|
|
durationDays: "2",
|
|
effectiveFrom: "",
|
|
effectiveTo: "",
|
|
resourceId: "11",
|
|
sortOrder: "0",
|
|
},
|
|
],
|
|
}),
|
|
).toThrow(FormValidationError);
|
|
});
|
|
});
|