mirror of
https://github.com/lingble/twenty.git
synced 2025-11-20 16:04:57 +00:00
268 lines
7.6 KiB
TypeScript
268 lines
7.6 KiB
TypeScript
import { Locator, Page } from '@playwright/test';
|
|
import { formatDate } from './formatDate.function';
|
|
|
|
export class InsertFieldData {
|
|
private readonly address1Input: Locator;
|
|
private readonly address2Input: Locator;
|
|
private readonly cityInput: Locator;
|
|
private readonly stateInput: Locator;
|
|
private readonly postCodeInput: Locator;
|
|
private readonly countrySelect: Locator;
|
|
private readonly arrayValueInput: Locator;
|
|
private readonly arrayAddValueButton: Locator;
|
|
// boolean react after click so no need to write special locator
|
|
private readonly currencySelect: Locator;
|
|
private readonly currencyAmountInput: Locator;
|
|
private readonly monthSelect: Locator;
|
|
private readonly yearSelect: Locator;
|
|
private readonly previousMonthButton: Locator;
|
|
private readonly nextMonthButton: Locator;
|
|
private readonly clearDateButton: Locator;
|
|
private readonly dateInput: Locator;
|
|
private readonly firstNameInput: Locator;
|
|
private readonly lastNameInput: Locator;
|
|
private readonly addURLButton: Locator;
|
|
private readonly setAsPrimaryButton: Locator;
|
|
private readonly addPhoneButton: Locator;
|
|
private readonly addMailButton: Locator;
|
|
|
|
constructor(public readonly page: Page) {
|
|
this.page = page;
|
|
this.address1Input = page.locator(
|
|
'//label[contains(., "ADDRESS 1")]/../div[last()]/input',
|
|
);
|
|
this.address2Input = page.locator(
|
|
'//label[contains(., "ADDRESS 2")]/../div[last()]/input',
|
|
);
|
|
this.cityInput = page.locator(
|
|
'//label[contains(., "CITY")]/../div[last()]/input',
|
|
);
|
|
this.stateInput = page.locator(
|
|
'//label[contains(., "STATE")]/../div[last()]/input',
|
|
);
|
|
this.postCodeInput = page.locator(
|
|
'//label[contains(., "POST CODE")]/../div[last()]/input',
|
|
);
|
|
this.countrySelect = page.locator(
|
|
'//span[contains(., "COUNTRY")]/../div[last()]/input',
|
|
);
|
|
this.arrayValueInput = page.locator("//input[@placeholder='Enter value']");
|
|
this.arrayAddValueButton = page.locator(
|
|
"//div[@data-testid='tooltip' and contains(.,'Add item')]",
|
|
);
|
|
this.currencySelect = page.locator(
|
|
'//body/div[last()]/div/div/div[first()]/div/div',
|
|
);
|
|
this.currencyAmountInput = page.locator("//input[@placeholder='Currency']");
|
|
this.monthSelect; // TODO: add once some other attributes are added
|
|
this.yearSelect;
|
|
this.previousMonthButton;
|
|
this.nextMonthButton;
|
|
this.clearDateButton = page.locator(
|
|
"//div[@data-testid='tooltip' and contains(., 'Clear')]",
|
|
);
|
|
this.dateInput = page.locator("//input[@placeholder='Type date and time']");
|
|
this.firstNameInput = page.locator("//input[@placeholder='First name']"); // may fail if placeholder is `F‌‌irst name` instead of `First name`
|
|
this.lastNameInput = page.locator("//input[@placeholder='Last name']"); // may fail if placeholder is `L‌‌ast name` instead of `Last name`
|
|
this.addURLButton = page.locator(
|
|
"//div[@data-testid='tooltip' and contains(., 'Add URL')]",
|
|
);
|
|
this.setAsPrimaryButton = page.locator(
|
|
"//div[@data-testid='tooltip' and contains(., 'Set as primary')]",
|
|
);
|
|
this.addPhoneButton = page.locator(
|
|
"//div[@data-testid='tooltip' and contains(., 'Add Phone')]",
|
|
);
|
|
this.addMailButton = page.locator(
|
|
"//div[@data-testid='tooltip' and contains(., 'Add Email')]",
|
|
);
|
|
}
|
|
|
|
// address
|
|
async typeAddress1(value: string) {
|
|
await this.address1Input.fill(value);
|
|
}
|
|
|
|
async typeAddress2(value: string) {
|
|
await this.address2Input.fill(value);
|
|
}
|
|
|
|
async typeCity(value: string) {
|
|
await this.cityInput.fill(value);
|
|
}
|
|
|
|
async typeState(value: string) {
|
|
await this.stateInput.fill(value);
|
|
}
|
|
|
|
async typePostCode(value: string) {
|
|
await this.postCodeInput.fill(value);
|
|
}
|
|
|
|
async selectCountry(value: string) {
|
|
await this.countrySelect.click();
|
|
await this.page
|
|
.locator(`//div[@data-testid='tooltip' and contains(., '${value}')]`)
|
|
.click();
|
|
}
|
|
|
|
// array
|
|
async typeArrayValue(value: string) {
|
|
await this.arrayValueInput.fill(value);
|
|
}
|
|
|
|
async clickAddItemButton() {
|
|
await this.arrayAddValueButton.click();
|
|
}
|
|
|
|
// currency
|
|
async selectCurrency(value: string) {
|
|
await this.currencySelect.click();
|
|
await this.page
|
|
.locator(`//div[@data-testid='tooltip' and contains(., '${value}')]`)
|
|
.click();
|
|
}
|
|
|
|
async typeCurrencyAmount(value: string) {
|
|
await this.currencyAmountInput.fill(value);
|
|
}
|
|
|
|
// date(-time)
|
|
async typeDate(value: string) {
|
|
await this.dateInput.fill(value);
|
|
}
|
|
|
|
async selectMonth(value: string) {
|
|
await this.monthSelect.click();
|
|
await this.page
|
|
.locator(`//div[@data-testid='tooltip' and contains(., '${value}')]`)
|
|
.click();
|
|
}
|
|
|
|
async selectYear(value: string) {
|
|
await this.yearSelect.click();
|
|
await this.page
|
|
.locator(`//div[@data-testid='tooltip' and contains(., '${value}')]`)
|
|
.click();
|
|
}
|
|
|
|
async clickPreviousMonthButton() {
|
|
await this.previousMonthButton.click();
|
|
}
|
|
|
|
async clickNextMonthButton() {
|
|
await this.nextMonthButton.click();
|
|
}
|
|
|
|
async selectDay(value: string) {
|
|
await this.page
|
|
.locator(`//div[@aria-label='${formatDate(value)}']`)
|
|
.click();
|
|
}
|
|
|
|
async clearDate() {
|
|
await this.clearDateButton.click();
|
|
}
|
|
|
|
// email
|
|
async typeEmail(value: string) {
|
|
await this.page.locator(`//input[@placeholder='Email']`).fill(value);
|
|
}
|
|
|
|
async clickAddMailButton() {
|
|
await this.addMailButton.click();
|
|
}
|
|
|
|
// full name
|
|
async typeFirstName(name: string) {
|
|
await this.firstNameInput.fill(name);
|
|
}
|
|
|
|
async typeLastName(name: string) {
|
|
await this.lastNameInput.fill(name);
|
|
}
|
|
|
|
// JSON
|
|
// placeholder is dependent on the name of field
|
|
async typeJSON(placeholder: string, value: string) {
|
|
await this.page
|
|
.locator(`//input[@placeholder='${placeholder}']`)
|
|
.fill(value);
|
|
}
|
|
|
|
// link
|
|
async typeLink(value: string) {
|
|
await this.page.locator("//input[@placeholder='URL']").fill(value);
|
|
}
|
|
|
|
async clickAddURL() {
|
|
await this.addURLButton.click();
|
|
}
|
|
|
|
// (multi-)select
|
|
async selectValue(value: string) {
|
|
await this.page
|
|
.locator(`//div[@data-testid='tooltip' and contains(., '${value}')]`)
|
|
.click();
|
|
}
|
|
|
|
// number
|
|
// placeholder is dependent on the name of field
|
|
async typeNumber(placeholder: string, value: string) {
|
|
await this.page
|
|
.locator(`//input[@placeholder='${placeholder}']`)
|
|
.fill(value);
|
|
}
|
|
|
|
// phones
|
|
async selectCountryPhoneCode(countryCode: string) {
|
|
await this.page
|
|
.locator(
|
|
`//div[@data-testid='tooltip' and contains(., '${countryCode}')]`,
|
|
)
|
|
.click();
|
|
}
|
|
|
|
async typePhoneNumber(value: string) {
|
|
await this.page.locator(`//input[@placeholder='Phone']`).fill(value);
|
|
}
|
|
|
|
async clickAddPhoneButton() {
|
|
await this.addPhoneButton.click();
|
|
}
|
|
|
|
// rating
|
|
// if adding rating for the first time, hover must be used
|
|
async selectRating(rating: number) {
|
|
await this.page.locator(`//div[@role='slider']/div[${rating}]`).click();
|
|
}
|
|
|
|
// text
|
|
// placeholder is dependent on the name of field
|
|
async typeText(placeholder: string, value: string) {
|
|
await this.page
|
|
.locator(`//input[@placeholder='${placeholder}']`)
|
|
.fill(value);
|
|
}
|
|
|
|
async clickSetAsPrimaryButton() {
|
|
await this.setAsPrimaryButton.click();
|
|
}
|
|
|
|
async searchValue(value: string) {
|
|
await this.page.locator(`//div[@placeholder='Search']`).fill(value);
|
|
}
|
|
|
|
async clickEditButton() {
|
|
await this.page
|
|
.locator("//div[@data-testid='tooltip' and contains(., 'Edit')]")
|
|
.click();
|
|
}
|
|
|
|
async clickDeleteButton() {
|
|
await this.page
|
|
.locator("//div[@data-testid='tooltip' and contains(., 'Delete')]")
|
|
.click();
|
|
}
|
|
}
|