From 83add0d1e6e0e6935df000cbaa6868665f279b95 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 | 29 +++++++----- cypress/e2e/StatusList.spec.cy.ts | 19 ++++---- cypress/support/commands.ts | 45 ++++++++++++------- cypress/support/constants.ts | 4 ++ cypress/support/selectors.ts | 17 +++++-- .../steps/ReviewStep/ReviewStep.tsx | 2 + 6 files changed, 78 insertions(+), 38 deletions(-) diff --git a/cypress/e2e/NewPolicy.spec.cy.ts b/cypress/e2e/NewPolicy.spec.cy.ts index dd86b139..6d0fc43a 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,38 @@ const deletePolicyFromDetailsPage = (policyName: string) => { cy.contains('h1', 'NodeNetworkConfigurationPolicy'); }; -describe.skip('Create new policy with form', () => { +describe('Create new policy with form', () => { beforeEach(() => { cy.login(); }); - 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 696287a1..e0c3d054 100644 --- a/cypress/e2e/StatusList.spec.cy.ts +++ b/cypress/e2e/StatusList.spec.cy.ts @@ -3,8 +3,9 @@ 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', () => { @@ -24,7 +25,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 +53,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 +87,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 +108,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 +126,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 +148,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 +164,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 +186,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 4756b324..7aec85c3 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -1,13 +1,23 @@ /* eslint-disable @typescript-eslint/no-namespace */ /// -import { KUBEADMIN_IDP, KUBEADMIN_USERNAME } from './constants'; +import { + KUBEADMIN_IDP, + KUBEADMIN_PASSWORD_ENV_KEY, + KUBEADMIN_USERNAME, + NETWORKING, + NODE_NETWORK_CONFIGURATION_POLICY, +} from './constants'; +import { + NNCP_NAV_ITEM, + OCP_GUIDED_TOUR_MODAL, + OCP_GUIDED_TOUR_SKIP_BUTTON, + PASSWORD_INPUT, + SIDE_NAV_BAR, + SUBMIT_BUTTON, + USERNAME_INPUT, +} 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,12 +29,11 @@ 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). @@ -33,11 +42,15 @@ Cypress.Commands.add('login', (provider, username, password) => { 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'); + // Close the OCP guided tour if it's displayed + cy.get('body').then(($body) => { + if ($body.find(OCP_GUIDED_TOUR_MODAL)) { + cy.get(OCP_GUIDED_TOUR_SKIP_BUTTON).click(); + } + }); + + cy.contains(SIDE_NAV_BAR, NETWORKING).click(); + cy.contains(NNCP_NAV_ITEM, NODE_NETWORK_CONFIGURATION_POLICY).should('be.visible'); return; } @@ -53,9 +66,9 @@ Cypress.Commands.add('login', (provider, username, password) => { } }); - cy.get('#inputUsername').type(username || KUBEADMIN_USERNAME); - cy.get('#inputPassword').type(password || Cypress.env('KUBEADMIN_PASSWORD')); - cy.get(submitButton).click(); + cy.get(USERNAME_INPUT).type(username || KUBEADMIN_USERNAME); + cy.get(PASSWORD_INPUT).type(password || Cypress.env(KUBEADMIN_PASSWORD_ENV_KEY)); + cy.get(SUBMIT_BUTTON).click(); }); }); diff --git a/cypress/support/constants.ts b/cypress/support/constants.ts index f47e519d..add4dfe5 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 KUBEADMIN_PASSWORD_ENV_KEY = 'KUBEADMIN_PASSWORD'; + +export const NETWORKING = 'Networking'; +export const NODE_NETWORK_CONFIGURATION_POLICY = 'NodeNetworkConfigurationPolicy'; diff --git a/cypress/support/selectors.ts b/cypress/support/selectors.ts index 00f4bf69..0061f059 100644 --- a/cypress/support/selectors.ts +++ b/cypress/support/selectors.ts @@ -1,10 +1,21 @@ +export const SIDE_NAV_BAR = 'li[data-test="nav"]'; + export const EXPAND_INTERFACES_LIST_TEST_ID = '#expand-interfaces-list0'; export const EXPAND_INTERFACE_INFO = 'ethernet-expandable-section-toggle'; 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 OCP_GUIDED_TOUR_SKIP_BUTTON = '[data-test="tour-step-footer-secondary"]'; + +export const SUBMIT_BUTTON = 'button[type=submit]'; + +export const NNCP_NAV_ITEM = '*[data-test-id="nodenetworkconfigurationpolicy-nav-item"]'; + +export const USERNAME_INPUT = '#inputUsername'; +export const PASSWORD_INPUT = '#inputPassword'; diff --git a/src/utils/components/PolicyForm/PolicyWizard/steps/ReviewStep/ReviewStep.tsx b/src/utils/components/PolicyForm/PolicyWizard/steps/ReviewStep/ReviewStep.tsx index afcbc5a0..54a95879 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 }) =