Skip to content

Commit 3294a38

Browse files
committed
Test Logging-UI using real data
1 parent 8b7f3df commit 3294a38

18 files changed

+2857
-6
lines changed

web/cypress.config.ts

Lines changed: 110 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,120 @@
11
import { defineConfig } from 'cypress';
2+
const fs = require('fs');
3+
const path = require('path');
24

35
export default defineConfig({
6+
screenshotsFolder: './gui_test_screenshots/cypress/screenshots',
7+
screenshotOnRunFailure: true,
8+
trashAssetsBeforeRuns: true,
9+
videosFolder: './gui_test_screenshots/cypress/videos',
10+
video: true,
11+
videoCompression: false,
12+
//reporter: './node_modules/cypress-multi-reporters',
13+
//reporterOptions: {
14+
// configFile: 'reporter-config.json',
15+
//},
16+
env: {
17+
grepFilterSpecs: false,
18+
'KUBECONFIG_PATH': process.env.KUBECONFIG,
19+
'E2E_RUN_TAGS': process.env.E2E_RUN_TAGS,
20+
'NOO_CS_IMAGE': process.env.MULTISTAGE_PARAM_OVERRIDE_CYPRESS_NOO_CS_IMAGE,
21+
'OPENSHIFT_VERSION': process.env.CYPRESS_OPENSHIFT_VERSION,
22+
23+
},
24+
fixturesFolder: 'fixtures',
25+
defaultCommandTimeout: 30000,
26+
retries: {
27+
runMode: 0,
28+
openMode: 0,
29+
},
30+
viewportWidth: 1600,
31+
viewportHeight: 1200,
432
e2e: {
5-
baseUrl: 'http://localhost:9003',
33+
baseUrl: process.env.CYPRESS_BASE_URL || process.env.BASE_URL || 'http://localhost:9003',
634
setupNodeEvents(on, config) {
735
// eslint-disable-next-line @typescript-eslint/no-var-requires
836
require('@cypress/code-coverage/task')(on, config);
37+
on('before:browser:launch', (browser = {
38+
name: "",
39+
family: "chromium",
40+
channel: "",
41+
displayName: "",
42+
version: "",
43+
majorVersion: "",
44+
path: "",
45+
isHeaded: false,
46+
isHeadless: false
47+
}, launchOptions) => {
48+
if (browser.family === 'chromium' && browser.name !== 'electron') {
49+
// auto open devtools
50+
launchOptions.args.push('--enable-precise-memory-info')
51+
}
52+
53+
return launchOptions
54+
55+
});
56+
// `on` is used to hook into various events Cypress emits
57+
on('task', {
58+
log(message) {
59+
console.log(message);
60+
return null;
61+
},
62+
logError(message) {
63+
console.error(message);
64+
return null;
65+
},
66+
logTable(data) {
67+
console.table(data);
68+
return null;
69+
},
70+
readFileIfExists(filename) {
71+
if (fs.existsSync(filename)) {
72+
return fs.readFileSync(filename, 'utf8');
73+
}
74+
return null;
75+
},
76+
});
77+
on('after:screenshot', (details) => {
78+
// Prepend "1_", "2_", etc. to screenshot filenames because they are sorted alphanumerically in CI's artifacts dir
79+
const pathObj = path.parse(details.path);
80+
fs.readdir(pathObj.dir, (error, files) => {
81+
const newPath = `${pathObj.dir}${path.sep}${files.length}_${pathObj.base}`;
82+
return new Promise((resolve, reject) => {
83+
// eslint-disable-next-line consistent-return
84+
fs.rename(details.path, newPath, (err) => {
85+
if (err) return reject(err);
86+
// because we renamed and moved the image, resolve with the new path
87+
// so it is accurate in the test results
88+
resolve({ path: newPath });
89+
});
90+
});
91+
});
92+
});
93+
on(
94+
'after:spec',
95+
(spec: Cypress.Spec, results: CypressCommandLine.RunResult) => {
96+
if (results && results.video) {
97+
// Do we have failures for any retry attempts?
98+
const failures = results.tests.some((test) =>
99+
test.attempts.some((attempt) => attempt.state === 'failed')
100+
)
101+
if (!failures && fs.existsSync(results.video)) {
102+
// delete the video if the spec passed and no tests retried
103+
fs.unlinkSync(results.video)
104+
}
105+
}
106+
}
107+
);
108+
require('@cypress/grep/src/plugin')(config);
9109
return config;
10110
},
111+
supportFile: './cypress/support/e2e.ts',
112+
specPattern: './cypress/e2e/**/*.cy.{js,jsx,ts,tsx}',
113+
numTestsKeptInMemory: 1,
114+
testIsolation: false,
115+
experimentalModifyObstructiveThirdPartyCode: true,
116+
experimentalOriginDependencies: true,
117+
experimentalMemoryManagement: true,
118+
experimentalCspAllowList: ['default-src', 'script-src']
11119
},
12-
video: false,
13-
viewportWidth: 1400,
14-
});
120+
})
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import { TestIds } from '../../../src/test-ids';
2+
import { commonTests } from './logs-common-test.cy.ts';
3+
import { APP_NAMESPACE1,APP_NAMESPACE2,APP_MESSAGE } from './logs-common-test.cy.ts';
4+
5+
describe('Admin in AdminConsole AggregatedLogs', () => {
6+
before( function() {
7+
cy.uiLoginAsClusterAdmin("first_user");
8+
cy.switchToAdmConsole();
9+
cy.get('button[data-quickstart-id="qs-nav-workloads"]').click();
10+
});
11+
12+
beforeEach( function() {
13+
//Hover on WorkLoad -> Pods page
14+
cy.get('[id="page-sidebar"]')
15+
.within(() => {
16+
cy.contains('a[data-test="nav"]', 'Pods').click();
17+
})
18+
});
19+
20+
after( function() {
21+
//cy.uiLogoutClusterAdmin("first_user");
22+
});
23+
24+
it('Log Panel top elements', {tags:['distinct','aggr']} , () => {
25+
//load Aggregated Logs for the first pod in APP_NAMESPACE1
26+
cy.get('[data-test-id="namespace-bar-dropdown"]')
27+
.find('button[aria-expanded="false"]')
28+
.click();
29+
30+
cy.get('[data-test="namespace-dropdown-menu"]')
31+
.within(() => {
32+
cy.contains('button', `${APP_NAMESPACE1}`).click();
33+
});
34+
35+
cy.get('tr[data-test-rows="resource-row"]')
36+
.first()
37+
.find('td')
38+
.first()
39+
.find('a.co-resource-item__resource-name')
40+
.click();
41+
cy.get('a[data-test-id="horizontal-link-Aggregated Logs"]').click();
42+
43+
cy.getByTestId(TestIds.ToggleHistogramButton).should('exist');
44+
cy.getByTestId(TestIds.TimeRangeDropdown).should('exist');
45+
cy.getByTestId(TestIds.RefreshIntervalDropdown).should('exist');
46+
cy.getByTestId(TestIds.SyncButton).should('exist');
47+
cy.getByTestId(TestIds.AvailableAttributes).should('exist');
48+
cy.getByTestId(TestIds.SeverityDropdown).should('exist');
49+
cy.getByTestId(TestIds.TenantToggle).should('not.exist');
50+
cy.contains('button', 'Show Resources').should('exist');
51+
cy.getByTestId(TestIds.ShowStatsToggle).should('exist');
52+
cy.contains('button', 'Export as CSV').should('exist');
53+
cy.getByTestId(TestIds.ExecuteVolumeButton).should('exist');
54+
cy.getByTestId(TestIds.ExecuteQueryButton).should('exist');
55+
cy.getByTestId(TestIds.ShowQueryToggle).should('exist');
56+
cy.getByTestId(TestIds.LogsTable).should('exist');
57+
if (String(Cypress.env('CLUSTERLOGGING_DATAMODE')) == "select" ) {
58+
cy.getByTestId(TestIds.SchemaToggle).should('exist');
59+
}
60+
cy.getByTestId(TestIds.AttributeFilters).within(() => {
61+
cy.getByTestId(TestIds.AvailableAttributes).click();
62+
cy.contains('li', 'Content');
63+
cy.contains('li', 'Namespaces').should('not.exist');
64+
cy.contains('li', 'Pod');
65+
cy.contains('li', 'Containers');
66+
});
67+
});
68+
69+
it('admin can display applicatioins logs',{tags:['distinct', 'aggr']}, () => {
70+
//load Aggregated Logs for the first pod in APP_NAMESPACE1
71+
cy.get('[data-test-id="namespace-bar-dropdown"]')
72+
.find('button[aria-expanded="false"]')
73+
.click();
74+
75+
cy.get('[data-test="namespace-dropdown-menu"]')
76+
.within(() => {
77+
cy.contains('button', `${APP_NAMESPACE1}`).click();
78+
});
79+
80+
cy.get('section.pf-v6-c-page__main-section')
81+
.contains('h1','Pods');
82+
cy.get('section[id="content-scrollable"]')
83+
.within(() => {
84+
cy.get('tr[data-test-rows="resource-row"]')
85+
.first()
86+
.find('td')
87+
.first()
88+
.find('a.co-resource-item__resource-name')
89+
.click();
90+
});
91+
cy.get('a[data-test-id="horizontal-link-Aggregated Logs"]').click();
92+
cy.getByTestId(TestIds.LogsTable,{ timeout: 20000 }).should('be.visible');
93+
cy.assertLogInLogsTable();
94+
});
95+
96+
it('admin can display infra container logs',{tags:['distinct','aggr']}, () => {
97+
//load Aggregated Logs for pod in openshift-monitoring
98+
cy.get('[data-test-id="namespace-bar-dropdown"]')
99+
.find('button[aria-expanded="false"]')
100+
.click();
101+
cy.get('input[data-test="dropdown-text-filter"]').type('openshift-monitoring');
102+
cy.get('input[data-test="showSystemSwitch"]').then($el => {
103+
if ($el.attr('data-checked-state') === 'false') {
104+
cy.wrap($el).click();
105+
}
106+
});
107+
cy.get('[data-test="dropdown-menu-item-link"]',{ timeout: 6000 })
108+
.contains('button', 'openshift-monitoring')
109+
.click();
110+
cy.get('section.pf-v6-c-page__main-section')
111+
.contains('h1','Pods');
112+
//Click the pod alertmanager-main-0
113+
cy.get('tbody[role="rowgroup"]')
114+
.find('a[data-test-id="alertmanager-main-0"]')
115+
.click();
116+
//click Aggregated Logs tab
117+
cy.get('a[data-test-id="horizontal-link-Aggregated Logs"]').click();
118+
cy.getByTestId(TestIds.LogsTable,{ timeout: 20000 }).should('be.visible');
119+
cy.assertLogInLogsTable();
120+
});
121+
})
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import { TestIds } from '../../../src/test-ids';
2+
import { commonTests } from './logs-common-test.cy.ts';
3+
import { APP_NAMESPACE1,APP_NAMESPACE2,APP_MESSAGE } from './logs-common-test.cy.ts';
4+
5+
describe('Impersonate User in AdminConsole AggregatedLogs', () => {
6+
before( function() {
7+
cy.cliLogin("second_user")
8+
cy.grantLogRoles("second_user", `${APP_NAMESPACE1}`);
9+
cy.grantLogRoles("second_user", `${APP_NAMESPACE2}`);
10+
cy.uiLoginAsClusterAdmin("first_user");
11+
cy.switchToAdmConsole();
12+
cy.uiImpersonateUser("second_user");
13+
cy.switchToAdmConsole();
14+
cy.get('button[data-quickstart-id="qs-nav-workloads"]').click();
15+
});
16+
17+
beforeEach( function() {
18+
//reload Aggregated Logs for first pod in APP_NAMESPACE1
19+
cy.get('[id="page-sidebar"]')
20+
.within(() => {
21+
cy.contains('a[data-test="nav"]', 'Pods').click();
22+
})
23+
cy.get('[data-test-id="namespace-bar-dropdown"]')
24+
.find('button[aria-expanded="false"]')
25+
.click();
26+
27+
cy.get('[data-test="namespace-dropdown-menu"]')
28+
.within(() => {
29+
cy.contains('button', `${APP_NAMESPACE1}`).click();
30+
});
31+
cy.get('section.pf-v6-c-page__main-section')
32+
.contains('h1','Pods');
33+
cy.get('section[id="content-scrollable"]')
34+
.within(() => {
35+
cy.get('tr[data-test-rows="resource-row"]')
36+
.first()
37+
.find('td')
38+
.first()
39+
.find('a.co-resource-item__resource-name')
40+
.click();
41+
});
42+
cy.get('a[data-test-id="horizontal-link-Aggregated Logs"]').click();
43+
cy.getByTestId(TestIds.LogsTable,{ timeout: 20000 }).should('be.visible');
44+
});
45+
46+
after( function() {
47+
cy.uiLogoutUser("second_user");
48+
cy.removeLogRoles("second_user", `${APP_NAMESPACE1}`);
49+
cy.removeLogRoles("second_user", `${APP_NAMESPACE2}`);
50+
});
51+
52+
it('validate elements in Aggregated Logs',{tags:['distinct', 'aggr']}, () => {
53+
cy.getByTestId(TestIds.ToggleHistogramButton).should('exist');
54+
cy.getByTestId(TestIds.TimeRangeDropdown).should('exist');
55+
cy.getByTestId(TestIds.RefreshIntervalDropdown).should('exist');
56+
cy.getByTestId(TestIds.SyncButton).should('exist');
57+
cy.getByTestId(TestIds.AvailableAttributes).should('exist');
58+
cy.getByTestId(TestIds.SeverityDropdown).should('exist');
59+
cy.contains('button', 'Show Resources').should('exist');
60+
cy.getByTestId(TestIds.ShowStatsToggle).should('exist');
61+
cy.contains('button', 'Export as CSV').should('exist');
62+
cy.getByTestId(TestIds.ExecuteVolumeButton).should('exist');
63+
cy.getByTestId(TestIds.ExecuteQueryButton).should('exist');
64+
cy.getByTestId(TestIds.ShowQueryToggle).should('exist');
65+
cy.getByTestId(TestIds.ToogleStreamingButton).should('exist');
66+
cy.getByTestId(TestIds.LogsTable).should('exist');
67+
cy.getByTestId(TestIds.TenantToggle).should('not.exist'); //Specical feature
68+
cy.getByTestId(TestIds.AttributeFilters).within(() => {
69+
cy.getByTestId(TestIds.AvailableAttributes).click();
70+
cy.contains('li', 'Content');
71+
cy.contains('li', 'Namespaces').should('not.exist'); //Specical feature
72+
cy.contains('li', 'Pod');
73+
cy.contains('li', 'Containers');
74+
})
75+
if (String(Cypress.env('CLUSTERLOGGING_DATAMODE')) == "select" ) {
76+
cy.getByTestId(TestIds.SchemaToggle).should('exist');
77+
}
78+
});
79+
80+
it('user can display applicatioins logs',{tags:['distinct','aggr']}, () => {
81+
//load Aggregated Logs for the first pod in APP_NAMESPACE1
82+
cy.get('[data-test-id="namespace-bar-dropdown"]')
83+
.find('button[aria-expanded="false"]')
84+
.click();
85+
cy.get('[data-test="namespace-dropdown-menu"]')
86+
.within(() => {
87+
cy.contains('button', `${APP_NAMESPACE1}`).click();
88+
});
89+
cy.get('a[data-test="resource-inventory-item"]')
90+
.filter(`[href="/k8s/ns/${APP_NAMESPACE1}/pods"]`)
91+
.click();
92+
93+
cy.get('section.pf-v6-c-page__main-section')
94+
.contains('h1','Pods');
95+
cy.get('section[id="content-scrollable"]')
96+
.within(() => {
97+
cy.get('tr[data-test-rows="resource-row"]')
98+
.first()
99+
.find('td')
100+
.first()
101+
.find('a.co-resource-item__resource-name')
102+
.click();
103+
});
104+
cy.get('a[data-test-id="horizontal-link-Aggregated Logs"]').click();
105+
cy.getByTestId(TestIds.LogsTable,{ timeout: 20000 }).should('be.visible');
106+
cy.assertLogInLogsTable();
107+
});
108+
commonTests();
109+
});

0 commit comments

Comments
 (0)