Files
Benny JooGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
96bec9f7b9 refactor: Move repositories from @calcom/lib to @calcom/features domain folders (#27570)
* refactor: move repositories from lib to features domain folders

- Move HolidayRepository to features/holidays/repositories
- Move PrismaTrackingRepository to features/bookings/repositories
- Move PrismaBookingPaymentRepository to features/bookings/repositories
- Move PrismaRoutingFormResponseRepository to features/routing-forms/repositories
- Move PrismaAssignmentReasonRepository to features/assignment-reason/repositories
- Move VerificationTokenRepository to features/auth/repositories
- Move WorkspacePlatformRepository to features/workspace-platform/repositories
- Move DTO files to their respective feature domains
- Merge lib DestinationCalendarRepository into features version
- Merge lib SelectedCalendarRepository into features version
- Update all import paths across the codebase

This follows the vertical slice architecture pattern by organizing
repositories by domain rather than by technical layer.

Co-Authored-By: [email protected] <[email protected]>

* fix: update VerificationTokenService import path to new location

Co-Authored-By: [email protected] <[email protected]>

* fix: update test file imports to use new repository locations

Co-Authored-By: [email protected] <[email protected]>

* mv

* fix structure

* fix

* refactor: merge unit tests for SelectedCalendarRepository into single file

Co-Authored-By: [email protected] <[email protected]>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-02-09 08:41:04 -03:00

164 lines
4.3 KiB
TypeScript

import { describe, test, expect, vi, beforeEach } from "vitest";
import type { VerificationToken } from "@calcom/prisma/client";
import { VerificationTokenRepository } from "./VerificationTokenRepository";
vi.mock("@calcom/prisma", () => ({
default: {
verificationToken: {
create: vi.fn(),
findFirst: vi.fn(),
update: vi.fn(),
},
},
}));
const prismaMock = vi.hoisted(() => ({
verificationToken: {
create: vi.fn(),
findFirst: vi.fn(),
update: vi.fn(),
},
}));
vi.mock("@calcom/prisma", () => ({
default: prismaMock,
}));
describe("VerificationTokenRepository", () => {
beforeEach(() => {
vi.clearAllMocks();
});
describe("create", () => {
test("should create a verification token", async () => {
const identifier = "[email protected]";
const token = "hashed-token-value";
const expires = new Date(Date.now() + 86400 * 1000);
const mockVerificationToken: VerificationToken = {
identifier,
token,
expires,
};
prismaMock.verificationToken.create.mockResolvedValue(mockVerificationToken);
const result = await VerificationTokenRepository.create({
identifier,
token,
expires,
});
expect(prismaMock.verificationToken.create).toHaveBeenCalledWith({
data: {
identifier,
token,
expires,
},
});
expect(result).toEqual(mockVerificationToken);
});
test("should create a verification token with correct data types", async () => {
const identifier = "[email protected]";
const token = "sha256-hashed-token";
const expires = new Date("2025-12-31T23:59:59.000Z");
const mockVerificationToken: VerificationToken = {
identifier,
token,
expires,
};
prismaMock.verificationToken.create.mockResolvedValue(mockVerificationToken);
await VerificationTokenRepository.create({
identifier,
token,
expires,
});
expect(prismaMock.verificationToken.create).toHaveBeenCalledWith({
data: {
identifier,
token,
expires,
},
});
});
});
describe("updateTeamInviteTokenExpirationDate", () => {
test("should update team invite token expiration date", async () => {
const email = "[email protected]";
const teamId = 123;
const expiresInDays = 7;
const existingToken: VerificationToken = {
identifier: email,
token: "existing-token",
expires: new Date(),
};
prismaMock.verificationToken.findFirst.mockResolvedValue(existingToken);
prismaMock.verificationToken.update.mockResolvedValue({
...existingToken,
expires: new Date(Date.now() + expiresInDays * 24 * 60 * 60 * 1000),
});
const result = await VerificationTokenRepository.updateTeamInviteTokenExpirationDate({
email,
teamId,
expiresInDays,
});
expect(prismaMock.verificationToken.findFirst).toHaveBeenCalledWith({
where: {
identifier: email,
teamId,
},
});
expect(prismaMock.verificationToken.update).toHaveBeenCalledWith({
where: {
identifier: email,
teamId,
token: existingToken.token,
},
data: { expires: expect.any(Date) },
});
expect(result.token).toBe(existingToken.token);
expect(result.expires).toBeInstanceOf(Date);
});
test("should calculate correct expiration date", async () => {
const email = "[email protected]";
const teamId = 456;
const expiresInDays = 3;
const existingToken: VerificationToken = {
identifier: email,
token: "token-123",
expires: new Date(),
};
prismaMock.verificationToken.findFirst.mockResolvedValue(existingToken);
const expectedExpires = new Date(Date.now() + expiresInDays * 24 * 60 * 60 * 1000);
prismaMock.verificationToken.update.mockImplementation(({ data }) => {
expect(data.expires.getTime()).toBeCloseTo(expectedExpires.getTime(), -2);
return Promise.resolve({ ...existingToken, expires: data.expires });
});
await VerificationTokenRepository.updateTeamInviteTokenExpirationDate({
email,
teamId,
expiresInDays,
});
});
});
});