Skip to content

Commit

Permalink
Add workspace utility (opensearch-project#9038)
Browse files Browse the repository at this point in the history
Signed-off-by: Suchit Sahoo <[email protected]>
  • Loading branch information
LDrago27 authored and ArgusLi committed Dec 17, 2024
1 parent 719c882 commit 3444f18
Show file tree
Hide file tree
Showing 5 changed files with 346 additions and 0 deletions.
106 changes: 106 additions & 0 deletions cypress/utils/dashboards/commands.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

Cypress.Commands.add('selectFromDataSourceSelector', (dataSourceTitle, dataSourceId) => {
// clean up the input field
cy.wait(1000);
cy.getElementByTestId('dataSourceSelectorComboBox').find('input').type(`{selectall}{backspace}`);
cy.waitForLoader();
cy.getElementByTestId('dataSourceSelectorComboBox').should('have.attr', 'aria-expanded', 'false');
cy.getElementByTestId('dataSourceSelectorComboBox')
.find(`button[data-test-subj="comboBoxToggleListButton"]`)
.then(($element) => {
if ($element.attr('aria-label') === 'Open list of options') {
$element.click();
}
});
cy.getElementByTestId('dataSourceSelectorComboBox').should('have.attr', 'aria-expanded', 'true');
if (dataSourceId) {
cy.get(`#${dataSourceId}`).should('be.visible').trigger('click');
} else if (dataSourceTitle) {
cy.get(`.euiFilterSelectItem[title="${dataSourceTitle}"]`)
.should('be.visible')
.trigger('click');
}
cy.waitForLoader();
});

Cypress.Commands.add(
'selectFromDataSourceSelectorFromStandardPageHeader',
(dataSourceTitle, dataSourceId) => {
// clean up the input field
cy.wait(1000);
cy.getElementByTestId('dataSourceSelectableButton').click();
cy.getElementByTestId('dataSourceSelectable').find('input').type(`{selectall}{backspace}`);
cy.waitForLoader();
if (dataSourceId) {
cy.get(`#${dataSourceId}`).should('be.visible').trigger('click');
} else if (dataSourceTitle) {
cy.get(`.euiSelectableListItem[title="${dataSourceTitle}"]`)
.should('be.visible')
.trigger('click');
}
cy.waitForLoader();
}
);

Cypress.Commands.add(
// navigates to the workspace HomePage of a given workspace
'navigateToWorkSpaceHomePage',
(url, workspaceName) => {
// Selecting the correct workspace
cy.visit(`${url}/app/workspace_list#`);
cy.openWorkspaceDashboard(workspaceName);
}
);

Cypress.Commands.add(
//navigate to workspace specific pages
'navigateToWorkSpaceSpecificPage',
(url, workspaceName, page) => {
// Navigating to the WorkSpace Home Page
cy.navigateToWorkSpaceHomePage(url, workspaceName);

// Opening the side panel
cy.getElementByTestId('toggleNavButton').then((ele) => {
if (ele.length > 0) {
ele.first().click();
}
});

cy.getElementByTestId(`collapsibleNavAppLink-${page}`).click();

cy.waitForLoader();
}
);

Cypress.Commands.add(
// creates an index pattern within the workspace
// Don't use * in the indexPattern it adds it by default at the end of name
'createWorkspaceIndexPatterns',
(url, workspaceName, indexPattern, dataSource, timefieldName = '') => {
// Navigate to Workspace Specific IndexPattern Page
cy.navigateToWorkSpaceSpecificPage(url, workspaceName, 'indexPatterns');

cy.getElementByTestId('createIndexPatternButton').click({ force: true });

cy.get('[type="data-source"]').contains(dataSource).click();
cy.getElementByTestId('createIndexPatternStepDataSourceNextStepButton').click();

cy.wait(1000); // Intentional Wait

cy.getElementByTestId('createIndexPatternNameInput').clear().type(indexPattern);
cy.getElementByTestId('createIndexPatternGoToStep2Button').click();

if (timefieldName !== '') {
cy.getElementByTestId('createIndexPatternTimeFieldSelect').select(timefieldName);
} else {
cy.getElementByTestId('createIndexPatternTimeFieldSelect').select(
"I don't want to use the time filter"
);
}
cy.getElementByTestId('createIndexPatternButton').click();
}
);
17 changes: 17 additions & 0 deletions cypress/utils/dashboards/remove_workspace.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

export function removeSampleDataAndWorkspace(url, workspaceName) {
describe('removing workspace/sampledata', () => {
it('remove workspace', () => {
cy.visit(`${url}/app/workspace_list`);
cy.openWorkspaceDashboard(workspaceName);
cy.getElementByTestId('toggleNavButton').eq(0).should('exist').click();
cy.wait(3000);
cy.getElementByTestId('collapsibleNavAppLink-workspace_detail').should('exist').click();
cy.deleteWorkspace(workspaceName);
});
});
}
32 changes: 32 additions & 0 deletions cypress/utils/dashboards/setup_workspace.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

const dataSourceTitle = Cypress.env('dataSourceTitle');

export function createWorkspaceAndSampleData(url, workspaceName) {
describe('checking home page', () => {
it('checking workspace initial page', () => {
cy.visit(`${url}/app/home`);
cy.getElementByTestId('workspace-initial-card-createWorkspace-button').should('be.visible');
});
});

describe('creating workspace', () => {
it('creating workspace with data source', () => {
cy.visit(`${url}/app/home`);
cy.createInitialWorkspaceWithDataSource(dataSourceTitle, workspaceName);
cy.wait(2000);
});
});

describe('adding sample data to workspace', () => {
it('add sample data to data source', () => {
cy.visit(`${url}/app/workspace_list`);
cy.openWorkspaceDashboard(workspaceName);
cy.openSampleDataPage();
cy.addSampleDataToDataSource(dataSourceTitle);
});
});
}
185 changes: 185 additions & 0 deletions cypress/utils/dashboards/workspace-plugin/commands.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

import { WORKSPACE_API_PREFIX } from './constants';

const BASE_PATH = Cypress.config('baseUrl');

Cypress.Commands.add('deleteWorkspaceById', (workspaceId) => {
cy.request({
method: 'DELETE',
url: `${BASE_PATH}${WORKSPACE_API_PREFIX}/${workspaceId}`,
headers: {
'osd-xsrf': true,
},
});
});

Cypress.Commands.add('deleteWorkspaceByName', (workspaceName) => {
cy.request({
method: 'POST',
url: `${BASE_PATH}${WORKSPACE_API_PREFIX}/_list`,
headers: {
'osd-xsrf': true,
},
body: {},
}).then((resp) => {
if (resp && resp.body && resp.body.success) {
resp.body.result.workspaces.map(({ name, id }) => {
if (workspaceName === name) {
cy.request({
method: 'DELETE',
url: `${BASE_PATH}${WORKSPACE_API_PREFIX}/${id}`,
headers: {
'osd-xsrf': true,
},
});
}
});
}
});
});

Cypress.Commands.add('createWorkspace', ({ settings, ...workspace } = {}) => {
return cy
.request({
method: 'POST',
url: `${BASE_PATH}${WORKSPACE_API_PREFIX}`,
headers: {
'osd-xsrf': true,
},
body: {
attributes: {
...workspace,
features: workspace.features || ['use-case-all'],
description: workspace.description || 'test_description',
},
settings,
},
})
.then((resp) => {
if (resp && resp.body && resp.body.success) {
return resp.body.result.id;
} else {
throw new Error(`Create workspace ${workspace.name} failed!`);
}
});
});

/**
* Check whether the given workspace is equal to the expected workspace or not,
* the given workspace is as exepcted when the name, description, features, and permissions are as expected.
*/
Cypress.Commands.add('checkWorkspace', (workspaceId, expected) => {
cy.request({
method: 'GET',
url: `${BASE_PATH}${WORKSPACE_API_PREFIX}/${workspaceId}`,
}).then((resp) => {
if (resp && resp.body && resp.body.success) {
const { name, description, features, permissions } = resp.body.result;
if (name !== expected.name) {
throw new Error(
`workspace ${workspaceId} is not as expected, expected name is ${expected.name}, but is ${name}`
);
}
if (description !== expected.description) {
throw new Error(
`workspace ${workspaceId} is not as expected, expected description is ${expected.description}, but is ${description}`
);
}

if (features && expected.features) {
const expectedFeatures = JSON.stringify(expected.features);
const actualFeatures = JSON.stringify(features);
if (features.length !== expected.features.length) {
throw new Error(
`workspace ${workspaceId} is not as expected, expected features are: ${expectedFeatures}, but are: ${actualFeatures}`
);
}
expected.features.forEach((feature) => {
if (!features.includes(feature)) {
throw new Error(
`workspace ${workspaceId} is not as expected because the feature ${feature} is missing, expected features are: ${expectedFeatures}, but are: ${actualFeatures}`
);
}
});
}

if (permissions && expected.permissions) {
const expectedPermissions = JSON.stringify(expected.permissions);
const actualPermissions = JSON.stringify(permissions);
if (Object.keys(permissions).length !== Object.keys(expected.permissions).length) {
throw new Error(
`permissions for workspace ${workspaceId} is not as expected, expected permissions are: ${expectedPermissions}, but are: ${actualPermissions}`
);
}

Object.entries(permissions).forEach(([key, value]) => {
if (!expected.permissions[key]) {
throw new Error(
`permissions for workspace ${workspaceId} is not as expected because the permission ${key} is missing, expected permissions are: ${expectedPermissions}, but are ${actualPermissions}`
);
} else {
if (
expected.permissions[key].users &&
!checkPrincipalArrayEquals(expected.permissions[key].users, value.users)
) {
throw new Error(
`permissions for workspace ${workspaceId} is not as expected, expected permissions are: ${expectedPermissions}, but are ${actualPermissions}`
);
}

if (
expected.permissions[key].groups &&
!checkPrincipalArrayEquals(expected.permissions[key].groups, value.groups)
) {
throw new Error(
`permissions for workspace ${workspaceId} is not as expected, expected permissions are: ${expectedPermissions}, but are ${actualPermissions}`
);
}
}
});
}
} else {
throw new Error(`cannot find workspace ${workspaceId}`);
}
});
});

function checkPrincipalArrayEquals(expectedPrincipals, actualPrincipals) {
if (expectedPrincipals.length !== actualPrincipals.length) {
return false;
}

expectedPrincipals.forEach((principal) => {
if (!actualPrincipals.includes(principal)) {
return false;
}
});
return true;
}

Cypress.Commands.add('deleteAllWorkspaces', () => {
cy.request({
method: 'POST',
url: `${BASE_PATH}${WORKSPACE_API_PREFIX}/_list`,
headers: {
'osd-xsrf': true,
},
body: {},
}).then((resp) => {
if (resp && resp.body && resp.body.success) {
resp.body.result.workspaces.forEach(({ id }) => {
cy.request({
method: 'DELETE',
url: `${BASE_PATH}${WORKSPACE_API_PREFIX}/${id}`,
headers: {
'osd-xsrf': true,
},
});
});
}
});
});
6 changes: 6 additions & 0 deletions cypress/utils/dashboards/workspace-plugin/constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

export const WORKSPACE_API_PREFIX = '/api/workspaces';

0 comments on commit 3444f18

Please sign in to comment.