From d0d80278449e89e6388bc0d0cc23db0581deaa18 Mon Sep 17 00:00:00 2001 From: Tal Hilzenrat Date: Fri, 30 Jan 2026 16:40:49 -0500 Subject: [PATCH] Redesign tests and pages structure --- cypress/e2e/device.cy.js | 22 +-- cypress/e2e/fleet.cy.js | 50 ++++--- cypress/e2e/repository.cy.js | 32 ++-- cypress/support/commands.js | 237 ------------------------------ cypress/views/common.js | 43 ++++++ cypress/views/devicesPage.js | 86 +++++++++++ cypress/views/fleetsPage.js | 89 +++++++++++ cypress/views/repositoriesPage.js | 64 ++++++++ 8 files changed, 342 insertions(+), 281 deletions(-) create mode 100644 cypress/views/common.js create mode 100644 cypress/views/devicesPage.js create mode 100644 cypress/views/fleetsPage.js create mode 100644 cypress/views/repositoriesPage.js diff --git a/cypress/e2e/device.cy.js b/cypress/e2e/device.cy.js index 741a1ae..4ba01bd 100644 --- a/cypress/e2e/device.cy.js +++ b/cypress/e2e/device.cy.js @@ -1,19 +1,23 @@ +import { devicesPage } from '../views/devicesPage' + describe('Device Management', () => { beforeEach(() => { cy.login(`${Cypress.env('host')}`, `${Cypress.env('auth')}`, `${Cypress.env('username')}`, `${Cypress.env('password')}`) }) - + it('Should approve a device enrollment request', () => { - cy.deviceApproval() + devicesPage.approveDevice() }) -/* it('Should open a terminal on a device', () => { - cy.openTerminal() + + /* it('Should open a terminal on a device', () => { + devicesPage.openTerminal() }) */ + it('Should edit a device', () => { - cy.editDevice(`${Cypress.env('image')}`) + devicesPage.editDevice(`${Cypress.env('image')}`) }) + it('Should decommission a device', () => { - //login command is in commands.js - cy.decommissionDevice() - }) -}) \ No newline at end of file + devicesPage.decommissionDevice() + }) +}) diff --git a/cypress/e2e/fleet.cy.js b/cypress/e2e/fleet.cy.js index c2be3d6..eb18493 100644 --- a/cypress/e2e/fleet.cy.js +++ b/cypress/e2e/fleet.cy.js @@ -1,22 +1,30 @@ +import { fleetsPage } from '../views/fleetsPage' +import { repositoriesPage } from '../views/repositoriesPage' + describe('Fleet Management', () => { - beforeEach(() => { - cy.login(`${Cypress.env('host')}`, `${Cypress.env('auth')}`, `${Cypress.env('username')}`, `${Cypress.env('password')}`) - }) - it('Should create a fleet', () => { - cy.createFleet(`${Cypress.env('image')}`) - }) - /* it('Should edit a fleet', () => { - cy.editFleet(`${Cypress.env('image')}`) - }) */ - it('Should delete a fleet', () => { - cy.deleteFleet('test-fleet') - }) - it('Should import a fleet', () => { - cy.importFleet() - }) - /* it('Should delete an imported fleet', () => { - cy.deleteRepository('test-fleet') - cy.wait(5000) - cy.deleteFleet('basic-nginx-fleet') - }) */ -}) \ No newline at end of file + beforeEach(() => { + cy.login(`${Cypress.env('host')}`, `${Cypress.env('auth')}`, `${Cypress.env('username')}`, `${Cypress.env('password')}`) + }) + + it('Should create a fleet', () => { + fleetsPage.createFleet(`${Cypress.env('image')}`) + }) + + /* it('Should edit a fleet', () => { + fleetsPage.editFleet(`${Cypress.env('image')}`) + }) */ + + it('Should delete a fleet', () => { + fleetsPage.deleteFleet('test-fleet') + }) + + it('Should import a fleet', () => { + fleetsPage.importFleet() + }) + + /* it('Should delete an imported fleet', () => { + repositoriesPage.deleteRepository('test-fleet') + cy.wait(5000) + fleetsPage.deleteFleet('basic-nginx-fleet') + }) */ +}) diff --git a/cypress/e2e/repository.cy.js b/cypress/e2e/repository.cy.js index 2b3a9f2..758a373 100644 --- a/cypress/e2e/repository.cy.js +++ b/cypress/e2e/repository.cy.js @@ -1,15 +1,19 @@ +import { repositoriesPage } from '../views/repositoriesPage' + describe('Repository Management', () => { - beforeEach(() => { - cy.login(`${Cypress.env('host')}`, `${Cypress.env('auth')}`, `${Cypress.env('username')}`, `${Cypress.env('password')}`) - }) -/* it('Should create a repository', () => { - cy.createRepository(`${Cypress.env('repository')}`, `${Cypress.env('revision')}`, `${Cypress.env('resource')}`) - - }) */ - it('Should edit a repository', () => { - cy.editRepository(`${Cypress.env('repository')}`) - }) -/* it('Should delete a repository', () => { - cy.deleteRepository(`${Cypress.env('repository')}`) - }) */ -}) \ No newline at end of file + beforeEach(() => { + cy.login(`${Cypress.env('host')}`, `${Cypress.env('auth')}`, `${Cypress.env('username')}`, `${Cypress.env('password')}`) + }) + + /* it('Should create a repository', () => { + repositoriesPage.createRepository(`${Cypress.env('repository')}`, `${Cypress.env('revision')}`, `${Cypress.env('resource')}`) + }) */ + + it('Should edit a repository', () => { + repositoriesPage.editRepository(`${Cypress.env('repository')}`) + }) + + /* it('Should delete a repository', () => { + repositoriesPage.deleteRepository(`${Cypress.env('repository')}`) + }) */ +}) diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 6890efc..3bf675a 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -24,177 +24,6 @@ Cypress.Commands.add('login', (url=`${Cypress.env('host')}`, auth=`${Cypress.env //cy.get('button.pf-v5-c-menu__item').contains('All Clusters').click() }) -// Command to select organization if the selection page appears -Cypress.Commands.add('selectOrganizationIfNeeded', (orgName = 'Default', maxRetries = 5, retryDelay = 1000) => { - const checkForOrgSelection = (attempt = 1) => { - cy.log(`Checking for organization selection page (attempt ${attempt}/${maxRetries})`) - - // Wait for page to stabilize - cy.wait(retryDelay) - - cy.get('body').then(($body) => { - if ($body.text().includes('Select Organization')) { - cy.log(`Organization selection page detected, selecting ${orgName}`) - // Click on the organization name to select it - cy.contains(orgName).click() - // Click the Continue button - cy.contains('button', 'Continue').click() - // Wait for the page to load after selection - cy.get('.pf-v5-c-page', { timeout: 30000 }).should('exist') - } else if (attempt < maxRetries) { - // Retry if we haven't reached max attempts - cy.log(`Organization selection not found yet, retrying...`) - checkForOrgSelection(attempt + 1) - } else { - cy.log('No organization selection page detected after all retries, continuing...') - } - }) - } - - checkForOrgSelection() -}) - -Cypress.Commands.add('deviceApproval', () => { - cy.get('#nav-toggle').should('exist') - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Devices').click() - cy.selectOrganizationIfNeeded('Default') - cy.get('h2.pf-v5-c-title.pf-m-3xl').contains('Devices pending approval') - cy.get('[data-label="Approve"] > .pf-v5-c-button').should('exist') - cy.get('[data-label="Approve"] > .pf-v5-c-button').should('be.visible') - cy.get('[data-label="Approve"] > .pf-v5-c-button').click() - cy.get('#rich-validation-field-deviceAlias').should('be.visible') - cy.get('#rich-validation-field-deviceAlias').type('test-device') - cy.get('#rich-validation-field-deviceAlias').should('have.value', 'test-device') - cy.get('.pf-v5-c-form__actions > .pf-m-primary').should('be.visible') - cy.get('.pf-v5-c-form__actions > .pf-m-primary').click() - cy.get('[data-label="Device status"]', { timeout: 50000 }).should('contain', 'Online') -}) -Cypress.Commands.add('editDevice', (img=`${Cypress.env('image')}`) => { - cy.get('#nav-toggle').should('exist') - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Devices').click() - cy.selectOrganizationIfNeeded('Default') - cy.get('a > .fctl-resource-link__text').contains('test-device') - cy.get('.pf-v5-c-table__action > .pf-v5-c-menu-toggle').click() - cy.wait(1000) - cy.contains('Edit device configurations').click() - cy.wait(1000) - cy.get('#rich-validation-field-deviceAlias').should('be.visible') - cy.get('#rich-validation-field-deviceAlias').should('have.value', 'test-device') - cy.get('#rich-validation-field-deviceAlias').clear() - cy.get('#rich-validation-field-deviceAlias').type('test-device-edited') - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('#textfield-osImage').should('be.visible') - cy.get('#textfield-osImage').clear() - cy.get('#textfield-osImage').type(img) - cy.get('#textfield-osImage').should('have.value', `${img}`) - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('.pf-v5-c-title > .pf-v5-l-grid > .pf-m-6-col-on-md', { timeout: 50000 }).should('contain', 'test-device-edited') -}) -Cypress.Commands.add('decommissionDevice', () => { - cy.get('#nav-toggle').should('exist') - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Devices').click() - cy.selectOrganizationIfNeeded('Default') - cy.get('.pf-v5-c-table__tbody > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').should('be.visible') - cy.get('.pf-v5-c-table__tbody > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').click() - cy.get('#devices-toolbar > :nth-child(1) > .pf-v5-c-toolbar__content-section > :nth-child(3) > .pf-v5-c-button').should('be.visible') - cy.get('#devices-toolbar > :nth-child(1) > .pf-v5-c-toolbar__content-section > :nth-child(3) > .pf-v5-c-button').click() - cy.get('.pf-m-danger').should('be.visible') - cy.get('.pf-m-danger').click() - cy.get('.pf-v5-c-table__thead > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').should('be.visible') - cy.get('.pf-v5-c-table__thead > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').click() - cy.get('.pf-v5-c-toolbar__group > :nth-child(3) > .pf-v5-c-button').should('be.visible') - cy.get('.pf-v5-c-toolbar__group > :nth-child(3) > .pf-v5-c-button').click() - cy.get('.pf-m-danger').should('be.visible') - cy.get('.pf-m-danger').click() - cy.get('.pf-v5-c-switch__toggle').should('be.visible') - cy.get('.pf-v5-c-switch__toggle').click() - -}) -Cypress.Commands.add('createFleet', (img = `${Cypress.env('image')}`, fleetname = `${Cypress.env('fleetname')}`) => { - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Fleets').click() - cy.selectOrganizationIfNeeded('Default') - cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(1) > .pf-v5-c-button').should('exist') - cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(1) > .pf-v5-c-button').should('be.visible') - cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(1) > .pf-v5-c-button').click() - cy.get('#rich-validation-field-name').should('be.visible') - cy.get('#rich-validation-field-name').type(fleetname) - cy.get('#rich-validation-field-name').should('have.value', 'test-fleet') - cy.get('.pf-v5-l-stack__item > .pf-v5-c-label-group > .pf-v5-c-label-group__main > .pf-v5-c-label-group__list').click() - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('#textfield-osImage').should('be.visible') - cy.get('#textfield-osImage').type(img) - cy.get('#textfield-osImage').should('have.value', img) - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - //cy.get('.pf-v5-c-description-list__text > .pf-v5-l-flex', { timeout: 50000 }).should('contain', 'Valid') -}) -Cypress.Commands.add('editFleet', (fleetname = `${Cypress.env('fleetname')}`,img1 = `${Cypress.env('newimage')}`) => { - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Fleets').click() - cy.selectOrganizationIfNeeded('Default') - cy.get('[data-label="Name"]').contains(fleetname) - cy.get('.pf-v5-c-table__action > .pf-v5-c-menu-toggle').click() - cy.get('td.pf-v5-c-table__td').then($cells => cy.wrap($cells.eq(-1))) - cy.get('.pf-v5-c-table__action > .pf-v5-c-menu-toggle').should('be.visible') - // cy.get('.pf-v5-c-table__action > .pf-v5-c-menu-toggle').click() - cy.get('[data-ouia-component-id="OUIA-Generated-DropdownItem-2"] > .pf-v5-c-menu__item > .pf-v5-c-menu__item-main > .pf-v5-c-menu__item-text').click() - cy.get(':nth-child(1) > .pf-v5-c-form__group-label > .pf-v5-c-form__label > .pf-v5-c-form__label-text').should('contain', 'Fleet name') - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('#textfield-osImage').should('be.visible') - cy.get('#textfield-osImage').clear() - cy.get('#textfield-osImage').type(img1) - cy.get('#textfield-osImage').should('have.value', img1) - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('.pf-v5-c-title').should('contain', fleetname) -}) -Cypress.Commands.add('deleteFleet', (fleetname = `${Cypress.env('fleetname')}`) => { - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Fleets').click() - cy.selectOrganizationIfNeeded('Default') - cy.get('[data-label="Name"]').contains(fleetname) - cy.get('.pf-v5-c-table__tbody > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').click() - cy.get('button.pf-v5-c-button.pf-m-secondary').contains('Delete fleets').should('be.visible') - cy.get('button.pf-v5-c-button.pf-m-secondary').contains('Delete fleets').click() - cy.get('.pf-m-danger').should('be.visible') - cy.get('.pf-m-danger').click() -}) -Cypress.Commands.add('importFleet', (repo = `${Cypress.env('repository')}`, fleetname = `${Cypress.env('fleetname')}`, resource = `${Cypress.env('resource')}`, resourcename = `${Cypress.env('resourcename')}`, revision = `${Cypress.env('revision')}`) => { - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Fleets').click() - cy.selectOrganizationIfNeeded('Default') - cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(2) > .pf-v5-c-button').should('exist') - cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(2) > .pf-v5-c-button').should('be.visible') - cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(2) > .pf-v5-c-button').click() - cy.get('#rich-validation-field-name').type(fleetname) - cy.get('#textfield-url').type(repo) - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('#rich-validation-field-resourceSyncs\\[0\\]\\.name').clear() - cy.get('#rich-validation-field-resourceSyncs\\[0\\]\\.name').type('test-resource') - cy.get('#textfield-resourceSyncs\\[0\\]\\.targetRevision').clear() - cy.get('#textfield-resourceSyncs\\[0\\]\\.targetRevision').type(revision) - cy.get('#textfield-resourceSyncs\\[0\\]\\.path').clear() - cy.get('#textfield-resourceSyncs\\[0\\]\\.path').type(resourcename) - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').should('be.visible') - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() - cy.get('td[data-label="Status"]', { timeout: 1000000 }).should('contain', 'Valid') -}) Cypress.Commands.add('downloadClifile', (platform = `${Cypress.env('platform')}`, arch = `${Cypress.env('arch')}`) => { let filename if (platform === 'Windows') { @@ -216,70 +45,4 @@ Cypress.Commands.add('downloadClifile', (platform = `${Cypress.env('platform')}` let fullpath = `downloads/${filename}` cy.log(`Downloaded file: ${fullpath}`) cy.readFile(fullpath).should('exist') -}) -Cypress.Commands.add('createRepository', (reponame = `${Cypress.env('repositoryname')}`,repo = `${Cypress.env('repository')}`,revision = `${Cypress.env('revision')}`, resource = `${Cypress.env('resource')}`) => { - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Repositories').click() - cy.selectOrganizationIfNeeded('Default') - cy.get('.pf-v5-c-toolbar__content-section > :nth-child(2) > .pf-v5-c-button').should('be.visible') - cy.get('.pf-v5-c-toolbar__content-section > :nth-child(2) > .pf-v5-c-button').click() - cy.get('#rich-validation-field-name').should('be.visible') - cy.get('#rich-validation-field-name').type('test-repository') - cy.get('#rich-validation-field-name').should('have.value', 'test-repository') - cy.get('#use-resource-syncs').should('be.visible') - cy.get('#textfield-url').type(repo) - cy.get('#textfield-url').should('have.value', repo) - cy.get('.pf-v5-c-form__section').should('be.visible') - cy.contains('Resource sync name').type('test-resource') - cy.get('#textfield-resourceSyncs\\[0\\]\\.targetRevision').type(revision) - cy.get('#textfield-resourceSyncs\\[0\\]\\.path').type(resource) - cy.get('.pf-v5-c-form__actions > .pf-m-primary').click() - cy.get('.pf-v5-c-description-list__text > .pf-v5-l-flex > :nth-child(2)', { timeout: 100000 }).should('contain', 'Accessible') -}) -Cypress.Commands.add('editRepository',(reponame = `${Cypress.env('repositoryname')}`,newyaml = `${Cypress.env('newyaml')}`, resourcename = `${Cypress.env('resourcename')}`, revision = `${Cypress.env('revision')}`) => { - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Repositories').click() - cy.selectOrganizationIfNeeded('Default') - - cy.contains(reponame).should('be.visible') - cy.get('.pf-v5-c-table__action').click() - cy.get('[data-ouia-component-id="OUIA-Generated-DropdownItem-1"] > .pf-v5-c-menu__item > .pf-v5-c-menu__item-main > .pf-v5-c-menu__item-text').contains('Edit repository').click() - cy.get('.pf-v5-c-check__body > .pf-m-link').click() - cy.get('#rich-validation-field-resourceSyncs\\[1\\]\\.name').should('be.visible') - cy.get('#rich-validation-field-resourceSyncs\\[1\\]\\.name').clear() - cy.get('#rich-validation-field-resourceSyncs\\[1\\]\\.name').type('test-resource1') - cy.get('#rich-validation-field-resourceSyncs\\[1\\]\\.name').should('have.value', 'test-resource1') - //cy.get('#textfield-resourceSyncs\\[0\\]\\.targetRevision').clear() - cy.get('#textfield-resourceSyncs\\[1\\]\\.targetRevision').type(revision) - cy.get('#textfield-resourceSyncs\\[1\\]\\.path').clear() - cy.get('#textfield-resourceSyncs\\[1\\]\\.path').type(newyaml) - cy.get('.pf-v5-c-form__actions > .pf-m-primary').click() - cy.get('.pf-v5-c-description-list__text > .pf-v5-l-flex > :nth-child(2)', { timeout: 100000 }).should('contain', 'Accessible') -}) -Cypress.Commands.add('deleteRepository',(reponame = `${Cypress.env('repositoryname')}`) => { - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Repositories').click() - cy.get('[data-label="Name"]').should('contain', reponame) - cy.get('.pf-v5-c-table__tbody > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').should('be.visible') - cy.get('.pf-v5-c-table__tbody > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').click() - cy.contains('Delete repositories').should('be.visible') - cy.contains('Delete repositories').click() - cy.get('.pf-m-danger').should('be.visible') - cy.get('.pf-m-danger').click() -}) -Cypress.Commands.add('openTerminal', () => { - cy.get('#nav-toggle').click() - cy.contains('Edge Management').click() - cy.contains('Devices').click() - cy.get('a > .fctl-resource-link__text').contains('test-device').should('be.visible') - cy.get('a > .fctl-resource-link__text').click() - cy.contains('Terminal').should('be.visible') - cy.contains('Terminal').click() - cy.get('.pf-v5-l-bullseye', { timeout: 50000 }).should('be.visible') - cy.get('.pf-v5-l-bullseye').click() - - }) \ No newline at end of file diff --git a/cypress/views/common.js b/cypress/views/common.js new file mode 100644 index 0000000..95a0560 --- /dev/null +++ b/cypress/views/common.js @@ -0,0 +1,43 @@ +/** + * Common utilities for test operations + */ +export const common = { + /** + * Navigate to a page under Edge Management + * @param {string} page - The page to navigate to (e.g., 'Devices', 'Fleets', 'Repositories') + */ + navigateTo: (page) => { + cy.get('#nav-toggle').should('exist') + cy.get('#nav-toggle').click() + cy.contains('Edge Management').click() + cy.contains(page).click() + common.selectOrganizationIfNeeded('Default') + }, + + /** + * Select organization if the selection page appears + */ + selectOrganizationIfNeeded: (orgName = 'Default', maxRetries = 5, retryDelay = 1000) => { + const checkForOrgSelection = (attempt = 1) => { + cy.log(`Checking for organization selection page (attempt ${attempt}/${maxRetries})`) + + cy.wait(retryDelay) + + cy.get('body').then(($body) => { + if ($body.text().includes('Select Organization')) { + cy.log(`Organization selection page detected, selecting ${orgName}`) + cy.contains(orgName).click() + cy.contains('button', 'Continue').click() + cy.get('.pf-v5-c-page', { timeout: 30000 }).should('exist') + } else if (attempt < maxRetries) { + cy.log(`Organization selection not found yet, retrying...`) + checkForOrgSelection(attempt + 1) + } else { + cy.log('No organization selection page detected after all retries, continuing...') + } + }) + } + + checkForOrgSelection() + }, +} diff --git a/cypress/views/devicesPage.js b/cypress/views/devicesPage.js new file mode 100644 index 0000000..4ac6f69 --- /dev/null +++ b/cypress/views/devicesPage.js @@ -0,0 +1,86 @@ +import { common } from './common' + +/** + * DevicesPage object for device management operations + */ +export const devicesPage = { + /** + * Approve a device enrollment request + */ + approveDevice: (deviceName = 'test-device') => { + common.navigateTo('Devices') + + cy.get('h2.pf-v5-c-title.pf-m-3xl').contains('Devices pending approval') + cy.get('[data-label="Approve"] > .pf-v5-c-button').should('exist') + cy.get('[data-label="Approve"] > .pf-v5-c-button').should('be.visible') + cy.get('[data-label="Approve"] > .pf-v5-c-button').click() + cy.get('#rich-validation-field-deviceAlias').should('be.visible') + cy.get('#rich-validation-field-deviceAlias').type(deviceName) + cy.get('#rich-validation-field-deviceAlias').should('have.value', deviceName) + cy.get('.pf-v5-c-form__actions > .pf-m-primary').should('be.visible') + cy.get('.pf-v5-c-form__actions > .pf-m-primary').click() + cy.get('[data-label="Device status"]', { timeout: 50000 }).should('contain', 'Online') + }, + + /** + * Edit a device configuration + */ + editDevice: (image, currentName = 'test-device', newName = 'test-device-edited') => { + common.navigateTo('Devices') + + cy.get('a > .fctl-resource-link__text').contains(currentName) + cy.get('.pf-v5-c-table__action > .pf-v5-c-menu-toggle').click() + cy.wait(1000) + cy.contains('Edit device configurations').click() + cy.wait(1000) + cy.get('#rich-validation-field-deviceAlias').should('be.visible') + cy.get('#rich-validation-field-deviceAlias').should('have.value', currentName) + cy.get('#rich-validation-field-deviceAlias').clear() + cy.get('#rich-validation-field-deviceAlias').type(newName) + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('#textfield-osImage').should('be.visible') + cy.get('#textfield-osImage').clear() + cy.get('#textfield-osImage').type(image) + cy.get('#textfield-osImage').should('have.value', image) + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('.pf-v5-c-title > .pf-v5-l-grid > .pf-m-6-col-on-md', { timeout: 50000 }).should('contain', newName) + }, + + /** + * Decommission a device + */ + decommissionDevice: () => { + common.navigateTo('Devices') + + cy.get('.pf-v5-c-table__tbody > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').should('be.visible') + cy.get('.pf-v5-c-table__tbody > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').click() + cy.get('#devices-toolbar > :nth-child(1) > .pf-v5-c-toolbar__content-section > :nth-child(3) > .pf-v5-c-button').should('be.visible') + cy.get('#devices-toolbar > :nth-child(1) > .pf-v5-c-toolbar__content-section > :nth-child(3) > .pf-v5-c-button').click() + cy.get('.pf-m-danger').should('be.visible') + cy.get('.pf-m-danger').click() + cy.get('.pf-v5-c-table__thead > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').should('be.visible') + cy.get('.pf-v5-c-table__thead > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').click() + cy.get('.pf-v5-c-toolbar__group > :nth-child(3) > .pf-v5-c-button').should('be.visible') + cy.get('.pf-v5-c-toolbar__group > :nth-child(3) > .pf-v5-c-button').click() + cy.get('.pf-m-danger').should('be.visible') + cy.get('.pf-m-danger').click() + cy.get('.pf-v5-c-switch__toggle').should('be.visible') + cy.get('.pf-v5-c-switch__toggle').click() + }, + + /** + * Open terminal on a device + */ + openTerminal: (deviceName = 'test-device') => { + common.navigateTo('Devices') + + cy.get('a > .fctl-resource-link__text').contains(deviceName).should('be.visible') + cy.get('a > .fctl-resource-link__text').click() + cy.contains('Terminal').should('be.visible') + cy.contains('Terminal').click() + cy.get('.pf-v5-l-bullseye', { timeout: 50000 }).should('be.visible') + cy.get('.pf-v5-l-bullseye').click() + }, +} diff --git a/cypress/views/fleetsPage.js b/cypress/views/fleetsPage.js new file mode 100644 index 0000000..9282e08 --- /dev/null +++ b/cypress/views/fleetsPage.js @@ -0,0 +1,89 @@ +import { common } from './common' + +/** + * FleetsPage object for fleet management operations + */ +export const fleetsPage = { + /** + * Create a new fleet + */ + createFleet: (img = Cypress.env('image'), fleetname = Cypress.env('fleetname')) => { + common.navigateTo('Fleets') + + cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(1) > .pf-v5-c-button').should('exist') + cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(1) > .pf-v5-c-button').should('be.visible') + cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(1) > .pf-v5-c-button').click() + cy.get('#rich-validation-field-name').should('be.visible') + cy.get('#rich-validation-field-name').type(fleetname) + cy.get('#rich-validation-field-name').should('have.value', 'test-fleet') + cy.get('.pf-v5-l-stack__item > .pf-v5-c-label-group > .pf-v5-c-label-group__main > .pf-v5-c-label-group__list').click() + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('#textfield-osImage').should('be.visible') + cy.get('#textfield-osImage').type(img) + cy.get('#textfield-osImage').should('have.value', img) + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + }, + + /** + * Edit an existing fleet + */ + editFleet: (fleetname = Cypress.env('fleetname'), img1 = Cypress.env('newimage')) => { + common.navigateTo('Fleets') + + cy.get('[data-label="Name"]').contains(fleetname) + cy.get('.pf-v5-c-table__action > .pf-v5-c-menu-toggle').click() + cy.get('td.pf-v5-c-table__td').then($cells => cy.wrap($cells.eq(-1))) + cy.get('.pf-v5-c-table__action > .pf-v5-c-menu-toggle').should('be.visible') + cy.get('[data-ouia-component-id="OUIA-Generated-DropdownItem-2"] > .pf-v5-c-menu__item > .pf-v5-c-menu__item-main > .pf-v5-c-menu__item-text').click() + cy.get(':nth-child(1) > .pf-v5-c-form__group-label > .pf-v5-c-form__label > .pf-v5-c-form__label-text').should('contain', 'Fleet name') + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('#textfield-osImage').should('be.visible') + cy.get('#textfield-osImage').clear() + cy.get('#textfield-osImage').type(img1) + cy.get('#textfield-osImage').should('have.value', img1) + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('.pf-v5-c-title').should('contain', fleetname) + }, + + /** + * Delete a fleet + */ + deleteFleet: (fleetname = Cypress.env('fleetname')) => { + common.navigateTo('Fleets') + + cy.get('[data-label="Name"]').contains(fleetname) + cy.get('.pf-v5-c-table__tbody > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').click() + cy.get('button.pf-v5-c-button.pf-m-secondary').contains('Delete fleets').should('be.visible') + cy.get('button.pf-v5-c-button.pf-m-secondary').contains('Delete fleets').click() + cy.get('.pf-m-danger').should('be.visible') + cy.get('.pf-m-danger').click() + }, + + /** + * Import a fleet from repository + */ + importFleet: (repo = Cypress.env('repository'), fleetname = Cypress.env('fleetname'), resource = Cypress.env('resource'), resourcename = Cypress.env('resourcename'), revision = Cypress.env('revision')) => { + common.navigateTo('Fleets') + + cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(2) > .pf-v5-c-button').should('exist') + cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(2) > .pf-v5-c-button').should('be.visible') + cy.get(':nth-child(2) > .pf-v5-l-split > :nth-child(2) > .pf-v5-c-button').click() + cy.get('#rich-validation-field-name').type(fleetname) + cy.get('#textfield-url').type(repo) + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('#rich-validation-field-resourceSyncs\\[0\\]\\.name').clear() + cy.get('#rich-validation-field-resourceSyncs\\[0\\]\\.name').type('test-resource') + cy.get('#textfield-resourceSyncs\\[0\\]\\.targetRevision').clear() + cy.get('#textfield-resourceSyncs\\[0\\]\\.targetRevision').type(revision) + cy.get('#textfield-resourceSyncs\\[0\\]\\.path').clear() + cy.get('#textfield-resourceSyncs\\[0\\]\\.path').type(resourcename) + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').should('be.visible') + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('.pf-v5-c-wizard__footer > .pf-m-primary').click() + cy.get('td[data-label="Status"]', { timeout: 1000000 }).should('contain', 'Valid') + }, +} diff --git a/cypress/views/repositoriesPage.js b/cypress/views/repositoriesPage.js new file mode 100644 index 0000000..1113a6b --- /dev/null +++ b/cypress/views/repositoriesPage.js @@ -0,0 +1,64 @@ +import { common } from './common' + +/** + * RepositoriesPage object for repository management operations + */ +export const repositoriesPage = { + /** + * Create a new repository + */ + createRepository: (reponame = Cypress.env('repositoryname'), repo = Cypress.env('repository'), revision = Cypress.env('revision'), resource = Cypress.env('resource')) => { + common.navigateTo('Repositories') + + cy.get('.pf-v5-c-toolbar__content-section > :nth-child(2) > .pf-v5-c-button').should('be.visible') + cy.get('.pf-v5-c-toolbar__content-section > :nth-child(2) > .pf-v5-c-button').click() + cy.get('#rich-validation-field-name').should('be.visible') + cy.get('#rich-validation-field-name').type('test-repository') + cy.get('#rich-validation-field-name').should('have.value', 'test-repository') + cy.get('#use-resource-syncs').should('be.visible') + cy.get('#textfield-url').type(repo) + cy.get('#textfield-url').should('have.value', repo) + cy.get('.pf-v5-c-form__section').should('be.visible') + cy.contains('Resource sync name').type('test-resource') + cy.get('#textfield-resourceSyncs\\[0\\]\\.targetRevision').type(revision) + cy.get('#textfield-resourceSyncs\\[0\\]\\.path').type(resource) + cy.get('.pf-v5-c-form__actions > .pf-m-primary').click() + cy.get('.pf-v5-c-description-list__text > .pf-v5-l-flex > :nth-child(2)', { timeout: 100000 }).should('contain', 'Accessible') + }, + + /** + * Edit an existing repository + */ + editRepository: (reponame = Cypress.env('repositoryname'), newyaml = Cypress.env('newyaml'), resourcename = Cypress.env('resourcename'), revision = Cypress.env('revision')) => { + common.navigateTo('Repositories') + + cy.contains(reponame).should('be.visible') + cy.get('.pf-v5-c-table__action').click() + cy.get('[data-ouia-component-id="OUIA-Generated-DropdownItem-1"] > .pf-v5-c-menu__item > .pf-v5-c-menu__item-main > .pf-v5-c-menu__item-text').contains('Edit repository').click() + cy.get('.pf-v5-c-check__body > .pf-m-link').click() + cy.get('#rich-validation-field-resourceSyncs\\[1\\]\\.name').should('be.visible') + cy.get('#rich-validation-field-resourceSyncs\\[1\\]\\.name').clear() + cy.get('#rich-validation-field-resourceSyncs\\[1\\]\\.name').type('test-resource1') + cy.get('#rich-validation-field-resourceSyncs\\[1\\]\\.name').should('have.value', 'test-resource1') + cy.get('#textfield-resourceSyncs\\[1\\]\\.targetRevision').type(revision) + cy.get('#textfield-resourceSyncs\\[1\\]\\.path').clear() + cy.get('#textfield-resourceSyncs\\[1\\]\\.path').type(newyaml) + cy.get('.pf-v5-c-form__actions > .pf-m-primary').click() + cy.get('.pf-v5-c-description-list__text > .pf-v5-l-flex > :nth-child(2)', { timeout: 100000 }).should('contain', 'Accessible') + }, + + /** + * Delete a repository + */ + deleteRepository: (reponame = Cypress.env('repositoryname')) => { + common.navigateTo('Repositories') + + cy.get('[data-label="Name"]').should('contain', reponame) + cy.get('.pf-v5-c-table__tbody > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').should('be.visible') + cy.get('.pf-v5-c-table__tbody > .pf-v5-c-table__tr > .pf-v5-c-table__check > label > input').click() + cy.contains('Delete repositories').should('be.visible') + cy.contains('Delete repositories').click() + cy.get('.pf-m-danger').should('be.visible') + cy.get('.pf-m-danger').click() + }, +}