From f5f331fd0ff83cf30be7e8e2ab70f864537e4066 Mon Sep 17 00:00:00 2001 From: mmusil Date: Wed, 19 Apr 2023 08:49:27 +0200 Subject: [PATCH] MGDSTRM-10602 and couple minor improvements from last week --- lib/pom/streams/instance/topic/messages.ts | 2 + lib/pom/streams/instance/topicList.ts | 12 +++++ lib/pom/streams/kafkaInstanceList.ts | 63 ++++++++++++++++++++++ tests/rhosak/access.spec.ts | 13 +---- tests/rhosak/kas.spec.ts | 26 ++------- tests/rhosak/kas_messaging.spec.ts | 40 +++----------- tests/rhosak/kas_with_instance.spec.ts | 63 +++------------------- 7 files changed, 97 insertions(+), 122 deletions(-) diff --git a/lib/pom/streams/instance/topic/messages.ts b/lib/pom/streams/instance/topic/messages.ts index a3d8fa6..6ed87cd 100644 --- a/lib/pom/streams/instance/topic/messages.ts +++ b/lib/pom/streams/instance/topic/messages.ts @@ -6,6 +6,7 @@ export class MessagesPage extends TopicListPage { readonly topicName: string; readonly messageMenuButton: Locator; readonly messageTable: Locator; + readonly messageTableBody: Locator; readonly checkForNewDataButton: Locator; readonly searchButton: Locator; readonly filterGroup: Locator; @@ -19,6 +20,7 @@ export class MessagesPage extends TopicListPage { this.topicName = topicName; this.messageMenuButton = page.locator('li[data-ouia-component-id="tab-Topics"]'); this.messageTable = page.locator('table[aria-label="Messages table"]'); + this.messageTableBody = this.messageTable.locator('tbody'); this.checkForNewDataButton = page.locator('button', { hasText: 'Check for new data' }); this.searchButton = page.locator('button[aria-label="Search"]'); this.filterGroup = page.locator('[data-testid="filter-group"]'); diff --git a/lib/pom/streams/instance/topicList.ts b/lib/pom/streams/instance/topicList.ts index 856c99a..cc139bc 100644 --- a/lib/pom/streams/instance/topicList.ts +++ b/lib/pom/streams/instance/topicList.ts @@ -122,4 +122,16 @@ export class TopicListPage extends KafkaInstancePage { } resourceStore.clearKafkaTopicList(); } + + async kafkaTopicExists(name: string) { + return (await this.page.locator('a', { hasText: name }).count()) === 1; + } + + async setupTestKafkaTopic(testTopicName) { + await this.gotoThroughMenu(); + // Do not create topic if it already exists + if (!(await this.kafkaTopicExists(testTopicName))) { + await this.createKafkaTopic(testTopicName, true); + } + } } diff --git a/lib/pom/streams/kafkaInstanceList.ts b/lib/pom/streams/kafkaInstanceList.ts index 03d68b2..1e288d5 100644 --- a/lib/pom/streams/kafkaInstanceList.ts +++ b/lib/pom/streams/kafkaInstanceList.ts @@ -151,4 +151,67 @@ export class KafkaInstanceListPage extends AbstractPage { } resourceStore.clearKafkaList(); } + + async setupTestKafkaInstance(page, testInstanceName: string) { + await this.gotoThroughMenu(); + if ((await this.noKafkaInstancesText.count()) == 1) { + await this.createKafkaInstance(testInstanceName); + await this.waitForKafkaReady(testInstanceName); + } else { + // Test instance present, nothing to do! + try { + await expect(page.getByText(testInstanceName)).toHaveCount(1, { timeout: 2000 }); + await this.waitForKafkaReady(testInstanceName); + } catch (e) { + await this.createKafkaInstance(testInstanceName); + await this.waitForKafkaReady(testInstanceName); + } + } + } + + async resetFilter(page) { + if ((await page.getByText('Clear all filters').count()) > 1) { + await page.getByText('Clear all filters').nth(1).click(); + } + } + + async filterByStatus(page, status) { + await this.resetFilter(page); + await page.getByTestId('large-viewport-toolbar').locator('[aria-label="Options menu"]').click(); + + await page.locator('button[role="option"]:has-text("Status")').click(); + await page.getByTestId('large-viewport-toolbar').getByText('Filter by status').click(); + + await page.getByLabel(status).check(true); + + await page.getByTestId('large-viewport-toolbar').getByText('Filter by status').click(); + } + + async filterByName(page, name, skipClick = false) { + await this.resetFilter(page); + await page.getByTestId('large-viewport-toolbar').locator('[aria-label="Options menu"]').click(); + + await page.locator('button[role="option"]:has-text("Name")').click(); + + await page.getByTestId('large-viewport-toolbar').getByPlaceholder('Filter by name').click(); + await page.getByTestId('large-viewport-toolbar').getByPlaceholder('Filter by name').fill(name); + + if (!skipClick) { + await page.getByRole('button', { name: 'Search' }).click(); + } + } + + async filterByOwner(page, name, skipClick = false) { + await this.resetFilter(page); + await page.getByTestId('large-viewport-toolbar').locator('[aria-label="Options menu"]').click(); + + await page.locator('button[role="option"]:has-text("Owner")').click(); + + await page.getByTestId('large-viewport-toolbar').getByPlaceholder('Filter by owner').click(); + await page.getByTestId('large-viewport-toolbar').getByPlaceholder('Filter by owner').fill(name); + + if (!skipClick) { + await page.getByRole('button', { name: 'Search' }).click(); + } + } } diff --git a/tests/rhosak/access.spec.ts b/tests/rhosak/access.spec.ts index 0d74709..15bb78b 100644 --- a/tests/rhosak/access.spec.ts +++ b/tests/rhosak/access.spec.ts @@ -23,18 +23,7 @@ test.describe('kafka instance manage access tests', () => { await consoleDotAuthPage.login(); await kafkaInstancesPage.gotoThroughMenu(); - if ((await kafkaInstancesPage.noKafkaInstancesText.count()) == 1) { - await kafkaInstancesPage.createKafkaInstance(testInstanceName); - await kafkaInstancesPage.waitForKafkaReady(testInstanceName); - } else { - // Test instance present, nothing to do! - try { - await expect(page.getByText(testInstanceName)).toHaveCount(1, { timeout: 2000 }); - } catch (e) { - await kafkaInstancesPage.createKafkaInstance(testInstanceName); - await kafkaInstancesPage.waitForKafkaReady(testInstanceName); - } - } + await kafkaInstancesPage.setupTestKafkaInstance(page, testInstanceName); }); test.afterAll(async ({ page }) => { diff --git a/tests/rhosak/kas.spec.ts b/tests/rhosak/kas.spec.ts index bce8fdc..e46a23a 100644 --- a/tests/rhosak/kas.spec.ts +++ b/tests/rhosak/kas.spec.ts @@ -70,24 +70,6 @@ test('test Kafka creation units slider', async ({ page }) => { await expect(slider.locator('.pf-c-slider__step-label').last()).toHaveText(config.maxKafkaStreamingUnits.toString()); }); -const resetFilter = async function (page) { - if ((await page.getByText('Clear all filters').count()) > 1) { - await page.getByText('Clear all filters').nth(1).click(); - } -}; - -const filterByStatus = async function (page, status) { - await resetFilter(page); - await page.getByTestId('large-viewport-toolbar').locator('[aria-label="Options menu"]').click(); - - await page.locator('button[role="option"]:has-text("Status")').click(); - await page.getByTestId('large-viewport-toolbar').getByText('Filter by status').click(); - - await page.getByLabel(status).check(true); - - await page.getByTestId('large-viewport-toolbar').getByText('Filter by status').click(); -}; - // test_3kas.py test_kas_kafka_filter_by_status test('test Kafka list filtered by status', async ({ page }) => { const kafkaInstancesPage = new KafkaInstanceListPage(page); @@ -96,17 +78,17 @@ test('test Kafka list filtered by status', async ({ page }) => { await kafkaInstancesPage.createKafkaInstance(testInstanceName); await expect(page.getByText(testInstanceName)).toBeVisible(); - await filterByStatus(page, 'Suspended'); + await kafkaInstancesPage.filterByStatus(page, 'Suspended'); await expect(page.getByText('No results found')).toHaveCount(1); - await filterByStatus(page, 'Creating'); + await kafkaInstancesPage.filterByStatus(page, 'Creating'); await expect(page.getByText(testInstanceName)).toBeTruthy(); // Reset the filter - await resetFilter(page); + await kafkaInstancesPage.resetFilter(page); await kafkaInstancesPage.waitForKafkaReady(testInstanceName); - await filterByStatus(page, 'Ready'); + await kafkaInstancesPage.filterByStatus(page, 'Ready'); await expect(page.getByText(testInstanceName)).toBeTruthy(); await kafkaInstancesPage.deleteKafkaInstance(testInstanceName, false); diff --git a/tests/rhosak/kas_messaging.spec.ts b/tests/rhosak/kas_messaging.spec.ts index e8baac9..ec496f2 100644 --- a/tests/rhosak/kas_messaging.spec.ts +++ b/tests/rhosak/kas_messaging.spec.ts @@ -35,38 +35,16 @@ test.beforeEach(async ({ page }) => { const topicPage = new TopicListPage(page, testInstanceName); const accessPage = new AccessPage(page, testInstanceName); - await kafkaInstancesPage.gotoThroughMenu(); - - if ((await kafkaInstancesPage.noKafkaInstancesText.count()) == 1) { - await kafkaInstancesPage.createKafkaInstance(testInstanceName); - await kafkaInstancesPage.waitForKafkaReady(testInstanceName); - } else { - // Test instance present, nothing to do! - try { - await expect(page.getByText(testInstanceName)).toHaveCount(1, { timeout: 2000 }); - } catch (e) { - await kafkaInstancesPage.createKafkaInstance(testInstanceName); - await kafkaInstancesPage.waitForKafkaReady(testInstanceName); - } - } + await kafkaInstancesPage.setupTestKafkaInstance(page, testInstanceName); + bootstrap = await kafkaInstancesPage.getBootstrapUrl(testInstanceName); await kafkaInstancePage.gotoThroughMenu(); - await topicPage.gotoThroughMenu(); - // Do not create topic if it already exists - // TODO - implement this in POM somehow - await expect(page.getByText('Create topic')).toHaveCount(1); - await expect(page.getByText('Loading content')).toHaveCount(0); - if ((await page.locator('a', { hasText: testTopicName }).count()) === 0) { - await topicPage.createKafkaTopic(testTopicName, true); - } + await topicPage.setupTestKafkaTopic(testTopicName); await serviceAccountPage.gotoThroughMenu(); credentials = await serviceAccountPage.createServiceAccount(testServiceAccountName); - await kafkaInstancesPage.gotoThroughMenu(); - bootstrap = await kafkaInstancesPage.getBootstrapUrl(testInstanceName); - await kafkaInstancePage.gotoThroughMenu(); - await accessPage.gotoThroughMenu(); + await accessPage.gotoFromAnywhere(); await accessPage.grantProducerAccess(credentials.clientID, testTopicName); // Producer 100 messages @@ -101,9 +79,7 @@ test('Consume messages from topic', async ({ page }) => { const consumerGroupsPage = new ConsumerGroupsPage(page, testInstanceName); const accessPage = new AccessPage(page, testInstanceName); - await kafkaInstancesPage.gotoThroughMenu(); - await kafkaInstancePage.gotoThroughMenu(); - await accessPage.gotoThroughMenu(); + await accessPage.gotoFromAnywhere(); await accessPage.grantConsumerAccess(credentials.clientID, testTopicName, consumerGroupId); // Consume 100 messages @@ -139,9 +115,9 @@ test('Browse messages', async ({ page }) => { await messagesPage.refreshMessages(); - await expect(page.locator('table[aria-label="Messages table"]')).toContainText('value-' + testMessageKey); - await expect(page.locator('table[aria-label="Messages table"]')).toContainText('key-' + testMessageKey); - await page.locator('table[aria-label="Messages table"] >> tr').nth(1).click(); + await expect(messagesPage.messageTable).toContainText('value-' + testMessageKey); + await expect(messagesPage.messageTable).toContainText('key-' + testMessageKey); + await messagesPage.messageTable.locator('tr').nth(1).click(); const messageDetail = await page.locator('data-testid=message-details'); await expect(messageDetail.locator('dt:has-text("Offset")')).toHaveCount(1); await expect(messageDetail.locator('dd:has-text("key-")')).toHaveCount(1); diff --git a/tests/rhosak/kas_with_instance.spec.ts b/tests/rhosak/kas_with_instance.spec.ts index d72e760..bab5830 100644 --- a/tests/rhosak/kas_with_instance.spec.ts +++ b/tests/rhosak/kas_with_instance.spec.ts @@ -21,21 +21,7 @@ test.use({ storageState: config.adminAuthFile }); test.beforeEach(async ({ page }) => { const kafkaInstancesPage = new KafkaInstanceListPage(page); - - await kafkaInstancesPage.gotoThroughMenu(); - - if ((await kafkaInstancesPage.noKafkaInstancesText.count()) == 1) { - await kafkaInstancesPage.createKafkaInstance(testInstanceName); - await kafkaInstancesPage.waitForKafkaReady(testInstanceName); - } else { - // Test instance present, nothing to do! - try { - await expect(page.getByText(testInstanceName)).toHaveCount(1, { timeout: 2000 }); - } catch (e) { - await kafkaInstancesPage.createKafkaInstance(testInstanceName); - await kafkaInstancesPage.waitForKafkaReady(testInstanceName); - } - } + await kafkaInstancesPage.setupTestKafkaInstance(page, testInstanceName); }); test.afterEach(async ({ page }) => { @@ -94,70 +80,35 @@ test('test fail to create a second Kafka instance', async ({ page }) => { await page.locator('#modalCreateKafka > button').click(); }); -const filterByName = async function (page, name, skipClick = false) { - if ((await page.getByRole('button', { name: 'Clear all filters' }).count()) > 0) { - await page.getByRole('button', { name: 'Clear all filters' }).click(); - } - await page.getByTestId('large-viewport-toolbar').locator('[aria-label="Options menu"]').click(); - - await page.locator('button[role="option"]:has-text("Name")').click(); - - await page.getByTestId('large-viewport-toolbar').getByPlaceholder('Filter by name').click(); - await page.getByTestId('large-viewport-toolbar').getByPlaceholder('Filter by name').fill(name); - - if (!skipClick) { - await page.getByRole('button', { name: 'Search' }).click(); - } -}; - // test_3kas.py test_kas_kafka_filter_by_name test('test instances can be filtered by name', async ({ page }) => { const kafkaInstancesPage = new KafkaInstanceListPage(page); await kafkaInstancesPage.gotoThroughMenu(); - await filterByName(page, 'test'); + await kafkaInstancesPage.filterByName(page, 'test'); await expect(page.getByText(testInstanceName)).toBeTruthy(); - await filterByName(page, 'wrong'); + await kafkaInstancesPage.filterByName(page, 'wrong'); await expect(page.getByText('No results found')).toHaveCount(1); - await filterByName(page, 'INVALID-SYNTAX#$', true); + await kafkaInstancesPage.filterByName(page, 'INVALID-SYNTAX#$', true); await expect( page.getByText('Valid characters include lowercase letters from a to z, numbers from 0 to 9, and') ).toHaveCount(1); }); -const filterByOwner = async function (page, name, skipClick = false) { - const kafkaInstancesPage = new KafkaInstanceListPage(page); - await kafkaInstancesPage.gotoThroughMenu(); - - if ((await page.getByRole('button', { name: 'Clear all filters' }).count()) > 0) { - await page.getByRole('button', { name: 'Clear all filters' }).click(); - } - await page.getByTestId('large-viewport-toolbar').locator('[aria-label="Options menu"]').click(); - - await page.locator('button[role="option"]:has-text("Owner")').click(); - - await page.getByTestId('large-viewport-toolbar').getByPlaceholder('Filter by owner').click(); - await page.getByTestId('large-viewport-toolbar').getByPlaceholder('Filter by owner').fill(name); - - if (!skipClick) { - await page.getByRole('button', { name: 'Search' }).click(); - } -}; - // test_3kas.py test_kas_kafka_filter_by_owner test('test instances can be filtered by owner', async ({ page }) => { const kafkaInstancesPage = new KafkaInstanceListPage(page); await kafkaInstancesPage.gotoThroughMenu(); - await filterByOwner(page, config.adminUsername.substring(0, 5)); + await kafkaInstancesPage.filterByOwner(page, config.adminUsername.substring(0, 5)); await expect(page.getByText(testInstanceName)).toBeTruthy(); - await filterByOwner(page, 'wrong'); + await kafkaInstancesPage.filterByOwner(page, 'wrong'); await expect(page.getByText('No results found')).toHaveCount(1); - await filterByOwner(page, 'INVALID-SYNTAX#$', true); + await kafkaInstancesPage.filterByOwner(page, 'INVALID-SYNTAX#$', true); await expect( page.getByText('Valid characters include lowercase letters from a to z, numbers from 0 to 9, and') ).toHaveCount(1);