Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
165 lines
5.0 KiB
TypeScript
165 lines
5.0 KiB
TypeScript
import { expect, test } from '../lib/fixtures/screenshot';
|
||
import { postBackendGraphQL } from '../lib/requests/post-backend-graphql';
|
||
|
||
const query = `query FindOnePerson($objectRecordId: UUID!) {
|
||
person(
|
||
filter: {or: [{deletedAt: {is: NULL}}, {deletedAt: {is: NOT_NULL}}], id: {eq: $objectRecordId}}
|
||
) {
|
||
previousCompanies {
|
||
edges {
|
||
node {
|
||
company {
|
||
name
|
||
}
|
||
}
|
||
}
|
||
}
|
||
emails {
|
||
primaryEmail
|
||
additionalEmails
|
||
__typename
|
||
}
|
||
id
|
||
intro
|
||
jobTitle
|
||
linkedinLink {
|
||
primaryLinkUrl
|
||
primaryLinkLabel
|
||
secondaryLinks {
|
||
label
|
||
url
|
||
}
|
||
__typename
|
||
}
|
||
name {
|
||
firstName
|
||
lastName
|
||
__typename
|
||
}
|
||
performanceRating
|
||
phones {
|
||
primaryPhoneNumber
|
||
primaryPhoneCountryCode
|
||
primaryPhoneCallingCode
|
||
additionalPhones {
|
||
number
|
||
callingCode
|
||
countryCode
|
||
}
|
||
__typename
|
||
}
|
||
position
|
||
workPreference
|
||
updatedAt
|
||
}
|
||
}`;
|
||
|
||
test('Create and update record', async ({ page }) => {
|
||
await page.goto('/objects/people');
|
||
await page.getByRole('button', { name: 'Create new Person' }).click();
|
||
|
||
// Generate a random email for testing
|
||
const randomEmail = `testuser_${Math.random().toString(36).substring(2, 10)}@example.com`;
|
||
// Fill first name and last name
|
||
const firstNameInput = page.getByRole('textbox', { name: 'First name' });
|
||
await expect(firstNameInput).toBeFocused();
|
||
await firstNameInput.fill('John');
|
||
const lastNameInput = page.getByPlaceholder('Last name');
|
||
await expect(lastNameInput).toBeVisible();
|
||
await lastNameInput.fill('Doe');
|
||
await lastNameInput.press('Enter');
|
||
|
||
// Focus on recordFieldList
|
||
const recordFieldList = page.getByTestId('record-fields-widget');
|
||
await expect(recordFieldList).toBeVisible();
|
||
await recordFieldList.getByText('Emails').first().click();
|
||
|
||
// Fill email
|
||
const emailInput = recordFieldList.getByText('Emails').nth(1);
|
||
await expect(emailInput).toBeVisible();
|
||
await emailInput.click({ force: true });
|
||
await page.getByPlaceholder('Email').fill(randomEmail);
|
||
await page.keyboard.press('Enter');
|
||
await recordFieldList.getByText('Emails').first().click();
|
||
|
||
// Fill intro
|
||
const introInput = recordFieldList.getByText('Intro').nth(1);
|
||
await expect(introInput).toBeVisible();
|
||
await introInput.click({ force: true });
|
||
await introInput.click({ force: true });
|
||
await page.getByPlaceholder('Intro').fill('This is an intro');
|
||
await page.getByPlaceholder('Intro').press('Enter');
|
||
|
||
// Fill URL
|
||
await recordFieldList.getByText('Linkedin').first().click();
|
||
const urlInput = recordFieldList.getByText('Linkedin').nth(1);
|
||
await expect(urlInput).toBeVisible();
|
||
await urlInput.click({ force: true });
|
||
await page.getByPlaceholder('URL').fill('linkedin.com/johndoe');
|
||
await page.getByPlaceholder('URL').press('Enter');
|
||
|
||
// Click on 4th star to rate
|
||
await recordFieldList
|
||
.getByText('Performance Rating')
|
||
.first()
|
||
.click({ force: true });
|
||
const ratingContainer = recordFieldList.locator('div[aria-label="Rating"]');
|
||
await ratingContainer.locator('svg').nth(3).click({ force: true });
|
||
|
||
// Fill phone field
|
||
await recordFieldList.getByText('Phones').first().click();
|
||
const phoneInput = recordFieldList.getByText('Phones').nth(1);
|
||
await expect(phoneInput).toBeVisible();
|
||
await phoneInput.click({ force: true });
|
||
await page.getByPlaceholder('Phone').fill('+336 1 122 3344');
|
||
await page.getByPlaceholder('Phone').press('Enter');
|
||
|
||
// Fill work preference
|
||
await recordFieldList
|
||
.getByText('Work Preference')
|
||
.first()
|
||
.click({ force: true });
|
||
await recordFieldList
|
||
.getByText('Work Preference')
|
||
.nth(1)
|
||
.click({ force: true });
|
||
const options = page.getByRole('listbox');
|
||
await options.getByText('Hybrid').first().click({ force: true });
|
||
recordFieldList.getByText('Work Preference').first().click({ force: true });
|
||
|
||
// Open full record page to get person ID
|
||
await page.getByRole('button', { name: 'Expand record' }).click();
|
||
await page.waitForURL(/\/object\/person\//);
|
||
const newPersonId = page.url().match(/\/object\/person\/([a-f0-9-]+)/)?.[1];
|
||
|
||
// Check data was saved
|
||
const findOnePersonResponse = await postBackendGraphQL({
|
||
page,
|
||
data: {
|
||
operationName: 'FindOnePerson',
|
||
query,
|
||
variables: {
|
||
objectRecordId: newPersonId,
|
||
},
|
||
},
|
||
});
|
||
|
||
const findOnePersonReponseBody = await findOnePersonResponse.json();
|
||
|
||
expect(findOnePersonReponseBody.data.person.name.firstName).toBe('John');
|
||
expect(findOnePersonReponseBody.data.person.name.lastName).toBe('Doe');
|
||
expect(findOnePersonReponseBody.data.person.emails.primaryEmail).toBe(
|
||
randomEmail,
|
||
);
|
||
expect(findOnePersonReponseBody.data.person.intro).toBe('This is an intro');
|
||
expect(findOnePersonReponseBody.data.person.linkedinLink.primaryLinkUrl).toBe(
|
||
'linkedin.com/johndoe',
|
||
);
|
||
expect(findOnePersonReponseBody.data.person.phones.primaryPhoneNumber).toBe(
|
||
'611223344',
|
||
);
|
||
expect(findOnePersonReponseBody.data.person.workPreference).toEqual([
|
||
'HYBRID',
|
||
]);
|
||
});
|