2023-05-15 20:30:53 +03:00
|
|
|
import { BadRequestException } from '@nestjs/common';
|
2025-02-11 14:08:13 -05:00
|
|
|
import { PartnerDirection } from 'src/repositories/partner.repository';
|
2024-03-21 00:07:30 +01:00
|
|
|
import { PartnerService } from 'src/services/partner.service';
|
2025-03-11 16:29:56 -04:00
|
|
|
import { factory } from 'test/small.factory';
|
2025-02-10 18:47:42 -05:00
|
|
|
import { newTestService, ServiceMocks } from 'test/utils';
|
2023-05-15 20:30:53 +03:00
|
|
|
|
|
|
|
|
describe(PartnerService.name, () => {
|
|
|
|
|
let sut: PartnerService;
|
2025-02-10 18:47:42 -05:00
|
|
|
let mocks: ServiceMocks;
|
2023-05-15 20:30:53 +03:00
|
|
|
|
2024-03-05 23:23:06 +01:00
|
|
|
beforeEach(() => {
|
2025-02-10 18:47:42 -05:00
|
|
|
({ sut, mocks } = newTestService(PartnerService));
|
2023-05-15 20:30:53 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('should work', () => {
|
|
|
|
|
expect(sut).toBeDefined();
|
|
|
|
|
});
|
|
|
|
|
|
2024-07-08 16:41:39 -04:00
|
|
|
describe('search', () => {
|
2023-05-15 20:30:53 +03:00
|
|
|
it("should return a list of partners with whom I've shared my library", async () => {
|
2025-03-11 16:29:56 -04:00
|
|
|
const user1 = factory.user();
|
|
|
|
|
const user2 = factory.user();
|
|
|
|
|
const sharedWithUser2 = factory.partner({ sharedBy: user1, sharedWith: user2 });
|
|
|
|
|
const sharedWithUser1 = factory.partner({ sharedBy: user2, sharedWith: user1 });
|
2025-04-11 11:53:37 -04:00
|
|
|
const auth = factory.auth({ user: { id: user1.id } });
|
2025-03-11 16:29:56 -04:00
|
|
|
|
|
|
|
|
mocks.partner.getAll.mockResolvedValue([sharedWithUser1, sharedWithUser2]);
|
|
|
|
|
|
|
|
|
|
await expect(sut.search(auth, { direction: PartnerDirection.SharedBy })).resolves.toBeDefined();
|
|
|
|
|
expect(mocks.partner.getAll).toHaveBeenCalledWith(user1.id);
|
2023-05-15 20:30:53 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('should return a list of partners who have shared their libraries with me', async () => {
|
2025-03-11 16:29:56 -04:00
|
|
|
const user1 = factory.user();
|
|
|
|
|
const user2 = factory.user();
|
|
|
|
|
const sharedWithUser2 = factory.partner({ sharedBy: user1, sharedWith: user2 });
|
|
|
|
|
const sharedWithUser1 = factory.partner({ sharedBy: user2, sharedWith: user1 });
|
2025-04-11 11:53:37 -04:00
|
|
|
const auth = factory.auth({ user: { id: user1.id } });
|
2025-03-11 16:29:56 -04:00
|
|
|
|
|
|
|
|
mocks.partner.getAll.mockResolvedValue([sharedWithUser1, sharedWithUser2]);
|
|
|
|
|
await expect(sut.search(auth, { direction: PartnerDirection.SharedWith })).resolves.toBeDefined();
|
|
|
|
|
expect(mocks.partner.getAll).toHaveBeenCalledWith(user1.id);
|
2023-05-15 20:30:53 +03:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
describe('create', () => {
|
|
|
|
|
it('should create a new partner', async () => {
|
2025-03-11 16:29:56 -04:00
|
|
|
const user1 = factory.user();
|
|
|
|
|
const user2 = factory.user();
|
|
|
|
|
const partner = factory.partner({ sharedBy: user1, sharedWith: user2 });
|
2025-04-11 11:53:37 -04:00
|
|
|
const auth = factory.auth({ user: { id: user1.id } });
|
2025-03-11 16:29:56 -04:00
|
|
|
|
2025-02-10 18:47:42 -05:00
|
|
|
mocks.partner.get.mockResolvedValue(void 0);
|
2025-03-11 16:29:56 -04:00
|
|
|
mocks.partner.create.mockResolvedValue(partner);
|
2023-05-15 20:30:53 +03:00
|
|
|
|
2025-09-05 17:59:11 -04:00
|
|
|
await expect(sut.create(auth, { sharedWithId: user2.id })).resolves.toBeDefined();
|
2023-05-15 20:30:53 +03:00
|
|
|
|
2025-02-10 18:47:42 -05:00
|
|
|
expect(mocks.partner.create).toHaveBeenCalledWith({
|
2025-03-11 16:29:56 -04:00
|
|
|
sharedById: partner.sharedById,
|
|
|
|
|
sharedWithId: partner.sharedWithId,
|
2023-05-15 20:30:53 +03:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2025-10-14 11:43:53 +02:00
|
|
|
it('should create a new partner with startDate', async () => {
|
|
|
|
|
const user1 = factory.user();
|
|
|
|
|
const user2 = factory.user();
|
|
|
|
|
const startDate = new Date('2024-01-01T00:00:00.000Z');
|
|
|
|
|
const partner = factory.partner({ sharedBy: user1, sharedWith: user2, startDate });
|
|
|
|
|
const auth = factory.auth({ user: { id: user1.id } });
|
|
|
|
|
|
|
|
|
|
mocks.partner.get.mockResolvedValue(void 0);
|
|
|
|
|
mocks.partner.create.mockResolvedValue(partner);
|
|
|
|
|
|
|
|
|
|
await expect(sut.create(auth, { sharedWithId: user2.id, startDate })).resolves.toBeDefined();
|
|
|
|
|
|
|
|
|
|
expect(mocks.partner.create).toHaveBeenCalledWith({
|
|
|
|
|
sharedById: partner.sharedById,
|
|
|
|
|
sharedWithId: partner.sharedWithId,
|
|
|
|
|
startDate,
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2023-05-15 20:30:53 +03:00
|
|
|
it('should throw an error when the partner already exists', async () => {
|
2025-03-11 16:29:56 -04:00
|
|
|
const user1 = factory.user();
|
|
|
|
|
const user2 = factory.user();
|
|
|
|
|
const partner = factory.partner({ sharedBy: user1, sharedWith: user2 });
|
2025-04-11 11:53:37 -04:00
|
|
|
const auth = factory.auth({ user: { id: user1.id } });
|
2023-05-15 20:30:53 +03:00
|
|
|
|
2025-03-11 16:29:56 -04:00
|
|
|
mocks.partner.get.mockResolvedValue(partner);
|
|
|
|
|
|
2025-09-05 17:59:11 -04:00
|
|
|
await expect(sut.create(auth, { sharedWithId: user2.id })).rejects.toBeInstanceOf(BadRequestException);
|
2023-05-15 20:30:53 +03:00
|
|
|
|
2025-02-10 18:47:42 -05:00
|
|
|
expect(mocks.partner.create).not.toHaveBeenCalled();
|
2023-05-15 20:30:53 +03:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
describe('remove', () => {
|
|
|
|
|
it('should remove a partner', async () => {
|
2025-03-11 16:29:56 -04:00
|
|
|
const user1 = factory.user();
|
|
|
|
|
const user2 = factory.user();
|
|
|
|
|
const partner = factory.partner({ sharedBy: user1, sharedWith: user2 });
|
2025-04-11 11:53:37 -04:00
|
|
|
const auth = factory.auth({ user: { id: user1.id } });
|
2025-03-11 16:29:56 -04:00
|
|
|
|
|
|
|
|
mocks.partner.get.mockResolvedValue(partner);
|
2023-05-15 20:30:53 +03:00
|
|
|
|
2025-03-11 16:29:56 -04:00
|
|
|
await sut.remove(auth, user2.id);
|
2023-05-15 20:30:53 +03:00
|
|
|
|
2025-03-11 16:29:56 -04:00
|
|
|
expect(mocks.partner.remove).toHaveBeenCalledWith({ sharedById: user1.id, sharedWithId: user2.id });
|
2023-05-15 20:30:53 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('should throw an error when the partner does not exist', async () => {
|
2025-03-11 16:29:56 -04:00
|
|
|
const user2 = factory.user();
|
|
|
|
|
const auth = factory.auth();
|
|
|
|
|
|
2025-02-10 18:47:42 -05:00
|
|
|
mocks.partner.get.mockResolvedValue(void 0);
|
2023-05-15 20:30:53 +03:00
|
|
|
|
2025-03-11 16:29:56 -04:00
|
|
|
await expect(sut.remove(auth, user2.id)).rejects.toBeInstanceOf(BadRequestException);
|
2023-05-15 20:30:53 +03:00
|
|
|
|
2025-02-10 18:47:42 -05:00
|
|
|
expect(mocks.partner.remove).not.toHaveBeenCalled();
|
2023-05-15 20:30:53 +03:00
|
|
|
});
|
|
|
|
|
});
|
2024-10-08 23:08:49 +02:00
|
|
|
|
|
|
|
|
describe('update', () => {
|
|
|
|
|
it('should require access', async () => {
|
2025-03-11 16:29:56 -04:00
|
|
|
const user2 = factory.user();
|
|
|
|
|
const auth = factory.auth();
|
|
|
|
|
|
|
|
|
|
await expect(sut.update(auth, user2.id, { inTimeline: false })).rejects.toBeInstanceOf(BadRequestException);
|
2024-10-08 23:08:49 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('should update partner', async () => {
|
2025-03-11 16:29:56 -04:00
|
|
|
const user1 = factory.user();
|
|
|
|
|
const user2 = factory.user();
|
|
|
|
|
const partner = factory.partner({ sharedBy: user1, sharedWith: user2 });
|
2025-04-11 11:53:37 -04:00
|
|
|
const auth = factory.auth({ user: { id: user1.id } });
|
2025-03-11 16:29:56 -04:00
|
|
|
|
|
|
|
|
mocks.access.partner.checkUpdateAccess.mockResolvedValue(new Set([user2.id]));
|
|
|
|
|
mocks.partner.update.mockResolvedValue(partner);
|
2024-10-08 23:08:49 +02:00
|
|
|
|
2025-03-11 16:29:56 -04:00
|
|
|
await expect(sut.update(auth, user2.id, { inTimeline: true })).resolves.toBeDefined();
|
2025-02-10 18:47:42 -05:00
|
|
|
expect(mocks.partner.update).toHaveBeenCalledWith(
|
2025-03-11 16:29:56 -04:00
|
|
|
{ sharedById: user2.id, sharedWithId: user1.id },
|
2025-01-17 18:49:21 -05:00
|
|
|
{ inTimeline: true },
|
|
|
|
|
);
|
2024-10-08 23:08:49 +02:00
|
|
|
});
|
2025-10-14 11:43:53 +02:00
|
|
|
|
|
|
|
|
it('should update partner with startDate', async () => {
|
|
|
|
|
const user1 = factory.user();
|
|
|
|
|
const user2 = factory.user();
|
|
|
|
|
const startDate = new Date('2024-01-01T00:00:00.000Z');
|
|
|
|
|
const partner = factory.partner({ sharedBy: user1, sharedWith: user2, startDate });
|
|
|
|
|
const auth = factory.auth({ user: { id: user1.id } });
|
|
|
|
|
|
|
|
|
|
mocks.access.partner.checkUpdateAccess.mockResolvedValue(new Set([user2.id]));
|
|
|
|
|
mocks.partner.update.mockResolvedValue(partner);
|
|
|
|
|
|
|
|
|
|
await expect(sut.update(auth, user2.id, { inTimeline: true, startDate })).resolves.toBeDefined();
|
|
|
|
|
expect(mocks.partner.update).toHaveBeenCalledWith(
|
|
|
|
|
{ sharedById: user2.id, sharedWithId: user1.id },
|
|
|
|
|
{ inTimeline: true, startDate },
|
|
|
|
|
);
|
|
|
|
|
});
|
2024-10-08 23:08:49 +02:00
|
|
|
});
|
2023-05-15 20:30:53 +03:00
|
|
|
});
|