|
|
@@ -0,0 +1,110 @@
|
|
|
+/* @vitest-environment node */
|
|
|
+
|
|
|
+import { describe, it, expect } from "vitest";
|
|
|
+import {
|
|
|
+ ADMIN_USERS_SORT,
|
|
|
+ normalizeAdminUsersSortMode,
|
|
|
+ sortAdminUsers,
|
|
|
+} from "./usersSorting.js";
|
|
|
+
|
|
|
+function mapRows(rows) {
|
|
|
+ return rows.map((x) => ({
|
|
|
+ id: x.id,
|
|
|
+ role: x.role,
|
|
|
+ branchId: x.branchId,
|
|
|
+ username: x.username,
|
|
|
+ }));
|
|
|
+}
|
|
|
+
|
|
|
+describe("lib/frontend/admin/users/usersSorting", () => {
|
|
|
+ it("normalizes known sort modes and rejects invalid values", () => {
|
|
|
+ expect(normalizeAdminUsersSortMode(undefined)).toBe(
|
|
|
+ ADMIN_USERS_SORT.DEFAULT,
|
|
|
+ );
|
|
|
+ expect(normalizeAdminUsersSortMode("")).toBe(ADMIN_USERS_SORT.DEFAULT);
|
|
|
+ expect(normalizeAdminUsersSortMode(ADMIN_USERS_SORT.ROLE_RIGHTS)).toBe(
|
|
|
+ ADMIN_USERS_SORT.ROLE_RIGHTS,
|
|
|
+ );
|
|
|
+ expect(normalizeAdminUsersSortMode("nope")).toBe(null);
|
|
|
+ });
|
|
|
+
|
|
|
+ it("sorts by role rights with deterministic tie-breakers", () => {
|
|
|
+ const items = [
|
|
|
+ {
|
|
|
+ id: "6",
|
|
|
+ role: "admin",
|
|
|
+ branchId: null,
|
|
|
+ username: "z-admin",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: "1",
|
|
|
+ role: "branch",
|
|
|
+ branchId: "NL10",
|
|
|
+ username: "branch-z",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: "2",
|
|
|
+ role: "branch",
|
|
|
+ branchId: "NL2",
|
|
|
+ username: "branch-a",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: "3",
|
|
|
+ role: "dev",
|
|
|
+ branchId: null,
|
|
|
+ username: "dev",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: "4",
|
|
|
+ role: "superadmin",
|
|
|
+ branchId: null,
|
|
|
+ username: "root",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: "5",
|
|
|
+ role: "admin",
|
|
|
+ branchId: null,
|
|
|
+ username: "a-admin",
|
|
|
+ },
|
|
|
+ ];
|
|
|
+
|
|
|
+ const out = sortAdminUsers(items, ADMIN_USERS_SORT.ROLE_RIGHTS);
|
|
|
+
|
|
|
+ expect(mapRows(out)).toEqual([
|
|
|
+ { id: "4", role: "superadmin", branchId: null, username: "root" },
|
|
|
+ { id: "3", role: "dev", branchId: null, username: "dev" },
|
|
|
+ { id: "5", role: "admin", branchId: null, username: "a-admin" },
|
|
|
+ { id: "6", role: "admin", branchId: null, username: "z-admin" },
|
|
|
+ { id: "2", role: "branch", branchId: "NL2", username: "branch-a" },
|
|
|
+ { id: "1", role: "branch", branchId: "NL10", username: "branch-z" },
|
|
|
+ ]);
|
|
|
+ });
|
|
|
+
|
|
|
+ it("sorts by branch asc (numeric) with null branch at the end", () => {
|
|
|
+ const items = [
|
|
|
+ { id: "1", role: "branch", branchId: "NL10", username: "b1" },
|
|
|
+ { id: "2", role: "branch", branchId: "NL2", username: "b2" },
|
|
|
+ { id: "3", role: "admin", branchId: null, username: "admin" },
|
|
|
+ { id: "4", role: "superadmin", branchId: null, username: "super" },
|
|
|
+ { id: "5", role: "branch", branchId: "NL01", username: "b0" },
|
|
|
+ ];
|
|
|
+
|
|
|
+ const out = sortAdminUsers(items, ADMIN_USERS_SORT.BRANCH_ASC);
|
|
|
+
|
|
|
+ expect(mapRows(out)).toEqual([
|
|
|
+ { id: "5", role: "branch", branchId: "NL01", username: "b0" },
|
|
|
+ { id: "2", role: "branch", branchId: "NL2", username: "b2" },
|
|
|
+ { id: "1", role: "branch", branchId: "NL10", username: "b1" },
|
|
|
+ { id: "4", role: "superadmin", branchId: null, username: "super" },
|
|
|
+ { id: "3", role: "admin", branchId: null, username: "admin" },
|
|
|
+ ]);
|
|
|
+ });
|
|
|
+
|
|
|
+ it("returns a shallow copy for default mode", () => {
|
|
|
+ const items = [{ id: "1" }, { id: "2" }];
|
|
|
+ const out = sortAdminUsers(items, ADMIN_USERS_SORT.DEFAULT);
|
|
|
+ expect(out).toEqual(items);
|
|
|
+ expect(out).not.toBe(items);
|
|
|
+ });
|
|
|
+});
|
|
|
+
|