diff --git a/frontend/packages/integration-tests-cypress/cypress.config.js b/frontend/packages/integration-tests-cypress/cypress.config.js index 073f349b502..e77aacf36ff 100644 --- a/frontend/packages/integration-tests-cypress/cypress.config.js +++ b/frontend/packages/integration-tests-cypress/cypress.config.js @@ -16,9 +16,9 @@ module.exports = defineConfig({ configFile: 'reporter-config.json', }, fixturesFolder: 'fixtures', - defaultCommandTimeout: 30000, + defaultCommandTimeout: 40000, retries: { - runMode: 1, + runMode: 2, openMode: 0, }, e2e: { diff --git a/frontend/packages/integration-tests-cypress/tests/app/demo-dynamic-plugin.cy.ts b/frontend/packages/integration-tests-cypress/tests/app/demo-dynamic-plugin.cy.ts index 44f9c9cebba..9b92c4c8223 100644 --- a/frontend/packages/integration-tests-cypress/tests/app/demo-dynamic-plugin.cy.ts +++ b/frontend/packages/integration-tests-cypress/tests/app/demo-dynamic-plugin.cy.ts @@ -2,6 +2,7 @@ import { safeLoadAll } from 'js-yaml'; import { checkErrors } from '../../support'; import { isLocalDevEnvironment } from '../../views/common'; import { detailsPage } from '../../views/details-page'; +import { guidedTour } from '../../views/guided-tour'; import { listPage } from '../../views/list-page'; import { modal } from '../../views/modal'; import { nav } from '../../views/nav'; @@ -83,6 +84,7 @@ if (!Cypress.env('OPENSHIFT_CI') || Cypress.env('PLUGIN_PULL_SPEC')) { describe('Demo dynamic plugin test', () => { before(() => { cy.login(); + guidedTour.close(); cy.createProjectWithCLI(PLUGIN_NAME); cy.readFile(`${PLUGIN_PATH}/oc-manifest.yaml`).then((textManifest) => { const yamlManifest = safeLoadAll(textManifest); diff --git a/frontend/packages/integration-tests-cypress/tests/crud/image-pull-secret.cy.ts b/frontend/packages/integration-tests-cypress/tests/crud/image-pull-secret.cy.ts index 0ab624d0878..df2dcc6bbef 100644 --- a/frontend/packages/integration-tests-cypress/tests/crud/image-pull-secret.cy.ts +++ b/frontend/packages/integration-tests-cypress/tests/crud/image-pull-secret.cy.ts @@ -1,5 +1,6 @@ import { checkErrors, testName } from '../../support'; import { projectDropdown } from '../../views/common'; +import { guidedTour } from '../../views/guided-tour'; import { listPage } from '../../views/list-page'; import { nav } from '../../views/nav'; @@ -51,6 +52,7 @@ describe('Create image pull secret', () => { before(() => { cy.login(); + guidedTour.close(); cy.createProjectWithCLI(testName); }); diff --git a/frontend/packages/integration-tests-cypress/tests/crud/secrets/add-to-workload.cy.ts b/frontend/packages/integration-tests-cypress/tests/crud/secrets/add-to-workload.cy.ts index f75217b4f9e..941d4aa76a1 100644 --- a/frontend/packages/integration-tests-cypress/tests/crud/secrets/add-to-workload.cy.ts +++ b/frontend/packages/integration-tests-cypress/tests/crud/secrets/add-to-workload.cy.ts @@ -1,6 +1,7 @@ import * as _ from 'lodash'; import { DeploymentKind } from '@console/internal/module/k8s'; import { checkErrors, testName } from '../../../support'; +import { guidedTour } from '../../../views/guided-tour'; import { modal } from '../../../views/modal'; import { secrets } from '../../../views/secret'; @@ -43,6 +44,7 @@ const deployment: DeploymentKind = { describe('Add Secret to Workloads', () => { before(() => { cy.login(); + guidedTour.close(); cy.createProjectWithCLI(testName); cy.exec(`echo '${JSON.stringify(deployment)}' | kubectl create -n ${testName} -f -`); cy.exec( diff --git a/frontend/packages/integration-tests-cypress/tests/crud/secrets/image-pull.cy.ts b/frontend/packages/integration-tests-cypress/tests/crud/secrets/image-pull.cy.ts index 8ab55c1c189..f53a19742b7 100644 --- a/frontend/packages/integration-tests-cypress/tests/crud/secrets/image-pull.cy.ts +++ b/frontend/packages/integration-tests-cypress/tests/crud/secrets/image-pull.cy.ts @@ -1,5 +1,6 @@ import { checkErrors, testName } from '../../../support'; import { detailsPage } from '../../../views/details-page'; +import { guidedTour } from '../../../views/guided-tour'; import { secrets } from '../../../views/secret'; const heading = 'Create image pull secret'; @@ -7,6 +8,7 @@ const heading = 'Create image pull secret'; describe('Image pull secrets', () => { before(() => { cy.login(); + guidedTour.close(); cy.createProjectWithCLI(testName); }); diff --git a/frontend/packages/integration-tests-cypress/tests/crud/secrets/key-value.cy.ts b/frontend/packages/integration-tests-cypress/tests/crud/secrets/key-value.cy.ts index 864323bab9c..7bb1f9c4c19 100644 --- a/frontend/packages/integration-tests-cypress/tests/crud/secrets/key-value.cy.ts +++ b/frontend/packages/integration-tests-cypress/tests/crud/secrets/key-value.cy.ts @@ -2,6 +2,7 @@ import 'cypress-file-upload'; import { checkErrors, testName } from '../../../support'; import { detailsPage } from '../../../views/details-page'; +import { guidedTour } from '../../../views/guided-tour'; import { listPage } from '../../../views/list-page'; import { nav } from '../../../views/nav'; import { secrets } from '../../../views/secret'; @@ -33,6 +34,7 @@ describe('Create key/value secrets', () => { before(() => { cy.login(); + guidedTour.close(); cy.createProjectWithCLI(testName); }); @@ -63,9 +65,7 @@ describe('Create key/value secrets', () => { cy.byLegacyTestID('file-input-textarea').should('not.exist'); cy.byTestID('alert-info').should('exist'); secrets.save(); - cy.byTestID('loading-indicator').should('not.exist'); - detailsPage.isLoaded(); - detailsPage.titleShouldContain(binarySecretName); + secrets.detailsPageIsLoaded(binarySecretName); cy.exec( `oc get secret -n ${testName} ${binarySecretName} --template '{{.data.${secretKey}}}' | base64 -d`, { @@ -78,9 +78,7 @@ describe('Create key/value secrets', () => { }); modifySecretForm(modifiedSecretKey); secrets.save(); - cy.byTestID('loading-indicator').should('not.exist'); - detailsPage.isLoaded(); - detailsPage.titleShouldContain(binarySecretName); + secrets.detailsPageIsLoaded(binarySecretName); cy.exec( `oc get secret -n ${testName} ${binarySecretName} --template '{{.data.${modifiedSecretKey}}}' | base64 -d`, { @@ -99,9 +97,7 @@ describe('Create key/value secrets', () => { cy.byLegacyTestID('file-input-textarea').should('contain.text', asciiSecret); cy.byTestID('alert-info').should('not.exist'); secrets.save(); - cy.byTestID('loading-indicator').should('not.exist'); - detailsPage.isLoaded(); - detailsPage.titleShouldContain(asciiSecretName); + secrets.detailsPageIsLoaded(asciiSecretName); cy.exec( `oc get secret -n ${testName} ${asciiSecretName} --template '{{.data.${secretKey}}}' | base64 -d`, { @@ -119,9 +115,7 @@ describe('Create key/value secrets', () => { cy.byLegacyTestID('file-input-textarea').should('contain.text', unicodeSecret); cy.byTestID('alert-info').should('not.exist'); secrets.save(); - cy.byTestID('loading-indicator').should('not.exist'); - detailsPage.isLoaded(); - detailsPage.titleShouldContain(unicodeSecretName); + secrets.detailsPageIsLoaded(unicodeSecretName); cy.exec( `oc get secret -n ${testName} ${unicodeSecretName} --template '{{.data.${secretKey}}}' | base64 -d`, { diff --git a/frontend/packages/integration-tests-cypress/tests/crud/secrets/source.cy.ts b/frontend/packages/integration-tests-cypress/tests/crud/secrets/source.cy.ts index c8b8b6501c4..328976d8d9b 100644 --- a/frontend/packages/integration-tests-cypress/tests/crud/secrets/source.cy.ts +++ b/frontend/packages/integration-tests-cypress/tests/crud/secrets/source.cy.ts @@ -1,5 +1,6 @@ import { checkErrors, testName } from '../../../support'; import { detailsPage } from '../../../views/details-page'; +import { guidedTour } from '../../../views/guided-tour'; import { secrets } from '../../../views/secret'; describe('Source secrets', () => { @@ -14,15 +15,21 @@ describe('Source secrets', () => { before(() => { cy.login(); + guidedTour.close(); cy.createProjectWithCLI(testName); }); beforeEach(() => { + // ensure the test project is selected to avoid flakes + cy.visit(`/k8s/cluster/projects/${testName}`); cy.visit(`/k8s/ns/${testName}/secrets/`); secrets.clickCreateSecretDropdownButton('source'); }); afterEach(() => { + cy.exec(`oc delete secret -n ${testName} ${basicSourceSecretName} ${sshSourceSecretName}`, { + failOnNonZeroExit: false, + }); checkErrors(); }); diff --git a/frontend/packages/integration-tests-cypress/tests/crud/secrets/webhook.cy.ts b/frontend/packages/integration-tests-cypress/tests/crud/secrets/webhook.cy.ts index 5d136b312e7..66f357b6fe2 100644 --- a/frontend/packages/integration-tests-cypress/tests/crud/secrets/webhook.cy.ts +++ b/frontend/packages/integration-tests-cypress/tests/crud/secrets/webhook.cy.ts @@ -1,5 +1,6 @@ import { checkErrors, testName } from '../../../support'; import { detailsPage } from '../../../views/details-page'; +import { guidedTour } from '../../../views/guided-tour'; import { secrets } from '../../../views/secret'; describe('Webhook secret', () => { @@ -8,6 +9,7 @@ describe('Webhook secret', () => { before(() => { cy.login(); + guidedTour.close(); cy.createProjectWithCLI(testName); }); diff --git a/frontend/packages/integration-tests-cypress/views/secret.ts b/frontend/packages/integration-tests-cypress/views/secret.ts index 5e863f58216..fca8bb52513 100644 --- a/frontend/packages/integration-tests-cypress/views/secret.ts +++ b/frontend/packages/integration-tests-cypress/views/secret.ts @@ -56,6 +56,7 @@ export const secrets = { cy.byTestID('loading-indicator').should('not.exist'); detailsPage.isLoaded(); detailsPage.titleShouldContain(secretName); + cy.byTestID('secret-data').should('exist'); }, encode: (username, password) => Base64.encode(`${username}:${password}`), enterSecretName: (secretName: string) => cy.byTestID('secret-name').type(secretName), diff --git a/frontend/public/components/configmap-and-secret-data.tsx b/frontend/public/components/configmap-and-secret-data.tsx index cd534ffa3f4..dc935c6f29a 100644 --- a/frontend/public/components/configmap-and-secret-data.tsx +++ b/frontend/public/components/configmap-and-secret-data.tsx @@ -126,34 +126,36 @@ const SecretDataRevealButton: React.FC = ({ reveal, export const SecretData: React.FC = ({ data }) => { const [reveal, setReveal] = React.useState(false); - const [hasRevealableContent, setHasRevealableContent] = React.useState(false); const { t } = useTranslation(); - const dataDescriptionList = React.useMemo(() => { - return data - ? Object.keys(data) - .sort() - .map((k) => { - const isBinary = ITOB.isBinary(k, Buffer.from(data[k], 'base64')); - if (!isBinary && data[k]) { - setHasRevealableContent(hasRevealableContent || !isBinary); - } - return ( - -
- {k} -
-
- {isBinary ? ( - - ) : ( - - )} -
-
- ); - }) - : []; + const { items: dataDescriptionList, hasRevealableContent } = React.useMemo(() => { + if (!data) { + return { items: [], hasRevealableContent: false }; + } + let revealable = false; + const items = Object.keys(data) + .sort() + .map((k) => { + const isBinary = ITOB.isBinary(k, Buffer.from(data[k], 'base64')); + if (!isBinary && data[k]) { + revealable = true; + } + return ( + +
+ {k} +
+
+ {isBinary ? ( + + ) : ( + + )} +
+
+ ); + }); + return { items, hasRevealableContent: revealable }; }, [data, reveal]); return (