Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 148 additions & 6 deletions web/cypress.config.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,153 @@
import { defineConfig } from "cypress";
import { defineConfig } from 'cypress';
import * as fs from 'fs-extra';
import * as console from 'console';
import * as path from 'path';
import registerCypressGrep from '@cypress/grep/src/plugin';

export default defineConfig({
screenshotsFolder: './cypress/screenshots',
screenshotOnRunFailure: true,
trashAssetsBeforeRuns: true,
videosFolder: './cypress/videos',
video: true,
videoCompression: false,
reporter: './node_modules/cypress-multi-reporters',
reporterOptions: {
configFile: 'reporter-config.json',
},
env: {
grepFilterSpecs: true,
HOST_API: process.env.CYPRESS_BASE_URL.replace(/console-openshift-console.apps/, 'api').concat(
':6443',
),
LOGIN_USERNAME: process.env.CYPRESS_LOGIN_USERS.split(',')[0].split(':')[0],
LOGIN_PASSWORD: process.env.CYPRESS_LOGIN_USERS.split(',')[0].split(':')[1],
TIMEZONE: process.env.CYPRESS_TIMEZONE || 'UTC',
MOCK_NEW_METRICS: process.env.CYPRESS_MOCK_NEW_METRICS || 'false',
COO_NAMESPACE: process.env.CYPRESS_COO_NAMESPACE || 'openshift-cluster-observability-operator',
typeDelay: 200,
},
fixturesFolder: 'cypress/fixtures',
defaultCommandTimeout: 80000, //due to performance loading issue on console
readyTimeoutMilliseconds: 120000,
installTimeoutMilliseconds: 600000,
retries: {
runMode: 0,
openMode: 0,
},
e2e: {
baseUrl: 'http://localhost:9003',
defaultCommandTimeout: 30000,
supportFile: 'cypress/support/index.ts',
viewportHeight: 1080,
browser: "chrome",
viewportWidth: 1920,
viewportHeight: 1080,
setupNodeEvents(on, config) {
registerCypressGrep(config);

on(
'before:browser:launch',
(
browser = {
name: '',
family: 'chromium',
channel: '',
displayName: '',
version: '',
majorVersion: '',
path: '',
isHeaded: false,
isHeadless: false,
},
launchOptions,
) => {
if (browser.family === 'chromium' && browser.name !== 'electron') {
// Auto open devtools
launchOptions.args.push('--enable-precise-memory-info');
// Add flags for headless/container stability:
launchOptions.args.push('--disable-gpu'); // Often necessary for headless
launchOptions.args.push('--no-sandbox'); // Often needed in containers, understand security implications
launchOptions.args.push('--disable-dev-shm-usage'); // Crucial for Docker to prevent crashes
launchOptions.args.push('--window-size=1920,1080');
}

return launchOptions;
},
);
// `on` is used to hook into various events Cypress emits
on('task', {
log(message) {
console.log(message);
return null;
},
logError(message) {
console.error(message);
return null;
},
logTable(data) {
console.table(data);
return null;
},
readFileIfExists(filename) {
if (fs.existsSync(filename)) {
return fs.readFileSync(filename, 'utf8');
}
return null;
},
clearDownloads(folder: string = config.downloadsFolder): null {
// You must return a value or a promise from a task.
// Returning null is a common practice for tasks that don't need to yield a value.
console.log(`Clearing downloads folder: ${folder}`);
fs.emptyDirSync(folder);
return null;
},
/**
* Checks if a file exists in the specified folder (defaults to downloads folder).
* @param args Object containing fileName and optional folder.
* @returns True if the file exists, false otherwise.
*/
doesFileExist({ fileName, folder = config.downloadsFolder }: { fileName: string; folder?: string }): boolean {
const filePath = path.join(folder, fileName);
const exists = fs.existsSync(filePath);
console.log(`Checking if file "${fileName}" exists at "${filePath}": ${exists}`);
return exists;
},

/**
* Gets a list of file names in the specified folder (defaults to downloads folder).
* @param folder The folder to list files from.
* @returns An array of file names.
*/
getFilesInFolder(folder: string = config.downloadsFolder): string[] {
if (!fs.existsSync(folder)) {
console.log(`Folder does not exist: ${folder}`);
return [];
}
const files = fs.readdirSync(folder);
console.log(`Files in "${folder}": ${files.join(', ')}`);
return files;
},

});
on('after:spec', (spec: Cypress.Spec, results: CypressCommandLine.RunResult) => {
if (results && results.video) {
// Do we have failures for any retry attempts?
const failures = results.tests.some((test) =>
test.attempts.some((attempt) => attempt.state === 'failed'),
);
if (!failures && fs.existsSync(results.video)) {
// Delete the video if the spec passed and no tests retried
fs.unlinkSync(results.video);
}
}
});
return config;
},
supportFile: './cypress/support/index.ts',
specPattern: './cypress/e2e/**/*.cy.{js,jsx,ts,tsx}',
downloadsFolder: './cypress/downloads',
numTestsKeptInMemory: 1,
testIsolation: false,
experimentalModifyObstructiveThirdPartyCode: true,
experimentalOriginDependencies: true,
experimentalMemoryManagement: true,
experimentalStudio: true,
},
});
});
43 changes: 43 additions & 0 deletions web/cypress/e2e/coo/01.coo_bvt.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { commonPages } from '../../views/common';
import { nav } from '../../views/nav';

// Set constants for the operators that need to be installed for tests.
const MCP = {
namespace: Cypress.env('COO_NAMESPACE'),
packageName: 'cluster-observability-operator',
operatorName: 'Cluster Observability Operator',
config: {
kind: 'UIPlugin',
name: 'monitoring',
},
};

const MP = {
namespace: 'openshift-monitoring',
operatorName: 'Cluster Monitoring Operator',
};

describe('BVT: COO', { tags: ['@smoke', '@coo'] }, () => {

before(() => {
cy.beforeBlockCOO(MCP, MP);

});

it('1. Admin perspective - Observe Menu', () => {
cy.log('Admin perspective - Observe Menu and verify all submenus');
nav.sidenav.clickNavLink(['Observe', 'Alerting']);
commonPages.titleShouldHaveText('Alerting');
nav.tabs.switchTab('Silences');
nav.tabs.switchTab('Alerting rules');
nav.sidenav.clickNavLink(['Observe', 'Dashboards (Perses)']);
commonPages.titleShouldHaveText('Dashboards');
nav.sidenav.clickNavLink(['Observe', 'Alerting']);

});

/**
* TODO: To be replaced by COO validation such as Dashboards (Perses) scenarios
*/

});
84 changes: 84 additions & 0 deletions web/cypress/e2e/monitoring/00.bvt_admin.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import { nav } from '../../views/nav';
import { alerts } from '../../fixtures/monitoring/alert';
import { runBVTMonitoringTests } from '../../support/monitoring/00.bvt_monitoring.cy';
import { commonPages } from '../../views/common';
import { overviewPage } from '../../views/overview-page';
import { metricsPage } from '../../views/metrics';
// Set constants for the operators that need to be installed for tests.
const MP = {
namespace: 'openshift-monitoring',
operatorName: 'Cluster Monitoring Operator',
};

describe('BVT: Monitoring', { tags: ['@smoke', '@monitoring'] }, () => {

before(() => {
cy.beforeBlock(MP);
});

beforeEach(() => {
// need to pass through metrics page to have the alerts loaded correctly from scenario to scenario
nav.sidenav.clickNavLink(['Observe', 'Metrics']);
commonPages.titleShouldHaveText('Metrics');
alerts.getWatchdogAlert();
nav.sidenav.clickNavLink(['Observe', 'Alerting']);
commonPages.titleShouldHaveText('Alerting');
alerts.getWatchdogAlert();
});

it(`1. Admin perspective - Observe Menu`, () => {
cy.log(`Admin perspective - Observe Menu and verify all submenus`);
nav.sidenav.clickNavLink(['Administration', 'Cluster Settings']);
commonPages.detailsPage.administration_clusterSettings();
nav.sidenav.clickNavLink(['Observe', 'Alerting']);
commonPages.titleShouldHaveText('Alerting');
nav.tabs.switchTab('Silences');
nav.sidenav.clickNavLink(['Observe', 'Metrics']);
commonPages.titleShouldHaveText('Metrics');
nav.sidenav.clickNavLink(['Observe', 'Dashboards']);
commonPages.titleShouldHaveText('Dashboards');
nav.sidenav.clickNavLink(['Observe', 'Targets']);
commonPages.titleShouldHaveText('Metrics targets');


});
// TODO: Intercept Bell GET request to inject an alert (Watchdog to have it opened in Alert Details page?)
// it('Admin perspective - Bell > Alert details > Alerting rule details > Metrics flow', () => {
// cy.visit('/');
// commonPages.clickBellIcon();
// commonPages.bellIconClickAlert('TargetDown');
// commonPages.titleShouldHaveText('TargetDown')

// });


it(`2. Admin perspective - Overview Page > Status - View alerts`, () => {
nav.sidenav.clickNavLink(['Home', 'Overview']);
overviewPage.clickStatusViewAlerts();
commonPages.titleShouldHaveText('Alerting');
});

//TODO: Intercept and inject a valid alert into status-card to be opened correctly to Alerting / Alerts page
// I couldn't make Watchdog working on status-card
// it('3. Admin perspective - Overview Page > Status - View details', () => {
// cy.visit('/');
// nav.sidenav.clickNavLink(['Home', 'Overview']);
// overviewPage.clickStatusViewDetails(0);
// detailsPage.sectionHeaderShouldExist('Alert details');
// });

it(`3. Admin perspective - Cluster Utilization - Metrics`, () => {
nav.sidenav.clickNavLink(['Home', 'Overview']);
overviewPage.clickClusterUtilizationViewCPU();
commonPages.titleShouldHaveText('Metrics');
commonPages.projectDropdownShouldNotExist();
cy.wait(3000);
metricsPage.clickActionsDeleteAllQueries();
});

// Run tests in Administrator perspective
runBVTMonitoringTests({
name: 'Administrator',
});

});
35 changes: 35 additions & 0 deletions web/cypress/e2e/monitoring/regression/01.reg_alerts_admin.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { alerts } from '../../../fixtures/monitoring/alert';
import { runAllRegressionAlertsTests } from '../../../support/monitoring/01.reg_alerts.cy';
import { commonPages } from '../../../views/common';
import { nav } from '../../../views/nav';

const MP = {
namespace: 'openshift-monitoring',
operatorName: 'Cluster Monitoring Operator',
};

// Test suite for Administrator perspective
describe('Regression: Monitoring - Alerts (Administrator)', { tags: ['@monitoring', '@alerts'] }, () => {

before(() => {
cy.beforeBlock(MP);
});

beforeEach(() => {
alerts.getWatchdogAlert();
nav.sidenav.clickNavLink(['Observe', 'Metrics']);
commonPages.titleShouldHaveText('Metrics');
alerts.getWatchdogAlert();
nav.sidenav.clickNavLink(['Observe', 'Alerting']);
commonPages.titleShouldHaveText('Alerting');
alerts.getWatchdogAlert();
});

// Run tests in Administrator perspective
runAllRegressionAlertsTests({
name: 'Administrator',
});

});


28 changes: 28 additions & 0 deletions web/cypress/e2e/monitoring/regression/02.reg_metrics_admin_1.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { runAllRegressionMetricsTests1 } from '../../../support/monitoring/02.reg_metrics_1.cy';
import { commonPages } from '../../../views/common';
import { nav } from '../../../views/nav';

const MP = {
namespace: 'openshift-monitoring',
operatorName: 'Cluster Monitoring Operator',
};

// Test suite for Administrator perspective
describe('Regression: Monitoring - Metrics (Administrator)', { tags: ['@monitoring', '@metrics'] }, () => {

before(() => {
cy.beforeBlock(MP);
});

beforeEach(() => {
nav.sidenav.clickNavLink(['Observe', 'Metrics']);
commonPages.titleShouldHaveText('Metrics');
});

// Run tests in Administrator perspective
runAllRegressionMetricsTests1({
name: 'Administrator',
});

});

28 changes: 28 additions & 0 deletions web/cypress/e2e/monitoring/regression/02.reg_metrics_admin_2.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { runAllRegressionMetricsTests2 } from '../../../support/monitoring/02.reg_metrics_2.cy';
import { commonPages } from '../../../views/common';
import { nav } from '../../../views/nav';

const MP = {
namespace: 'openshift-monitoring',
operatorName: 'Cluster Monitoring Operator',
};

// Test suite for Administrator perspective
describe('Regression: Monitoring - Metrics (Administrator)', { tags: ['@monitoring', '@metrics'] }, () => {

before(() => {
cy.beforeBlock(MP);
});

beforeEach(() => {
nav.sidenav.clickNavLink(['Observe', 'Metrics']);
commonPages.titleShouldHaveText('Metrics');
});

// Run tests in Administrator perspective
runAllRegressionMetricsTests2({
name: 'Administrator',
});

});

Loading