* chore(deps): update dependency eslint to v9 * chore: migrate eslint to v9 * fix: dependency issues * fix: unit tests not working * chore: disable lint check for Image component that does not work in ci * fix: lint issue --------- Co-authored-by: homarr-renovate[bot] <158783068+homarr-renovate[bot]@users.noreply.github.com> Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
193 lines
5.1 KiB
TypeScript
193 lines
5.1 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
import { describe, expect, test, vi } from "vitest";
|
|
|
|
import type { Session } from "@homarr/auth";
|
|
import { createId } from "@homarr/db";
|
|
import { invites, users } from "@homarr/db/schema/sqlite";
|
|
import { createDb } from "@homarr/db/test";
|
|
|
|
import { inviteRouter } from "../invite";
|
|
|
|
const defaultSession = {
|
|
user: {
|
|
id: createId(),
|
|
permissions: [],
|
|
},
|
|
expires: new Date().toISOString(),
|
|
} satisfies Session;
|
|
|
|
// Mock the auth module to return an empty session
|
|
vi.mock("@homarr/auth", async () => {
|
|
const mod = await import("@homarr/auth/security");
|
|
return { ...mod, auth: () => ({}) as Session };
|
|
});
|
|
|
|
describe("all should return all existing invites without sensitive informations", () => {
|
|
test("invites should not contain sensitive informations", async () => {
|
|
// Arrange
|
|
const db = createDb();
|
|
const caller = inviteRouter.createCaller({
|
|
db,
|
|
session: defaultSession,
|
|
});
|
|
|
|
const userId = createId();
|
|
await db.insert(users).values({
|
|
id: userId,
|
|
name: "someone",
|
|
});
|
|
|
|
const inviteId = createId();
|
|
await db.insert(invites).values({
|
|
id: inviteId,
|
|
creatorId: userId,
|
|
expirationDate: new Date(2022, 5, 1),
|
|
token: "token",
|
|
});
|
|
|
|
// Act
|
|
const result = await caller.getAll();
|
|
|
|
// Assert
|
|
expect(result.length).toBe(1);
|
|
expect(result[0]?.id).toBe(inviteId);
|
|
expect(result[0]?.expirationDate).toEqual(new Date(2022, 5, 1));
|
|
expect(result[0]?.creator.id).toBe(userId);
|
|
expect(result[0]?.creator.name).toBe("someone");
|
|
expect("token" in result[0]!).toBe(false);
|
|
});
|
|
|
|
test("invites should be sorted ascending by expiration date", async () => {
|
|
// Arrange
|
|
const db = createDb();
|
|
const caller = inviteRouter.createCaller({
|
|
db,
|
|
session: defaultSession,
|
|
});
|
|
|
|
const userId = createId();
|
|
await db.insert(users).values({
|
|
id: userId,
|
|
name: "someone",
|
|
});
|
|
|
|
const inviteId = createId();
|
|
await db.insert(invites).values({
|
|
id: inviteId,
|
|
creatorId: userId,
|
|
expirationDate: new Date(2022, 5, 1),
|
|
token: "token",
|
|
});
|
|
await db.insert(invites).values({
|
|
id: createId(),
|
|
creatorId: userId,
|
|
expirationDate: new Date(2022, 5, 2),
|
|
token: "token2",
|
|
});
|
|
|
|
// Act
|
|
const result = await caller.getAll();
|
|
|
|
// Assert
|
|
expect(result.length).toBe(2);
|
|
expect(result[0]?.expirationDate.getDate()).toBe(1);
|
|
expect(result[1]?.expirationDate.getDate()).toBe(2);
|
|
});
|
|
});
|
|
|
|
describe("create should create a new invite expiring on the specified date with a token and id returned to generate url", () => {
|
|
test("creation should work with a date in the future, but less than 6 months.", async () => {
|
|
// Arrange
|
|
const db = createDb();
|
|
const caller = inviteRouter.createCaller({
|
|
db,
|
|
session: defaultSession,
|
|
});
|
|
await db.insert(users).values({
|
|
id: defaultSession.user.id,
|
|
});
|
|
const expirationDate = new Date(2024, 5, 1); // TODO: add mock date
|
|
|
|
// Act
|
|
const result = await caller.createInvite({
|
|
expirationDate,
|
|
});
|
|
|
|
// Assert
|
|
expect(result.id.length).toBeGreaterThan(10);
|
|
expect(result.token.length).toBeGreaterThan(20);
|
|
|
|
const createdInvite = await db.query.invites.findFirst();
|
|
expect(createdInvite).toBeDefined();
|
|
expect(createdInvite?.id).toBe(result.id);
|
|
expect(createdInvite?.token).toBe(result.token);
|
|
expect(createdInvite?.expirationDate).toEqual(expirationDate);
|
|
expect(createdInvite?.creatorId).toBe(defaultSession.user.id);
|
|
});
|
|
});
|
|
|
|
describe("delete should remove invite by id", () => {
|
|
test("deletion should remove present invite", async () => {
|
|
// Arrange
|
|
const db = createDb();
|
|
const caller = inviteRouter.createCaller({
|
|
db,
|
|
session: defaultSession,
|
|
});
|
|
|
|
const userId = createId();
|
|
await db.insert(users).values({
|
|
id: userId,
|
|
});
|
|
const inviteId = createId();
|
|
await db.insert(invites).values([
|
|
{
|
|
id: createId(),
|
|
creatorId: userId,
|
|
expirationDate: new Date(2023, 1, 1),
|
|
token: "first-token",
|
|
},
|
|
{
|
|
id: inviteId,
|
|
creatorId: userId,
|
|
expirationDate: new Date(2023, 1, 1),
|
|
token: "second-token",
|
|
},
|
|
]);
|
|
|
|
// Act
|
|
await caller.deleteInvite({ id: inviteId });
|
|
|
|
// Assert
|
|
const dbInvites = await db.query.invites.findMany();
|
|
expect(dbInvites.length).toBe(1);
|
|
expect(dbInvites[0]?.id).not.toBe(inviteId);
|
|
});
|
|
|
|
test("deletion should throw with NOT_FOUND code when specified invite not present", async () => {
|
|
// Arrange
|
|
const db = createDb();
|
|
const caller = inviteRouter.createCaller({
|
|
db,
|
|
session: defaultSession,
|
|
});
|
|
|
|
const userId = createId();
|
|
await db.insert(users).values({
|
|
id: userId,
|
|
});
|
|
await db.insert(invites).values({
|
|
id: createId(),
|
|
creatorId: userId,
|
|
expirationDate: new Date(2023, 1, 1),
|
|
token: "first-token",
|
|
});
|
|
|
|
// Act
|
|
const actAsync = async () => await caller.deleteInvite({ id: createId() });
|
|
|
|
// Assert
|
|
await expect(actAsync()).rejects.toThrow("not found");
|
|
});
|
|
});
|