Files
twenty/packages/twenty-server/test/integration/graphql/suites/all-message-participants-resolvers.integration-spec.ts
gitstart-app[bot] bf0a059751 [Server Integration tests] Enrich integration GraphQL API tests #3 (#7931)
This PR was created by [GitStart](https://gitstart.com/) to address the
requirements from this ticket:
[TWNTY-7526](https://clients.gitstart.com/twenty/5449/tickets/TWNTY-7526).

 --- 

### Description

NoteTargets and MessageThreads are special cases because they do not
have a notable property that we could use in "update" the test cases,\
for NoteTargets we are using the personId, testing the relation, but for
MessageThreads we are using updatedAt. To test the relations for
MessageThreads\
we would need to update another object (Message) because the relation is
ONE_TO_MANY, updating another object in a test that would update the
current tested object sounds incorrect.\
In the NoteTargets, we can update the NoteTarget object because the
relation is MANY_TO_ONE\
for some tests we need an account ID, we are using Tim's account for all
the tests (the token in jest-integration.config.ts), so we are using a
constant to use the account ID

### Refs

#7526

### Demo


![](https://assets-service.gitstart.com/28455/7f1c520e-78e4-43c3-aa89-f6fc09e0a056.png)

---------

Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com>
Co-authored-by: gitstart-twenty <140154534+gitstart-twenty@users.noreply.github.com>
2024-10-22 10:17:10 +02:00

467 lines
16 KiB
TypeScript

import { createManyOperationFactory } from 'test/integration/graphql/utils/create-many-operation-factory.util';
import { createOneOperationFactory } from 'test/integration/graphql/utils/create-one-operation-factory.util';
import { deleteManyOperationFactory } from 'test/integration/graphql/utils/delete-many-operation-factory.util';
import { deleteOneOperationFactory } from 'test/integration/graphql/utils/delete-one-operation-factory.util';
import { destroyManyOperationFactory } from 'test/integration/graphql/utils/destroy-many-operation-factory.util';
import { destroyOneOperationFactory } from 'test/integration/graphql/utils/destroy-one-operation-factory.util';
import { findManyOperationFactory } from 'test/integration/graphql/utils/find-many-operation-factory.util';
import { findOneOperationFactory } from 'test/integration/graphql/utils/find-one-operation-factory.util';
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
import { updateManyOperationFactory } from 'test/integration/graphql/utils/update-many-operation-factory.util';
import { updateOneOperationFactory } from 'test/integration/graphql/utils/update-one-operation-factory.util';
import { generateRecordName } from 'test/integration/utils/generate-record-name';
const MESSAGE_PARTICIPANT_1_ID = '777a8457-eb2d-40ac-a707-551b615b6987';
const MESSAGE_PARTICIPANT_2_ID = '777a8457-eb2d-40ac-a707-551b615b6988';
const MESSAGE_PARTICIPANT_3_ID = '777a8457-eb2d-40ac-a707-551b615b6989';
const MESSAGE_ID = '777a8457-eb2d-40ac-a707-441b615b6989';
const MESSAGE_PARTICIPANT_GQL_FIELDS = `
id
displayName
handle
role
messageId
workspaceMemberId
createdAt
deletedAt
`;
describe('messageParticipants resolvers (integration)', () => {
beforeAll(async () => {
const messageSubject = generateRecordName(MESSAGE_ID);
const graphqlOperation = createOneOperationFactory({
objectMetadataSingularName: 'message',
gqlFields: `id`,
data: {
id: MESSAGE_ID,
subject: messageSubject,
},
});
await makeGraphqlAPIRequest(graphqlOperation);
});
afterAll(async () => {
const graphqlOperation = destroyOneOperationFactory({
objectMetadataSingularName: 'message',
gqlFields: `id`,
recordId: MESSAGE_ID,
});
await makeGraphqlAPIRequest(graphqlOperation);
});
it('1. should create and return messageParticipants', async () => {
const messageParticipantDisplayName1 = generateRecordName(
MESSAGE_PARTICIPANT_1_ID,
);
const messageParticipantDisplayName2 = generateRecordName(
MESSAGE_PARTICIPANT_2_ID,
);
const graphqlOperation = createManyOperationFactory({
objectMetadataSingularName: 'messageParticipant',
objectMetadataPluralName: 'messageParticipants',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
data: [
{
id: MESSAGE_PARTICIPANT_1_ID,
displayName: messageParticipantDisplayName1,
messageId: MESSAGE_ID,
},
{
id: MESSAGE_PARTICIPANT_2_ID,
displayName: messageParticipantDisplayName2,
messageId: MESSAGE_ID,
},
],
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
expect(response.body.data.createMessageParticipants).toHaveLength(2);
response.body.data.createMessageParticipants.forEach(
(messageParticipant) => {
expect(messageParticipant).toHaveProperty('displayName');
expect([
messageParticipantDisplayName1,
messageParticipantDisplayName2,
]).toContain(messageParticipant.displayName);
expect(messageParticipant).toHaveProperty('id');
expect(messageParticipant).toHaveProperty('handle');
expect(messageParticipant).toHaveProperty('role');
expect(messageParticipant).toHaveProperty('messageId');
expect(messageParticipant).toHaveProperty('workspaceMemberId');
expect(messageParticipant).toHaveProperty('createdAt');
expect(messageParticipant).toHaveProperty('deletedAt');
},
);
});
it('1b. should create and return one messageParticipant', async () => {
const messageParticipantDisplayName = generateRecordName(
MESSAGE_PARTICIPANT_3_ID,
);
const graphqlOperation = createOneOperationFactory({
objectMetadataSingularName: 'messageParticipant',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
data: {
id: MESSAGE_PARTICIPANT_3_ID,
displayName: messageParticipantDisplayName,
messageId: MESSAGE_ID,
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
const createdMessageParticipant =
response.body.data.createMessageParticipant;
expect(createdMessageParticipant).toHaveProperty('displayName');
expect(createdMessageParticipant.displayName).toEqual(
messageParticipantDisplayName,
);
expect(createdMessageParticipant).toHaveProperty('id');
expect(createdMessageParticipant).toHaveProperty('handle');
expect(createdMessageParticipant).toHaveProperty('role');
expect(createdMessageParticipant).toHaveProperty('messageId');
expect(createdMessageParticipant).toHaveProperty('workspaceMemberId');
expect(createdMessageParticipant).toHaveProperty('createdAt');
expect(createdMessageParticipant).toHaveProperty('deletedAt');
});
it('2. should find many messageParticipants', async () => {
const graphqlOperation = findManyOperationFactory({
objectMetadataSingularName: 'messageParticipant',
objectMetadataPluralName: 'messageParticipants',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
const data = response.body.data.messageParticipants;
expect(data).toBeDefined();
expect(Array.isArray(data.edges)).toBe(true);
const edges = data.edges;
if (edges.length > 0) {
const messageParticipant = edges[0].node;
expect(messageParticipant).toHaveProperty('displayName');
expect(messageParticipant).toHaveProperty('id');
expect(messageParticipant).toHaveProperty('handle');
expect(messageParticipant).toHaveProperty('role');
expect(messageParticipant).toHaveProperty('messageId');
expect(messageParticipant).toHaveProperty('workspaceMemberId');
expect(messageParticipant).toHaveProperty('createdAt');
expect(messageParticipant).toHaveProperty('deletedAt');
}
});
it('2b. should find one messageParticipant', async () => {
const graphqlOperation = findOneOperationFactory({
objectMetadataSingularName: 'messageParticipant',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
id: {
eq: MESSAGE_PARTICIPANT_3_ID,
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
const messageParticipant = response.body.data.messageParticipant;
expect(messageParticipant).toHaveProperty('displayName');
expect(messageParticipant).toHaveProperty('id');
expect(messageParticipant).toHaveProperty('handle');
expect(messageParticipant).toHaveProperty('role');
expect(messageParticipant).toHaveProperty('messageId');
expect(messageParticipant).toHaveProperty('workspaceMemberId');
expect(messageParticipant).toHaveProperty('createdAt');
expect(messageParticipant).toHaveProperty('deletedAt');
});
it('3. should update many messageParticipants', async () => {
const graphqlOperation = updateManyOperationFactory({
objectMetadataSingularName: 'messageParticipant',
objectMetadataPluralName: 'messageParticipants',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
data: {
displayName: 'New DisplayName',
},
filter: {
id: {
in: [MESSAGE_PARTICIPANT_1_ID, MESSAGE_PARTICIPANT_2_ID],
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
const updatedmessageParticipants =
response.body.data.updateMessageParticipants;
expect(updatedmessageParticipants).toHaveLength(2);
updatedmessageParticipants.forEach((messageParticipant) => {
expect(messageParticipant.displayName).toEqual('New DisplayName');
});
});
it('3b. should update one messageParticipant', async () => {
const graphqlOperation = updateOneOperationFactory({
objectMetadataSingularName: 'messageParticipant',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
data: {
displayName: 'Updated DisplayName',
},
recordId: MESSAGE_PARTICIPANT_3_ID,
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
const updatedmessageParticipant =
response.body.data.updateMessageParticipant;
expect(updatedmessageParticipant.displayName).toEqual(
'Updated DisplayName',
);
});
it('4. should find many messageParticipants with updated displayName', async () => {
const graphqlOperation = findManyOperationFactory({
objectMetadataSingularName: 'messageParticipant',
objectMetadataPluralName: 'messageParticipants',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
displayName: {
eq: 'New DisplayName',
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
expect(response.body.data.messageParticipants.edges).toHaveLength(2);
});
it('4b. should find one messageParticipant with updated displayName', async () => {
const graphqlOperation = findOneOperationFactory({
objectMetadataSingularName: 'messageParticipant',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
displayName: {
eq: 'Updated DisplayName',
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
expect(response.body.data.messageParticipant.displayName).toEqual(
'Updated DisplayName',
);
});
it('5. should delete many messageParticipants', async () => {
const graphqlOperation = deleteManyOperationFactory({
objectMetadataSingularName: 'messageParticipant',
objectMetadataPluralName: 'messageParticipants',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
id: {
in: [MESSAGE_PARTICIPANT_1_ID, MESSAGE_PARTICIPANT_2_ID],
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
const deleteMessageParticipants =
response.body.data.deleteMessageParticipants;
expect(deleteMessageParticipants).toHaveLength(2);
deleteMessageParticipants.forEach((messageParticipant) => {
expect(messageParticipant.deletedAt).toBeTruthy();
});
});
it('5b. should delete one messageParticipant', async () => {
const graphqlOperation = deleteOneOperationFactory({
objectMetadataSingularName: 'messageParticipant',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
recordId: MESSAGE_PARTICIPANT_3_ID,
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
expect(response.body.data.deleteMessageParticipant.deletedAt).toBeTruthy();
});
it('6. should not find many messageParticipants anymore', async () => {
const graphqlOperation = findManyOperationFactory({
objectMetadataSingularName: 'messageParticipant',
objectMetadataPluralName: 'messageParticipants',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
id: {
in: [MESSAGE_PARTICIPANT_1_ID, MESSAGE_PARTICIPANT_2_ID],
},
},
});
const findMessageParticipantsResponse =
await makeGraphqlAPIRequest(graphqlOperation);
expect(
findMessageParticipantsResponse.body.data.messageParticipants.edges,
).toHaveLength(0);
});
it('6b. should not find one messageParticipant anymore', async () => {
const graphqlOperation = findOneOperationFactory({
objectMetadataSingularName: 'messageParticipant',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
id: {
eq: MESSAGE_PARTICIPANT_3_ID,
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
expect(response.body.data.messageParticipant).toBeNull();
});
it('7. should find many deleted messageParticipants with deletedAt filter', async () => {
const graphqlOperation = findManyOperationFactory({
objectMetadataSingularName: 'messageParticipant',
objectMetadataPluralName: 'messageParticipants',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
id: {
in: [MESSAGE_PARTICIPANT_1_ID, MESSAGE_PARTICIPANT_2_ID],
},
not: {
deletedAt: {
is: 'NULL',
},
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
expect(response.body.data.messageParticipants.edges).toHaveLength(2);
});
it('7b. should find one deleted messageParticipant with deletedAt filter', async () => {
const graphqlOperation = findOneOperationFactory({
objectMetadataSingularName: 'messageParticipant',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
id: {
eq: MESSAGE_PARTICIPANT_3_ID,
},
not: {
deletedAt: {
is: 'NULL',
},
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
expect(response.body.data.messageParticipant.id).toEqual(
MESSAGE_PARTICIPANT_3_ID,
);
});
it('8. should destroy many messageParticipants', async () => {
const graphqlOperation = destroyManyOperationFactory({
objectMetadataSingularName: 'messageParticipant',
objectMetadataPluralName: 'messageParticipants',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
id: {
in: [MESSAGE_PARTICIPANT_1_ID, MESSAGE_PARTICIPANT_2_ID],
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
expect(response.body.data.destroyMessageParticipants).toHaveLength(2);
});
it('8b. should destroy one messageParticipant', async () => {
const graphqlOperation = destroyOneOperationFactory({
objectMetadataSingularName: 'messageParticipant',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
recordId: MESSAGE_PARTICIPANT_3_ID,
});
const destroyMessageParticipantResponse =
await makeGraphqlAPIRequest(graphqlOperation);
expect(
destroyMessageParticipantResponse.body.data.destroyMessageParticipant,
).toBeTruthy();
});
it('9. should not find many messageParticipants anymore', async () => {
const graphqlOperation = findManyOperationFactory({
objectMetadataSingularName: 'messageParticipant',
objectMetadataPluralName: 'messageParticipants',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
id: {
in: [MESSAGE_PARTICIPANT_1_ID, MESSAGE_PARTICIPANT_2_ID],
},
not: {
deletedAt: {
is: 'NULL',
},
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
expect(response.body.data.messageParticipants.edges).toHaveLength(0);
});
it('9b. should not find one messageParticipant anymore', async () => {
const graphqlOperation = findOneOperationFactory({
objectMetadataSingularName: 'messageParticipant',
gqlFields: MESSAGE_PARTICIPANT_GQL_FIELDS,
filter: {
id: {
eq: MESSAGE_PARTICIPANT_3_ID,
},
not: {
deletedAt: {
is: 'NULL',
},
},
},
});
const response = await makeGraphqlAPIRequest(graphqlOperation);
expect(response.body.data.messageParticipant).toBeNull();
});
});