Skip to content
Open
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
11 changes: 8 additions & 3 deletions web/cypress/e2e/incidents/00.coo_incidents_e2e.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,17 @@ describe('BVT: Incidents - e2e', { tags: ['@smoke', '@slow', '@incidents', '@e2e
incidentsPage.clearAllFilters();

const intervalMs = 60_000;
const maxMinutes = 30;

cy.log('1.2 Wait for incident with custom alert to appear');
// Poll via UI traversal with OOM-safe findIncidentWithAlert.
// The search loop has three layers of OOM protection:
// 1. cy.reload() — releases browser DOM each iteration
// 2. _quietSearch — suppresses Cypress DOM snapshots
// 3. Hard timeout (35 min) — kills infinite loops
// This makes it safe to poll for the full 30-minute window.
cy.waitUntil(() => incidentsPage.findIncidentWithAlert(currentAlertName), {
interval: intervalMs,
timeout: maxMinutes * intervalMs,
interval: 2 * intervalMs,
timeout: 30 * intervalMs + 2 * intervalMs,
});

cy.log('1.3 Verify custom alert appears in alerts table');
Expand Down
1 change: 1 addition & 0 deletions web/cypress/e2e/incidents/01.incidents.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const MP = {
describe('BVT: Incidents - UI', { tags: ['@smoke', '@incidents'] }, () => {
before(() => {
cy.beforeBlockCOO(MCP, MP, { dashboards: false, troubleshootingPanel: false });
incidentsPage.warmUpForPlugin();
cy.mockIncidentFixture(
'incident-scenarios/1-single-incident-firing-critical-and-warning-alerts.yaml',
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ const MP = {
describe('Regression: Charts UI - Comprehensive', { tags: ['@incidents'] }, () => {
before(() => {
cy.beforeBlockCOO(MCP, MP, { dashboards: false, troubleshootingPanel: false });
incidentsPage.warmUpForPlugin();
});

beforeEach(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ describe(
incidentsPage.setDays('1 day');
incidentsPage.elements.incidentsChartContainer().should('be.visible');
incidentsPage.elements.incidentsChartBarsGroups().should('have.length', 1);
cy.pause();

cy.log(
'2.2 Consecutive interval boundaries: End of segment 1 should equal Start of segment 2',
Expand Down Expand Up @@ -141,7 +140,6 @@ describe(
).to.equal(firstEnd);
});
});
cy.pause();

cy.log('2.3 Incident tooltip Start vs alert tooltip Start vs alerts table Start');
incidentsPage.hoverOverIncidentBarSegment(0, 0);
Expand Down Expand Up @@ -188,7 +186,6 @@ describe(
});
});
});
cy.pause();

cy.log('Expected failure: Incident tooltip Start times are 5 minutes off (OU-1221)');
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ describe(

before(() => {
cy.beforeBlockCOO(MCP, MP, { dashboards: false, troubleshootingPanel: false });
incidentsPage.warmUpForPlugin();

// Reset the search timeout so this spec gets a fresh 35-minute window
incidentsPage.resetSearchTimeout();
Comment thread
coderabbitai[bot] marked this conversation as resolved.

cy.log('Create firing alert for testing');
cy.cleanupIncidentPrometheusRules();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ const MP = {
describe('Regression: Silences Not Applied Correctly', { tags: ['@incidents'] }, () => {
before(() => {
cy.beforeBlockCOO(MCP, MP, { dashboards: false, troubleshootingPanel: false });
incidentsPage.warmUpForPlugin();
});

beforeEach(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ const MP = {
describe('Regression: Redux State Management', { tags: ['@incidents', '@incidents-redux'] }, () => {
before(() => {
cy.beforeBlockCOO(MCP, MP, { dashboards: false, troubleshootingPanel: false });
incidentsPage.warmUpForPlugin();
});

beforeEach(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ const MAX_GAP_RELAXED = 500;
describe('Regression: Stress Testing UI', { tags: ['@incidents'] }, () => {
before(() => {
cy.beforeBlockCOO(MCP, MP, { dashboards: false, troubleshootingPanel: false });
incidentsPage.warmUpForPlugin();
});

it('5.1 No excessive padding between chart top and alert bars for 100, 200, and 500 alerts', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: "Silenced and Firing Mixed Severity"
description: "One silenced critical incident (resolved) and one firing warning incident."
incidents:
- id: "silenced-critical-resolved-001"
component: "monitoring"
layer: "core"
timeline:
start: "4h"
end: "1h"
alerts:
- name: "SilencedCriticalAlert001"
namespace: "openshift-monitoring"
severity: "critical"
firing: false
silenced: true
timeline:
start: "3h"
end: "2h"

- id: "firing-warning-unsilenced-001"
component: "network"
layer: "core"
timeline:
start: "2h"
alerts:
- name: "FiringWarningAlert001"
namespace: "openshift-network"
severity: "warning"
firing: true
silenced: false
timeline:
start: "1h"
169 changes: 169 additions & 0 deletions web/cypress/reports/test-stability.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
# Test Stability Ledger

Tracks incident detection test stability across local and CI iteration runs. Updated automatically by `/cypress:test-iteration:iterate-incident-tests` and `/cypress:test-iteration:iterate-ci-flaky`.

## How to Read

- **Pass rate**: percentage across all recorded runs (local + CI combined)
- **Trend**: direction over last 3 runs
- **Last failure**: most recent failure reason and which run it occurred in
- **Fixed by**: commit that resolved the issue (if applicable)

## Current Status

| Test | Pass Rate | Trend | Runs | Last Failure | Fixed By |
|------|-----------|-------|------|-------------|----------|
| BVT: Incidents - 1.1 Toolbar and charts toggle functionality | 100% | stable | 7 | — | — |
| BVT: Incidents - 1.2 Incidents chart renders with bars | 100% | stable | 7 | — | — |
| BVT: Incidents - 1.3 Incidents table renders with rows | 100% | stable | 7 | — | — |
| BVT: Incidents - 1.4 Charts and alerts empty state | 100% | stable | 7 | — | — |
| BVT: Incidents - 1.5 Traverse Incident Table | 100% | stable | 7 | 2026-04-16: plugin tab timeout (80s) | 0cb566d (warmUpForPlugin in goTo + BVT before) |
| Regression: Filtering - 1. Severity filtering | 100% | stable | 7 | — | — |
| Regression: Filtering - 2. Chart interaction with active filters | 100% | stable | 7 | — | — |
| Regression: Charts UI - 2.1 Chart renders with correct bar count | 100% | stable | 7 | — | — |
| Regression: Charts UI - 2.2 Chart bars have correct severity colors | 100% | stable | 7 | — | — |
| Regression: Charts UI - 2.3 Toggle charts button hides/shows chart | 100% | stable | 7 | — | — |
| Regression: Charts UI - 2.4 Incident selection updates alert chart | 100% | stable | 7 | — | — |
| Regression: Silences - 3.1 Silenced alerts not shown as active | 100% | stable | 7 | — | — |
| Regression: Silences - 3.2 Mixed silenced and firing alerts | 100% | stable | 7 | — | — |
| Regression: Redux - 4.1 Redux state updates on filter change | 100% | stable | 7 | — | — |
| Regression: Redux - 4.2 Redux state persists across navigation | 100% | stable | 7 | — | — |
| Regression: Redux - 4.3 Days selector updates redux state | 100% | stable | 7 | — | — |
| Regression: Stress Testing - 5.1 No excessive padding | 100% | stable | 7 | — | — |

Comment on lines +14 to +33
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Test name keys in JSON don't match human-readable table labels.

The human-readable table uses names like BVT: Incidents - 1.1 Toolbar... while the JSON uses BVT: Incidents - UI 1. Toolbar.... This inconsistency could break automated correlation between the two sections if scripts attempt to match by test name.

Either align the naming conventions or document that they differ intentionally.

Also applies to: 54-155

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/cypress/reports/test-stability.md` around lines 14 - 33, The JSON test
keys and the human-readable table labels are inconsistent (e.g., JSON uses "BVT:
Incidents - UI 1. Toolbar..." while the table uses "BVT: Incidents - 1.1 Toolbar
and charts toggle functionality"); update the sources so they share a single
canonical identifier—either rename the JSON keys to match the table labels
(change "BVT: Incidents - UI 1. Toolbar..." → "BVT: Incidents - 1.1 Toolbar and
charts toggle functionality") or add a stable id field (e.g., "testId":
"BVT_Incidents_1.1") in the JSON and use that id in the table generation and
matching scripts; apply the same change for all affected entries (examples
include "BVT: Incidents - 1.5 Traverse Incident Table" and "Regression:
Filtering - 1. Severity filtering") so automated correlation scripts can
reliably match entries.

## Run History

### Run Log

| # | Date | Type | Cluster | Tests | Passed | Failed | Flaky | Commit |
|---|------|------|---------|-------|--------|--------|-------|--------|
| 1 | 2026-04-16 | local | ci-ln-trfv3nt (cluster 1) | 17 | 17 | 0 | 0 | 567c2e7 |
| 2 | 2026-04-16 | local | ci-ln-trfv3nt (cluster 1) | 17 | 17 | 0 | 0 | 567c2e7 |
| 3 | 2026-04-16 | local | ci-ln-trfv3nt (cluster 1) | 17 | 17 | 0 | 0 | 567c2e7 |
| 4 | 2026-04-16 | e2e-real | ci-ln-trfv3nt (cluster 1) | 1 | 1 | 0 | 0 | 92bba27 |
| 5 | 2026-04-16 | local | ci-ln-zgwt0qt (cluster 2) | 17 | 17 | 0 | 0 | 580dc96 |
| 6 | 2026-04-17 | local | ci-ln-lg6ry1t (cluster 3) | 17 | 17 | 0 | 0 | 580dc96 |
| 7 | 2026-04-17 | local | ci-ln-lg6ry1t (cluster 3) | 17 | 17 | 0 | 0 | d9f37d2 |
| 8 | 2026-04-22 | local | ci-ln-y7v0t92 (cluster 4) | 17 | 17 | 0 | 0 | 0cb566d |

<!-- STABILITY_DATA_START
This section is machine-readable. Do not edit manually.

{
"tests": {
"BVT: Incidents - UI 1. Toolbar and charts toggle functionality": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"BVT: Incidents - UI 1.2 Incidents chart renders with bars": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"BVT: Incidents - UI 1.3 Incidents table renders with rows": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"BVT: Incidents - UI 1.4 Charts and alerts empty state": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"BVT: Incidents - UI 1.5 Traverse Incident Table": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": "Timed out retrying after 80000ms: Expected to find element: [data-test=\"incidents-days-select-toggle\"]",
"last_failure_date": "2026-04-16",
"fixed_by": "0cb566d"
},
"Regression: Incidents Filtering 1. Severity filtering": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Incidents Filtering 2. Chart interaction with active filters": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Charts UI - Comprehensive 2.1 Chart renders with correct bar count": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Charts UI - Comprehensive 2.2 Chart bars have correct severity colors": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Charts UI - Comprehensive 2.3 Toggle charts button hides/shows chart": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Charts UI - Comprehensive 2.4 Incident selection updates alert chart": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Silences Not Applied Correctly 3.1 Silenced alerts not shown as active": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Silences Not Applied Correctly 3.2 Mixed silenced and firing alerts": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Redux State Management 4.1 Redux state updates on filter change": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Redux State Management 4.2 Redux state persists across navigation": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Redux State Management 4.3 Days selector updates redux state": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
},
"Regression: Stress Testing UI 5.1 No excessive padding": {
"results": ["pass", "pass", "pass", "pass", "pass", "pass", "pass"],
"last_failure_reason": null,
"last_failure_date": null,
"fixed_by": null
}
},
"runs": [
{ "date": "2026-04-16", "type": "local", "cluster": "ci-ln-trfv3nt", "total": 17, "passed": 17, "failed": 0, "flaky": 0, "commit": "567c2e7" },
{ "date": "2026-04-16", "type": "local", "cluster": "ci-ln-trfv3nt", "total": 17, "passed": 17, "failed": 0, "flaky": 0, "commit": "567c2e7" },
{ "date": "2026-04-16", "type": "local", "cluster": "ci-ln-trfv3nt", "total": 17, "passed": 17, "failed": 0, "flaky": 0, "commit": "567c2e7" },
{ "date": "2026-04-16", "type": "e2e-real", "cluster": "ci-ln-trfv3nt", "total": 1, "passed": 1, "failed": 0, "flaky": 0, "commit": "92bba27" },
{ "date": "2026-04-16", "type": "local", "cluster": "ci-ln-zgwt0qt", "total": 17, "passed": 17, "failed": 0, "flaky": 0, "commit": "580dc96" },
{ "date": "2026-04-17", "type": "local", "cluster": "ci-ln-lg6ry1t", "total": 17, "passed": 17, "failed": 0, "flaky": 0, "commit": "580dc96" },
{ "date": "2026-04-17", "type": "local", "cluster": "ci-ln-lg6ry1t", "total": 17, "passed": 17, "failed": 0, "flaky": 0, "commit": "d9f37d2" },
{ "date": "2026-04-22", "type": "local", "cluster": "ci-ln-y7v0t92", "total": 17, "passed": 17, "failed": 0, "flaky": 0, "commit": "0cb566d" }
]
}

STABILITY_DATA_END -->
Loading