Skip to content

Commit 36d7315

Browse files
[Cypress Test] Add and Refactor TESTID-140 sidebar spec and TESTID-46,47,49 sharing spec (#9154)
* Refactor TESTID 140 and resolve TESTID 46,47,49 Issue Resolved Partially #8946 #8954 #8952 #8953 Signed-off-by: Anan <[email protected]> * Changeset file for PR #9154 created/updated --------- Signed-off-by: Anan <[email protected]> Co-authored-by: opensearch-changeset-bot[bot] <154024398+opensearch-changeset-bot[bot]@users.noreply.github.com> (cherry picked from commit a50e0c7) Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent 027837b commit 36d7315

File tree

10 files changed

+884
-161
lines changed

10 files changed

+884
-161
lines changed

changelogs/fragments/9154.yml

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
test:
2+
- [Cypress Test] Add and Refactor TESTID-140 sidebar spec and clean up ([#9154](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/9154))

cypress/integration/core_opensearch_dashboards/opensearch_dashboards/apps/query_enhancements/field_display_filtering.spec.js

+153-154
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import {
7+
INDEX_WITH_TIME_1,
8+
INDEX_PATTERN_WITH_TIME_1,
9+
SECONDARY_ENGINE,
10+
} from '../../../../../utils/constants';
11+
import {
12+
getRandomizedWorkspaceName,
13+
getRandomizedDatasourceName,
14+
generateAllTestConfigurations,
15+
setDatePickerDatesAndSearchIfRelevant,
16+
setHistogramIntervalIfRelevant,
17+
} from '../../../../../utils/apps/query_enhancements/shared';
18+
import { QueryLanguages } from '../../../../../utils/apps/query_enhancements/constants';
19+
import { selectFieldFromSidebar } from '../../../../../utils/apps/query_enhancements/sidebar';
20+
import { verifyShareUrl } from '../../../../../utils/apps/query_enhancements/shared_links';
21+
import { setSort } from '../../../../../utils/apps/query_enhancements/table';
22+
23+
const workspaceName = getRandomizedWorkspaceName();
24+
const datasourceName = getRandomizedDatasourceName();
25+
26+
const generateShareUrlsTestConfiguration = (dataset, datasetType, language) => {
27+
const baseConfig = {
28+
dataset,
29+
datasetType,
30+
language: language.name,
31+
apiLanguage: language.apiName,
32+
hasDocLinks: [QueryLanguages.DQL.name, QueryLanguages.Lucene.name].includes(language.name),
33+
testName: `${language.name}-${datasetType}`,
34+
saveName: `${language.name}-${datasetType}`,
35+
};
36+
37+
return {
38+
...baseConfig,
39+
};
40+
};
41+
42+
const getQueryString = (config) => {
43+
if (config.language === QueryLanguages.DQL.name) {
44+
return 'bytes_transferred > 9950';
45+
}
46+
if (config.language === QueryLanguages.Lucene.name) {
47+
return 'bytes_transferred: {9950 TO *}';
48+
}
49+
if (config.language === QueryLanguages.SQL.name) {
50+
return `SELECT * FROM ${config.dataset} WHERE bytes_transferred > 9950`;
51+
}
52+
return `source = ${config.dataset} | where bytes_transferred > 9950`;
53+
};
54+
55+
export const runSharedLinksTests = () => {
56+
describe('discover sharing tests', () => {
57+
const testData = {
58+
fields: ['service_endpoint'],
59+
sort: ['asc'],
60+
interval: 'w',
61+
filter: ['category', 'Network'],
62+
};
63+
beforeEach(() => {
64+
cy.setupTestData(
65+
SECONDARY_ENGINE.url,
66+
[`cypress/fixtures/query_enhancements/data_logs_1/${INDEX_WITH_TIME_1}.mapping.json`],
67+
[`cypress/fixtures/query_enhancements/data_logs_1/${INDEX_WITH_TIME_1}.data.ndjson`]
68+
);
69+
cy.addDataSource({
70+
name: datasourceName,
71+
url: SECONDARY_ENGINE.url,
72+
authType: 'no_auth',
73+
});
74+
cy.deleteWorkspaceByName(workspaceName);
75+
cy.visit('/app/home');
76+
cy.osd.createInitialWorkspaceWithDataSource(datasourceName, workspaceName);
77+
});
78+
79+
afterEach(() => {
80+
cy.deleteWorkspaceByName(workspaceName);
81+
cy.deleteDataSourceByName(datasourceName);
82+
cy.deleteIndex(INDEX_WITH_TIME_1);
83+
});
84+
85+
generateAllTestConfigurations(generateShareUrlsTestConfiguration, {
86+
indexPattern: INDEX_PATTERN_WITH_TIME_1,
87+
index: INDEX_WITH_TIME_1,
88+
}).forEach((config) => {
89+
describe(`${config.testName}`, () => {
90+
beforeEach(() => {
91+
if (config.datasetType === 'INDEX_PATTERN') {
92+
cy.createWorkspaceIndexPatterns({
93+
workspaceName: workspaceName,
94+
indexPattern: INDEX_WITH_TIME_1,
95+
timefieldName: 'timestamp',
96+
dataSource: datasourceName,
97+
isEnhancement: true,
98+
});
99+
}
100+
cy.navigateToWorkSpaceSpecificPage({
101+
workspaceName: workspaceName,
102+
page: 'discover',
103+
isEnhancement: true,
104+
});
105+
});
106+
107+
const queryString = getQueryString(config);
108+
109+
it(`should handle shared document links correctly for ${config.testName}`, () => {
110+
// Setup
111+
cy.setDataset(config.dataset, datasourceName, config.datasetType);
112+
cy.setQueryLanguage(config.language);
113+
setDatePickerDatesAndSearchIfRelevant(config.language);
114+
115+
if (config.hasDocLinks) {
116+
// Test surrounding documents link
117+
cy.get('tbody tr')
118+
.first()
119+
.find('[data-test-subj="docTableExpandToggleColumn"] button')
120+
.click();
121+
122+
cy.getElementByTestId('docTableRowAction-0')
123+
.should('exist')
124+
.and('contain.text', 'View surrounding documents')
125+
.invoke('removeAttr', 'target')
126+
.click();
127+
cy.url().should('include', '/context/');
128+
cy.go('back');
129+
130+
// Test single document link
131+
cy.get('tbody tr')
132+
.first()
133+
.find('[data-test-subj="docTableExpandToggleColumn"] button')
134+
.click();
135+
136+
cy.getElementByTestId('docTableRowAction-1')
137+
.should('exist')
138+
.and('contain.text', 'View single document')
139+
.invoke('removeAttr', 'target')
140+
.click();
141+
cy.url().should('include', '/doc/');
142+
cy.go('back');
143+
} else {
144+
// Verify no document links for SQL/PPL
145+
cy.get('tbody tr')
146+
.first()
147+
.find('[data-test-subj="docTableExpandToggleColumn"] button')
148+
.click();
149+
cy.getElementByTestId('docTableRowAction-0').should('not.exist');
150+
cy.getElementByTestId('docTableRowAction-1').should('not.exist');
151+
}
152+
});
153+
154+
it(`should persist state in shared links for ${config.testName}`, () => {
155+
// Set dataset and language
156+
cy.setDataset(config.dataset, datasourceName, config.datasetType);
157+
cy.setQueryLanguage(config.language);
158+
setDatePickerDatesAndSearchIfRelevant(config.language);
159+
160+
// Set interval
161+
setHistogramIntervalIfRelevant(config.language, testData.interval);
162+
163+
// Set query
164+
cy.setQueryEditor(queryString, { parseSpecialCharSequences: false });
165+
166+
// Set filter for DQL/Lucene
167+
if (config.hasDocLinks) {
168+
cy.submitFilterFromDropDown(testData.filter[0], 'is', testData.filter[1], true);
169+
}
170+
171+
// Add fields from side panel
172+
testData.fields.forEach((field, i) => {
173+
selectFieldFromSidebar(field);
174+
if (config.hasDocLinks) {
175+
setSort(field, testData.sort[i]);
176+
}
177+
});
178+
179+
// Test snapshot url
180+
cy.getElementByTestId('shareTopNavButton').click();
181+
cy.getElementByTestId('copyShareUrlButton')
182+
.invoke('attr', 'data-share-url')
183+
.then((url) => {
184+
verifyShareUrl(url, config, testData, datasourceName, queryString);
185+
});
186+
187+
// Test short url
188+
cy.getElementByTestId('useShortUrl').click();
189+
// Need to wait for short url to generate
190+
cy.wait(2000);
191+
cy.getElementByTestId('copyShareUrlButton')
192+
.invoke('attr', 'data-share-url')
193+
.then((shareUrl) => {
194+
return cy.request({
195+
url: shareUrl,
196+
followRedirect: false,
197+
});
198+
})
199+
.then((response) => {
200+
const redirectUrl = response.headers.location;
201+
verifyShareUrl(redirectUrl, config, testData, datasourceName, queryString);
202+
});
203+
204+
// Test saved object url
205+
// Before save, export as saved object is disabled
206+
cy.getElementByTestId('exportAsSavedObject').find('input').should('be.disabled');
207+
cy.saveSearch(config.saveName);
208+
cy.waitForLoader(true);
209+
cy.getElementByTestId('shareTopNavButton').click();
210+
cy.getElementByTestId('exportAsSavedObject').find('input').should('not.be.disabled');
211+
cy.getElementByTestId('exportAsSavedObject').click();
212+
// Get saved search ID
213+
cy.url().then((url) => {
214+
const viewMatch = url.match(/\/view\/([^?#]+)/);
215+
const savedSearchId = viewMatch ? viewMatch[1] : '';
216+
217+
// Verify ID exists and is properly formatted
218+
expect(savedSearchId).to.not.be.empty;
219+
220+
cy.getElementByTestId('copyShareUrlButton')
221+
.invoke('attr', 'data-share-url')
222+
.then((shareUrl) => {
223+
expect(shareUrl).to.include(`/view/${savedSearchId}`);
224+
});
225+
});
226+
});
227+
});
228+
});
229+
});
230+
};
231+
232+
runSharedLinksTests();

0 commit comments

Comments
 (0)