From 88c214fb89d7ff50ffaffe9721b78b1faaf587be Mon Sep 17 00:00:00 2001 From: Anton Standrik Date: Mon, 7 Apr 2025 19:15:16 +0300 Subject: [PATCH 1/3] fix: try no unsaved for templates --- .../Tenant/Query/QueryEditor/YqlEditor.tsx | 1 + .../tenant/queryEditor/queryTemplates.test.ts | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/containers/Tenant/Query/QueryEditor/YqlEditor.tsx b/src/containers/Tenant/Query/QueryEditor/YqlEditor.tsx index cbc41e505b..229b809cea 100644 --- a/src/containers/Tenant/Query/QueryEditor/YqlEditor.tsx +++ b/src/containers/Tenant/Query/QueryEditor/YqlEditor.tsx @@ -99,6 +99,7 @@ export function YqlEditor({ editor.focus(); editor.setValue(''); contribution.insert(input); + dispatch(setIsDirty(false)); } }); diff --git a/tests/suites/tenant/queryEditor/queryTemplates.test.ts b/tests/suites/tenant/queryEditor/queryTemplates.test.ts index ca79fc65fb..fd691b88ad 100644 --- a/tests/suites/tenant/queryEditor/queryTemplates.test.ts +++ b/tests/suites/tenant/queryEditor/queryTemplates.test.ts @@ -214,4 +214,54 @@ test.describe('Query Templates', () => { // Verify unsaved changes modal appears await expect(unsavedChangesModal.isVisible()).resolves.toBe(true); }); + test('Switching between templates does not trigger unsaved changes modal', async ({page}) => { + const objectSummary = new ObjectSummary(page); + const tenantPage = new TenantPage(page); + + // First select a template (Add Index) + await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.AddIndex); + await page.waitForTimeout(500); + + // Without editing the template, switch to another template (Select Query) + await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.SelectQuery); + await page.waitForTimeout(500); + + // Verify unsaved changes modal does not appear + const isModalHidden = await tenantPage.isUnsavedChangesModalHidden(); + expect(isModalHidden).toBe(true); + }); + + test('Selecting a template and then opening history query does not trigger unsaved changes modal', async ({ + page, + }) => { + const objectSummary = new ObjectSummary(page); + const queryEditor = new QueryEditor(page); + const tenantPage = new TenantPage(page); + + // First, run a query to ensure we have history to select from + const testQuery = 'SELECT 1 AS test_column;'; + await queryEditor.setQuery(testQuery); + await queryEditor.clickRunButton(); + await page.waitForTimeout(1000); // Wait for the query to complete + + // Next, select a template + await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.AddIndex); + await page.waitForTimeout(500); + + // Navigate to history tab + await queryEditor.queryTabs.selectTab(QueryTabs.History); + await queryEditor.historyQueries.isVisible(); + + // Select the query from history + await queryEditor.historyQueries.selectQuery(testQuery); + await page.waitForTimeout(500); + + // Verify no unsaved changes modal appeared + const isModalHidden = await tenantPage.isUnsavedChangesModalHidden(); + expect(isModalHidden).toBe(true); + + // Verify the query was loaded into the editor + const editorValue = await queryEditor.editorTextArea.inputValue(); + expect(editorValue.trim()).toBe(testQuery.trim()); + }); }); From 887426cc348447545e2df53c8a3b0b6ce808523c Mon Sep 17 00:00:00 2001 From: Anton Standrik Date: Mon, 7 Apr 2025 19:58:10 +0300 Subject: [PATCH 2/3] fix: try no unsaved for templates --- .../tenant/queryEditor/queryTemplates.test.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/suites/tenant/queryEditor/queryTemplates.test.ts b/tests/suites/tenant/queryEditor/queryTemplates.test.ts index fd691b88ad..c27872e488 100644 --- a/tests/suites/tenant/queryEditor/queryTemplates.test.ts +++ b/tests/suites/tenant/queryEditor/queryTemplates.test.ts @@ -82,14 +82,20 @@ test.describe('Query Templates', () => { } }); - test('Unsaved changes modal appears when switching between templates', async ({page}) => { + test('Unsaved changes modal appears when switching between templates if query was edited', async ({ + page, + }) => { const objectSummary = new ObjectSummary(page); const unsavedChangesModal = new UnsavedChangesModal(page); + const queryEditor = new QueryEditor(page); // First action - Add index await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.AddIndex); await page.waitForTimeout(500); + // First set some content + await queryEditor.setQuery('SELECT 1;'); + // Try to switch to Select query await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.SelectQuery); await page.waitForTimeout(500); @@ -107,8 +113,7 @@ test.describe('Query Templates', () => { await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.AddIndex); await page.waitForTimeout(500); - // Store initial editor content - const initialContent = await queryEditor.editorTextArea.inputValue(); + await queryEditor.setQuery('SELECT 1;'); // Try to switch to Select query await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.SelectQuery); @@ -118,7 +123,7 @@ test.describe('Query Templates', () => { await unsavedChangesModal.clickCancel(); // Verify editor content remains unchanged - await expect(queryEditor.editorTextArea).toHaveValue(initialContent); + await expect(queryEditor.editorTextArea).toHaveValue('SELECT 1;'); }); test('Dont save button in unsaved changes modal allows to change text', async ({page}) => { @@ -130,6 +135,7 @@ test.describe('Query Templates', () => { await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.AddIndex); await page.waitForTimeout(500); + await queryEditor.setQuery('SELECT 1;'); // Store initial editor content const initialContent = await queryEditor.editorTextArea.inputValue(); @@ -157,6 +163,8 @@ test.describe('Query Templates', () => { await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.AddIndex); await page.waitForTimeout(500); + await queryEditor.setQuery('SELECT 1;'); + // Try to switch to Select query await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.SelectQuery); await page.waitForTimeout(500); From cd1dff76bc3973e48f47a1bb7a17b57adf05050f Mon Sep 17 00:00:00 2001 From: Anton Standrik Date: Tue, 8 Apr 2025 10:45:14 +0300 Subject: [PATCH 3/3] fix: test --- tests/suites/tenant/summary/objectSummary.test.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/suites/tenant/summary/objectSummary.test.ts b/tests/suites/tenant/summary/objectSummary.test.ts index 051690845f..3698be6384 100644 --- a/tests/suites/tenant/summary/objectSummary.test.ts +++ b/tests/suites/tenant/summary/objectSummary.test.ts @@ -11,7 +11,6 @@ import { } from '../../../utils/constants'; import {TenantPage} from '../TenantPage'; import {QueryEditor} from '../queryEditor/models/QueryEditor'; -import {UnsavedChangesModal} from '../queryEditor/models/UnsavedChangesModal'; import {ObjectSummary, ObjectSummaryTab} from './ObjectSummary'; import {RowTableAction} from './types'; @@ -140,7 +139,6 @@ test.describe('Object Summary', async () => { test('Different tables show different column lists in Monaco editor', async ({page}) => { const objectSummary = new ObjectSummary(page); const queryEditor = new QueryEditor(page); - const unsavedChangesModal = new UnsavedChangesModal(page); // Get columns for first table await objectSummary.clickActionMenuItem(dsVslotsTableName, RowTableAction.SelectQuery); @@ -153,8 +151,6 @@ test.describe('Object Summary', async () => { ); await page.waitForTimeout(500); - // Click Don't save in the modal - await unsavedChangesModal.clickDontSave(); const storagePoolsColumns = await queryEditor.editorTextArea.inputValue();