Files
upstream-mirror 135ffdb085
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
snapshot of https://github.com/krayin/laravel-crm.git (2.2, 2026-09-18; blobs > 131072B omitted)
2026-09-18 04:37:41 +05:00

121 lines
4.7 KiB
TypeScript

import { expect, Locator, Page } from "playwright/test";
import CoreLocators from "../locator/CoreLocators";
import { generateEmail, generateFullName, generateName, generatePhoneNumber } from "../utils/faker";
import { organizationData } from "../pages/OrganizationPage";
export type PersonData = {
name: string;
emails: string; // array to hold multiple emails
contactNumber: string; // array to hold multiple contact numbers
jobTitle: string;
salesOwnerId: string; // id or value representing Sales Owner
organizationName: string;
};
/**
* Build a person with an email and contact number unique to this call.
*
* Both fields are unique in Krayin, so two persons built from one shared object cannot both be
* saved — the second submit fails with "The value has already been taken." Each spec that creates
* a person therefore needs its own instance, while keeping that instance stable *within* the spec
* so the create / edit / delete cases all address the same record.
*/
export function buildPersonData(overrides: Partial<PersonData> = {}): PersonData {
return {
name: generateName(),
emails: generateEmail(),
contactNumber: generatePhoneNumber(),
jobTitle: generateName(),
salesOwnerId: "1", // Example sales owner id
organizationName: organizationData.name,
...overrides,
};
}
/**
* Default instance kept for existing importers. Do not create a person from this in more than one
* spec — build a fresh instance instead.
*/
export const personData: PersonData = buildPersonData();
export default class PersonsPage extends CoreLocators {
readonly page: Page;
readonly firstPerson:Locator;
constructor(page: Page) {
super(page),
this.page = page
this.firstPerson= page.locator(`(//div[@class="flex flex-col gap-1.5 dark:text-gray-300"])[1]`);
}
async navigageToPersonsPage() {
await this.page.goto("admin/contacts/persons");
}
async createPerson(personData: PersonData) {
await this.createPersonLink.click();
// Fill person details (use first email/phone if multiple provided)
await this.personNameTextbox.fill(personData.name);
if (personData.emails && personData.emails.length > 0) {
await this.personEmailTextbox.fill(personData.emails);
}
if (personData.contactNumber && personData.contactNumber.length > 0) {
await this.personPhoneTextbox.fill(personData.contactNumber);
}
await this.personJobTitleTextbox.fill(personData.jobTitle || "");
// Assign organization (if provided)
if (personData.organizationName) {
await this.personOrgSelectDiv.click();
await this.searchInputField.fill("Examp");
await this.personOrgListItem("Examp").click();
}
// Save person
await this.savePersonButton.click();
await this.searchInputExact.fill(personData.name);
await this.page.keyboard.press('Enter');
await expect(this.page.getByText(personData.name).first()).toBeVisible();
}
async updatePerson(personData: PersonData) {
await this.searchInputExact.fill(personData.name);
await this.page.keyboard.press('Enter');
await this.firstEditIcon.click();
// Fill person details (use first email/phone if multiple provided)
await this.personNameTextbox.fill(personData.name);
if (personData.emails && personData.emails.length > 0) {
await this.personEmailTextbox.fill(personData.emails);
}
if (personData.contactNumber && personData.contactNumber.length > 0) {
await this.personPhoneTextbox.fill(personData.contactNumber);
}
await this.personJobTitleTextbox.fill(personData.jobTitle || "");
// Assign organization (if provided)
if (personData.organizationName) {
await this.personOrgSelectDiv.click();
await this.searchInputField.fill("Examp");
await this.personOrgListItem("Examp").click();
}
// Save person
await this.savePersonButton.click();
await this.searchInputExact.fill(personData.name);
await expect(this.page.getByText(personData.name).first()).toBeVisible();
}
async personDelete() {
await this.firstDeleteIcon.click();
await this.agreeButton.click();
await expect(this.successMessage.first()).toBeVisible();
}
async personMassDelete() {
await this.multiSelectCheckbox.click();
await this.deleteButton.click();
await this.agreeButton.click();
await expect(this.successMessage.first()).toBeVisible();
}
}