From 87d5068a062dbf04760315f053193b0d031dffbd Mon Sep 17 00:00:00 2001 From: Philip Colares Carneiro Date: Wed, 20 May 2026 15:05:32 +0100 Subject: [PATCH 1/3] add cypress coverage for manage columns behaviour in hardware conf table Signed-off-by: Philip Colares Carneiro --- .../cypress/cypress/pages/modelCatalog.ts | 34 +++ .../mocked/modelCatalog/manageColumns.cy.ts | 288 ++++++++++++++++++ 2 files changed, 322 insertions(+) create mode 100644 clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts diff --git a/clients/ui/frontend/src/__tests__/cypress/cypress/pages/modelCatalog.ts b/clients/ui/frontend/src/__tests__/cypress/cypress/pages/modelCatalog.ts index 10d2cdff7f..0378324980 100644 --- a/clients/ui/frontend/src/__tests__/cypress/cypress/pages/modelCatalog.ts +++ b/clients/ui/frontend/src/__tests__/cypress/cypress/pages/modelCatalog.ts @@ -491,6 +491,40 @@ class ModelCatalog { findModelTypeSelect() { return cy.findByTestId('register-model-type-select'); } + + findManageColumnsButton() { + return cy.findByTestId('manage-columns-button'); + } + + findManageColumnsModal() { + return cy.findByTestId('hardware-config-manage-columns'); + } + + findManageColumnsUpdateButton() { + return cy.findByTestId('hardware-config-manage-columns-update-button'); + } + + findManageColumnsCancelButton() { + return cy.findByTestId('hardware-config-manage-columns-cancel-button'); + } + + findManageColumnsRestoreDefaults() { + return cy.findByTestId('hardware-config-manage-columns-restore-defaults'); + } + + findManageColumnsSearch() { + return cy.findByTestId('hardware-config-manage-columns-search'); + } + + findManageColumnCheckbox(columnLabel: string) { + return this.findManageColumnsModal().find(`[aria-label="${columnLabel}"]`).scrollIntoView(); + } + + openManageColumnsModal() { + this.findManageColumnsButton().click(); + this.findManageColumnsModal().should('be.visible'); + return this; + } } export const modelCatalog = new ModelCatalog(); diff --git a/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts b/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts new file mode 100644 index 0000000000..d14fbbc46f --- /dev/null +++ b/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts @@ -0,0 +1,288 @@ +/* eslint-disable camelcase */ +import { modelCatalog } from '~/__tests__/cypress/cypress/pages/modelCatalog'; +import { mockModelRegistry } from '~/__mocks__/mockModelRegistry'; +import { + setupModelCatalogIntercepts, + interceptPerformanceArtifactsList, + interceptArtifactsList, + type ModelCatalogInterceptOptions, +} from '~/__tests__/cypress/cypress/support/interceptHelpers/modelCatalog'; +import { NBSP } from '~/__tests__/cypress/cypress/support/constants'; + +const STORAGE_KEY = 'hardware-config-table-columns'; + +const initIntercepts = (options: Partial = {}) => { + const resolvedOptions = { + useValidatedModel: true, + includePerformanceArtifacts: true, + ...options, + }; + + setupModelCatalogIntercepts(resolvedOptions); + + if (resolvedOptions.includePerformanceArtifacts) { + interceptArtifactsList(); + interceptPerformanceArtifactsList(); + } +}; + +const navigateToPerformanceInsights = () => { + modelCatalog.visit(); + modelCatalog.findLoadingState().should('not.exist'); + modelCatalog.findModelCatalogDetailLink().first().click(); + modelCatalog.clickPerformanceInsightsTab(); +}; + +describe('Manage Columns Modal', () => { + beforeEach(() => { + cy.intercept('GET', '/model-registry/api/v1/model_registry*', [ + mockModelRegistry({ name: 'modelregistry-sample' }), + ]).as('getModelRegistries'); + + cy.clearLocalStorage(STORAGE_KEY); + initIntercepts({ useValidatedModel: true, includePerformanceArtifacts: true }); + }); + + describe('Opening the Modal', () => { + it('should open the modal when clicking the Customize columns button', () => { + navigateToPerformanceInsights(); + + modelCatalog.findManageColumnsButton().should('be.visible'); + modelCatalog.openManageColumnsModal(); + modelCatalog.findManageColumnsModal().should('be.visible'); + }); + + it('should display search input and column list in the modal', () => { + navigateToPerformanceInsights(); + modelCatalog.openManageColumnsModal(); + + modelCatalog.findManageColumnsSearch().should('be.visible'); + modelCatalog.findManageColumnsUpdateButton().should('be.visible'); + modelCatalog.findManageColumnsCancelButton().should('be.visible'); + modelCatalog.findManageColumnsRestoreDefaults().should('be.visible'); + }); + }); + + describe('Sticky Columns Exclusion', () => { + it('should not show Hardware configuration column in the modal', () => { + navigateToPerformanceInsights(); + modelCatalog.openManageColumnsModal(); + + modelCatalog.findManageColumnsModal().should('not.contain.text', 'Hardware configuration'); + }); + + it('should not show Workload type column in the modal', () => { + navigateToPerformanceInsights(); + modelCatalog.openManageColumnsModal(); + + modelCatalog.findManageColumnsModal().should('not.contain.text', 'Workload type'); + }); + + it('should always show sticky columns in the table regardless of manage columns settings', () => { + navigateToPerformanceInsights(); + + modelCatalog + .findHardwareConfigurationTableHeaders() + .should('contain.text', 'Hardware configuration'); + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Workload type'); + }); + }); + + describe('Toggling Columns Off/On', () => { + it('should remove a column from the table when unchecked and Update is clicked', () => { + navigateToPerformanceInsights(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); + + modelCatalog.openManageColumnsModal(); + modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); + modelCatalog.findManageColumnsUpdateButton().click(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); + }); + + it('should add a column back when re-checked and Update is clicked', () => { + navigateToPerformanceInsights(); + + modelCatalog.openManageColumnsModal(); + modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); + modelCatalog.findManageColumnsUpdateButton().click(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); + + modelCatalog.openManageColumnsModal(); + modelCatalog.findManageColumnCheckbox('Replicas').check(); + modelCatalog.findManageColumnsUpdateButton().click(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); + }); + + it('should not apply changes when Cancel is clicked', () => { + navigateToPerformanceInsights(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); + + modelCatalog.openManageColumnsModal(); + modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); + modelCatalog.findManageColumnsCancelButton().click(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); + }); + + it('should toggle multiple columns at once', () => { + navigateToPerformanceInsights(); + + modelCatalog.openManageColumnsModal(); + modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); + modelCatalog.findManageColumnCheckbox('vLLM Version').uncheck(); + modelCatalog.findManageColumnsUpdateButton().click(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); + modelCatalog + .findHardwareConfigurationTableHeaders() + .should('not.contain.text', 'vLLM Version'); + }); + }); + + describe('Column Visibility Persistence', () => { + it('should persist column visibility to localStorage', () => { + navigateToPerformanceInsights(); + + modelCatalog.openManageColumnsModal(); + modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); + modelCatalog.findManageColumnsUpdateButton().click(); + + cy.window().then((win) => { + const stored = win.localStorage.getItem(STORAGE_KEY); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(stored).to.not.be.null; + const parsed = JSON.parse(stored!); + expect(parsed).to.be.an('array'); + expect(parsed).to.not.include('replicas'); + }); + }); + + it('should restore column visibility from localStorage on reload', () => { + navigateToPerformanceInsights(); + + modelCatalog.openManageColumnsModal(); + modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); + modelCatalog.findManageColumnsUpdateButton().click(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); + + navigateToPerformanceInsights(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); + }); + }); + + describe('Restore Defaults', () => { + it('should restore default column visibility when Restore default columns is clicked', () => { + navigateToPerformanceInsights(); + + modelCatalog.openManageColumnsModal(); + modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); + modelCatalog.findManageColumnCheckbox('vLLM Version').uncheck(); + modelCatalog.findManageColumnsUpdateButton().click(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); + modelCatalog + .findHardwareConfigurationTableHeaders() + .should('not.contain.text', 'vLLM Version'); + + modelCatalog.openManageColumnsModal(); + modelCatalog.findManageColumnsRestoreDefaults().click(); + modelCatalog.findManageColumnsUpdateButton().click(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'vLLM Version'); + }); + }); + + describe('Latency Filter Interaction with Column Visibility', () => { + beforeEach(() => { + cy.clearLocalStorage(STORAGE_KEY); + initIntercepts({ useValidatedModel: true, includePerformanceArtifacts: true }); + }); + + it('should update visible columns when latency filter is applied', () => { + modelCatalog.visit(); + modelCatalog.findLoadingState().should('not.exist'); + modelCatalog.togglePerformanceView(); + modelCatalog.findModelCatalogDetailLink().first().click(); + modelCatalog.clickPerformanceInsightsTab(); + + modelCatalog.openLatencyFilter(); + modelCatalog.selectLatencyMetric('E2E'); + modelCatalog.selectLatencyPercentile('Mean'); + modelCatalog.clickApplyFilter(); + + modelCatalog + .findHardwareConfigurationTableHeaders() + .should('contain.text', `E2E${NBSP}Latency Mean`); + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', `TPS${NBSP}Mean`); + + modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'TTFT'); + modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'ITL'); + }); + + it('should reflect latency filter changes in the manage columns modal state', () => { + modelCatalog.visit(); + modelCatalog.findLoadingState().should('not.exist'); + modelCatalog.togglePerformanceView(); + modelCatalog.findModelCatalogDetailLink().first().click(); + modelCatalog.clickPerformanceInsightsTab(); + + modelCatalog.openLatencyFilter(); + modelCatalog.selectLatencyMetric('ITL'); + modelCatalog.selectLatencyPercentile('P95'); + modelCatalog.clickApplyFilter(); + + modelCatalog + .findHardwareConfigurationTableHeaders() + .should('contain.text', `ITL${NBSP}Latency P95`); + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', `TPS${NBSP}P95`); + + modelCatalog.openManageColumnsModal(); + + modelCatalog.findManageColumnCheckbox(`ITL${NBSP}Latency P95`).should('be.checked'); + modelCatalog.findManageColumnCheckbox(`TPS${NBSP}P95`).should('be.checked'); + }); + + it('should keep non-latency columns unchanged when latency filter updates column visibility', () => { + modelCatalog.visit(); + modelCatalog.findLoadingState().should('not.exist'); + modelCatalog.togglePerformanceView(); + modelCatalog.findModelCatalogDetailLink().first().click(); + modelCatalog.clickPerformanceInsightsTab(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); + + modelCatalog.openLatencyFilter(); + modelCatalog.selectLatencyMetric('E2E'); + modelCatalog.selectLatencyPercentile('P99'); + modelCatalog.clickApplyFilter(); + + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); + modelCatalog + .findHardwareConfigurationTableHeaders() + .should('contain.text', 'Hardware configuration'); + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Workload type'); + }); + }); + + describe('Search', () => { + it('should filter columns when typing in the search input', () => { + navigateToPerformanceInsights(); + modelCatalog.openManageColumnsModal(); + + modelCatalog.findManageColumnsSearch().type('TTFT'); + + modelCatalog.findManageColumnsModal().should('contain.text', `TTFT${NBSP}Latency Mean`); + modelCatalog.findManageColumnsModal().should('contain.text', `TTFT${NBSP}Latency P90`); + modelCatalog.findManageColumnsModal().should('not.contain.text', 'Replicas'); + modelCatalog.findManageColumnsModal().should('not.contain.text', 'vLLM Version'); + }); + }); +}); From a7077599b868b04c8952914cf5ca3e5b5a4e0e74 Mon Sep 17 00:00:00 2001 From: Philip Colares Carneiro Date: Tue, 2 Jun 2026 10:38:39 +0100 Subject: [PATCH 2/3] add fix requested Signed-off-by: Philip Colares Carneiro --- .../mocked/modelCatalog/manageColumns.cy.ts | 59 ++++++++----------- 1 file changed, 24 insertions(+), 35 deletions(-) diff --git a/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts b/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts index d14fbbc46f..e399b1685a 100644 --- a/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts +++ b/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts @@ -8,8 +8,10 @@ import { type ModelCatalogInterceptOptions, } from '~/__tests__/cypress/cypress/support/interceptHelpers/modelCatalog'; import { NBSP } from '~/__tests__/cypress/cypress/support/constants'; - -const STORAGE_KEY = 'hardware-config-table-columns'; +import { + DEFAULT_VISIBLE_COLUMN_FIELDS, + HARDWARE_CONFIG_COLUMNS_STORAGE_KEY as STORAGE_KEY, +} from '~/app/pages/modelCatalog/components/HardwareConfigurationTableColumns'; const initIntercepts = (options: Partial = {}) => { const resolvedOptions = { @@ -33,6 +35,14 @@ const navigateToPerformanceInsights = () => { modelCatalog.clickPerformanceInsightsTab(); }; +const navigateWithPerformanceView = () => { + modelCatalog.visit(); + modelCatalog.findLoadingState().should('not.exist'); + modelCatalog.togglePerformanceView(); + modelCatalog.findModelCatalogDetailLink().first().click(); + modelCatalog.clickPerformanceInsightsTab(); +}; + describe('Manage Columns Modal', () => { beforeEach(() => { cy.intercept('GET', '/model-registry/api/v1/model_registry*', [ @@ -40,7 +50,7 @@ describe('Manage Columns Modal', () => { ]).as('getModelRegistries'); cy.clearLocalStorage(STORAGE_KEY); - initIntercepts({ useValidatedModel: true, includePerformanceArtifacts: true }); + initIntercepts(); }); describe('Opening the Modal', () => { @@ -49,7 +59,6 @@ describe('Manage Columns Modal', () => { modelCatalog.findManageColumnsButton().should('be.visible'); modelCatalog.openManageColumnsModal(); - modelCatalog.findManageColumnsModal().should('be.visible'); }); it('should display search input and column list in the modal', () => { @@ -64,17 +73,11 @@ describe('Manage Columns Modal', () => { }); describe('Sticky Columns Exclusion', () => { - it('should not show Hardware configuration column in the modal', () => { + it('should not show sticky columns in the modal', () => { navigateToPerformanceInsights(); modelCatalog.openManageColumnsModal(); modelCatalog.findManageColumnsModal().should('not.contain.text', 'Hardware configuration'); - }); - - it('should not show Workload type column in the modal', () => { - navigateToPerformanceInsights(); - modelCatalog.openManageColumnsModal(); - modelCatalog.findManageColumnsModal().should('not.contain.text', 'Workload type'); }); @@ -102,11 +105,14 @@ describe('Manage Columns Modal', () => { }); it('should add a column back when re-checked and Update is clicked', () => { - navigateToPerformanceInsights(); + const columnsWithoutReplicas = DEFAULT_VISIBLE_COLUMN_FIELDS.filter( + (col) => col !== 'replicas', + ); + cy.window().then((win) => { + win.localStorage.setItem(STORAGE_KEY, JSON.stringify(columnsWithoutReplicas)); + }); - modelCatalog.openManageColumnsModal(); - modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); - modelCatalog.findManageColumnsUpdateButton().click(); + navigateToPerformanceInsights(); modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); @@ -201,17 +207,8 @@ describe('Manage Columns Modal', () => { }); describe('Latency Filter Interaction with Column Visibility', () => { - beforeEach(() => { - cy.clearLocalStorage(STORAGE_KEY); - initIntercepts({ useValidatedModel: true, includePerformanceArtifacts: true }); - }); - it('should update visible columns when latency filter is applied', () => { - modelCatalog.visit(); - modelCatalog.findLoadingState().should('not.exist'); - modelCatalog.togglePerformanceView(); - modelCatalog.findModelCatalogDetailLink().first().click(); - modelCatalog.clickPerformanceInsightsTab(); + navigateWithPerformanceView(); modelCatalog.openLatencyFilter(); modelCatalog.selectLatencyMetric('E2E'); @@ -228,11 +225,7 @@ describe('Manage Columns Modal', () => { }); it('should reflect latency filter changes in the manage columns modal state', () => { - modelCatalog.visit(); - modelCatalog.findLoadingState().should('not.exist'); - modelCatalog.togglePerformanceView(); - modelCatalog.findModelCatalogDetailLink().first().click(); - modelCatalog.clickPerformanceInsightsTab(); + navigateWithPerformanceView(); modelCatalog.openLatencyFilter(); modelCatalog.selectLatencyMetric('ITL'); @@ -251,11 +244,7 @@ describe('Manage Columns Modal', () => { }); it('should keep non-latency columns unchanged when latency filter updates column visibility', () => { - modelCatalog.visit(); - modelCatalog.findLoadingState().should('not.exist'); - modelCatalog.togglePerformanceView(); - modelCatalog.findModelCatalogDetailLink().first().click(); - modelCatalog.clickPerformanceInsightsTab(); + navigateWithPerformanceView(); modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); From 17384876f6556efc34527d8578527e6dfbeab754 Mon Sep 17 00:00:00 2001 From: Philip Colares Carneiro Date: Mon, 8 Jun 2026 12:55:44 +0100 Subject: [PATCH 3/3] test moved to mod_arch_library Signed-off-by: Philip Colares Carneiro --- .../mocked/modelCatalog/manageColumns.cy.ts | 139 +----------------- 1 file changed, 6 insertions(+), 133 deletions(-) diff --git a/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts b/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts index e399b1685a..46bef890d3 100644 --- a/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts +++ b/clients/ui/frontend/src/__tests__/cypress/cypress/tests/mocked/modelCatalog/manageColumns.cy.ts @@ -8,10 +8,7 @@ import { type ModelCatalogInterceptOptions, } from '~/__tests__/cypress/cypress/support/interceptHelpers/modelCatalog'; import { NBSP } from '~/__tests__/cypress/cypress/support/constants'; -import { - DEFAULT_VISIBLE_COLUMN_FIELDS, - HARDWARE_CONFIG_COLUMNS_STORAGE_KEY as STORAGE_KEY, -} from '~/app/pages/modelCatalog/components/HardwareConfigurationTableColumns'; +import { HARDWARE_CONFIG_COLUMNS_STORAGE_KEY as STORAGE_KEY } from '~/app/pages/modelCatalog/components/HardwareConfigurationTableColumns'; const initIntercepts = (options: Partial = {}) => { const resolvedOptions = { @@ -53,17 +50,12 @@ describe('Manage Columns Modal', () => { initIntercepts(); }); - describe('Opening the Modal', () => { - it('should open the modal when clicking the Customize columns button', () => { + describe('Smoke Test', () => { + it('should open the manage columns modal and display its controls', () => { navigateToPerformanceInsights(); modelCatalog.findManageColumnsButton().should('be.visible'); modelCatalog.openManageColumnsModal(); - }); - - it('should display search input and column list in the modal', () => { - navigateToPerformanceInsights(); - modelCatalog.openManageColumnsModal(); modelCatalog.findManageColumnsSearch().should('be.visible'); modelCatalog.findManageColumnsUpdateButton().should('be.visible'); @@ -81,61 +73,7 @@ describe('Manage Columns Modal', () => { modelCatalog.findManageColumnsModal().should('not.contain.text', 'Workload type'); }); - it('should always show sticky columns in the table regardless of manage columns settings', () => { - navigateToPerformanceInsights(); - - modelCatalog - .findHardwareConfigurationTableHeaders() - .should('contain.text', 'Hardware configuration'); - modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Workload type'); - }); - }); - - describe('Toggling Columns Off/On', () => { - it('should remove a column from the table when unchecked and Update is clicked', () => { - navigateToPerformanceInsights(); - - modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); - - modelCatalog.openManageColumnsModal(); - modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); - modelCatalog.findManageColumnsUpdateButton().click(); - - modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); - }); - - it('should add a column back when re-checked and Update is clicked', () => { - const columnsWithoutReplicas = DEFAULT_VISIBLE_COLUMN_FIELDS.filter( - (col) => col !== 'replicas', - ); - cy.window().then((win) => { - win.localStorage.setItem(STORAGE_KEY, JSON.stringify(columnsWithoutReplicas)); - }); - - navigateToPerformanceInsights(); - - modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); - - modelCatalog.openManageColumnsModal(); - modelCatalog.findManageColumnCheckbox('Replicas').check(); - modelCatalog.findManageColumnsUpdateButton().click(); - - modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); - }); - - it('should not apply changes when Cancel is clicked', () => { - navigateToPerformanceInsights(); - - modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); - - modelCatalog.openManageColumnsModal(); - modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); - modelCatalog.findManageColumnsCancelButton().click(); - - modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); - }); - - it('should toggle multiple columns at once', () => { + it('should always show sticky columns in the table after toggling other columns off', () => { navigateToPerformanceInsights(); modelCatalog.openManageColumnsModal(); @@ -147,62 +85,11 @@ describe('Manage Columns Modal', () => { modelCatalog .findHardwareConfigurationTableHeaders() .should('not.contain.text', 'vLLM Version'); - }); - }); - - describe('Column Visibility Persistence', () => { - it('should persist column visibility to localStorage', () => { - navigateToPerformanceInsights(); - - modelCatalog.openManageColumnsModal(); - modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); - modelCatalog.findManageColumnsUpdateButton().click(); - - cy.window().then((win) => { - const stored = win.localStorage.getItem(STORAGE_KEY); - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - expect(stored).to.not.be.null; - const parsed = JSON.parse(stored!); - expect(parsed).to.be.an('array'); - expect(parsed).to.not.include('replicas'); - }); - }); - - it('should restore column visibility from localStorage on reload', () => { - navigateToPerformanceInsights(); - - modelCatalog.openManageColumnsModal(); - modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); - modelCatalog.findManageColumnsUpdateButton().click(); - - modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); - - navigateToPerformanceInsights(); - - modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); - }); - }); - describe('Restore Defaults', () => { - it('should restore default column visibility when Restore default columns is clicked', () => { - navigateToPerformanceInsights(); - - modelCatalog.openManageColumnsModal(); - modelCatalog.findManageColumnCheckbox('Replicas').uncheck(); - modelCatalog.findManageColumnCheckbox('vLLM Version').uncheck(); - modelCatalog.findManageColumnsUpdateButton().click(); - - modelCatalog.findHardwareConfigurationTableHeaders().should('not.contain.text', 'Replicas'); modelCatalog .findHardwareConfigurationTableHeaders() - .should('not.contain.text', 'vLLM Version'); - - modelCatalog.openManageColumnsModal(); - modelCatalog.findManageColumnsRestoreDefaults().click(); - modelCatalog.findManageColumnsUpdateButton().click(); - - modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Replicas'); - modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'vLLM Version'); + .should('contain.text', 'Hardware configuration'); + modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Workload type'); }); }); @@ -260,18 +147,4 @@ describe('Manage Columns Modal', () => { modelCatalog.findHardwareConfigurationTableHeaders().should('contain.text', 'Workload type'); }); }); - - describe('Search', () => { - it('should filter columns when typing in the search input', () => { - navigateToPerformanceInsights(); - modelCatalog.openManageColumnsModal(); - - modelCatalog.findManageColumnsSearch().type('TTFT'); - - modelCatalog.findManageColumnsModal().should('contain.text', `TTFT${NBSP}Latency Mean`); - modelCatalog.findManageColumnsModal().should('contain.text', `TTFT${NBSP}Latency P90`); - modelCatalog.findManageColumnsModal().should('not.contain.text', 'Replicas'); - modelCatalog.findManageColumnsModal().should('not.contain.text', 'vLLM Version'); - }); - }); });