Files
calendar/packages/lib/server/service/teamService.test.ts
T
Eunjae LeeGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
97bde083ca refactor: rename team service files to follow camelCase convention (#22671)
- Rename team.ts to teamService.ts
- Rename TeamService.test.ts to teamService.test.ts
- Rename TeamService.alternative.test.ts to teamService.alternative.test.ts
- Update all import statements across codebase to reference new file names

This change improves consistency with the codebase naming conventions while maintaining all existing functionality.

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2025-07-22 12:25:16 +00:00

109 lines
3.5 KiB
TypeScript

import prismaMock from "../../../../tests/libs/__mocks__/prismaMock";
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { TeamBilling } from "@calcom/features/ee/billing/teams";
import { deleteDomain } from "@calcom/lib/domainManager/organization";
import { TeamRepository } from "@calcom/lib/server/repository/team";
import { WorkflowService } from "@calcom/lib/server/service/workflows";
import { MembershipRole } from "@calcom/prisma/enums";
import { TRPCError } from "@trpc/server";
import { TeamService } from "./teamService";
vi.mock("@calcom/features/ee/billing/teams");
vi.mock("@calcom/lib/server/repository/team");
vi.mock("@calcom/lib/server/service/workflows");
vi.mock("@calcom/lib/domainManager/organization");
vi.mock("@calcom/features/ee/teams/lib/removeMember");
const mockTeamBilling = {
cancel: vi.fn(),
updateQuantity: vi.fn(),
publish: vi.fn(),
downgrade: vi.fn(),
};
vi.mocked(TeamBilling.findAndInit).mockResolvedValue(mockTeamBilling);
describe("TeamService", () => {
beforeEach(() => {
vi.resetAllMocks();
vi.mocked(TeamBilling.findAndInit).mockResolvedValue(mockTeamBilling);
});
afterEach(() => {
vi.clearAllMocks();
});
describe("delete", () => {
it("should delete team, cancel billing, and clean up", async () => {
const mockDeletedTeam = {
id: 1,
name: "Deleted Team",
isOrganization: true,
slug: "deleted-team",
};
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const mockTeamRepo = {
deleteById: vi.fn().mockResolvedValue(mockDeletedTeam),
};
vi.mocked(TeamRepository).mockImplementation(() => mockTeamRepo as any);
const result = await TeamService.delete({ id: 1 });
expect(TeamBilling.findAndInit).toHaveBeenCalledWith(1);
expect(mockTeamBilling.cancel).toHaveBeenCalled();
expect(WorkflowService.deleteWorkflowRemindersOfRemovedTeam).toHaveBeenCalledWith(1);
expect(mockTeamRepo.deleteById).toHaveBeenCalledWith({ id: 1 });
expect(deleteDomain).toHaveBeenCalledWith("deleted-team");
expect(result).toEqual(mockDeletedTeam);
});
});
describe("inviteMemberByToken", () => {
it("should throw error if verification token is not found", async () => {
prismaMock.verificationToken.findFirst.mockResolvedValue(null);
await expect(TeamService.inviteMemberByToken("invalid-token", 1)).rejects.toThrow(TRPCError);
});
it("should create membership and update billing", async () => {
const mockToken = {
teamId: 1,
team: { name: "Test Team" },
expiresInDays: null,
expires: new Date(Date.now() + 86400000),
token: "valid-token",
identifier: "valid-token",
id: "1",
};
prismaMock.verificationToken.findFirst.mockResolvedValue(mockToken);
const result = await TeamService.inviteMemberByToken("valid-token", 1);
expect(prismaMock.membership.create).toHaveBeenCalledWith({
data: {
accepted: false,
createdAt: expect.any(Date),
role: MembershipRole.MEMBER,
teamId: 1,
userId: 1,
},
});
expect(mockTeamBilling.updateQuantity).toHaveBeenCalled();
expect(result).toBe("Test Team");
});
});
describe("publish", () => {
it("should call publish on TeamBilling", async () => {
await TeamService.publish(1);
expect(TeamBilling.findAndInit).toHaveBeenCalledWith(1);
expect(mockTeamBilling.publish).toHaveBeenCalled();
});
});
});