refactor(storage): use unstorage for session state

This commit is contained in:
2026-07-01 18:36:26 +08:00
parent 0251916a8a
commit ae6578923b
13 changed files with 398 additions and 246 deletions
@@ -35,34 +35,38 @@ describe("subscription exit helpers", () => {
peekPendingChatUnlockMock.mockReset();
});
it("uses explicit chat image return urls first", () => {
consumePendingChatImageReturnMock.mockReturnValue({
it("uses explicit chat image return urls first", async () => {
consumePendingChatImageReturnMock.mockResolvedValue({
reason: "image_paywall",
messageId: "msg_1",
returnUrl: "/chat/image/msg_1",
createdAt: 1,
});
expect(consumeSubscriptionExplicitExitUrl()).toBe("/chat/image/msg_1");
await expect(consumeSubscriptionExplicitExitUrl()).resolves.toBe(
"/chat/image/msg_1",
);
});
it("falls back to chat when requested", () => {
consumePendingChatImageReturnMock.mockReturnValue(null);
peekPendingChatUnlockMock.mockReturnValue(null);
it("falls back to chat when requested", async () => {
consumePendingChatImageReturnMock.mockResolvedValue(null);
peekPendingChatUnlockMock.mockResolvedValue(null);
expect(consumeSubscriptionExitUrl("chat")).toBe(ROUTES.chat);
await expect(consumeSubscriptionExitUrl("chat")).resolves.toBe(ROUTES.chat);
});
it("falls back to sidebar by default", () => {
consumePendingChatImageReturnMock.mockReturnValue(null);
peekPendingChatUnlockMock.mockReturnValue(null);
it("falls back to sidebar by default", async () => {
consumePendingChatImageReturnMock.mockResolvedValue(null);
peekPendingChatUnlockMock.mockResolvedValue(null);
expect(getSubscriptionFallbackExitUrl(null)).toBe(ROUTES.sidebar);
expect(consumeSubscriptionExitUrl(null)).toBe(ROUTES.sidebar);
await expect(consumeSubscriptionExitUrl(null)).resolves.toBe(
ROUTES.sidebar,
);
});
it("peeks chat unlock return urls without clearing them", () => {
peekPendingChatUnlockMock.mockReturnValue({
it("peeks chat unlock return urls without clearing them", async () => {
peekPendingChatUnlockMock.mockResolvedValue({
reason: "single_message_unlock",
messageId: "msg_1",
kind: "image",
@@ -71,13 +75,15 @@ describe("subscription exit helpers", () => {
createdAt: 1,
});
expect(peekSubscriptionExplicitExitUrl()).toBe("/chat/image/msg_1");
await expect(peekSubscriptionExplicitExitUrl()).resolves.toBe(
"/chat/image/msg_1",
);
expect(clearPendingChatUnlockMock).not.toHaveBeenCalled();
});
it("clears chat unlock return urls when consumed", () => {
consumePendingChatImageReturnMock.mockReturnValue(null);
peekPendingChatUnlockMock.mockReturnValue({
it("clears chat unlock return urls when consumed", async () => {
consumePendingChatImageReturnMock.mockResolvedValue(null);
peekPendingChatUnlockMock.mockResolvedValue({
reason: "single_message_unlock",
messageId: "msg_1",
kind: "image",
@@ -86,7 +92,9 @@ describe("subscription exit helpers", () => {
createdAt: 1,
});
expect(consumeSubscriptionExplicitExitUrl()).toBe("/chat/image/msg_1");
await expect(consumeSubscriptionExplicitExitUrl()).resolves.toBe(
"/chat/image/msg_1",
);
expect(clearPendingChatUnlockMock).toHaveBeenCalledTimes(1);
});
});