From a4d211076c7b2d94e7d81cabbd146dbd4a7e6344 Mon Sep 17 00:00:00 2001 From: Anan Date: Mon, 27 Jan 2025 22:42:04 -0800 Subject: [PATCH] [Cypress][TESTID-147] Add tests for table canvas in discover Issue resolved: https://github.com/opensearch-project/OpenSearch-Dashboards/issues/8947 Signed-off-by: Anan --- .../apps/query_enhancements/table.spec.js | 188 ++++++++++++++++++ .../utils/apps/query_enhancements/shared.js | 26 +++ 2 files changed, 214 insertions(+) create mode 100644 cypress/integration/core_opensearch_dashboards/opensearch_dashboards/apps/query_enhancements/table.spec.js diff --git a/cypress/integration/core_opensearch_dashboards/opensearch_dashboards/apps/query_enhancements/table.spec.js b/cypress/integration/core_opensearch_dashboards/opensearch_dashboards/apps/query_enhancements/table.spec.js new file mode 100644 index 00000000000..8a00f4d64e6 --- /dev/null +++ b/cypress/integration/core_opensearch_dashboards/opensearch_dashboards/apps/query_enhancements/table.spec.js @@ -0,0 +1,188 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { + INDEX_WITH_TIME_1, + INDEX_WITHOUT_TIME_1, + SECONDARY_ENGINE, +} from '../../../../../utils/constants'; +import { + getRandomizedWorkspaceName, + getRandomizedDatasourceName, + generateAllTestConfigurations, + generateIndexPatternTestConfigurations, + setDatePickerDatesAndSearchIfRelevant, +} from '../../../../../utils/apps/query_enhancements/shared'; +import { QueryLanguages } from '../../../../../utils/apps/query_enhancements/constants'; +import { selectFieldFromSidebar } from '../../../../../utils/apps/query_enhancements/sidebar'; + +const workspaceName = getRandomizedWorkspaceName(); +const datasourceName = getRandomizedDatasourceName(); + +const generateTableTestConfiguration = (dataset, datasetType, language) => { + const baseConfig = { + dataset, + datasetType, + language: language.name, + testName: `${language.name}-${datasetType}`, + }; + + return { + ...baseConfig, + }; +}; + +export const runTableTests = () => { + describe('discover table tests', () => { + beforeEach(() => { + cy.setupTestData( + SECONDARY_ENGINE.url, + [ + `cypress/fixtures/query_enhancements/data_logs_1/${INDEX_WITH_TIME_1}.mapping.json`, + `cypress/fixtures/query_enhancements/data_logs_1/${INDEX_WITHOUT_TIME_1}.mapping.json`, + ], + [ + `cypress/fixtures/query_enhancements/data_logs_1/${INDEX_WITH_TIME_1}.data.ndjson`, + `cypress/fixtures/query_enhancements/data_logs_1/${INDEX_WITHOUT_TIME_1}.data.ndjson`, + ] + ); + cy.addDataSource({ + name: datasourceName, + url: SECONDARY_ENGINE.url, + authType: 'no_auth', + }); + //cy.deleteWorkspaceByName(`${workspaceName}`); + cy.visit('/app/home'); + cy.osd.createInitialWorkspaceWithDataSource(datasourceName, workspaceName); + }); + + afterEach(() => { + cy.deleteWorkspaceByName(`${workspaceName}`); + cy.deleteDataSourceByName(datasourceName); + cy.deleteIndex('data_logs_small_time_1'); + cy.window().then((win) => { + win.localStorage.clear(); + win.sessionStorage.clear(); + }); + }); + + generateAllTestConfigurations(generateTableTestConfiguration, { + indexPattern: 'data_logs_small_time_1*', + index: 'data_logs_small_time_1', + }).forEach((config) => { + describe(`${config.testName}`, () => { + beforeEach(() => { + if (config.datasetType === 'INDEX_PATTERN') { + cy.createWorkspaceIndexPatterns({ + workspaceName: workspaceName, + indexPattern: 'data_logs_small_time_1', + timefieldName: 'timestamp', + dataSource: datasourceName, + isEnhancement: true, + }); + } + cy.navigateToWorkSpaceSpecificPage({ + workspaceName: workspaceName, + page: 'discover', + isEnhancement: true, + }); + }); + + it(`should allow expand multiple documents for ${config.testName}`, () => { + // Setup + cy.setDataset(config.dataset, datasourceName, config.datasetType); + cy.setQueryLanguage(config.language); + setDatePickerDatesAndSearchIfRelevant(config.language); + // expanding a document in the table + cy.get('[data-test-subj="docTableExpandToggleColumn"]') + .find('[type="button"]') + .eq(2) + .click(); + + // expanding a document in the table + cy.get('[data-test-subj="docTableExpandToggleColumn"]') + .find('[type="button"]') + .eq(3) + .click(); + + // checking the number of exapnded documents visible on screen + cy.get('[data-test-subj="tableDocViewRow-_index"]').should('have.length', 2); + + // switch query should keep expanded state + // TODO: allow switch to other languages + if (config.language === QueryLanguages.DQL.name) { + cy.setQueryLanguage('Lucene'); + } else if (config.language === QueryLanguages.Lucene.name) { + cy.setQueryLanguage('DQL'); + } else if (config.language === QueryLanguages.SQL.name) { + cy.setQueryLanguage('PPL'); + } else { + cy.setQueryLanguage('OpenSearch SQL'); + } + cy.get('[data-test-subj="tableDocViewRow-_index"]').should('have.length', 2); + }); + }); + }); + + generateIndexPatternTestConfigurations(generateTableTestConfiguration, { + indexPattern: 'data_logs_small_no_time_1*', + supportedLanguages: [QueryLanguages.DQL, QueryLanguages.Lucene], + }).forEach((config) => { + describe(`${config.testName}`, () => { + beforeEach(() => { + if (config.datasetType === 'INDEX_PATTERN') { + cy.createWorkspaceIndexPatterns({ + workspaceName: workspaceName, + indexPattern: 'data_logs_small_no_time_1', + timefieldName: '', + indexPatternHasTimefield: false, + dataSource: datasourceName, + isEnhancement: true, + }); + } + cy.navigateToWorkSpaceSpecificPage({ + workspaceName: workspaceName, + page: 'discover', + isEnhancement: true, + }); + }); + // TODO: Currently sort is not applicable for nested field. Should include and test nested field if sort can support. + const testFields = ['category', 'response_time']; + + it(`sort for ${config.testName}`, () => { + // Setup + cy.setDataset(config.dataset, datasourceName, config.datasetType); + cy.setQueryLanguage(config.language); + // Add fields + testFields.forEach((field) => { + selectFieldFromSidebar(field); + // Default is no sort + cy.getElementByTestId(`docTableHeaderFieldSort_${field}`).should( + 'have.attr', + 'aria-label', + `Sort ${field} ascending` + ); + }); + // Sort asc + cy.getElementByTestId(`docTableHeaderFieldSort_${testFields[0]}`).should('exist').click(); + cy.getElementByTestId('osdDocTableCellDataField') + .eq(0) + .should('have.text', 'Application'); + // Sort desc + cy.getElementByTestId(`docTableHeaderFieldSort_${testFields[0]}`).should('exist').click(); + cy.getElementByTestId('osdDocTableCellDataField').eq(0).should('have.text', 'Security'); + // Sort asc on the 2nd col + cy.getElementByTestId(`docTableHeaderFieldSort_${testFields[1]}`).should('exist').click(); + cy.getElementByTestId('osdDocTableCellDataField').eq(1).should('have.text', '0.1'); + // Sort desc on the 2nd col + cy.getElementByTestId(`docTableHeaderFieldSort_${testFields[1]}`).should('exist').click(); + cy.getElementByTestId('osdDocTableCellDataField').eq(1).should('have.text', '5'); + }); + }); + }); + }); +}; + +runTableTests(); diff --git a/cypress/utils/apps/query_enhancements/shared.js b/cypress/utils/apps/query_enhancements/shared.js index 73bd9e0032b..3cbc1dd5293 100644 --- a/cypress/utils/apps/query_enhancements/shared.js +++ b/cypress/utils/apps/query_enhancements/shared.js @@ -73,6 +73,32 @@ export const generateAllTestConfigurations = (generateTestConfigurationCallback, ); }; +/** + * Returns an array of test configurations for every query language + index pattern permutation + * @param {GenerateTestConfigurationCallback} generateTestConfigurationCallback - cb function that generates a test case for the particular permutation + * @param {Object} [options] - Optional configuration options + * @param {string} [options.indexPattern] - Custom index pattern name (defaults to INDEX_PATTERN_WITH_TIME) + * @param {string} [options.supportedLanguages] - Custom supported languages (defaults to all four supported languages) + * @returns {object[]} + */ +export const generateIndexPatternTestConfigurations = ( + generateTestConfigurationCallback, + options = {} +) => { + const { + indexPattern = INDEX_PATTERN_WITH_TIME, + supportedLanguages = DatasetTypes.INDEX_PATTERN.supportedLanguages, + } = options; + const indexPatternDatasets = Object.values(DatasetTypes).filter( + (dataset) => dataset.name === DatasetTypes.INDEX_PATTERN.name + ); + return indexPatternDatasets.flatMap((dataset) => + supportedLanguages.map((language) => { + return generateTestConfigurationCallback(indexPattern, dataset.name, language); + }) + ); +}; + /** * Sets the top nav date if it is relevant for the passed language * @param {QueryEnhancementLanguage} language - query language