From 651e8aec3867f4e478c313bdee73ba2880133e77 Mon Sep 17 00:00:00 2001 From: AspidDark Date: Sun, 28 Sep 2025 00:39:38 +0300 Subject: [PATCH 1/3] connectors e-2-e functions --- .../src/features/Connectors.feature | 54 +++++++++++++++++++ .../pages/Connectors/ConnectorsLocators.ts | 18 ++++++- e2e-playwright/src/steps/Connectors.steps.ts | 49 +++++++++++++++++ 3 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 e2e-playwright/src/features/Connectors.feature create mode 100644 e2e-playwright/src/steps/Connectors.steps.ts diff --git a/e2e-playwright/src/features/Connectors.feature b/e2e-playwright/src/features/Connectors.feature new file mode 100644 index 000000000..a99bf7f0d --- /dev/null +++ b/e2e-playwright/src/features/Connectors.feature @@ -0,0 +1,54 @@ +Feature: Connectors page visibility and functions + + Scenario: Connectors search is working + Given Kafka Connect is visible + When click on Kafka Connect link + Then Kafka Connect heading visible + Given Connectors with name: "sink_postgres_activities" visible is: "true" + Given Connectors with name: "s3-sink" visible is: "true" + When Connectors searchfield input is: "sink_postgres" + Given Connectors with name: "sink_postgres_activities" visible is: "true" + Given Connectors with name: "s3-sink" visible is: "false" + + Scenario: Connectors main page functions + Given Kafka Connect is visible + When click on Kafka Connect link + Then Kafka Connect heading visible + Given Connectors with name: "sink_postgres_activities" visible is: "true" + Given Connectors with name: "s3-sink" visible is: "true" + When Connectors searchfield input is: "sink_postgres" + Given Connectors with name: "sink_postgres_activities" visible is: "true" + Given Connectors with name: "s3-sink" visible is: "false" + Given Connectors satus is: "RUNNING", type is: "SINK" + Given Connectors row menu menu item "Stop" is clicked + Given Connectors satus is: "STOPPED", type is: "SINK" + Given Connectors row menu menu item "Resume" is clicked + Given Connectors satus is: "RUNNING", type is: "SINK" + Given Connectors row menu menu item "Pause" is clicked + Given Connectors satus is: "PAUSED", type is: "SINK" + Given Connectors row menu menu item "Resume" is clicked + Given Connectors satus is: "RUNNING", type is: "SINK" + + Scenario: Connectors connector page + Given Kafka Connect is visible + When click on Kafka Connect link + Then Kafka Connect heading visible + Given Connectors with name: "sink_postgres_activities" visible is: "true" + When Connectors connector named: "sink_postgres_activities" clicked + Then Connectors connector page with label: "Connectorssink_postgres_activities" open + + Scenario: Connectors connector page functions + Given Kafka Connect is visible + When click on Kafka Connect link + Then Kafka Connect heading visible + Given Connectors with name: "sink_postgres_activities" visible is: "true" + When Connectors connector named: "sink_postgres_activities" clicked + Then Connectors connector page with label: "Connectorssink_postgres_activities" open + Given Connectors connector page status is: "RUNNING" + When Connectors connector menu item "Pause" clicked + Given Connectors connector page status is: "PAUSED" + When Connectors connector menu item "Resume" clicked + Given Connectors connector page status is: "RUNNING" + When Connectors connector menu item "Stop" clicked + Given Connectors connector page state is: "STOPPED" + When Connectors connector menu item "Resume" clicked \ No newline at end of file diff --git a/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts b/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts index 6e21e0b33..4cd7aa749 100644 --- a/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts +++ b/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts @@ -7,5 +7,21 @@ export default class ConnectorsLocators { this.page = page; } - get clustersTab(): Locator { return this.page.getByRole('link', { name: 'Clusters' })}; + get heading(): Locator { return this.page.getByRole('heading', { name: 'Connectors' })}; + get searchBox(): Locator { return this.page.getByRole('textbox', { name: 'Search by Connect Name' })}; + get createConnectorButton(): Locator { return this.page.getByRole('button', { name: 'Create Schema' })}; + get searchButton():Locator { return this.page.locator('.sc-eXzmLu > div > .sc-eAKtBH > svg')}; + get rowMenu():Locator { return this.page.getByRole('cell', { name: 'Dropdown Toggle' })}; + get internalMenuButton(): Locator { return this.page.locator('button').filter({ hasText: 'Restart' })}; + + rowData(value:string): Locator { return this.page.getByRole('cell', { name: value })}; + rowMenuItem(value:string): Locator { return this.page.getByRole('menuitem', { name: value })}; + + cellData(value:string): Locator { return this.page.getByText(value, { exact: true })}; + + localMenuLabel(value:string): Locator { return this.page.getByText(value)}; + + internalMenuCell(value:string): Locator { return this.page.getByRole('cell', { name: value })}; + internalMenuButtonItem(value:string): Locator { return this.page.getByRole('menuitem', { name: value })}; + internalMenuState(value:string): Locator { return this.page.getByRole('group').getByText(value)}; } diff --git a/e2e-playwright/src/steps/Connectors.steps.ts b/e2e-playwright/src/steps/Connectors.steps.ts new file mode 100644 index 000000000..ed6725017 --- /dev/null +++ b/e2e-playwright/src/steps/Connectors.steps.ts @@ -0,0 +1,49 @@ +/* eslint-disable no-unused-vars */ +import { Given, When, Then, setDefaultTimeout } from "@cucumber/cucumber"; +import { expectVisibility, ensureCheckboxState } from "../services/uiHelper"; +import { PlaywrightWorld } from "../support/PlaywrightWorld"; + +setDefaultTimeout(60 * 1000 * 2); + +Given('Connectors with name: {string} visible is: {string}', async function(this: PlaywrightWorld, name: string, visible: string) { + await expectVisibility(this.locators.connectors.rowData(name), visible); +}); + +When('Connectors searchfield input is: {string}', async function(this: PlaywrightWorld, value: string) { + let inputField = this.locators.connectors.searchBox + await inputField.isVisible() + await inputField.fill(value); + await this.locators.connectors.searchButton.click() + +}); + +Given('Connectors satus is: {string}, type is: {string}', async function(this: PlaywrightWorld, status: string, type: string) { + await this.locators.connectors.cellData(status).isVisible(); + await this.locators.connectors.cellData(type).isVisible(); +}); + +Given('Connectors row menu menu item {string} is clicked', async function(this: PlaywrightWorld, menuItem: string) { + await this.locators.connectors.rowMenu.click(); + await this.locators.connectors.rowMenuItem(menuItem).click(); +}); + +When('Connectors connector named: {string} clicked', async function(this: PlaywrightWorld, name: string) { + await this.locators.connectors.rowData(name).click() +}); + +Then('Connectors connector page with label: {string} open', async function(this: PlaywrightWorld, label: string) { + await this.locators.connectors.localMenuLabel(label).isVisible() +}); + +Given('Connectors connector page status is: {string}', async function(this: PlaywrightWorld, status: string) { + await this.locators.connectors.internalMenuCell(status).isVisible(); +}); + +When('Connectors connector menu item {string} clicked', async function(this: PlaywrightWorld, menuItem: string) { + await this.locators.connectors.internalMenuButton.click(); + await this.locators.connectors.internalMenuButtonItem(menuItem).click(); +}); + +Given('Connectors connector page state is: {string}', async function(this: PlaywrightWorld, state: string) { + await this.locators.connectors.internalMenuState(state).isVisible(); +}); \ No newline at end of file From 866fbf2b945f6acbcbe68ab7242119e4d98f31cb Mon Sep 17 00:00:00 2001 From: AspidDark Date: Sun, 28 Sep 2025 01:14:13 +0300 Subject: [PATCH 2/3] old test fixes --- e2e-playwright/src/features/navigation.feature | 2 +- e2e-playwright/src/steps/navigation.steps.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/e2e-playwright/src/features/navigation.feature b/e2e-playwright/src/features/navigation.feature index f57124489..645f8e81e 100644 --- a/e2e-playwright/src/features/navigation.feature +++ b/e2e-playwright/src/features/navigation.feature @@ -28,7 +28,7 @@ Feature: Navigation panel links Given Kafka Connect is visible When click on Kafka Connect link Then Kafka Connect heading visible - Then the end of current URL should be "kafka-connect/clusters" + Then the end of current URL should be "connectors" Scenario: Navigate to KSQL DB Given KSQL DB is visible diff --git a/e2e-playwright/src/steps/navigation.steps.ts b/e2e-playwright/src/steps/navigation.steps.ts index fce37a920..b59b67b66 100644 --- a/e2e-playwright/src/steps/navigation.steps.ts +++ b/e2e-playwright/src/steps/navigation.steps.ts @@ -62,12 +62,12 @@ Given('Kafka Connect is visible', async function() { await expect(this.locators.panel.kafkaConnectLink).toBeVisible(); }); -When('click on Kafka Connect link', async function() { +When('click on Kafka Connect link', async function(this: PlaywrightWorld) { await this.locators.panel.kafkaConnectLink.click(); }); -Then('Kafka Connect heading visible', async function() { - await this.locators.connectors.clustersTab.waitFor({ state: 'visible' }); +Then('Kafka Connect heading visible', async function(this: PlaywrightWorld) { + await this.locators.connectors.heading.waitFor({ state: 'visible' }); }); Given('KSQL DB is visible', async function() { From 71e2efd1510265892d72b4f207cf93aaa04fbbfc Mon Sep 17 00:00:00 2001 From: AspidDark Date: Thu, 9 Oct 2025 22:57:33 +0300 Subject: [PATCH 3/3] KafkaConnect --- .../src/features/Connectors.feature | 54 ----------------- .../src/features/KafkaConnect.feature | 58 +++++++++++++++++++ .../src/features/TopicsMessages.feature | 1 - .../src/features/navigation.feature | 2 +- .../pages/Connectors/ConnectorsLocators.ts | 3 +- e2e-playwright/src/steps/Connectors.steps.ts | 49 ---------------- .../src/steps/KafkaConnect.steps.ts | 51 ++++++++++++++++ 7 files changed, 111 insertions(+), 107 deletions(-) delete mode 100644 e2e-playwright/src/features/Connectors.feature create mode 100644 e2e-playwright/src/features/KafkaConnect.feature delete mode 100644 e2e-playwright/src/steps/Connectors.steps.ts create mode 100644 e2e-playwright/src/steps/KafkaConnect.steps.ts diff --git a/e2e-playwright/src/features/Connectors.feature b/e2e-playwright/src/features/Connectors.feature deleted file mode 100644 index a99bf7f0d..000000000 --- a/e2e-playwright/src/features/Connectors.feature +++ /dev/null @@ -1,54 +0,0 @@ -Feature: Connectors page visibility and functions - - Scenario: Connectors search is working - Given Kafka Connect is visible - When click on Kafka Connect link - Then Kafka Connect heading visible - Given Connectors with name: "sink_postgres_activities" visible is: "true" - Given Connectors with name: "s3-sink" visible is: "true" - When Connectors searchfield input is: "sink_postgres" - Given Connectors with name: "sink_postgres_activities" visible is: "true" - Given Connectors with name: "s3-sink" visible is: "false" - - Scenario: Connectors main page functions - Given Kafka Connect is visible - When click on Kafka Connect link - Then Kafka Connect heading visible - Given Connectors with name: "sink_postgres_activities" visible is: "true" - Given Connectors with name: "s3-sink" visible is: "true" - When Connectors searchfield input is: "sink_postgres" - Given Connectors with name: "sink_postgres_activities" visible is: "true" - Given Connectors with name: "s3-sink" visible is: "false" - Given Connectors satus is: "RUNNING", type is: "SINK" - Given Connectors row menu menu item "Stop" is clicked - Given Connectors satus is: "STOPPED", type is: "SINK" - Given Connectors row menu menu item "Resume" is clicked - Given Connectors satus is: "RUNNING", type is: "SINK" - Given Connectors row menu menu item "Pause" is clicked - Given Connectors satus is: "PAUSED", type is: "SINK" - Given Connectors row menu menu item "Resume" is clicked - Given Connectors satus is: "RUNNING", type is: "SINK" - - Scenario: Connectors connector page - Given Kafka Connect is visible - When click on Kafka Connect link - Then Kafka Connect heading visible - Given Connectors with name: "sink_postgres_activities" visible is: "true" - When Connectors connector named: "sink_postgres_activities" clicked - Then Connectors connector page with label: "Connectorssink_postgres_activities" open - - Scenario: Connectors connector page functions - Given Kafka Connect is visible - When click on Kafka Connect link - Then Kafka Connect heading visible - Given Connectors with name: "sink_postgres_activities" visible is: "true" - When Connectors connector named: "sink_postgres_activities" clicked - Then Connectors connector page with label: "Connectorssink_postgres_activities" open - Given Connectors connector page status is: "RUNNING" - When Connectors connector menu item "Pause" clicked - Given Connectors connector page status is: "PAUSED" - When Connectors connector menu item "Resume" clicked - Given Connectors connector page status is: "RUNNING" - When Connectors connector menu item "Stop" clicked - Given Connectors connector page state is: "STOPPED" - When Connectors connector menu item "Resume" clicked \ No newline at end of file diff --git a/e2e-playwright/src/features/KafkaConnect.feature b/e2e-playwright/src/features/KafkaConnect.feature new file mode 100644 index 000000000..5580331b4 --- /dev/null +++ b/e2e-playwright/src/features/KafkaConnect.feature @@ -0,0 +1,58 @@ +Feature: KafkaConnect page visibility and functions + + Scenario: KafkaConnect search is working + Given Kafka Connect is visible + When click on Kafka Connect link + Then Kafka Connect heading visible + Given KafkaConnect cell element "first" is clicked + Given KafkaConnect with name: "sink_postgres_activities" visible is: "true" + Given KafkaConnect with name: "s3-sink" visible is: "true" + When KafkaConnect searchfield input is: "sink_postgres" + Given KafkaConnect with name: "sink_postgres_activities" visible is: "true" + Given KafkaConnect with name: "s3-sink" visible is: "false" + + Scenario: KafkaConnect main page functions + Given Kafka Connect is visible + When click on Kafka Connect link + Then Kafka Connect heading visible + Given KafkaConnect cell element "first" is clicked + Given KafkaConnect with name: "sink_postgres_activities" visible is: "true" + Given KafkaConnect with name: "s3-sink" visible is: "true" + When KafkaConnect searchfield input is: "sink_postgres" + Given KafkaConnect with name: "sink_postgres_activities" visible is: "true" + Given KafkaConnect with name: "s3-sink" visible is: "false" + Given KafkaConnect satus is: "RUNNING", type is: "SINK" + Given KafkaConnect row menu menu item "Stop" is clicked + Given KafkaConnect satus is: "STOPPED", type is: "SINK" + Given KafkaConnect row menu menu item "Resume" is clicked + Given KafkaConnect satus is: "RUNNING", type is: "SINK" + Given KafkaConnect row menu menu item "Pause" is clicked + Given KafkaConnect satus is: "PAUSED", type is: "SINK" + Given KafkaConnect row menu menu item "Resume" is clicked + Given KafkaConnect satus is: "RUNNING", type is: "SINK" + + Scenario: KafkaConnect connector page + Given Kafka Connect is visible + When click on Kafka Connect link + Then Kafka Connect heading visible + Given KafkaConnect cell element "first" is clicked + Given KafkaConnect with name: "sink_postgres_activities" visible is: "true" + When KafkaConnect connector named: "sink_postgres_activities" clicked + Then KafkaConnect connector page with label: "KafkaConnectsink_postgres_activities" open + + Scenario: KafkaConnect connector page functions + Given Kafka Connect is visible + When click on Kafka Connect link + Then Kafka Connect heading visible + Given KafkaConnect cell element "first" is clicked + Given KafkaConnect with name: "sink_postgres_activities" visible is: "true" + When KafkaConnect connector named: "sink_postgres_activities" clicked + Then KafkaConnect connector page with label: "KafkaConnectsink_postgres_activities" open + Given KafkaConnect connector page status is: "RUNNING" + When KafkaConnect connector menu item "Pause" clicked + Given KafkaConnect connector page status is: "PAUSED" + When KafkaConnect connector menu item "Resume" clicked + Given KafkaConnect connector page status is: "RUNNING" + When KafkaConnect connector menu item "Stop" clicked + Given KafkaConnect connector page state is: "STOPPED" + When KafkaConnect connector menu item "Resume" clicked \ No newline at end of file diff --git a/e2e-playwright/src/features/TopicsMessages.feature b/e2e-playwright/src/features/TopicsMessages.feature index 45ff29b24..1f4eebf9b 100644 --- a/e2e-playwright/src/features/TopicsMessages.feature +++ b/e2e-playwright/src/features/TopicsMessages.feature @@ -154,7 +154,6 @@ Feature: Produce Messages page Then Topics TopicName Messages filter name starts with: "Filter" visible is: "true" Then Topics TopicName Messages exist is: "true" - Given Topics TopicName Messages edit filter button click Given Topics TopicName AddFilter filterCode change value is: "3" Then Topics TopicName AddFilter EditFilter button click diff --git a/e2e-playwright/src/features/navigation.feature b/e2e-playwright/src/features/navigation.feature index 645f8e81e..0ad39d682 100644 --- a/e2e-playwright/src/features/navigation.feature +++ b/e2e-playwright/src/features/navigation.feature @@ -28,7 +28,7 @@ Feature: Navigation panel links Given Kafka Connect is visible When click on Kafka Connect link Then Kafka Connect heading visible - Then the end of current URL should be "connectors" + Then the end of current URL should be "clusters" Scenario: Navigate to KSQL DB Given KSQL DB is visible diff --git a/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts b/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts index 4cd7aa749..b66fc26e8 100644 --- a/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts +++ b/e2e-playwright/src/pages/Connectors/ConnectorsLocators.ts @@ -7,10 +7,9 @@ export default class ConnectorsLocators { this.page = page; } - get heading(): Locator { return this.page.getByRole('heading', { name: 'Connectors' })}; + get heading(): Locator { return this.page.getByRole('heading', { name: 'Kafka Connect' })}; get searchBox(): Locator { return this.page.getByRole('textbox', { name: 'Search by Connect Name' })}; get createConnectorButton(): Locator { return this.page.getByRole('button', { name: 'Create Schema' })}; - get searchButton():Locator { return this.page.locator('.sc-eXzmLu > div > .sc-eAKtBH > svg')}; get rowMenu():Locator { return this.page.getByRole('cell', { name: 'Dropdown Toggle' })}; get internalMenuButton(): Locator { return this.page.locator('button').filter({ hasText: 'Restart' })}; diff --git a/e2e-playwright/src/steps/Connectors.steps.ts b/e2e-playwright/src/steps/Connectors.steps.ts deleted file mode 100644 index ed6725017..000000000 --- a/e2e-playwright/src/steps/Connectors.steps.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* eslint-disable no-unused-vars */ -import { Given, When, Then, setDefaultTimeout } from "@cucumber/cucumber"; -import { expectVisibility, ensureCheckboxState } from "../services/uiHelper"; -import { PlaywrightWorld } from "../support/PlaywrightWorld"; - -setDefaultTimeout(60 * 1000 * 2); - -Given('Connectors with name: {string} visible is: {string}', async function(this: PlaywrightWorld, name: string, visible: string) { - await expectVisibility(this.locators.connectors.rowData(name), visible); -}); - -When('Connectors searchfield input is: {string}', async function(this: PlaywrightWorld, value: string) { - let inputField = this.locators.connectors.searchBox - await inputField.isVisible() - await inputField.fill(value); - await this.locators.connectors.searchButton.click() - -}); - -Given('Connectors satus is: {string}, type is: {string}', async function(this: PlaywrightWorld, status: string, type: string) { - await this.locators.connectors.cellData(status).isVisible(); - await this.locators.connectors.cellData(type).isVisible(); -}); - -Given('Connectors row menu menu item {string} is clicked', async function(this: PlaywrightWorld, menuItem: string) { - await this.locators.connectors.rowMenu.click(); - await this.locators.connectors.rowMenuItem(menuItem).click(); -}); - -When('Connectors connector named: {string} clicked', async function(this: PlaywrightWorld, name: string) { - await this.locators.connectors.rowData(name).click() -}); - -Then('Connectors connector page with label: {string} open', async function(this: PlaywrightWorld, label: string) { - await this.locators.connectors.localMenuLabel(label).isVisible() -}); - -Given('Connectors connector page status is: {string}', async function(this: PlaywrightWorld, status: string) { - await this.locators.connectors.internalMenuCell(status).isVisible(); -}); - -When('Connectors connector menu item {string} clicked', async function(this: PlaywrightWorld, menuItem: string) { - await this.locators.connectors.internalMenuButton.click(); - await this.locators.connectors.internalMenuButtonItem(menuItem).click(); -}); - -Given('Connectors connector page state is: {string}', async function(this: PlaywrightWorld, state: string) { - await this.locators.connectors.internalMenuState(state).isVisible(); -}); \ No newline at end of file diff --git a/e2e-playwright/src/steps/KafkaConnect.steps.ts b/e2e-playwright/src/steps/KafkaConnect.steps.ts new file mode 100644 index 000000000..50a3cc3d4 --- /dev/null +++ b/e2e-playwright/src/steps/KafkaConnect.steps.ts @@ -0,0 +1,51 @@ + +import { Given, When, Then, setDefaultTimeout } from "@cucumber/cucumber"; +import { expectVisibility } from "../services/uiHelper"; +import { PlaywrightWorld } from "../support/PlaywrightWorld"; + +setDefaultTimeout(60 * 1000 * 2); + +Given('KafkaConnect with name: {string} visible is: {string}', async function(this: PlaywrightWorld, name: string, visible: string) { + await expectVisibility(this.locators.connectors.rowData(name), visible); +}); + +When('KafkaConnect cell element {string} is clicked', async function(this: PlaywrightWorld, value: string) { + await this.locators.connectors.cellData(value).click(); +}); + +When('KafkaConnect searchfield input is: {string}', async function(this: PlaywrightWorld, value: string) { + let inputField = this.locators.connectors.searchBox + await inputField.isVisible() + await inputField.fill(value); +}); + +Given('KafkaConnect satus is: {string}, type is: {string}', async function(this: PlaywrightWorld, status: string, type: string) { + await this.locators.connectors.cellData(status).isVisible(); + await this.locators.connectors.cellData(type).isVisible(); +}); + +Given('KafkaConnect row menu menu item {string} is clicked', async function(this: PlaywrightWorld, menuItem: string) { + await this.locators.connectors.rowMenu.click(); + await this.locators.connectors.rowMenuItem(menuItem).click(); +}); + +When('KafkaConnect connector named: {string} clicked', async function(this: PlaywrightWorld, name: string) { + await this.locators.connectors.rowData(name).click() +}); + +Then('KafkaConnect connector page with label: {string} open', async function(this: PlaywrightWorld, label: string) { + await this.locators.connectors.localMenuLabel(label).isVisible() +}); + +Given('KafkaConnect connector page status is: {string}', async function(this: PlaywrightWorld, status: string) { + await this.locators.connectors.internalMenuCell(status).isVisible(); +}); + +When('KafkaConnect connector menu item {string} clicked', async function(this: PlaywrightWorld, menuItem: string) { + await this.locators.connectors.internalMenuButton.click(); + await this.locators.connectors.internalMenuButtonItem(menuItem).click(); +}); + +Given('KafkaConnect connector page state is: {string}', async function(this: PlaywrightWorld, state: string) { + await this.locators.connectors.internalMenuState(state).isVisible(); +});