chore(test): Update Kubernetes E2E tests to handle submenu navigation (#8867)

* chore(test): update kubernetes tests
Signed-off-by: Anton Misskii <amisskii@redhat.com>

* fix: title
Signed-off-by: Anton Misskii <amisskii@redhat.com>
This commit is contained in:
Anton Misskii 2024-09-12 16:52:21 +02:00 committed by GitHub
parent 3ec6b40480
commit aa39be33cb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 57 additions and 16 deletions

View file

@ -11,7 +11,7 @@ export let meta: TinroRouteMeta;
<nav
class="z-1 w-leftsidebar min-w-leftsidebar flex-col justify-between flex transition-all duration-500 ease-in-out bg-[var(--pd-secondary-nav-bg)] border-[var(--pd-global-nav-bg-border)] border-r-[1px]"
aria-label="PreferencesNavigation">
aria-label={title + ' Navigation Bar'}>
<div class="flex items-center">
<div class="pt-4 px-3 mb-10">
<p

View file

@ -55,6 +55,7 @@ export * from './model/pages/extensions-page';
export * from './model/pages/image-details-page';
export * from './model/pages/image-edit-page';
export * from './model/pages/images-page';
export * from './model/pages/kubernetes-bar';
export * from './model/pages/kubernetes-resource-details-page';
export * from './model/pages/kubernetes-resource-page';
export * from './model/pages/main-page';

View file

@ -0,0 +1,44 @@
/**********************************************************************
* Copyright (C) 2024 Red Hat, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
***********************************************************************/
import type { Locator, Page } from '@playwright/test';
import type { KubernetesResources } from '../core/types';
import { KubernetesResourcePage } from './kubernetes-resource-page';
export class KubernetesBar {
readonly page: Page;
readonly kubernetesNavBar: Locator;
readonly title: Locator;
constructor(page: Page) {
this.page = page;
this.kubernetesNavBar = page.getByRole('navigation', { name: 'Kubernetes Navigation Bar' });
this.title = this.kubernetesNavBar.getByText('Kubernetes');
}
public async openTabPage(kubernetesResource: KubernetesResources): Promise<KubernetesResourcePage> {
const resource = this.kubernetesNavBar.getByRole('link', { name: kubernetesResource });
await resource.click();
return new KubernetesResourcePage(this.page, kubernetesResource);
}
public getSettingsNavBarTabLocator(name: string): Locator {
return this.kubernetesNavBar.getByLabel(name);
}
}

View file

@ -18,12 +18,11 @@
import { expect, type Locator, type Page } from '@playwright/test';
import type { KubernetesResources } from '../core/types';
import { ContainersPage } from '../pages/containers-page';
import { DashboardPage } from '../pages/dashboard-page';
import { ExtensionsPage } from '../pages/extensions-page';
import { ImagesPage } from '../pages/images-page';
import { KubernetesResourcePage } from '../pages/kubernetes-resource-page';
import { KubernetesBar } from '../pages/kubernetes-bar';
import { PodsPage } from '../pages/pods-page';
import { SettingsBar } from '../pages/settings-bar';
import { VolumesPage } from '../pages/volumes-page';
@ -38,8 +37,7 @@ export class NavigationBar {
readonly dashboardLink: Locator;
readonly settingsLink: Locator;
readonly extensionsLink: Locator;
readonly kubernetesButton: Locator;
readonly kubernetesResources: Locator;
readonly kubernetesLink: Locator;
constructor(page: Page) {
this.page = page;
@ -51,8 +49,7 @@ export class NavigationBar {
this.dashboardLink = this.page.getByRole('link', { name: 'Dashboard' });
this.settingsLink = this.page.getByRole('link', { name: 'Settings' });
this.extensionsLink = this.navigationLocator.getByRole('link', { name: 'Extensions', exact: true });
this.kubernetesButton = this.page.getByRole('button', { name: 'Open Kubernetes Resources Block' });
this.kubernetesResources = this.page.getByRole('region', { name: 'Kubernetes Resources' });
this.kubernetesLink = this.navigationLocator.getByRole('link', { name: 'Kubernetes' });
}
async openDashboard(): Promise<DashboardPage> {
@ -94,15 +91,13 @@ export class NavigationBar {
return new VolumesPage(this.page);
}
async openKubernetesResources(name: KubernetesResources): Promise<KubernetesResourcePage> {
await expect(this.kubernetesButton).toBeEnabled();
if ((await this.kubernetesButton.getAttribute('aria-expanded')) === 'false') {
await this.kubernetesButton.click();
async openKubernetes(): Promise<KubernetesBar> {
const kubernetesBar = new KubernetesBar(this.page);
if (!(await kubernetesBar.kubernetesNavBar.isVisible())) {
await expect(this.kubernetesLink).toBeVisible();
await this.kubernetesLink.click({ timeout: 5000 });
}
await expect(this.kubernetesResources).toBeVisible();
const resource = this.page.getByRole('link', { name: name });
await resource.click();
return new KubernetesResourcePage(this.page, name);
return new KubernetesBar(this.page);
}
async openExtensions(): Promise<ExtensionsPage> {

View file

@ -55,7 +55,8 @@ test.describe('Kubernetes resources End-to-End test', () => {
'Tests suite should not run on Linux platform',
);
test('Kubernetes Nodes test', async ({ navigationBar }) => {
const nodesPage = await navigationBar.openKubernetesResources(KubernetesResources.Nodes);
const kubernetesBar = await navigationBar.openKubernetes();
const nodesPage = await kubernetesBar.openTabPage(KubernetesResources.Nodes);
await playExpect(nodesPage.heading).toBeVisible();
await playExpect(nodesPage.getResourceRowByName(KIND_NODE)).toBeVisible();