Skip to content

Commit 47a2351

Browse files
angle943opensearch-changeset-bot[bot]ananzh
authored
Add tests for saved search creation and loading for query enhancement (opensearch-project#9112)
* Add tests for saved search creation and loading for query enhancement * click on a random element before typing on query editor to bypass the popover that appears * address pr comments - refactor to create saved search as an api call * address pr comments - specifically navigate to discover page before setting datasource Signed-off-by: Justin Kim <jungkm@amazon.com> --------- Signed-off-by: Justin Kim <jungkm@amazon.com> Signed-off-by: Anan Zhuang <ananzh@amazon.com> Co-authored-by: opensearch-changeset-bot[bot] <154024398+opensearch-changeset-bot[bot]@users.noreply.github.com> Co-authored-by: Anan Zhuang <ananzh@amazon.com>
1 parent 15a19fa commit 47a2351

File tree

15 files changed

+941
-101
lines changed

15 files changed

+941
-101
lines changed

changelogs/fragments/9112.yml

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
test:
2+
- Add tests for saving search and loading it ([#9112](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/9112))

cypress/integration/core-opensearch-dashboards/opensearch-dashboards/apps/query_enhancements/dataset_selector.spec.js

+13-39
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
START_TIME,
1010
END_TIME,
1111
} from '../../../../../utils/apps/constants';
12-
import { BASE_PATH, SECONDARY_ENGINE } from '../../../../../utils/constants';
12+
import { SECONDARY_ENGINE } from '../../../../../utils/constants';
1313

1414
const randomString = Math.random().toString(36).substring(7);
1515
const workspace = `${WORKSPACE_NAME}-${randomString}`;
@@ -38,6 +38,11 @@ describe('dataset selector', { scrollBehavior: false }, () => {
3838
cy.deleteWorkspaceByName(`${workspace}`);
3939
cy.visit('/app/home');
4040
cy.createInitialWorkspaceWithDataSource(`${DATASOURCE_NAME}`, `${workspace}`);
41+
cy.navigateToWorkSpaceSpecificPage({
42+
workspaceName: workspace,
43+
page: 'discover',
44+
isEnhancement: true,
45+
});
4146
});
4247

4348
afterEach(() => {
@@ -46,21 +51,7 @@ describe('dataset selector', { scrollBehavior: false }, () => {
4651

4752
describe('select indices', () => {
4853
it('with SQL as default language', function () {
49-
cy.getElementByTestId(`datasetSelectorButton`).click();
50-
cy.getElementByTestId(`datasetSelectorAdvancedButton`).click();
51-
cy.get(`[title="Indexes"]`).click();
52-
cy.get(`[title=${DATASOURCE_NAME}]`).click();
53-
cy.get(`[title="data_logs_small_time_1"]`).click(); // Updated to match loaded data
54-
cy.getElementByTestId('datasetSelectorNext').click();
55-
56-
cy.get(`[class="euiModalHeader__title"]`).should('contain', 'Step 2: Configure data');
57-
58-
// Select SQL
59-
cy.getElementByTestId('advancedSelectorLanguageSelect').select('OpenSearch SQL');
60-
cy.getElementByTestId(`advancedSelectorTimeFieldSelect`).select('timestamp');
61-
cy.getElementByTestId('advancedSelectorConfirmButton').click();
62-
63-
cy.waitForLoader(true);
54+
cy.setIndexAsDataset('data_logs_small_time_1', DATASOURCE_NAME, 'OpenSearch SQL');
6455

6556
// SQL should already be selected
6657
cy.getElementByTestId('queryEditorLanguageSelector').should('contain', 'OpenSearch SQL');
@@ -78,22 +69,7 @@ describe('dataset selector', { scrollBehavior: false }, () => {
7869
});
7970

8071
it('with PPL as default language', function () {
81-
cy.getElementByTestId(`datasetSelectorButton`).click();
82-
cy.getElementByTestId(`datasetSelectorAdvancedButton`).click();
83-
cy.get(`[title="Indexes"]`).click();
84-
cy.get(`[title=${DATASOURCE_NAME}]`).click();
85-
cy.get(`[title="data_logs_small_time_1"]`).click(); // Updated to match loaded data
86-
cy.getElementByTestId('datasetSelectorNext').click();
87-
88-
cy.get(`[class="euiModalHeader__title"]`).should('contain', 'Step 2: Configure data');
89-
90-
// Select PPL
91-
cy.getElementByTestId('advancedSelectorLanguageSelect').select('PPL');
92-
93-
cy.getElementByTestId(`advancedSelectorTimeFieldSelect`).select('timestamp');
94-
cy.getElementByTestId('advancedSelectorConfirmButton').click();
95-
96-
cy.waitForLoader(true);
72+
cy.setIndexAsDataset('data_logs_small_time_1', DATASOURCE_NAME, 'PPL');
9773

9874
// PPL should already be selected
9975
cy.getElementByTestId('queryEditorLanguageSelector').should('contain', 'PPL');
@@ -119,22 +95,20 @@ describe('dataset selector', { scrollBehavior: false }, () => {
11995
it('create index pattern and select it', function () {
12096
// Create and select index pattern for data_logs_small_time_1*
12197
cy.createWorkspaceIndexPatterns({
122-
url: `${BASE_PATH}`,
123-
workspaceName: `${workspace}`,
98+
workspaceName: workspace,
12499
indexPattern: 'data_logs_small_time_1',
125100
timefieldName: 'timestamp',
126101
indexPatternHasTimefield: true,
127102
dataSource: DATASOURCE_NAME,
128103
isEnhancement: true,
129104
});
130105

131-
cy.navigateToWorkSpaceHomePage(`${BASE_PATH}`, `${workspace}`);
106+
cy.navigateToWorkSpaceHomePage(workspace);
132107

133108
cy.waitForLoader(true);
134-
cy.getElementByTestId(`datasetSelectorButton`).click();
135-
cy.getElementByTestId(`datasetSelectorAdvancedButton`).click();
136-
cy.get(`[title="Index Patterns"]`).click();
137-
cy.get(`[title="${DATASOURCE_NAME}::data_logs_small_time_1*"]`).should('exist');
109+
cy.setIndexPatternAsDataset('data_logs_small_time_1*', DATASOURCE_NAME);
110+
// setting OpenSearch SQL as the code following it does not work if this test is isolated
111+
cy.setQueryLanguage('OpenSearch SQL');
138112

139113
cy.waitForLoader(true);
140114
cy.waitForSearch();

cypress/integration/core-opensearch-dashboards/opensearch-dashboards/apps/query_enhancements/queries.spec.js

+11-9
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
START_TIME,
1010
END_TIME,
1111
} from '../../../../../utils/apps/constants';
12-
import { BASE_PATH, SECONDARY_ENGINE } from '../../../../../utils/constants';
12+
import { SECONDARY_ENGINE } from '../../../../../utils/constants';
1313

1414
const randomString = Math.random().toString(36).substring(7);
1515
const workspace = `${WORKSPACE_NAME}-${randomString}`;
@@ -37,22 +37,24 @@ describe('query enhancement queries', { scrollBehavior: false }, () => {
3737

3838
// Create and select index pattern for data_logs_small_time_1*
3939
cy.createWorkspaceIndexPatterns({
40-
url: `${BASE_PATH}`,
41-
workspaceName: `${workspace}`,
40+
workspaceName: workspace,
4241
indexPattern: 'data_logs_small_time_1',
4342
timefieldName: 'timestamp',
4443
indexPatternHasTimefield: true,
4544
dataSource: DATASOURCE_NAME,
4645
isEnhancement: true,
4746
});
4847

49-
// Go to workspace home
50-
cy.navigateToWorkSpaceHomePage(`${BASE_PATH}`, `${workspace}`);
51-
cy.waitForLoader(true);
48+
// Go to discover page
49+
cy.navigateToWorkSpaceSpecificPage({
50+
workspaceName: workspace,
51+
page: 'discover',
52+
isEnhancement: true,
53+
});
5254
});
5355

5456
after(() => {
55-
cy.deleteWorkspaceByName(`${workspace}`);
57+
cy.deleteWorkspaceByName(workspace);
5658
cy.deleteDataSourceByName(`${DATASOURCE_NAME}`);
5759
cy.deleteIndex('data_logs_small_time_1');
5860
});
@@ -63,7 +65,7 @@ describe('query enhancement queries', { scrollBehavior: false }, () => {
6365
cy.setTopNavDate(START_TIME, END_TIME);
6466

6567
const query = `_id:1`;
66-
cy.setSingleLineQueryEditor(query);
68+
cy.setQueryEditor(query);
6769
cy.waitForLoader(true);
6870
cy.waitForSearch();
6971
cy.verifyHitCount(1);
@@ -78,7 +80,7 @@ describe('query enhancement queries', { scrollBehavior: false }, () => {
7880
cy.setTopNavDate(START_TIME, END_TIME);
7981

8082
const query = `_id:1`;
81-
cy.setSingleLineQueryEditor(query);
83+
cy.setQueryEditor(query);
8284
cy.waitForLoader(true);
8385
cy.waitForSearch();
8486
cy.verifyHitCount(1);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import {
7+
INDEX_PATTERN_WITH_TIME,
8+
INDEX_WITH_TIME_1,
9+
INDEX_WITH_TIME_2,
10+
QueryLanguages,
11+
SECONDARY_ENGINE,
12+
} from '../../../../../utils/constants';
13+
import {
14+
workspaceName,
15+
datasourceName,
16+
generateAllTestConfigurations,
17+
setDatePickerDatesAndSearchIfRelevant,
18+
setSearchConfigurations,
19+
verifyDiscoverPageState,
20+
verifySavedSearchInAssetsPage,
21+
postRequestSaveSearch,
22+
} from './utils/saved_search';
23+
24+
export const runSavedSearchTests = () => {
25+
describe('saved search', () => {
26+
beforeEach(() => {
27+
// Load test data
28+
cy.setupTestData(
29+
SECONDARY_ENGINE.url,
30+
[
31+
`cypress/fixtures/query_enhancements/data-logs-1/${INDEX_WITH_TIME_1}.mapping.json`,
32+
`cypress/fixtures/query_enhancements/data-logs-2/${INDEX_WITH_TIME_2}.mapping.json`,
33+
],
34+
[
35+
`cypress/fixtures/query_enhancements/data-logs-1/${INDEX_WITH_TIME_1}.data.ndjson`,
36+
`cypress/fixtures/query_enhancements/data-logs-2/${INDEX_WITH_TIME_2}.data.ndjson`,
37+
]
38+
);
39+
// Add data source
40+
cy.addDataSource({
41+
name: datasourceName,
42+
url: SECONDARY_ENGINE.url,
43+
authType: 'no_auth',
44+
});
45+
46+
// Create workspace
47+
cy.deleteWorkspaceByName(workspaceName);
48+
cy.visit('/app/home');
49+
cy.createInitialWorkspaceWithDataSource(datasourceName, workspaceName);
50+
cy.createWorkspaceIndexPatterns({
51+
workspaceName: workspaceName,
52+
indexPattern: INDEX_PATTERN_WITH_TIME.replace('*', ''),
53+
timefieldName: 'timestamp',
54+
dataSource: datasourceName,
55+
isEnhancement: true,
56+
});
57+
});
58+
59+
afterEach(() => {
60+
cy.deleteWorkspaceByName(workspaceName);
61+
// // TODO: Modify deleteIndex to handle an array of index and remove hard code
62+
cy.deleteDataSourceByName(datasourceName);
63+
cy.deleteIndex(INDEX_WITH_TIME_1);
64+
cy.deleteIndex(INDEX_WITH_TIME_2);
65+
});
66+
67+
generateAllTestConfigurations().forEach((config) => {
68+
it(`should successfully create a saved search for ${config.testName}`, () => {
69+
cy.navigateToWorkSpaceSpecificPage({
70+
workspaceName,
71+
page: 'discover',
72+
isEnhancement: true,
73+
});
74+
75+
cy.setDataset(config.dataset, datasourceName, config.datasetType);
76+
77+
cy.setQueryLanguage(config.language);
78+
setDatePickerDatesAndSearchIfRelevant(config.language);
79+
80+
setSearchConfigurations(config);
81+
verifyDiscoverPageState(config);
82+
cy.saveSearch(config.saveName);
83+
84+
// There is a small chance where if we go to assets page,
85+
// the saved search does not appear. So adding this wait
86+
cy.wait(2000);
87+
88+
verifySavedSearchInAssetsPage(config);
89+
});
90+
91+
// We are starting from various languages
92+
// to guard against: https://github.com/opensearch-project/OpenSearch-Dashboards/issues/9078
93+
Object.values(QueryLanguages)
94+
.map((queryLanguage) => queryLanguage.name)
95+
.forEach((startingLanguage) => {
96+
// TODO: Remove this line once bugs are fixed
97+
// https://github.com/opensearch-project/OpenSearch-Dashboards/issues/9078
98+
if (startingLanguage !== config.language) return;
99+
100+
it(`should successfully load a saved search for ${config.testName} starting from ${startingLanguage}`, () => {
101+
postRequestSaveSearch(config);
102+
103+
cy.navigateToWorkSpaceSpecificPage({
104+
workspaceName,
105+
page: 'discover',
106+
isEnhancement: true,
107+
});
108+
cy.getElementByTestId('discoverNewButton').click();
109+
110+
// Intentionally setting INDEX_PATTERN dataset here so that
111+
// we have access to all four languages that INDEX_PATTERN allows.
112+
// This means that we are only testing loading a saved search
113+
// starting from an INDEX_PATTERN dataset, but I think testing where the
114+
// start is a permutation of other dataset is overkill
115+
cy.setIndexPatternAsDataset(INDEX_PATTERN_WITH_TIME, datasourceName);
116+
117+
cy.setQueryLanguage(startingLanguage);
118+
cy.loadSaveSearch(config.saveName, false);
119+
setDatePickerDatesAndSearchIfRelevant(config.language);
120+
verifyDiscoverPageState(config);
121+
});
122+
});
123+
});
124+
});
125+
};
126+
127+
runSavedSearchTests();

0 commit comments

Comments
 (0)