Some checks failed
Admin | Playwright Tests / Admin | Playwright Tests | Shard 1 Of 6 (push) Failing after 37s
Admin | Playwright Tests / Admin | Playwright Tests | Shard 2 Of 6 (push) Failing after 7s
Admin | Playwright Tests / Admin | Playwright Tests | Shard 4 Of 6 (push) Failing after 7s
Admin | Playwright Tests / Admin | Playwright Tests | Shard 6 Of 6 (push) Failing after 6s
Linting Tests / PHP 8.3 test on ubuntu-latest (push) Failing after 5s
CI / PHP 8.3 test on ubuntu-latest (push) Failing after 6s
Skills Consistency / validate-skills (push) Successful in 10s
Admin | Playwright Tests / Admin | Playwright Tests | Shard 3 Of 6 (push) Failing after 7s
Admin | Playwright Tests / Admin | Playwright Tests | Shard 5 Of 6 (push) Failing after 6s
200 lines
5.9 KiB
TypeScript
200 lines
5.9 KiB
TypeScript
import { Page, expect } from "@playwright/test";
|
|
import CoreLocators from "../locator/CoreLocators";
|
|
import {
|
|
generateDescription,
|
|
generateEmail,
|
|
generateFullName,
|
|
generateName,
|
|
generatePhoneNumber,
|
|
generateRandomNumericString,
|
|
generateSKU,
|
|
} from "../utils/faker";
|
|
|
|
export type QuickAddTab = "Lead" | "Person" | "Organization" | "Product" | "Email";
|
|
|
|
export type QuickAddLeadData = {
|
|
title: string;
|
|
description: string;
|
|
};
|
|
|
|
export type QuickAddPersonData = {
|
|
name: string;
|
|
email: string;
|
|
contactNumber: string;
|
|
};
|
|
|
|
export type QuickAddOrganizationData = {
|
|
name: string;
|
|
};
|
|
|
|
export type QuickAddProductData = {
|
|
name: string;
|
|
description: string;
|
|
sku: string;
|
|
quantity: string;
|
|
price: string;
|
|
};
|
|
|
|
export type QuickAddMailData = {
|
|
replyTo: string;
|
|
subject: string;
|
|
body: string;
|
|
};
|
|
|
|
export const quickAddLeadData: QuickAddLeadData = {
|
|
title: generateName(),
|
|
description: generateDescription(),
|
|
};
|
|
|
|
export const quickAddPersonData: QuickAddPersonData = {
|
|
name: generateFullName(),
|
|
email: generateEmail(),
|
|
contactNumber: generatePhoneNumber(),
|
|
};
|
|
|
|
export const quickAddOrganizationData: QuickAddOrganizationData = {
|
|
name: generateName() + " Inc",
|
|
};
|
|
|
|
export const quickAddProductData: QuickAddProductData = {
|
|
name: "Product " + generateName(),
|
|
description: generateDescription(),
|
|
sku: generateSKU(),
|
|
quantity: generateRandomNumericString(2, 10, 50),
|
|
price: generateRandomNumericString(3, 100, 500),
|
|
};
|
|
|
|
export const quickAddMailData: QuickAddMailData = {
|
|
replyTo: generateEmail(),
|
|
subject: generateName(),
|
|
body: generateDescription().slice(0, 50),
|
|
};
|
|
|
|
export class QuickAddPage extends CoreLocators {
|
|
readonly page: Page;
|
|
|
|
constructor(page: Page) {
|
|
super(page);
|
|
this.page = page;
|
|
}
|
|
|
|
async openQuickAddModal() {
|
|
await this.page.goto("admin/dashboard");
|
|
await this.quickAddTrigger.waitFor({ state: "visible" });
|
|
await this.quickAddTrigger.click();
|
|
await expect(this.quickAddModalTitle).toBeVisible();
|
|
}
|
|
|
|
async selectQuickAddTab(tabLabel: QuickAddTab) {
|
|
await this.quickAddTab(tabLabel).click();
|
|
}
|
|
|
|
async submitQuickAdd() {
|
|
await this.quickAddSaveButton.click();
|
|
}
|
|
|
|
/**
|
|
* Every quick add tab exposed by the seeded admin role must be reachable.
|
|
*/
|
|
async verifyQuickAddTabs(tabs: QuickAddTab[]) {
|
|
await this.openQuickAddModal();
|
|
|
|
for (const tab of tabs) {
|
|
await expect(this.quickAddTab(tab)).toBeVisible();
|
|
}
|
|
}
|
|
|
|
async createLead(leadData: QuickAddLeadData) {
|
|
await this.openQuickAddModal();
|
|
await this.selectQuickAddTab("Lead");
|
|
|
|
await this.quickAddLeadTitleInput.fill(leadData.title);
|
|
await this.quickAddLeadDescriptionTextarea.fill(leadData.description);
|
|
|
|
await this.submitQuickAdd();
|
|
|
|
await expect(this.quickAddLeadSuccessMsg).toBeVisible();
|
|
|
|
await this.page.goto("admin/leads");
|
|
await this.searchInput.fill(leadData.title);
|
|
await this.page.keyboard.press("Enter");
|
|
await expect(this.page.getByText(leadData.title).first()).toBeVisible();
|
|
}
|
|
|
|
async createPerson(personData: QuickAddPersonData) {
|
|
await this.openQuickAddModal();
|
|
await this.selectQuickAddTab("Person");
|
|
|
|
await this.quickAddPersonNameInput.fill(personData.name);
|
|
await this.quickAddPersonEmailInput.fill(personData.email);
|
|
await this.quickAddPersonContactInput.fill(personData.contactNumber);
|
|
|
|
await this.submitQuickAdd();
|
|
|
|
await expect(this.quickAddPersonSuccessMsg).toBeVisible();
|
|
|
|
await this.page.goto("admin/contacts/persons");
|
|
await this.searchByName(personData.name);
|
|
await expect(this.page.getByText(personData.name).first()).toBeVisible();
|
|
}
|
|
|
|
async createOrganization(organizationData: QuickAddOrganizationData) {
|
|
await this.openQuickAddModal();
|
|
await this.selectQuickAddTab("Organization");
|
|
|
|
await this.quickAddOrgNameInput.fill(organizationData.name);
|
|
|
|
await this.submitQuickAdd();
|
|
|
|
await expect(this.quickAddOrgSuccessMsg).toBeVisible();
|
|
|
|
await this.page.goto("admin/contacts/organizations");
|
|
await this.searchByName(organizationData.name);
|
|
await expect(this.page.getByText(organizationData.name).first()).toBeVisible();
|
|
}
|
|
|
|
async createProduct(productData: QuickAddProductData) {
|
|
await this.openQuickAddModal();
|
|
await this.selectQuickAddTab("Product");
|
|
|
|
await this.quickAddProductNameInput.fill(productData.name);
|
|
await this.quickAddProductDescriptionTextarea.fill(productData.description);
|
|
await this.quickAddProductSkuInput.fill(productData.sku);
|
|
await this.quickAddProductQuantityInput.fill(productData.quantity);
|
|
await this.quickAddProductPriceInput.fill(productData.price);
|
|
|
|
await this.submitQuickAdd();
|
|
|
|
await expect(this.quickAddProductSuccessMsg).toBeVisible();
|
|
|
|
await this.page.goto("admin/products");
|
|
await this.searchByName(productData.name);
|
|
await expect(this.page.getByText(productData.name).first()).toBeVisible();
|
|
}
|
|
|
|
async createMail(mailData: QuickAddMailData) {
|
|
await this.openQuickAddModal();
|
|
await this.selectQuickAddTab("Email");
|
|
|
|
await this.quickAddMailReplyToInput.fill(mailData.replyTo);
|
|
await this.quickAddMailSubjectInput.fill(mailData.subject);
|
|
await this.quickAddMailEditorFrame.locator("body").fill(mailData.body);
|
|
|
|
await this.submitQuickAdd();
|
|
|
|
await expect(this.quickAddMailSuccessMsg).toBeVisible();
|
|
}
|
|
|
|
/**
|
|
* Validation errors must keep the modal mounted instead of closing it.
|
|
*/
|
|
async submitEmptyForm(tabLabel: QuickAddTab) {
|
|
await this.openQuickAddModal();
|
|
await this.selectQuickAddTab(tabLabel);
|
|
|
|
await this.submitQuickAdd();
|
|
|
|
await expect(this.quickAddModalTitle).toBeVisible();
|
|
}
|
|
}
|