|
@@ -0,0 +1,65 @@
|
|
|
|
|
+/* @vitest-environment node */
|
|
|
|
|
+
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+// Folder: lib/frontend
|
|
|
|
|
+// File: authMessages.test.js
|
|
|
|
|
+// Relative Path: lib/frontend/authMessages.test.js
|
|
|
|
|
+// ---------------------------------------------------------------------------
|
|
|
|
|
+
|
|
|
|
|
+import { describe, it, expect } from "vitest";
|
|
|
|
|
+import { ApiClientError } from "@/lib/frontend/apiClient";
|
|
|
|
|
+import { LOGIN_REASONS } from "@/lib/frontend/authRedirect";
|
|
|
|
|
+import { getLoginReasonAlert, getLoginErrorMessage } from "./authMessages.js";
|
|
|
|
|
+
|
|
|
|
|
+describe("lib/frontend/authMessages", () => {
|
|
|
|
|
+ describe("getLoginReasonAlert", () => {
|
|
|
|
|
+ it("returns alert copy for reason=expired", () => {
|
|
|
|
|
+ expect(getLoginReasonAlert(LOGIN_REASONS.EXPIRED)).toEqual({
|
|
|
|
|
+ title: "Session expired",
|
|
|
|
|
+ description: "Your session has expired. Please log in again.",
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("returns alert copy for reason=logged-out", () => {
|
|
|
|
|
+ expect(getLoginReasonAlert(LOGIN_REASONS.LOGGED_OUT)).toEqual({
|
|
|
|
|
+ title: "Logged out",
|
|
|
|
|
+ description: "You have been logged out successfully.",
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("returns null for unknown or missing reason", () => {
|
|
|
|
|
+ expect(getLoginReasonAlert(null)).toBe(null);
|
|
|
|
|
+ expect(getLoginReasonAlert("unknown")).toBe(null);
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ describe("getLoginErrorMessage", () => {
|
|
|
|
|
+ it("maps AUTH_INVALID_CREDENTIALS to a friendly message", () => {
|
|
|
|
|
+ const err = new ApiClientError({
|
|
|
|
|
+ status: 401,
|
|
|
|
|
+ code: "AUTH_INVALID_CREDENTIALS",
|
|
|
|
|
+ message: "Invalid credentials",
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ expect(getLoginErrorMessage(err)).toBe("Invalid username or password.");
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("maps CLIENT_NETWORK_ERROR to a friendly message", () => {
|
|
|
|
|
+ const err = new ApiClientError({
|
|
|
|
|
+ status: 0,
|
|
|
|
|
+ code: "CLIENT_NETWORK_ERROR",
|
|
|
|
|
+ message: "Network error",
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ expect(getLoginErrorMessage(err)).toBe(
|
|
|
|
|
+ "Network error. Please check your connection and try again."
|
|
|
|
|
+ );
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("uses a generic message for other errors", () => {
|
|
|
|
|
+ expect(getLoginErrorMessage(new Error("boom"))).toBe(
|
|
|
|
|
+ "Login failed. Please try again."
|
|
|
|
|
+ );
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+});
|