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

101 lines
4.2 KiB
TypeScript

import { Page, Locator, expect } from '@playwright/test';
import { SettingsPage } from '../SettingsPage';
import { generateDescription, generateFirstName } from '../../utils/faker';
export type WebhookData = {
url: string;
name: string;
description: string;
entity: string;
};
export const webhookData: WebhookData = {
url: 'https://example.com/webhook',
name: generateFirstName(),
description: generateDescription().slice(0, 50),
entity: 'persons',
};
export class WebhookPage extends SettingsPage {
readonly page: Page;
readonly createButton: Locator;
readonly editButton: Locator;
readonly deleteButton: Locator;
readonly urlEndpointInput: Locator;
readonly nameInput: Locator;
readonly descriptionInput: Locator;
readonly entityTypeSelect: Locator;
readonly queryParamKeyInput: Locator;
readonly queryParamValueInput: Locator;
readonly contentTypeRadio: Locator;
readonly payloadKeyInput: Locator;
readonly payloadValueInput: Locator;
readonly saveButton: Locator;
readonly deleteConfirmButton: Locator;
readonly listingUrl: string;
constructor(page: Page) {
super(page);
this.page = page;
this.listingUrl = 'admin/settings/webhooks';
// Main actions
this.createButton = page.getByRole('link', { name: 'Create Webhook' });
this.editButton = page.locator('(//span[@class="cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center icon-edit"])[1]');
this.deleteButton = page.locator('(//span[@class="cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center icon-delete"])[1]');
// Form fields
this.urlEndpointInput = page.getByRole('textbox', { name: 'Url Endpoint' });
this.nameInput = page.getByRole('textbox', { name: 'Name' });
this.descriptionInput = page.getByRole('textbox', { name: 'Description' });
this.entityTypeSelect = page.locator('#entity_type');
this.queryParamKeyInput = page.locator('input[name="query_params[0][key]"]');
this.queryParamValueInput = page.locator('[id="query_params[0][value]"]');
this.contentTypeRadio = page.getByRole('radio', { name: 'x-www-form-urlencoded' });
this.payloadKeyInput = page.locator('input[name="payload[0][key]"]');
this.payloadValueInput = page.locator('input[name="payload[0][value]"]');
this.saveButton = page.getByRole('button', { name: 'Save Webhook' });
this.deleteConfirmButton = page.getByRole('button', { name: 'Agree', exact: true });
}
async createWebhook(webhookData: WebhookData) {
await this.createButton.click();
await this.urlEndpointInput.fill(webhookData.url);
await this.nameInput.fill(webhookData.name);
await this.entityTypeSelect.selectOption(webhookData.entity);
await this.descriptionInput.fill(webhookData.description);
await this.queryParamKeyInput.fill('key');
await this.queryParamValueInput.fill('value');
await this.contentTypeRadio.check();
await this.payloadKeyInput.fill('key');
await this.payloadValueInput.fill('value');
await this.saveButton.click();
await expect(this.successMessage.first()).toBeVisible();
}
async updateFirstWebhook(webhookData: WebhookData) {
await this.editButton.click();
await this.urlEndpointInput.fill(webhookData.url);
await this.nameInput.fill(webhookData.name);
await this.descriptionInput.fill(webhookData.description);
await this.entityTypeSelect.selectOption(webhookData.entity);
await this.queryParamKeyInput.fill('updatedKey');
await this.queryParamValueInput.fill('updatedValue');
await this.payloadKeyInput.fill('updatedPayloadKey');
await this.payloadValueInput.fill('updatedPayloadValue');
await this.saveButton.click();
await this.searchWebhook(webhookData.name);
await expect(this.page.locator('p.break-words', { hasText: webhookData.url }).first()).toBeVisible();
}
async deleteWebhook() {
await this.deleteButton.click();
await this.deleteConfirmButton.click();
await expect(this.successMessage.first()).toBeVisible();
}
async searchWebhook(name: string) {
await this.searchInputExact.fill(name);
await this.page.keyboard.press('Enter');
}
}