91 lines
2.6 KiB
TypeScript
91 lines
2.6 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
ChatLockDetailSchema,
|
|
ChatSendResponseSchema,
|
|
PaymentGuidanceSchema,
|
|
UnlockHistoryResponseSchema,
|
|
UnlockPrivateResponseSchema,
|
|
} from "@/data/schemas/chat";
|
|
|
|
const guidance = {
|
|
guidanceId: "guidance-1",
|
|
characterId: "maya-tan",
|
|
characterName: "Maya Tan",
|
|
scene: "voiceLocked",
|
|
mode: "guide",
|
|
title: "Keep talking with Maya",
|
|
copy: "Hey love, I want to keep talking. This voice message needs 20 credits.",
|
|
ctaLabel: "View VIP & credit options",
|
|
purchaseOptions: ["vip", "topup"],
|
|
target: "subscription",
|
|
ruleId: "payment_guidance_voiceLocked",
|
|
} as const;
|
|
|
|
describe("payment guidance wire contract", () => {
|
|
it("parses the public decision without changing role identity", () => {
|
|
expect(PaymentGuidanceSchema.parse(guidance)).toEqual(guidance);
|
|
});
|
|
|
|
it("accepts the supportCharacter guidance scene", () => {
|
|
expect(
|
|
PaymentGuidanceSchema.parse({
|
|
...guidance,
|
|
scene: "supportCharacter",
|
|
ruleId: "payment_guidance_supportCharacter",
|
|
}).scene,
|
|
).toBe("supportCharacter");
|
|
});
|
|
|
|
it("keeps all backend lock facts instead of dropping hint and CTA", () => {
|
|
expect(
|
|
ChatLockDetailSchema.parse({
|
|
locked: true,
|
|
showContent: false,
|
|
showUpgrade: true,
|
|
reason: "voice_message",
|
|
hint: "This voice message needs 20 credits.",
|
|
actionLabel: "Unlock",
|
|
detail: { requiredCredits: 20 },
|
|
}),
|
|
).toEqual({
|
|
locked: true,
|
|
showContent: false,
|
|
showUpgrade: true,
|
|
reason: "voice_message",
|
|
hint: "This voice message needs 20 credits.",
|
|
actionLabel: "Unlock",
|
|
detail: { requiredCredits: 20 },
|
|
});
|
|
});
|
|
|
|
it("keeps backward compatibility when guidance is absent", () => {
|
|
const parsed = ChatSendResponseSchema.parse({ reply: "Hello" });
|
|
expect(parsed.paymentGuidance).toBeNull();
|
|
});
|
|
|
|
it("parses guidance on chat and both unlock responses", () => {
|
|
expect(
|
|
ChatSendResponseSchema.parse({
|
|
reply: "",
|
|
canSendMessage: false,
|
|
paymentGuidance: guidance,
|
|
}).paymentGuidance,
|
|
).toEqual(guidance);
|
|
expect(
|
|
UnlockPrivateResponseSchema.parse({
|
|
unlocked: false,
|
|
reason: "insufficient_credits",
|
|
paymentGuidance: guidance,
|
|
}).paymentGuidance,
|
|
).toEqual(guidance);
|
|
expect(
|
|
UnlockHistoryResponseSchema.parse({
|
|
unlocked: false,
|
|
reason: "insufficient_balance",
|
|
paymentGuidance: { ...guidance, scene: "historyLocked" },
|
|
}).paymentGuidance?.scene,
|
|
).toBe("historyLocked");
|
|
});
|
|
});
|