Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MGDSTRM-10602 and couple minor improvements from last week #160

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/pom/streams/instance/topic/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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"]');
Expand Down
12 changes: 12 additions & 0 deletions lib/pom/streams/instance/topicList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}
63 changes: 63 additions & 0 deletions lib/pom/streams/kafkaInstanceList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}
}
13 changes: 1 addition & 12 deletions tests/rhosak/access.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 }) => {
Expand Down
26 changes: 4 additions & 22 deletions tests/rhosak/kas.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
40 changes: 8 additions & 32 deletions tests/rhosak/kas_messaging.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down
63 changes: 7 additions & 56 deletions tests/rhosak/kas_with_instance.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 }) => {
Expand Down Expand Up @@ -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);
Expand Down