|
@@ -0,0 +1,128 @@
|
|
|
|
|
+/* @vitest-environment node */
|
|
|
|
|
+
|
|
|
|
|
+import { describe, it, expect } from "vitest";
|
|
|
|
|
+import {
|
|
|
|
|
+ normalizeUsernameForConfirmation,
|
|
|
|
|
+ isUsernameConfirmationMatch,
|
|
|
|
|
+ normalizeBranchIdInput,
|
|
|
|
|
+ normalizeBranchNumberInput,
|
|
|
|
|
+ formatBranchIdFromNumberInput,
|
|
|
|
|
+ extractBranchNumberInputFromBranchId,
|
|
|
|
|
+ isValidBranchIdFormat,
|
|
|
|
|
+ evaluateBranchExistence,
|
|
|
|
|
+} from "./userManagementUx.js";
|
|
|
|
|
+
|
|
|
|
|
+describe("lib/frontend/admin/users/userManagementUx", () => {
|
|
|
|
|
+ describe("username confirmation", () => {
|
|
|
|
|
+ it("normalizes to lowercase and trims", () => {
|
|
|
|
|
+ expect(normalizeUsernameForConfirmation(" Alice.Admin ")).toBe(
|
|
|
|
|
+ "alice.admin",
|
|
|
|
|
+ );
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("matches typed username case-insensitively after trimming", () => {
|
|
|
|
|
+ expect(
|
|
|
|
|
+ isUsernameConfirmationMatch({
|
|
|
|
|
+ expectedUsername: "branch.user",
|
|
|
|
|
+ typedUsername: " BRANCH.USER ",
|
|
|
|
|
+ }),
|
|
|
|
|
+ ).toBe(true);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("returns false for empty or mismatching values", () => {
|
|
|
|
|
+ expect(
|
|
|
|
|
+ isUsernameConfirmationMatch({
|
|
|
|
|
+ expectedUsername: "branch.user",
|
|
|
|
|
+ typedUsername: "other.user",
|
|
|
|
|
+ }),
|
|
|
|
|
+ ).toBe(false);
|
|
|
|
|
+
|
|
|
|
|
+ expect(
|
|
|
|
|
+ isUsernameConfirmationMatch({
|
|
|
|
|
+ expectedUsername: "",
|
|
|
|
|
+ typedUsername: "",
|
|
|
|
|
+ }),
|
|
|
|
|
+ ).toBe(false);
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ describe("branch formatting", () => {
|
|
|
|
|
+ it("normalizes branchId input to uppercase + trim", () => {
|
|
|
|
|
+ expect(normalizeBranchIdInput(" nl01 ")).toBe("NL01");
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("normalizes numeric branch input and strips non-digits", () => {
|
|
|
|
|
+ expect(normalizeBranchNumberInput(" 001 ")).toBe("1");
|
|
|
|
|
+ expect(normalizeBranchNumberInput(" 32a ")).toBe("32");
|
|
|
|
|
+ expect(normalizeBranchNumberInput("000")).toBe("0");
|
|
|
|
|
+ expect(normalizeBranchNumberInput("abc")).toBe("");
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("formats NL branchId with 2+ digit policy", () => {
|
|
|
|
|
+ expect(formatBranchIdFromNumberInput("1")).toBe("NL01");
|
|
|
|
|
+ expect(formatBranchIdFromNumberInput("32")).toBe("NL32");
|
|
|
|
|
+ expect(formatBranchIdFromNumberInput("200")).toBe("NL200");
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("extracts numeric branch input from an existing branchId", () => {
|
|
|
|
|
+ expect(extractBranchNumberInputFromBranchId("NL01")).toBe("01");
|
|
|
|
|
+ expect(extractBranchNumberInputFromBranchId("nl200")).toBe("200");
|
|
|
|
|
+ expect(extractBranchNumberInputFromBranchId("XX1")).toBe("");
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("validates branchId format", () => {
|
|
|
|
|
+ expect(isValidBranchIdFormat("NL01")).toBe(true);
|
|
|
|
|
+ expect(isValidBranchIdFormat("nl200")).toBe(true);
|
|
|
|
|
+ expect(isValidBranchIdFormat("XX1")).toBe(false);
|
|
|
|
|
+ expect(isValidBranchIdFormat("NL")).toBe(false);
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ describe("branch existence decision", () => {
|
|
|
|
|
+ it("blocks submit for unknown branch only when list is ready", () => {
|
|
|
|
|
+ expect(
|
|
|
|
|
+ evaluateBranchExistence({
|
|
|
|
|
+ role: "branch",
|
|
|
|
|
+ branchId: "NL99",
|
|
|
|
|
+ branchesStatus: "ready",
|
|
|
|
|
+ availableBranchIds: ["NL01", "NL02"],
|
|
|
|
|
+ }).shouldBlockSubmit,
|
|
|
|
|
+ ).toBe(true);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("allows submit when branch exists in ready list", () => {
|
|
|
|
|
+ expect(
|
|
|
|
|
+ evaluateBranchExistence({
|
|
|
|
|
+ role: "branch",
|
|
|
|
|
+ branchId: "NL02",
|
|
|
|
|
+ branchesStatus: "ready",
|
|
|
|
|
+ availableBranchIds: ["NL01", "NL02"],
|
|
|
|
|
+ }).shouldBlockSubmit,
|
|
|
|
|
+ ).toBe(false);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("is fail-open when list fetch failed", () => {
|
|
|
|
|
+ const result = evaluateBranchExistence({
|
|
|
|
|
+ role: "branch",
|
|
|
|
|
+ branchId: "NL99",
|
|
|
|
|
+ branchesStatus: "error",
|
|
|
|
|
+ availableBranchIds: null,
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ expect(result.listError).toBe(true);
|
|
|
|
|
+ expect(result.shouldBlockSubmit).toBe(false);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("is irrelevant for non-branch roles", () => {
|
|
|
|
|
+ const result = evaluateBranchExistence({
|
|
|
|
|
+ role: "admin",
|
|
|
|
|
+ branchId: "NL99",
|
|
|
|
|
+ branchesStatus: "ready",
|
|
|
|
|
+ availableBranchIds: ["NL01"],
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ expect(result.isBranchRole).toBe(false);
|
|
|
|
|
+ expect(result.shouldBlockSubmit).toBe(false);
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+});
|