diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml
index 1d480ea9db..83713e076a 100644
--- a/.github/workflows/playwright.yml
+++ b/.github/workflows/playwright.yml
@@ -209,6 +209,7 @@ jobs:
"pipelines.spec.js",
"pipeline-dynamic.spec.js",
"pipeline-core.spec.js",
+ "scheduled-pipeline-query-builder.spec.js",
# "remotepipeline.spec.js"
]
- testfolder: "Functions"
diff --git a/tests/ui-testing/pages/pipelinesPages/pipelinesPage.js b/tests/ui-testing/pages/pipelinesPages/pipelinesPage.js
index 480c236b0b..916251bf14 100644
--- a/tests/ui-testing/pages/pipelinesPages/pipelinesPage.js
+++ b/tests/ui-testing/pages/pipelinesPages/pipelinesPage.js
@@ -2165,4 +2165,51 @@ export class PipelinesPage {
await toggle.click();
testLogger.info(`Toggled pipeline: ${pipelineName}`);
}
+
+ // ============================================================================
+ // SCHEDULED PIPELINE TAB METHODS - POM Compliance Fix
+ // These methods replace raw selectors in spec files for PromQL/SQL tab switching
+ // ============================================================================
+
+ /**
+ * Click PromQL tab in scheduled pipeline dialog
+ * Note: AppTabs renders tabs as
elements with data-test="tab-{value}", not buttons
+ */
+ async clickPromqlTab() {
+ const promqlTab = this.scheduledPipelineTabs.locator('[data-test="tab-promql"]');
+ await promqlTab.waitFor({ state: 'visible', timeout: 5000 });
+ await promqlTab.click();
+ testLogger.info('Clicked PromQL tab');
+ }
+
+ /**
+ * Click SQL tab in scheduled pipeline dialog
+ * Note: AppTabs renders tabs as
elements with data-test="tab-{value}", not buttons
+ */
+ async clickSqlTab() {
+ const sqlTab = this.scheduledPipelineTabs.locator('[data-test="tab-sql"]');
+ await sqlTab.waitFor({ state: 'visible', timeout: 5000 });
+ await sqlTab.click();
+ testLogger.info('Clicked SQL tab');
+ }
+
+ /**
+ * Verify PromQL tab is active/selected
+ * Note: AppTabs uses 'active' CSS class for the selected tab
+ */
+ async expectPromqlTabActive() {
+ const promqlTab = this.scheduledPipelineTabs.locator('[data-test="tab-promql"]');
+ await expect(promqlTab).toHaveClass(/active/);
+ testLogger.info('Verified PromQL tab is active');
+ }
+
+ /**
+ * Verify SQL tab is active/selected
+ * Note: AppTabs uses 'active' CSS class for the selected tab
+ */
+ async expectSqlTabActive() {
+ const sqlTab = this.scheduledPipelineTabs.locator('[data-test="tab-sql"]');
+ await expect(sqlTab).toHaveClass(/active/);
+ testLogger.info('Verified SQL tab is active');
+ }
}
\ No newline at end of file
diff --git a/tests/ui-testing/playwright-tests/Pipelines/scheduled-pipeline-stream-auto-update.spec.js b/tests/ui-testing/playwright-tests/Pipelines/scheduled-pipeline-query-builder.spec.js
similarity index 88%
rename from tests/ui-testing/playwright-tests/Pipelines/scheduled-pipeline-stream-auto-update.spec.js
rename to tests/ui-testing/playwright-tests/Pipelines/scheduled-pipeline-query-builder.spec.js
index 26d25a410d..2d7e8c4264 100644
--- a/tests/ui-testing/playwright-tests/Pipelines/scheduled-pipeline-stream-auto-update.spec.js
+++ b/tests/ui-testing/playwright-tests/Pipelines/scheduled-pipeline-query-builder.spec.js
@@ -13,7 +13,7 @@ test.use({
}
});
-test.describe("Scheduled Pipeline Stream Auto-Update", { tag: ['@all', '@scheduledPipeline'] }, () => {
+test.describe("Scheduled Pipeline Query Builder", { tag: ['@all', '@scheduledPipeline'] }, () => {
let pageManager;
let loginPage;
@@ -142,11 +142,16 @@ test.describe("Scheduled Pipeline Stream Auto-Update", { tag: ['@all', '@schedul
testLogger.info('✅ Test passed: Default query generated correctly');
});
- test.skip("should not update PromQL tab when stream changes", {
+ test("should not update PromQL tab when stream changes", {
tag: ['@functional', '@P1']
}, async ({ page }) => {
testLogger.info('Testing PromQL tab is unaffected by SQL watcher');
+ // Ingest metrics data to ensure metrics streams exist for PromQL testing
+ testLogger.info('Ingesting metrics data for PromQL test');
+ await pageManager.pipelinesPage.ingestMetricsData('e2e_test_metrics', 10);
+ await page.waitForTimeout(2000); // Wait for metrics to be indexed
+
await pageManager.pipelinesPage.openPipelineMenu();
await page.waitForTimeout(1000);
await pageManager.pipelinesPage.addPipeline();
@@ -167,13 +172,9 @@ test.describe("Scheduled Pipeline Stream Auto-Update", { tag: ['@all', '@schedul
await pageManager.pipelinesPage.selectStreamType('metrics');
await page.waitForTimeout(1000);
- // Select a metrics stream in SQL tab
- testLogger.info('Selecting metrics stream');
- await pageManager.pipelinesPage.streamNameLabel.click();
- await page.waitForTimeout(500);
- // Note: We'll use any available metrics stream
- const streamOptions = page.getByRole("option").filter({ hasText: /^[a-z0-9_]+$/ }).first();
- await streamOptions.click();
+ // Select the metrics stream we just ingested
+ testLogger.info('Selecting metrics stream: e2e_test_metrics');
+ await pageManager.pipelinesPage.selectStreamName('e2e_test_metrics');
await page.waitForTimeout(2000);
// Get SQL query text
@@ -181,18 +182,16 @@ test.describe("Scheduled Pipeline Stream Auto-Update", { tag: ['@all', '@schedul
// Switch to PromQL tab (now enabled because we selected metrics)
testLogger.info('Switching to PromQL tab');
- const promqlTab = pageManager.pipelinesPage.scheduledPipelineTabs.getByRole('button', { name: /PromQL/i });
- await promqlTab.waitFor({ state: 'visible', timeout: 5000 });
- await promqlTab.click();
+ await pageManager.pipelinesPage.clickPromqlTab();
await page.waitForTimeout(1000);
// Verify we're on PromQL tab
testLogger.info('Verifying PromQL tab active');
+ await pageManager.pipelinesPage.expectPromqlTabActive();
// Switch back to SQL tab
testLogger.info('Switching back to SQL tab');
- const sqlTab = pageManager.pipelinesPage.scheduledPipelineTabs.getByRole('button', { name: /SQL/i });
- await sqlTab.click();
+ await pageManager.pipelinesPage.clickSqlTab();
await page.waitForTimeout(1000);
// Verify SQL query still exists (tab switching doesn't affect SQL query)
diff --git a/tests/ui-testing/playwright-tests/cleanup.spec.js b/tests/ui-testing/playwright-tests/cleanup.spec.js
index edc441da61..fb983c4d32 100644
--- a/tests/ui-testing/playwright-tests/cleanup.spec.js
+++ b/tests/ui-testing/playwright-tests/cleanup.spec.js
@@ -263,7 +263,7 @@ test.describe("Pre-Test Cleanup", () => {
/^e2e_test_traces$/ // Pipeline regression test traces stream (Issue #9901)
],
// Protected streams to never delete
- ['default', 'sensitive', 'important', 'critical', 'production', 'staging', 'automation', 'e2e_automate']
+ ['default', 'sensitive', 'important', 'critical', 'production', 'staging', 'automation', 'e2e_automate', 'k8s_json']
);
// Note: Pipeline regression test streams (e2e_test_cpu_usage for metrics, e2e_test_traces for traces)
@@ -301,7 +301,7 @@ test.describe("Pre-Test Cleanup", () => {
/^temp_metrics_/ // temp_metrics_* (Temporary test streams)
],
// Protected metrics streams - never delete
- ['default'] // 'default' is the primary metrics stream used by tests
+ ['default', 'e2e_test_metrics'] // 'default' is the primary metrics stream, 'e2e_test_metrics' used by scheduled-pipeline-query-builder.spec.js
);
// Note: Stream deletion waiting is no longer needed here because: