diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/campaign.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/campaign.spec.ts new file mode 100644 index 0000000000..57bb70910d --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/campaign.spec.ts @@ -0,0 +1,123 @@ +import { expect, test } from "../../../setup"; +import { generateCampaignName, generateDate, generateDescription, generateFullName } from "../../../utils/faker"; + +test.describe("campaign management", () => { + test("should create a event for campaign", async ({ adminPage }) => { + /** + * Reaching to the events listing page. + */ + await adminPage.goto("admin/settings/marketing/events"); + + /** + * Opening create event form in modal. + */ + await adminPage.getByRole("button", { name: "Create Event" }).click(); + + /** + * Filling the form with event details. + */ + await adminPage + .locator('input[name="name"]') + .fill(generateFullName()); + await adminPage + .locator('textarea[name="description"]') + .fill(generateDescription()); + await adminPage + .locator('input[name="date"]') + .fill(generateDate()); + await adminPage.getByRole('textbox', { name: 'Date *' }).press('Enter'); + + /** + * Save event and close the modal. + */ + await adminPage.getByRole('button', { name: 'Save Event' }).click(); + + await expect( + adminPage.getByText("Event created successfully.") + ).toBeVisible(); + }); + test("should create a campaign", async ({ adminPage }) => { + /* Navigate to the campaigns listing page */ + await adminPage.goto("admin/settings/marketing/campaigns"); + + /* Click the 'Create Campaign' button to open the form modal */ + await adminPage.getByRole("button", { name: "Create Campaign" }).click(); + + /* Fill in the campaign details */ + await adminPage.locator('input[name="name"]').fill("Test Campaign"); // Campaign name + await adminPage.getByRole('textbox', { name: 'Subject *' }).fill(generateCampaignName()); // First subject fill + await adminPage.getByRole('textbox', { name: 'Subject *' }).click(); // Trigger validation (if needed) + await adminPage.getByRole('textbox', { name: 'Subject *' }).fill(generateCampaignName()); // Second subject fill with description + + /* Select an email template */ + await adminPage.getByText('Email Template').click(); + await adminPage.getByLabel('Email Template').selectOption('1'); + + /* Select an event from the dropdown */ + await adminPage.getByLabel('Event').click(); + await adminPage.selectOption('select#marketing_event_id', { index: 0 }); + + /* Toggle the active status */ + await adminPage.locator('.peer.h-5').click(); + + /* Submit the form and create the campaign */ + await adminPage.getByRole('button', { name: 'Save Activity' }).click(); + + /* Assert the success message */ + await expect( + adminPage.getByText("Campaign created successfully.") + ).toBeVisible(); + }); + + test("should edit a campaign", async ({ adminPage }) => { + /* Navigate to the campaigns listing page */ + await adminPage.goto("admin/settings/marketing/campaigns"); + + /* Click the edit icon/button for the first campaign */ + await adminPage.locator('.row > div:nth-child(6) > a').first().click(); + + /* Update campaign name */ + await adminPage.locator('input[name="name"]').fill("Updated Campaign Name"); + + /* Update subject field */ + await adminPage.getByRole('textbox', { name: 'Subject *' }).fill("Updated Subject Name."); + await adminPage.getByRole('textbox', { name: 'Subject *' }).click(); + await adminPage.getByRole('textbox', { name: 'Subject *' }).fill('subject'); + + /* Update the email template */ + await adminPage.getByText('Email Template').click(); + await adminPage.getByLabel('Email Template').selectOption('1'); + + /* Update the associated event */ + await adminPage.getByLabel('Event').click(); + await adminPage.selectOption('select#marketing_event_id', { index: 0 }); + + /* Toggle the active status */ + await adminPage.locator('.peer.h-5').click(); + + /* Save changes */ + await adminPage.getByRole('button', { name: 'Save Activity' }).click(); + + /* Assert the update success message */ + await expect( + adminPage.getByText("Campaign updated successfully.") + ).toBeVisible(); + + }); + test("should delete a campaign", async ({ adminPage }) => { + /* Navigate to the campaigns listing page */ + await adminPage.goto("admin/settings/marketing/campaigns"); + + /* Click the delete icon/button for the first campaign */ + await adminPage.locator('xpath=(//span[contains(@class, "icon-delete")])[1]').click(); + + /* Confirm the deletion */ + await adminPage.getByRole('button', { name: 'Agree', exact: true }).click(); + + /* Assert the deletion success message */ + await expect( + adminPage.getByText("Campaign deleted successfully.") + ).toBeVisible(); + }); + +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/webhook.spec.ts b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/webhook.spec.ts new file mode 100644 index 0000000000..cac439ba4c --- /dev/null +++ b/packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/webhook.spec.ts @@ -0,0 +1,82 @@ +import { test, expect } from '../../../setup'; +import { generateUniqueWebhookUrl } from '../../../utils/faker'; + +test.describe('Webhook Management', () => { + const originalUrl = generateUniqueWebhookUrl(); + const updatedUrl = generateUniqueWebhookUrl(); + const name = 'Test Webhook'; + const description = 'Webhook for automation'; + const entity = 'persons'; + + test('should create a webhook', async ({ adminPage }) => { + /* Navigate to the webhook listing page */ + await adminPage.goto('admin/settings/webhooks'); + + /* Click the 'Create Webhook' button */ + await adminPage.getByRole('link', { name: 'Create Webhook' }).click(); + + /* Fill the webhook creation form with required data */ + await adminPage.getByRole('textbox', { name: 'Url Endpoint' }).fill(originalUrl); + await adminPage.getByRole('textbox', { name: 'Name' }).fill(name); + await adminPage.locator('#entity_type').selectOption(entity); + await adminPage.getByRole('textbox', { name: 'Description' }).fill(description); + await adminPage.locator('input[name="query_params[0][key]"]').fill('key'); + await adminPage.locator('[id="query_params[0][value]"]').fill('value'); + await adminPage.getByRole('radio', { name: 'x-www-form-urlencoded' }).check(); + await adminPage.locator('input[name="payload[0][key]"]').fill('key'); + await adminPage.locator('input[name="payload[0][value]"]').fill('value'); + + /* Submit the form to save the webhook */ + await adminPage.getByRole('button', { name: 'Save Webhook' }).click(); + + /* Verify that the webhook with originalUrl is visible in the list */ + await expect(adminPage.getByText(originalUrl).first()).toBeVisible(); + }); + + test('should update the webhook', async ({ adminPage }) => { + /* Define updated values for the webhook */ + const updatedName = 'Updated Webhook Name'; + const updatedDescription = 'Updated description for webhook'; + const updatedQueryKey = 'updatedKey'; + const updatedQueryValue = 'updatedValue'; + const updatedPayloadKey = 'updatedPayloadKey'; + const updatedPayloadValue = 'updatedPayloadValue'; + const updatedEntity = 'leads'; + + /* Navigate to the webhook listing page */ + await adminPage.goto('admin/settings/webhooks'); + + /* Click the edit icon of the first webhook in the list */ + await adminPage.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]').click(); + + /* Update the webhook details */ + await adminPage.getByRole('textbox', { name: 'Url Endpoint' }).fill(updatedUrl); + await adminPage.getByRole('textbox', { name: 'Name' }).fill(updatedName); + await adminPage.getByRole('textbox', { name: 'Description' }).fill(updatedDescription); + await adminPage.locator('#entity_type').selectOption(updatedEntity); + await adminPage.locator('input[name="query_params[0][key]"]').fill(updatedQueryKey); + await adminPage.locator('[id="query_params[0][value]"]').fill(updatedQueryValue); + await adminPage.locator('input[name="payload[0][key]"]').fill(updatedPayloadKey); + await adminPage.locator('input[name="payload[0][value]"]').fill(updatedPayloadValue); + + /* Save the updated webhook */ + await adminPage.getByRole('button', { name: 'Save Webhook' }).click(); + + /* Verify that the updated webhook URL is now visible in the list */ + await expect(adminPage.locator('p.break-words', { hasText: updatedUrl }).first()).toBeVisible(); + }); + + test('should delete the webhook', async ({ adminPage }) => { + /* Navigate to the webhook listing page */ + await adminPage.goto('admin/settings/webhooks'); + + /* Click the delete icon of the first webhook in the list */ + await adminPage.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]').click(); + + /* Confirm the deletion action in the modal */ + await adminPage.getByRole('button', { name: 'Agree', exact: true }).click(); + + /* Verify that the webhook with updated URL is no longer visible */ + await expect(adminPage.getByText(updatedUrl).first()).not.toBeVisible(); + }); +}); diff --git a/packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts b/packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts index 95bd77a0ab..2a3d15538d 100644 --- a/packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts +++ b/packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts @@ -448,8 +448,34 @@ function getRandomDateTime() { return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } +/* + +*/ + +function generateCampaignName() { + const adjectives = [ + "Innovative", "Dynamic", "Strategic", "Creative", "Impactful", + "Engaging", "Transformative", "Visionary", "Empowering", "Synergistic" + ]; + + const nouns = [ + "Campaign", "Initiative", "Project", "Program", "Drive", + "Movement", "Mission", "Operation", "Plan", "Strategy" + ]; + + return `${randomElement(adjectives)} ${randomElement(nouns)}`; +} + +/* Generate a random webhook URL */ + function generateUniqueWebhookUrl(): string { + const timestamp = Date.now(); + const random = Math.floor(Math.random() * 1000); + return `https://webhook.test/${timestamp}-${random}`; +} + export { + generateUniqueWebhookUrl, generateName, generateFirstName, generateLastName, @@ -467,5 +493,6 @@ export { createOrganization, generateCompanyName, createPerson, - getRandomDateTime + getRandomDateTime, + generateCampaignName }; \ No newline at end of file