// The Lucia project.
// Copyright 2026-2026 DSP, inc.  All rights reserved.
// Authors:
//   imacat.yang@dsp.im (imacat), 2026/03/08

import { beforeEach, describe, expect, it, vi } from "vitest";

const { mockAxiosCreate, mockRequestUse, mockResponseUse, mockDeleteCookie } =
  vi.hoisted(() => ({
    mockAxiosCreate: vi.fn(),
    mockRequestUse: vi.fn(),
    mockResponseUse: vi.fn(),
    mockDeleteCookie: vi.fn(),
  }));

vi.mock("axios", () => ({
  default: {
    create: mockAxiosCreate,
  },
}));

vi.mock("@/utils/cookieUtil.js", () => ({
  getCookie: vi.fn(() => null),
  deleteCookie: mockDeleteCookie,
}));

vi.mock("@/api/auth.js", () => ({
  refreshTokenAndGetNew: vi.fn().mockRejectedValue(new Error("401")),
}));

describe("apiClient response interceptor", () => {
  beforeEach(() => {
    vi.clearAllMocks();
    mockAxiosCreate.mockReturnValue({
      interceptors: {
        request: { use: mockRequestUse },
        response: { use: mockResponseUse },
      },
    });
  });

  it("clears all auth cookies when token refresh fails", async () => {
    await import("@/api/client.js");
    const rejectedHandler = mockResponseUse.mock.calls[0][1];
    await expect(
      rejectedHandler({
        response: { status: 401 },
        config: { url: "/api/my-account", headers: {} },
      }),
    ).rejects.toThrow("401");

    expect(mockDeleteCookie).toHaveBeenCalledWith("luciaToken");
    expect(mockDeleteCookie).toHaveBeenCalledWith("luciaRefreshToken");
    expect(mockDeleteCookie).toHaveBeenCalledWith("isLuciaLoggedIn");
  });
});
