Skip to content

Commit 5aa7acc

Browse files
committed
add tests
1 parent a054521 commit 5aa7acc

File tree

3 files changed

+211
-0
lines changed

3 files changed

+211
-0
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
import { Test, type TestingModule } from '@nestjs/testing';
2+
3+
import { ExceptionHandlerService } from 'src/engine/core-modules/exception-handler/exception-handler.service';
4+
import { FieldActorSource } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type';
5+
import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager';
6+
import { type ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
7+
import { CreateCompanyAndContactService } from 'src/modules/contact-creation-manager/services/create-company-and-contact.service';
8+
import { CreateCompanyService } from 'src/modules/contact-creation-manager/services/create-company.service';
9+
import { CreateContactService } from 'src/modules/contact-creation-manager/services/create-contact.service';
10+
import { type PersonWorkspaceEntity } from 'src/modules/person/standard-objects/person.workspace-entity';
11+
12+
describe('CreateCompanyAndContactService', () => {
13+
let service: CreateCompanyAndContactService;
14+
let createCompaniesService: CreateCompanyService;
15+
let createContactService: CreateContactService;
16+
17+
const workspaceId = 'workspace-1';
18+
19+
const mockConnectedAccount = {} as ConnectedAccountWorkspaceEntity;
20+
21+
beforeEach(async () => {
22+
const mockCreateCompaniesService = {
23+
createOrRestoreCompanies: jest.fn(),
24+
};
25+
const mockCreateContactService = {
26+
restorePeople: jest.fn(),
27+
};
28+
29+
const module: TestingModule = await Test.createTestingModule({
30+
providers: [
31+
CreateCompanyAndContactService,
32+
{
33+
provide: CreateCompanyService,
34+
useValue: mockCreateCompaniesService,
35+
},
36+
{
37+
provide: CreateContactService,
38+
useValue: mockCreateContactService,
39+
},
40+
{
41+
provide: TwentyORMGlobalManager,
42+
useValue: {},
43+
},
44+
{
45+
provide: ExceptionHandlerService,
46+
useValue: {},
47+
},
48+
],
49+
}).compile();
50+
51+
service = module.get<CreateCompanyAndContactService>(
52+
CreateCompanyAndContactService,
53+
);
54+
createContactService =
55+
module.get<CreateContactService>(CreateContactService);
56+
createCompaniesService =
57+
module.get<CreateCompanyService>(CreateCompanyService);
58+
});
59+
60+
describe('restorePeopleAndRestoreOrCreateCompanies - method', () => {
61+
it('should restore the soft deleted contact - matching primary email', async () => {
62+
await service.restorePeopleAndRestoreOrCreateCompanies(
63+
[
64+
{
65+
id: 'contact-1',
66+
emails: {
67+
primaryEmail: '[email protected]',
68+
additionalEmails: [],
69+
},
70+
deletedAt: new Date(),
71+
} as unknown as PersonWorkspaceEntity,
72+
],
73+
[
74+
{
75+
handle: '[email protected]',
76+
displayName: 'Contact 1',
77+
},
78+
],
79+
workspaceId,
80+
FieldActorSource.CALENDAR,
81+
mockConnectedAccount,
82+
);
83+
expect(createContactService.restorePeople).toHaveBeenCalledWith(
84+
[
85+
{
86+
id: 'contact-1',
87+
companyId: undefined,
88+
},
89+
],
90+
workspaceId,
91+
);
92+
expect(
93+
createCompaniesService.createOrRestoreCompanies,
94+
).toHaveBeenCalled();
95+
});
96+
it('should restore the soft deleted contact - matching primary email', async () => {
97+
await service.restorePeopleAndRestoreOrCreateCompanies(
98+
[
99+
{
100+
id: 'contact-1',
101+
emails: {
102+
primaryEmail: '[email protected]',
103+
additionalEmails: [
104+
105+
],
106+
},
107+
deletedAt: new Date(),
108+
} as unknown as PersonWorkspaceEntity,
109+
],
110+
[
111+
{
112+
handle: '[email protected]',
113+
displayName: 'Contact 1',
114+
},
115+
],
116+
workspaceId,
117+
FieldActorSource.CALENDAR,
118+
mockConnectedAccount,
119+
);
120+
expect(createContactService.restorePeople).toHaveBeenCalledWith(
121+
[
122+
{
123+
id: 'contact-1',
124+
companyId: undefined,
125+
},
126+
],
127+
workspaceId,
128+
);
129+
expect(
130+
createCompaniesService.createOrRestoreCompanies,
131+
).toHaveBeenCalled();
132+
});
133+
it('should not restore any contact', async () => {
134+
await service.restorePeopleAndRestoreOrCreateCompanies(
135+
[
136+
{
137+
id: 'contact-1',
138+
emails: {
139+
primaryEmail: '[email protected]',
140+
additionalEmails: [],
141+
},
142+
deletedAt: new Date(),
143+
} as unknown as PersonWorkspaceEntity,
144+
],
145+
[
146+
{
147+
handle: '[email protected]',
148+
displayName: 'Contact 1',
149+
},
150+
],
151+
workspaceId,
152+
FieldActorSource.CALENDAR,
153+
mockConnectedAccount,
154+
);
155+
expect(createContactService.restorePeople).not.toHaveBeenCalled();
156+
expect(
157+
createCompaniesService.createOrRestoreCompanies,
158+
).not.toHaveBeenCalled();
159+
});
160+
});
161+
});

packages/twenty-server/src/modules/contact-creation-manager/services/__tests__/create-company.service.spec.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ describe('CreateCompanyService', () => {
4646
provider: ConnectedAccountProvider.GOOGLE,
4747
},
4848
};
49+
const companyToRestore: CompanyToCreate = {
50+
domainName: 'soft-deleted-company.com',
51+
createdBySource: FieldActorSource.MANUAL,
52+
createdByContext: {
53+
provider: ConnectedAccountProvider.GOOGLE,
54+
},
55+
};
4956
const inputForCompanyToCreate1 = {
5057
address: {
5158
addressCity: undefined,
@@ -89,6 +96,7 @@ describe('CreateCompanyService', () => {
8996
find: jest.fn(),
9097
save: jest.fn(),
9198
maximum: jest.fn().mockResolvedValue(0),
99+
updateMany: jest.fn(),
92100
};
93101

94102
const module: TestingModule = await Test.createTestingModule({
@@ -199,4 +207,44 @@ describe('CreateCompanyService', () => {
199207
expect(mockCompanyRepository.save).not.toHaveBeenCalled();
200208
});
201209
});
210+
211+
describe('With existing companies and some deleted', () => {
212+
beforeEach(() => {
213+
mockCompanyRepository.find.mockResolvedValue([
214+
{
215+
id: 'soft-deleted-company-1',
216+
domainName: { primaryLinkUrl: 'https://soft-deleted-company.com' },
217+
deletedAt: new Date(),
218+
},
219+
]);
220+
mockCompanyRepository.save.mockResolvedValue([]);
221+
mockCompanyRepository.updateMany.mockResolvedValue({
222+
raw: [
223+
{
224+
id: 'soft-deleted-company-1',
225+
domainNamePrimaryLinkUrl: 'https://soft-deleted-company.com',
226+
},
227+
],
228+
});
229+
});
230+
231+
it('should restore the soft deleted company', async () => {
232+
await service.createOrRestoreCompanies([companyToRestore], workspaceId);
233+
234+
expect(mockCompanyRepository.find).toHaveBeenCalled();
235+
expect(mockCompanyRepository.save).toHaveBeenCalledWith([]);
236+
expect(mockCompanyRepository.updateMany).toHaveBeenCalledWith(
237+
[
238+
{
239+
criteria: 'soft-deleted-company-1',
240+
partialEntity: {
241+
deletedAt: null,
242+
},
243+
},
244+
],
245+
undefined,
246+
['domainNamePrimaryLinkUrl', 'id'],
247+
);
248+
});
249+
});
202250
});

packages/twenty-server/src/modules/contact-creation-manager/services/create-company-and-contact.service.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,8 @@ export class CreateCompanyAndContactService {
209209
})
210210
.filter(isDefined);
211211

212+
if (filteredContactsToRestore.length === 0) return [];
213+
212214
const workDomainNamesToCreate = filteredContactsToRestore
213215
.filter(
214216
(participant) =>

0 commit comments

Comments
 (0)