From 7907905737ec7d840e3e2bd0aa8df22cb83ce40d Mon Sep 17 00:00:00 2001 From: Phillip Rhodes Date: Mon, 8 Dec 2025 08:01:23 -0500 Subject: [PATCH] Fix broken tests --- cypress/e2e/NewPolicy.spec.cy.ts | 30 ++++++--- cypress/e2e/StatusList.spec.cy.ts | 20 +++--- cypress/support/commands.ts | 64 ++++++++----------- cypress/support/constants.ts | 4 ++ cypress/support/selectors.ts | 9 ++- .../steps/ReviewStep/ReviewStep.tsx | 2 + 6 files changed, 71 insertions(+), 58 deletions(-) diff --git a/cypress/e2e/NewPolicy.spec.cy.ts b/cypress/e2e/NewPolicy.spec.cy.ts index dd86b13..3789fb0 100644 --- a/cypress/e2e/NewPolicy.spec.cy.ts +++ b/cypress/e2e/NewPolicy.spec.cy.ts @@ -1,5 +1,3 @@ -import { SKIP_WELCOME_BANNER_TEST_ID } from '../support/selectors'; - const deletePolicyFromDetailsPage = (policyName: string) => { cy.contains('button', 'Actions', { matchCase: false }).click(); cy.contains('button', 'Delete').click(); @@ -13,27 +11,39 @@ const deletePolicyFromDetailsPage = (policyName: string) => { cy.contains('h1', 'NodeNetworkConfigurationPolicy'); }; -describe.skip('Create new policy with form', () => { +describe('Create new policy with form', () => { beforeEach(() => { cy.login(); + cy.skipOCPGuidedTour(); }); - it('with bridge interface', () => { + it('with default node network', () => { const testPolicyName = 'test-bridge-policy-name'; + const testDescription = 'Test description'; + cy.visit('/k8s/cluster/nmstate.io~v1~NodeNetworkConfigurationPolicy'); - cy.byTestID(SKIP_WELCOME_BANNER_TEST_ID).click(); cy.byTestID('item-create').click(); cy.contains('button', 'From Form').click(); - cy.get('input[name="policy-name"]').clear().type(`${testPolicyName}`); + // Network identity step + cy.get('input[name="physical-network-name"]').clear().type(`${testPolicyName}`); + cy.contains('button', 'Next').click(); - cy.get('input[name="policy-description"]').clear().type('test-policy-description'); + // Nodes configuration step + cy.get('input[name="policy-name"]').clear().type(`${testPolicyName}`); + cy.get('input[name="policy-description"]').clear().type(`${testDescription}`); + cy.contains('button', 'Next').click(); - cy.contains('button', 'Bridging').click(); - cy.get(`button#add-bridging-interface-button`).click(); + // Uplink connection step - 'Default node network' selected by default cy.contains('button', 'Next').click(); - cy.contains('button', 'Create policy').click(); + + // Settings step is skipped because 'Default node network' is selected + + // Review and Create step + cy.byLegacyTestID('review-physical-network-name').should('have.text', testPolicyName); + cy.byLegacyTestID('review-network-description').should('have.text', testDescription); + cy.contains('button', 'Create network').click(); cy.contains('h1', testPolicyName); diff --git a/cypress/e2e/StatusList.spec.cy.ts b/cypress/e2e/StatusList.spec.cy.ts index 696287a..aa31ef4 100644 --- a/cypress/e2e/StatusList.spec.cy.ts +++ b/cypress/e2e/StatusList.spec.cy.ts @@ -3,13 +3,15 @@ import { EXPAND_INTERFACES_LIST_TEST_ID, INTERFACE_DRAWER_TEST_ID, LLDP_DRAWER_DETAILS_SECTION_TEST_ID, + LLDP_SYSTEM_NAME_FILTER_OPTION_ID, + LLDP_VLAN_NAME_FILTER_OPTION_ID, SEARCH_FILTER_DROPDOWN_TEST_ID, - TEXT_FILTER_BUTTON_SELECTOR, } from '../support/selectors'; describe('NodeNetworkState list', () => { beforeEach(() => { cy.login(); + cy.skipOCPGuidedTour(); }); it('Empty state', () => { @@ -24,7 +26,7 @@ describe('NodeNetworkState list', () => { cy.get('h5').should('contain', 'No NodeNetworkStates found'); }); - it('with one VID instace ', () => { + it('with one VID instance ', () => { cy.intercept('GET', '/api/kubernetes/apis/nmstate.io/v1beta1/nodenetworkstates*', { fixture: 'NodeNetworkStatusWithVID.json', }).as('getStatuses'); @@ -52,7 +54,7 @@ describe('NodeNetworkState list', () => { }); }); - it('with LLDP informations ', () => { + it('with LLDP information', () => { cy.intercept('GET', '/api/kubernetes/apis/nmstate.io/v1beta1/nodenetworkstates*', { fixture: 'NodeNetworkStatusWithLLDP.json', }).as('getStatuses'); @@ -86,7 +88,7 @@ describe('NodeNetworkState list', () => { }); }); - it('filter by lldp', () => { + it('filter by LLDP', () => { cy.intercept('GET', '/api/kubernetes/apis/nmstate.io/v1beta1/nodenetworkstates*', { fixture: 'NodeNetworkStatusWithLLDP.json', }).as('getStatuses'); @@ -107,7 +109,7 @@ describe('NodeNetworkState list', () => { // open filter toolbar cy.get('button').contains('Filter').click({ force: true }); - // filter by lldp enabled + // filter by LLDP enabled cy.contains('label', 'Enabled').find('input[type="checkbox"]').check(); // close filter toolbar by clicking outside @@ -125,7 +127,7 @@ describe('NodeNetworkState list', () => { }); }); - it('search by lldp vlan ID', () => { + it('search by LLDP VLAN ID', () => { cy.intercept('GET', '/api/kubernetes/apis/nmstate.io/v1beta1/nodenetworkstates*', { fixture: 'NodeNetworkStatusWithLLDP.json', }).as('getStatuses'); @@ -147,7 +149,7 @@ describe('NodeNetworkState list', () => { cy.byTestID(SEARCH_FILTER_DROPDOWN_TEST_ID).click(); - cy.get(TEXT_FILTER_BUTTON_SELECTOR).contains('LLDP VLAN name').click(); + cy.get(LLDP_VLAN_NAME_FILTER_OPTION_ID).click(); cy.get('input[data-test-id="item-filter"]').type(VLAN_NAME); @@ -163,7 +165,7 @@ describe('NodeNetworkState list', () => { }); }); - it('search by lldp system name', () => { + it('search by LLDP system name', () => { cy.intercept('GET', '/api/kubernetes/apis/nmstate.io/v1beta1/nodenetworkstates*', { fixture: 'NodeNetworkStatusWithLLDP.json', }).as('getStatuses'); @@ -185,7 +187,7 @@ describe('NodeNetworkState list', () => { cy.byTestID(SEARCH_FILTER_DROPDOWN_TEST_ID).click(); - cy.get(TEXT_FILTER_BUTTON_SELECTOR).contains('LLDP system name').click(); + cy.get(LLDP_SYSTEM_NAME_FILTER_OPTION_ID).click(); cy.get('input[data-test-id="item-filter"]').type(SYSTEM_NAME); diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 4756b32..672bd20 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -1,13 +1,9 @@ /* eslint-disable @typescript-eslint/no-namespace */ /// -import { KUBEADMIN_IDP, KUBEADMIN_USERNAME } from './constants'; +import { KUBEADMIN_IDP, KUBEADMIN_USERNAME, MINUTE, SKIP_TOUR } from './constants'; +import { OCP_GUIDED_TOUR_MODAL, SUBMIT_BUTTON_SELECTOR } from './selectors'; import { ConsoleWindowType } from './types'; -import Loggable = Cypress.Loggable; -import Timeoutable = Cypress.Timeoutable; -import Withinable = Cypress.Withinable; -import Shadow = Cypress.Shadow; - declare global { namespace Cypress { interface Chainable { @@ -19,44 +15,32 @@ declare global { ): Chainable; byLegacyTestID(selector: string): Chainable; clickOutside(): Chainable; + skipOCPGuidedTour(): Chainable; } } } -const submitButton = 'button[type=submit]'; - Cypress.Commands.add('login', (provider, username, password) => { - // Check if auth is disabled (for a local development environment). - cy.visit(''); // visits baseUrl which is set in plugins.js - cy.window().then((win: ConsoleWindowType) => { - if (win.SERVER_FLAGS?.authDisabled) { - cy.log('skipping login, console is running with auth disabled'); - - cy.contains('li[data-test="nav"]', 'Networking').click(); - cy.contains( - '*[data-test-id="nodenetworkconfigurationpolicy-nav-item"]', - 'NodeNetworkConfigurationPolicy', - ).should('be.visible'); - return; + cy.task('log', ` Logging in as ${username || KUBEADMIN_USERNAME}`); + cy.get('.pf-v6-c-login__main', { timeout: 3 * MINUTE }).should('exist'); + const idp = provider || KUBEADMIN_IDP; + cy.get('body').then(($body) => { + if ($body.text().includes(idp)) { + cy.contains(idp).should('be.visible').click(); } - - cy.clearCookie('openshift-session-token'); - - const idp = provider || KUBEADMIN_IDP; - - cy.get('main form').should('be.visible'); - - cy.get('body').then(($body) => { - if ($body.text().includes(idp)) { - cy.contains(idp).should('be.visible').click(); - } - }); - - cy.get('#inputUsername').type(username || KUBEADMIN_USERNAME); - cy.get('#inputPassword').type(password || Cypress.env('KUBEADMIN_PASSWORD')); - cy.get(submitButton).click(); }); + cy.get('#inputUsername').type(username || KUBEADMIN_USERNAME); + cy.get('#inputPassword').type(password || Cypress.env('BRIDGE_KUBEADMIN_PASSWORD')); + cy.get(SUBMIT_BUTTON_SELECTOR).click(); + cy.byTestID(Cypress.env('BRIDGE_KUBEADMIN_PASSWORD') ? 'user-dropdown-toggle' : 'username', { + timeout: MINUTE, + }).should('be.visible'); + // wait for virtualization page appears, only for kubeadmin user + if (idp === KUBEADMIN_IDP) { + cy.contains('You are logged in as a temporary administrative user.').should('be.visible'); + } + cy.task('log', ' Login is successful'); }); Cypress.Commands.add('logout', () => { @@ -83,3 +67,11 @@ Cypress.Commands.add('byLegacyTestID', (selector) => cy.get(`[data-test-id="${se Cypress.Commands.add('clickOutside', () => { return cy.get('body').click(0, 0); //0,0 here are the x and y coordinates }); + +Cypress.Commands.add('skipOCPGuidedTour', () => + cy.get('body').then(($body) => { + if ($body.find(OCP_GUIDED_TOUR_MODAL).length) { + cy.contains('button', SKIP_TOUR).click(); + } + }), +); diff --git a/cypress/support/constants.ts b/cypress/support/constants.ts index f47e519..3eda20c 100644 --- a/cypress/support/constants.ts +++ b/cypress/support/constants.ts @@ -1,2 +1,6 @@ export const KUBEADMIN_USERNAME = 'kubeadmin'; export const KUBEADMIN_IDP = 'kube:admin'; + +export const SKIP_TOUR = 'Skip tour'; + +export const MINUTE = 60000; diff --git a/cypress/support/selectors.ts b/cypress/support/selectors.ts index 00f4bf6..f427e9b 100644 --- a/cypress/support/selectors.ts +++ b/cypress/support/selectors.ts @@ -4,7 +4,10 @@ export const INTERFACE_DRAWER_TEST_ID = 'interface-drawer'; export const LLDP_DRAWER_DETAILS_SECTION_TEST_ID = 'lldp-section'; export const SEARCH_FILTER_DROPDOWN_TEST_ID = 'console-select-menu-toggle'; -export const TEXT_FILTER_BUTTON_SELECTOR = - '.pf-v6-c-menu li.pf-v6-c-menu__list-item button.pf-v6-c-menu__item'; -export const SKIP_WELCOME_BANNER_TEST_ID = 'tour-step-footer-secondary'; +export const LLDP_VLAN_NAME_FILTER_OPTION_ID = '#lldp-name-link'; +export const LLDP_SYSTEM_NAME_FILTER_OPTION_ID = '#lldp-system-name-link'; + +export const OCP_GUIDED_TOUR_MODAL = '[data-test="guided-tour-modal"]'; + +export const SUBMIT_BUTTON_SELECTOR = 'button[type=submit]'; diff --git a/src/utils/components/PolicyForm/PolicyWizard/steps/ReviewStep/ReviewStep.tsx b/src/utils/components/PolicyForm/PolicyWizard/steps/ReviewStep/ReviewStep.tsx index afcbc5a..54a9587 100644 --- a/src/utils/components/PolicyForm/PolicyWizard/steps/ReviewStep/ReviewStep.tsx +++ b/src/utils/components/PolicyForm/PolicyWizard/steps/ReviewStep/ReviewStep.tsx @@ -103,6 +103,7 @@ const ReviewStep: FC = ({ policy, creationError, setPolicy }) = = ({ policy, creationError, setPolicy }) =