diff --git a/.github/workflows/accessibility-tests.yml b/.github/workflows/accessibility-tests.yml index c7823d7c57..c5c370692e 100644 --- a/.github/workflows/accessibility-tests.yml +++ b/.github/workflows/accessibility-tests.yml @@ -15,10 +15,15 @@ jobs: with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 - - name: Install k3d - env: - K3D_URL: https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh - run: curl --silent --fail $K3D_URL | bash + - name: Create Single Cluster + uses: AbsaOSS/k3d-action@4e8b3239042be1dc0aed6c5eb80c13b18200fc79 #v2.4.0 + with: + cluster-name: "k3dCluster" + args: >- + --agents 1 + --port 80:80@loadbalancer + --port 443:443@loadbalancer + --wait - name: Setup Kyma run: | set -o pipefail diff --git a/src/resources/CustomResourceDefinitions/templates.js b/src/resources/CustomResourceDefinitions/templates.js index 077aa3d243..8be93a6290 100644 --- a/src/resources/CustomResourceDefinitions/templates.js +++ b/src/resources/CustomResourceDefinitions/templates.js @@ -50,7 +50,7 @@ const convert = (arg, currentPath, spec) => { export function createTemplate(crd) { const spec = {}; - const currentVersion = crd.spec.versions.find(ver => ver.storage); + const currentVersion = crd?.spec?.versions.find(ver => ver.storage); return { apiVersion: `${crd.spec.group}/${currentVersion.name}`, diff --git a/tests/integration/continuum/cypress.js b/tests/integration/continuum/cypress.js index d1595d3633..938ac561b4 100644 --- a/tests/integration/continuum/cypress.js +++ b/tests/integration/continuum/cypress.js @@ -98,7 +98,10 @@ const failIfAnyAccessibilityConcerns = () => { ).to.have.lengthOf(0); }; -const submitAccessibilityConcernsToAMP = (reportTitle = 'Busola ACC') => { +const submitAccessibilityConcernsToAMP = ( + reportTitle = 'Busola ACC', + moduleName, +) => { const accessibilityConcerns = Continuum.getAccessibilityConcerns(); if (accessibilityConcerns.length <= 0) { return; @@ -113,7 +116,10 @@ const submitAccessibilityConcernsToAMP = (reportTitle = 'Busola ACC') => { await ampReportingService.setActiveOrganization(10274); // ID of AMP organization to submit test results to await ampReportingService.setActiveAsset(38893); // ID of AMP asset to submit test results to await ampReportingService.setActiveReportByName(reportTitle); - await ampReportingService.setActiveModuleByName(pageTitle, pageUrl); + await ampReportingService.setActiveModuleByName( + moduleName ?? pageTitle, + pageUrl, + ); await ampReportingService.setActiveReportManagementStrategy( ReportManagementStrategy.APPEND, ); diff --git a/tests/integration/cypress.config.js b/tests/integration/cypress.config.js index 33f992d915..747988019a 100644 --- a/tests/integration/cypress.config.js +++ b/tests/integration/cypress.config.js @@ -32,6 +32,12 @@ module.exports = defineConfig({ specPattern: [ 'tests/accessibility/test-acc-cluster.spec.js', 'tests/accessibility/test-acc-namespace-overview.spec.js', + 'tests/accessibility/test-acc-modules.spec.js', + 'tests/accessibility/test-acc-cron-jobs.spec.js', + 'tests/accessibility/test-acc-performance.spec.js', + 'tests/accessibility/test-acc-extensions.spec.js', + 'tests/accessibility/test-acc-pizzas.spec.js', + 'tests/accessibility/test-acc-custom-resoureces.spec.js', 'tests/cluster/test-download-a-kubeconfig.spec.js', 'tests/cluster/test-edit-cluster.spec.js', 'tests/cluster/test-cluster-overview.spec.js', diff --git a/tests/integration/tests/accessibility/test-acc-cluster.spec.js b/tests/integration/tests/accessibility/test-acc-cluster.spec.js index 8f5874ad9e..1f28f888e1 100644 --- a/tests/integration/tests/accessibility/test-acc-cluster.spec.js +++ b/tests/integration/tests/accessibility/test-acc-cluster.spec.js @@ -13,7 +13,10 @@ context('Accessibility test Cluster list and overview', () => { cy.visit(`${config.clusterAddress}/clusters`) .runAllAccessibilityTests() .printAccessibilityTestResults() - .submitAccessibilityConcernsToAMP(Cypress.env('AMP_REPORT_NAME')); + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Clusters list', + ); }); it('Acc test cluster overview', () => { @@ -23,6 +26,9 @@ context('Accessibility test Cluster list and overview', () => { cy.runAllAccessibilityTests() .printAccessibilityTestResults() - .submitAccessibilityConcernsToAMP(Cypress.env('AMP_REPORT_NAME')); + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Cluster overview', + ); }); }); diff --git a/tests/integration/tests/accessibility/test-acc-cron-jobs.spec.js b/tests/integration/tests/accessibility/test-acc-cron-jobs.spec.js new file mode 100644 index 0000000000..429203494c --- /dev/null +++ b/tests/integration/tests/accessibility/test-acc-cron-jobs.spec.js @@ -0,0 +1,141 @@ +/// + +import 'cypress-file-upload'; + +const NAMESPACE_NAME = 'acc-cron-jobs'; +const CRON_JOB_NAME = 'acc-test-cron-job'; + +context('Accessibility test Cron Jobs', () => { + Cypress.skipAfterFail(); + + before(() => { + cy.handleExceptions(); + cy.setUpContinuum('continuum/continuum.conf.js'); + cy.loginAndSelectCluster(); + cy.createNamespace(NAMESPACE_NAME); + }); + + it('Acc test Cron Jobs list', () => { + cy.loginAndSelectCluster(); + + cy.getLeftNav() + .contains('Namespaces') + .click(); + + cy.get('ui5-input[placeholder="Search"]:visible') + .find('input') + .wait(1000) + .type(NAMESPACE_NAME); + + cy.clickGenericListLink(NAMESPACE_NAME); + + cy.navigateTo('Workloads', 'Cron Jobs'); + + cy.contains('ui5-title', 'Cron Jobs').should('be.visible'); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Cron Jobs list', + ); + }); + + it('Acc test Cron Jobs create', () => { + cy.openCreate(); + + cy.getMidColumn() + .contains('ui5-title', 'Create Cron Job') + .should('be.visible'); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Cron Jobs create', + ); + }); + + it('Acc test Cron Jobs details', () => { + cy.get('[accessible-name="CronJob name"]') + .find('input') + .type(CRON_JOB_NAME, { force: true }); + + cy.get('[placeholder="Minute"]') + .find('input') + .click() + .clear() + .type(0, { force: true }); + + cy.get('[placeholder="Hour"]') + .find('input') + .click() + .clear() + .type(0, { force: true }); + + cy.get('[placeholder="Day of Month"]') + .find('input') + .click() + .clear() + .type(1, { force: true }); + + cy.get('[placeholder="Month"]') + .find('input') + .click() + .clear() + .type('*', { force: true }); + + cy.get('[placeholder="Day of Week"]') + .find('input') + .click() + .clear() + .type('*', { force: true }); + + cy.get( + '[aria-label="expand Schedule: At 12:00 AM, on day 1 of the month"]', + ).click(); + + cy.contains('Command').click(); + + cy.get('[placeholder="Command to run in a container"]') + .find('input') + .click() + .clear() + .type('ls -la', { force: true }); + + cy.get('[accessible-name="Container name"]') + .find('input') + .click() + .clear() + .type('test-container', { force: true }); + + cy.get( + '[placeholder="Enter the Docker image tag, for example, \'busybox\'"]', + ) + .find('input') + .click() + .clear() + .type('busybox', { force: true }); + + cy.get('ui5-combobox[value="IfNotPresent"]') + .find('ui5-icon[accessible-name="Select Options"]') + .click(); + + cy.get('ui5-li:visible') + .contains('Always') + .click(); + + cy.saveChanges('Create'); + + cy.getMidColumn() + .contains('ui5-title', CRON_JOB_NAME) + .should('be.visible'); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Cron Jobs details', + ); + }); +}); diff --git a/tests/integration/tests/accessibility/test-acc-custom-resoureces.spec.js b/tests/integration/tests/accessibility/test-acc-custom-resoureces.spec.js new file mode 100644 index 0000000000..cd5f39943b --- /dev/null +++ b/tests/integration/tests/accessibility/test-acc-custom-resoureces.spec.js @@ -0,0 +1,95 @@ +/// + +import { loadFile } from '../../support/loadFile'; + +const FILE_NAME = 'test-customresourcedefinisions-cluster.yaml'; +const TCLUSTER_FILE_NAME = 'test-Tcluster.yaml'; + +context('Accessibility test Custom Resources', () => { + Cypress.skipAfterFail(); + + before(() => { + cy.setUpContinuum('continuum/continuum.conf.js'); + + cy.loginAndSelectCluster(); + + cy.navigateTo('Configuration', 'Custom Resource Definitions'); + + cy.openCreate().click(); + + cy.wrap(loadFile(FILE_NAME)).then(CRD_CONFIG => { + const CRD = JSON.stringify(CRD_CONFIG); + cy.pasteToMonaco(CRD); + }); + + cy.checkUnsavedDialog(); + + cy.saveChanges('Create'); + }); + + it('Acc test Custom Resources overview', () => { + cy.getLeftNav() + .contains('Custom Resources') + .click(); + + cy.contains('ui5-title', 'Custom Resources').should('be.visible'); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Custom Resources overview', + ); + }); + + it('Acc test single Custom Resource list', () => { + cy.get('ui5-table-row') + .contains('Tclusters') + .click(); + + cy.contains('ui5-title', 'Tclusters').should('be.visible'); + + cy.contains('ui5-button', /Create/i).should('be.visible'); + + cy.url().should('match', /customresources/); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Custom Resources single list', + ); + }); + + it('Acc test Tcluster Custom Resource details', () => { + cy.getLeftNav() + .contains('Custom Resources') + .click(); + + cy.get('ui5-input[placeholder="Search"]:visible') + .find('input') + .wait(1000) + .type('cypress'); + cy.clickGenericListLink('Tclusters'); + + cy.contains('ui5-button', 'Create').click(); + + cy.wrap(loadFile(TCLUSTER_FILE_NAME)).then(TC_CONFIG => { + const TC = JSON.stringify(TC_CONFIG); + cy.pasteToMonaco(TC); + }); + + cy.checkUnsavedDialog(); + + cy.saveChanges('Create'); + + cy.contains('ui5-title', 'tcluster-test').should('be.visible'); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Tcluster Custom Resource details', + ); + }); +}); diff --git a/tests/integration/tests/accessibility/test-acc-extensions.spec.js b/tests/integration/tests/accessibility/test-acc-extensions.spec.js new file mode 100644 index 0000000000..f62867b063 --- /dev/null +++ b/tests/integration/tests/accessibility/test-acc-extensions.spec.js @@ -0,0 +1,100 @@ +/// + +import jsyaml from 'js-yaml'; + +context('Accessibility test Extensions view', () => { + Cypress.skipAfterFail(); + + before(() => { + cy.handleExceptions(); + cy.setUpContinuum('continuum/continuum.conf.js'); + cy.loginAndSelectCluster(); + + cy.createNamespace('pizzas'); + + cy.getLeftNav() + .contains('Cluster Details') + .click(); + + cy.contains('ui5-button', 'Upload YAML').click(); + + cy.loadFiles( + 'examples/pizzas/configuration/pizzas-configmap.yaml', + 'examples/pizzas/configuration/pizzas-crd.yaml', + ).then(resources => { + const input = resources.map(r => jsyaml.dump(r)).join('\n---\n'); + cy.pasteToMonaco(input); + }); + + cy.get('ui5-dialog') + .contains('ui5-button', 'Upload') + .should('be.visible') + .click(); + + cy.get('ui5-dialog') + .find('.status-message-success') + .should('have.length', 2); + }); + + it('Acc test Extensions list', () => { + cy.loginAndSelectCluster(); + + cy.navigateTo('Configuration', 'Extensions'); + + cy.wait(500); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Extensions list', + ); + }); + + it('Acc test Extensions create', () => { + cy.openCreate(); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Extensions create', + ); + }); + + it('Acc test Extensions details', () => { + cy.getLeftNav() + .contains('Extensions') + .click(); + + cy.get('ui5-input[placeholder="Search"]:visible') + .find('input') + .wait(1000) + .type('pizzas'); + + cy.clickGenericListLink('pizzas'); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Extensions details', + ); + }); + + it('Clean up', () => { + cy.getLeftNav() + .contains('Namespaces') + .click(); + + cy.deleteFromGenericList('Namespace', 'pizzas', { + clearSearch: false, + checkIfResourceIsRemoved: false, + selectSearchResult: true, + }); + + cy.get('ui5-table-row') + .find('.status-badge') + .contains('Terminating'); + }); +}); diff --git a/tests/integration/tests/accessibility/test-acc-modules.spec.js b/tests/integration/tests/accessibility/test-acc-modules.spec.js new file mode 100644 index 0000000000..e4d9007cb3 --- /dev/null +++ b/tests/integration/tests/accessibility/test-acc-modules.spec.js @@ -0,0 +1,70 @@ +/// + +context('Accessibility test Modules view', () => { + before(() => { + cy.handleExceptions(); + cy.loginAndSelectCluster(); + cy.setUpContinuum('continuum/continuum.conf.js'); + }); + + it('Acc test Modules view', () => { + cy.wait(2000); + + cy.get('ui5-card') + .contains('Modify Modules') + .click(); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Modules view', + ); + }); + + it('Acc test add Modules view', () => { + cy.get('ui5-panel') + .contains('ui5-button', 'Add') + .click(); + + cy.wait(1000); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Add Modules view', + ); + }); + + it('Acc test edit Modules view', () => { + cy.get('ui5-card') + .contains('api-gateway') + .should('be.visible'); + + cy.get('ui5-title') + .contains('api-gateway') + .click(); + + cy.get('[data-testid="create-form-footer-bar"]') + .contains('ui5-button:visible', 'Add') + .click(); + + cy.wait(7000); + + cy.get('ui5-table-row') + .contains('api-gateway') + .should('be.visible'); + + cy.inspectTab('Edit'); + + cy.wait(1000); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Edit Modules view', + ); + }); +}); diff --git a/tests/integration/tests/accessibility/test-acc-namespace-overview.spec.js b/tests/integration/tests/accessibility/test-acc-namespace-overview.spec.js index 3ec3bb3901..bf4a06338b 100644 --- a/tests/integration/tests/accessibility/test-acc-namespace-overview.spec.js +++ b/tests/integration/tests/accessibility/test-acc-namespace-overview.spec.js @@ -17,6 +17,9 @@ context('Accessibility test Namespace overview', () => { cy.runAllAccessibilityTests() .printAccessibilityTestResults() - .submitAccessibilityConcernsToAMP(Cypress.env('AMP_REPORT_NAME')); + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Namespace overview', + ); }); }); diff --git a/tests/integration/tests/accessibility/test-acc-performance.spec.js b/tests/integration/tests/accessibility/test-acc-performance.spec.js new file mode 100644 index 0000000000..b224db89e8 --- /dev/null +++ b/tests/integration/tests/accessibility/test-acc-performance.spec.js @@ -0,0 +1,27 @@ +/// +import config from '../../config'; + +context('Accessibility test Cluster list and overview', () => { + Cypress.skipAfterFail(); + + before(() => { + cy.handleExceptions(); + cy.setUpContinuum('continuum/continuum.conf.js'); + cy.loginAndSelectCluster(); + }); + + it('Acc test with performance panel open', () => { + cy.get('[title="Profile"]').click(); + + cy.get('ui5-menu-li:visible') + .contains('Preferences') + .click({ force: true }); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Performance panel', + ); + }); +}); diff --git a/tests/integration/tests/accessibility/test-acc-pizzas.spec.js b/tests/integration/tests/accessibility/test-acc-pizzas.spec.js new file mode 100644 index 0000000000..1d9316f745 --- /dev/null +++ b/tests/integration/tests/accessibility/test-acc-pizzas.spec.js @@ -0,0 +1,112 @@ +/// + +import 'cypress-file-upload'; +import jsyaml from 'js-yaml'; + +context('Accessibility test Pizza Orders', () => { + Cypress.skipAfterFail(); + + before(() => { + cy.handleExceptions(); + cy.setUpContinuum('continuum/continuum.conf.js'); + cy.loginAndSelectCluster(); + cy.createNamespace('pizzas'); + }); + + it('Creates the EXT pizza orders config', () => { + cy.getLeftNav() + .contains('Cluster Details') + .click(); + + cy.contains('ui5-button', 'Upload YAML').click(); + + cy.loadFiles( + 'examples/pizzas/configuration/pizza-orders-configmap.yaml', + 'examples/pizzas/configuration/pizza-orders-crd.yaml', + ).then(resources => { + const input = resources.map(r => jsyaml.dump(r)).join('\n---\n'); + cy.pasteToMonaco(input); + }); + + cy.get('ui5-dialog') + .contains('ui5-button', 'Upload') + .should('be.visible') + .click(); + + cy.get('ui5-dialog') + .find('.status-message-success') + .should('have.length', 2); + + cy.loadFiles('examples/pizzas/samples/pizza-orders-samples.yaml').then( + resources => { + const input = resources.map(r => jsyaml.dump(r)).join('\n---\n'); + cy.pasteToMonaco(input); + }, + ); + + cy.get('ui5-dialog') + .contains('ui5-button', 'Upload') + .should('be.visible') + .click(); + + cy.get('ui5-dialog') + .find('.status-message-success') + .should('have.length', 2); + }); + + it('Acc test Pizza Orders list', () => { + cy.loginAndSelectCluster(); + + cy.getLeftNav() + .contains('Namespaces') + .click(); + + cy.get('ui5-input[placeholder="Search"]:visible') + .find('input') + .wait(1000) + .type('pizzas'); + + cy.clickGenericListLink('pizzas'); + + cy.getLeftNav() + .contains('Lunch') + .click(); + + cy.getLeftNav() + .contains('Pizza Orders') + .click(); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Pizza Orders list', + ); + }); + + it('Acc test Pizza Orders create', () => { + cy.contains('ui5-button', 'Create').click(); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Pizza Orders create', + ); + }); + + it('Acc test Pizza Orders details', () => { + cy.getLeftNav() + .contains('Pizza Orders') + .click(); + + cy.clickGenericListLink('diavola-order'); + + cy.runAllAccessibilityTests() + .printAccessibilityTestResults() + .submitAccessibilityConcernsToAMP( + Cypress.env('AMP_REPORT_NAME'), + 'Pizza Orders details', + ); + }); +});