2024-06-08 20:49:57 +02:00
|
|
|
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
2024-10-07 21:13:15 +02:00
|
|
|
import type { AdapterUser } from "@auth/core/adapters";
|
2024-02-10 19:00:08 +01:00
|
|
|
import type { JWT } from "next-auth/jwt";
|
2024-09-26 19:02:45 +02:00
|
|
|
import { describe, expect, test, vi } from "vitest";
|
2024-02-10 19:00:08 +01:00
|
|
|
|
2024-12-19 16:10:22 +01:00
|
|
|
import { groupMembers, groupPermissions, groups, users } from "@homarr/db/schema";
|
2024-05-04 18:34:41 +02:00
|
|
|
import { createDb } from "@homarr/db/test";
|
|
|
|
|
import * as definitions from "@homarr/definitions";
|
|
|
|
|
|
2024-10-07 21:13:15 +02:00
|
|
|
import { createSessionCallback, getCurrentUserPermissionsAsync } from "../callbacks";
|
2024-05-04 18:34:41 +02:00
|
|
|
|
2024-10-05 17:03:32 +02:00
|
|
|
// This one is placed here because it's used in multiple tests and needs to be the same reference
|
|
|
|
|
const setCookies = vi.fn();
|
|
|
|
|
vi.mock("next/headers", () => ({
|
|
|
|
|
cookies: () => ({
|
|
|
|
|
set: setCookies,
|
|
|
|
|
}),
|
|
|
|
|
}));
|
|
|
|
|
|
2024-05-04 18:34:41 +02:00
|
|
|
describe("getCurrentUserPermissions", () => {
|
|
|
|
|
test("should return empty permissions when non existing user requested", async () => {
|
2024-09-26 19:02:45 +02:00
|
|
|
// Arrange
|
2024-05-04 18:34:41 +02:00
|
|
|
const db = createDb();
|
|
|
|
|
|
2024-07-08 17:39:36 +02:00
|
|
|
await db.insert(groups).values({
|
|
|
|
|
id: "2",
|
|
|
|
|
name: "test",
|
2025-02-15 10:08:06 +01:00
|
|
|
position: 1,
|
2024-07-08 17:39:36 +02:00
|
|
|
});
|
|
|
|
|
await db.insert(groupPermissions).values({
|
|
|
|
|
groupId: "2",
|
|
|
|
|
permission: "admin",
|
|
|
|
|
});
|
2024-05-04 18:34:41 +02:00
|
|
|
await db.insert(users).values({
|
|
|
|
|
id: "2",
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const userId = "1";
|
2024-09-26 19:02:45 +02:00
|
|
|
|
|
|
|
|
// Act
|
2024-05-18 12:25:33 +02:00
|
|
|
const result = await getCurrentUserPermissionsAsync(db, userId);
|
2024-09-26 19:02:45 +02:00
|
|
|
|
|
|
|
|
// Assert
|
2024-05-04 18:34:41 +02:00
|
|
|
expect(result).toEqual([]);
|
|
|
|
|
});
|
2024-07-08 17:39:36 +02:00
|
|
|
|
|
|
|
|
test("should return empty permissions when user has no groups", async () => {
|
2024-09-26 19:02:45 +02:00
|
|
|
// Arrange
|
2024-07-08 17:39:36 +02:00
|
|
|
const db = createDb();
|
|
|
|
|
const userId = "1";
|
|
|
|
|
|
|
|
|
|
await db.insert(groups).values({
|
|
|
|
|
id: "2",
|
|
|
|
|
name: "test",
|
2025-02-15 10:08:06 +01:00
|
|
|
position: 1,
|
2024-07-08 17:39:36 +02:00
|
|
|
});
|
|
|
|
|
await db.insert(groupPermissions).values({
|
|
|
|
|
groupId: "2",
|
|
|
|
|
permission: "admin",
|
|
|
|
|
});
|
|
|
|
|
await db.insert(users).values({
|
|
|
|
|
id: userId,
|
|
|
|
|
});
|
|
|
|
|
|
2024-09-26 19:02:45 +02:00
|
|
|
// Act
|
2024-07-08 17:39:36 +02:00
|
|
|
const result = await getCurrentUserPermissionsAsync(db, userId);
|
2024-09-26 19:02:45 +02:00
|
|
|
|
|
|
|
|
// Assert
|
2024-07-08 17:39:36 +02:00
|
|
|
expect(result).toEqual([]);
|
|
|
|
|
});
|
|
|
|
|
|
2024-05-04 18:34:41 +02:00
|
|
|
test("should return permissions for user", async () => {
|
2024-09-26 19:02:45 +02:00
|
|
|
// Arrange
|
2024-05-04 18:34:41 +02:00
|
|
|
const db = createDb();
|
|
|
|
|
const getPermissionsWithChildrenMock = vi
|
|
|
|
|
.spyOn(definitions, "getPermissionsWithChildren")
|
|
|
|
|
.mockReturnValue(["board-create"]);
|
|
|
|
|
const mockId = "1";
|
|
|
|
|
|
|
|
|
|
await db.insert(users).values({
|
|
|
|
|
id: mockId,
|
|
|
|
|
});
|
|
|
|
|
await db.insert(groups).values({
|
|
|
|
|
id: mockId,
|
|
|
|
|
name: "test",
|
2025-02-15 10:08:06 +01:00
|
|
|
position: 1,
|
2024-05-04 18:34:41 +02:00
|
|
|
});
|
|
|
|
|
await db.insert(groupMembers).values({
|
|
|
|
|
userId: mockId,
|
|
|
|
|
groupId: mockId,
|
|
|
|
|
});
|
|
|
|
|
await db.insert(groupPermissions).values({
|
|
|
|
|
groupId: mockId,
|
|
|
|
|
permission: "admin",
|
|
|
|
|
});
|
|
|
|
|
|
2024-09-26 19:02:45 +02:00
|
|
|
// Act
|
2024-05-18 12:25:33 +02:00
|
|
|
const result = await getCurrentUserPermissionsAsync(db, mockId);
|
2024-09-26 19:02:45 +02:00
|
|
|
|
|
|
|
|
// Assert
|
2024-05-04 18:34:41 +02:00
|
|
|
expect(result).toEqual(["board-create"]);
|
|
|
|
|
expect(getPermissionsWithChildrenMock).toHaveBeenCalledWith(["admin"]);
|
|
|
|
|
});
|
|
|
|
|
});
|
2024-02-10 19:00:08 +01:00
|
|
|
|
|
|
|
|
describe("session callback", () => {
|
2024-09-26 19:02:45 +02:00
|
|
|
test("should add id and name to session user", async () => {
|
|
|
|
|
// Arrange
|
2024-02-10 19:00:08 +01:00
|
|
|
const user: AdapterUser = {
|
|
|
|
|
id: "id",
|
|
|
|
|
name: "name",
|
|
|
|
|
email: "email",
|
|
|
|
|
emailVerified: new Date("2023-01-13"),
|
|
|
|
|
};
|
|
|
|
|
const token: JWT = {};
|
2024-05-04 18:34:41 +02:00
|
|
|
const db = createDb();
|
|
|
|
|
const callback = createSessionCallback(db);
|
2024-09-26 19:02:45 +02:00
|
|
|
|
|
|
|
|
// Act
|
2024-05-04 18:34:41 +02:00
|
|
|
const result = await callback({
|
2024-02-10 19:00:08 +01:00
|
|
|
session: {
|
|
|
|
|
user: {
|
|
|
|
|
id: "no-id",
|
|
|
|
|
email: "no-email",
|
|
|
|
|
emailVerified: new Date("2023-01-13"),
|
2024-05-04 18:34:41 +02:00
|
|
|
permissions: [],
|
2024-09-01 20:37:52 +02:00
|
|
|
colorScheme: "dark",
|
2024-02-10 19:00:08 +01:00
|
|
|
},
|
|
|
|
|
expires: "2023-01-13" as Date & string,
|
|
|
|
|
sessionToken: "token",
|
|
|
|
|
userId: "no-id",
|
|
|
|
|
},
|
|
|
|
|
user,
|
|
|
|
|
token,
|
|
|
|
|
trigger: "update",
|
|
|
|
|
newSession: {},
|
|
|
|
|
});
|
2024-09-26 19:02:45 +02:00
|
|
|
|
|
|
|
|
// Assert
|
2024-02-10 19:00:08 +01:00
|
|
|
expect(result.user).toBeDefined();
|
|
|
|
|
expect(result.user!.id).toEqual(user.id);
|
|
|
|
|
expect(result.user!.name).toEqual(user.name);
|
|
|
|
|
});
|
|
|
|
|
});
|