Skip to content

Commit a67d177

Browse files
committed
merge: merge branch 'THU/edit_and_relaunch_dataset_runners_PROD-14182'
2 parents 4f15566 + 12ba80c commit a67d177

File tree

34 files changed

+1045
-54
lines changed

34 files changed

+1045
-54
lines changed

cypress/commons/actions/generic/DatasetManager.js

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ export const getDatasetReuploadInput = (datasetId) =>
4343
cy.get(SELECTORS.list.reuploadInputByDatasetId.replace('$DATASETID', datasetId));
4444
export const getAllRefreshDatasetSpinners = (timeout) =>
4545
cy.get(SELECTORS.list.refreshSpinners, timeout ? { timeout: timeout * 1000 } : undefined);
46-
export const getRefreshDatasetSpinner = (datasetId) =>
47-
cy.get(SELECTORS.list.refreshSpinnerByDatasetId.replace('$DATASETID', datasetId));
46+
export const getRefreshDatasetSpinner = (datasetId, timeout = 10) =>
47+
cy.get(SELECTORS.list.refreshSpinnerByDatasetId.replace('$DATASETID', datasetId), { timeout: timeout * 1000 });
4848
export const getRefreshDatasetErrorIcon = (datasetId) =>
4949
cy.get(SELECTORS.list.refreshErrorIconByDatasetId.replace('$DATASETID', datasetId));
5050
export const getConfirmDatasetRefreshButton = () => cy.get(SELECTORS.confirmRefreshButton);
@@ -309,3 +309,49 @@ export const ignoreDatasetTwingraphQueries = () => {
309309
const response = [{ result: -1 }];
310310
api.interceptPostDatasetTwingraphQuery(response, null, 0);
311311
};
312+
313+
export const getUpdateDatasetParametersButton = () => {
314+
return cy.get(SELECTORS.list.updateDatasetParametersButton);
315+
};
316+
317+
export const openUpdateDatasetParametersDialog = () => {
318+
getUpdateDatasetParametersButton().click();
319+
};
320+
321+
export const getUpdateDatasetParametersDialog = () => {
322+
return cy.get(GENERIC_SELECTORS.datasetmanager.list.updateDatasetParametersDialog);
323+
};
324+
325+
export const getRunnerRunTemplate = () => {
326+
return cy.get(GENERIC_SELECTORS.datasetmanager.update.runnerRunTemplateId);
327+
};
328+
329+
export const getCloseUpdateDatasetParametersDialogButton = () => {
330+
return cy.get(GENERIC_SELECTORS.datasetmanager.update.closeUpdateDialogButton);
331+
};
332+
333+
export const closeUpdateDatasetParametersDialog = () => {
334+
getCloseUpdateDatasetParametersDialogButton().click();
335+
getUpdateDatasetParametersDialog().should('not.exist');
336+
};
337+
338+
export const uploadFileInParametersEditionDialog = (filePath) =>
339+
FileParameters.upload(getUpdateDatasetParametersDialog(), filePath);
340+
341+
export const getUpdateParametersButton = () =>
342+
cy.get(GENERIC_SELECTORS.datasetmanager.update.confirmUpdateParametersButton);
343+
344+
export const updateDatasetParameters = (datasetId, options) => {
345+
const aliases = [];
346+
options?.datasetsEvents?.reverse()?.forEach((datasetEvent) => {
347+
aliases.push(api.interceptCreateDataset({ id: datasetEvent.id }));
348+
aliases.push(api.interceptUpdateDataset({ id: datasetEvent.id, customDatasetPatch: { id: datasetEvent.id } }));
349+
aliases.push(api.interceptUploadWorkspaceFile());
350+
});
351+
const updateRunnerAlias = api.interceptUpdateRunner(options);
352+
aliases.push(updateRunnerAlias);
353+
aliases.push(api.interceptRefreshDatasetAndPollStatus(datasetId, options.importJobOptions));
354+
aliases.push(api.interceptGetDatasetStatus(options.importJobOptions?.expectedPollsCount));
355+
getUpdateParametersButton().click();
356+
api.waitAliases(aliases, { timeout: 10 * 1000 });
357+
};

cypress/commons/constants/generic/IdConstants.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ export const GENERIC_SELECTORS = {
179179
refreshSpinners: '[data-cy^="refresh-spinner-"]',
180180
refreshSpinnerByDatasetId: '[data-cy="refresh-spinner-$DATASETID"]',
181181
refreshErrorIconByDatasetId: '[data-cy="refresh-error-icon-$DATASETID"]',
182+
updateDatasetParametersButton: '[data-cy=edit-dataset-parameters-button]',
183+
updateDatasetParametersDialog: '[data-cy=update-dataset-parameters-dialog]',
182184
},
183185
metadata: {
184186
card: '[data-cy=dataset-metadata-card]',
@@ -272,6 +274,12 @@ export const GENERIC_SELECTORS = {
272274
},
273275
},
274276
confirmRefreshButton: '[data-cy=refresh-dataset-dialog-confirm-button]',
277+
update: {
278+
confirmButton: '[data-cy=confirm-dataset-update-button]',
279+
runnerRunTemplateId: '[data-cy=selected-runner-source-type]',
280+
closeUpdateDialogButton: '[data-cy=close-update-dataset-parameters-dialog-button]',
281+
confirmUpdateParametersButton: '[data-cy=update-dataset-parameters-button]',
282+
},
275283
},
276284
genericComponents: {
277285
uploadFile: {

cypress/commons/constants/generic/TestConstants.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ export const API_REGEX = {
182182
DATASET_ROLLBACK: new RegExp('^' + API_ENDPOINT.DATASET_ROLLBACK + '$'),
183183
DATASET_STATUS: new RegExp('^' + API_ENDPOINT.DATASET_STATUS + '$'),
184184
DATASET_TWINGRAPH: new RegExp('^' + API_ENDPOINT.DATASET_TWINGRAPH + '$'),
185-
RUNNERS: new RegExp('^' + API_ENDPOINT.RUNNERS + '$'),
185+
RUNNERS: new RegExp('^' + API_ENDPOINT.RUNNERS),
186186
RUNNER: new RegExp('^' + API_ENDPOINT.RUNNER + '$'),
187187
RUNNER_DEFAULT_SECURITY: new RegExp('^' + API_ENDPOINT.RUNNER_DEFAULT_SECURITY + '$'),
188188
RUNNER_SECURITY_ACL: new RegExp('^' + API_ENDPOINT.RUNNER_SECURITY_ACL + '$'),

cypress/commons/utils/apiUtils.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -766,8 +766,17 @@ const interceptWorkspaceSelectorQueries = () => {
766766
];
767767
};
768768

769+
const interceptGetRunners = () => {
770+
const alias = forgeAlias('reqGetRunners');
771+
cy.intercept({ method: 'GET', url: API_REGEX.RUNNERS, times: 1 }, (req) => {
772+
if (!stub.isEnabledFor('GET_DATASETS')) return;
773+
req.reply(stub.getRunners());
774+
}).as(alias);
775+
return alias;
776+
};
777+
769778
const interceptSelectWorkspaceQueries = (isPowerBiEnabled = true) => {
770-
const workspaceQueries = [interceptGetSolution(), interceptGetScenarios()];
779+
const workspaceQueries = [interceptGetSolution(), interceptGetScenarios(), interceptGetRunners()];
771780
if (isPowerBiEnabled) workspaceQueries.push(interceptPowerBIAzureFunction());
772781
return workspaceQueries;
773782
};
@@ -822,4 +831,5 @@ export const apiUtils = {
822831
interceptUpdateDatasetACLSecurity,
823832
interceptUpdateRunnerDefaultSecurity,
824833
interceptUpdateRunnerACLSecurity,
834+
interceptGetRunners,
825835
};
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
// Copyright (c) Cosmo Tech.
2+
// Licensed under the MIT license.
3+
import { Login, DatasetManager } from '../../commons/actions';
4+
import { GENERIC_SELECTORS } from '../../commons/constants/generic/IdConstants';
5+
import { stub } from '../../commons/services/stubbing';
6+
import { ORGANIZATION_WITH_DEFAULT_ROLE_USER } from '../../fixtures/stubbing/DatasetManager';
7+
import { DATASETS, RUNNERS, SOLUTION, WORKSPACE } from '../../fixtures/stubbing/DatasetManagerParametersEdition';
8+
9+
const NINE_CUSTOMERS_DATASET_ZIP_FILE_PATH = 'customers2.csv';
10+
11+
describe('Dataset Manager - Parameters Edition', () => {
12+
const ingestionOptions = {
13+
expectedPollsCount: 2,
14+
finalIngestionStatus: 'SUCCESS',
15+
};
16+
before(() => {
17+
stub.start();
18+
stub.setOrganizations([ORGANIZATION_WITH_DEFAULT_ROLE_USER]);
19+
stub.setSolutions([SOLUTION]);
20+
stub.setWorkspaces([WORKSPACE]);
21+
stub.setDatasets([...DATASETS]);
22+
stub.setRunners([...RUNNERS]);
23+
});
24+
25+
beforeEach(() =>
26+
Login.login({ url: `/${WORKSPACE.id}/datasetmanager`, workspaceId: WORKSPACE.id, isPowerBiEnabled: false })
27+
);
28+
after(stub.stop);
29+
30+
it('should edit ETL parameters of a dataset', () => {
31+
const datasetFile = DATASETS[2];
32+
const datasetETLDynamicValues = DATASETS[3];
33+
const datasetETLLocalFile = DATASETS[4];
34+
const secondDatasetETLLocalFile = DATASETS[6];
35+
const enumParameterSelector = '[data-cy=enum-input-select-etl_dynamic_values_enum_parameter]';
36+
const enumValue1Selector = '[data-cy=First]';
37+
const fileParameterSelector = '[data-cy="file-upload-etl_file_parameter"]';
38+
const stockParameterSelector = '[data-cy=text-input-etl_stock]';
39+
const getStockParameterInput = () => {
40+
return cy.get(stockParameterSelector).find('input');
41+
};
42+
const clearStockParameterInput = () => {
43+
getStockParameterInput().click().type('{selectAll}{backspace}');
44+
};
45+
const editStockParameter = (value) => {
46+
clearStockParameterInput();
47+
getStockParameterInput().type(value);
48+
};
49+
50+
const validateRequest = (req) =>
51+
expect(req.body).to.deep.equal({ query: 'MATCH(n:Customer) RETURN n.id as customer_id' });
52+
const queryResponse = [{ customer_id: 'First' }, { customer_id: 'Second' }, { customer_id: 'Third' }];
53+
54+
DatasetManager.ignoreDatasetTwingraphQueries();
55+
DatasetManager.switchToDatasetManagerView();
56+
DatasetManager.selectDatasetById(datasetFile.id);
57+
DatasetManager.getUpdateDatasetParametersButton().should('not.exist');
58+
DatasetManager.selectDatasetById(datasetETLDynamicValues.id);
59+
DatasetManager.getUpdateDatasetParametersButton().should('be.visible');
60+
const waitForTwingraphQuery = DatasetManager.expectDatasetTwingraphQuery(queryResponse, validateRequest);
61+
DatasetManager.openUpdateDatasetParametersDialog();
62+
DatasetManager.getUpdateDatasetParametersDialog().should('be.visible');
63+
DatasetManager.getRunnerRunTemplate().should('exist').contains('ETL with dynamic values');
64+
waitForTwingraphQuery();
65+
cy.get(enumParameterSelector).should('be.visible');
66+
cy.get(enumParameterSelector).find('input').should('have.value', 'Second');
67+
cy.get(enumParameterSelector).click();
68+
cy.get(enumValue1Selector).click();
69+
cy.get(enumParameterSelector).find('input').should('have.value', 'First');
70+
DatasetManager.updateDatasetParameters(datasetETLDynamicValues.id, {
71+
importJobOptions: ingestionOptions,
72+
});
73+
DatasetManager.getRefreshDatasetSpinner(datasetETLDynamicValues.id, 20).should('not.exist');
74+
DatasetManager.selectDatasetById(secondDatasetETLLocalFile.id);
75+
DatasetManager.getUpdateDatasetParametersButton().should('be.visible');
76+
DatasetManager.openUpdateDatasetParametersDialog();
77+
DatasetManager.getRunnerRunTemplate().should('exist').contains('ETL with local file');
78+
cy.get(fileParameterSelector)
79+
.find(GENERIC_SELECTORS.genericComponents.uploadFile.fileName)
80+
.should('have.text', 'reference_two.zip');
81+
getStockParameterInput().should('have.value', '56');
82+
DatasetManager.closeUpdateDatasetParametersDialog();
83+
DatasetManager.selectDatasetById(datasetETLLocalFile.id);
84+
DatasetManager.getUpdateDatasetParametersButton().should('be.visible');
85+
DatasetManager.openUpdateDatasetParametersDialog();
86+
DatasetManager.getRunnerRunTemplate().should('exist').contains('ETL with local file');
87+
cy.get(fileParameterSelector)
88+
.find(GENERIC_SELECTORS.genericComponents.uploadFile.fileName)
89+
.should('have.text', 'reference.zip');
90+
getStockParameterInput().should('have.value', '150');
91+
DatasetManager.getUpdateParametersButton().should('be.disabled');
92+
clearStockParameterInput();
93+
DatasetManager.getUpdateParametersButton().should('be.disabled');
94+
editStockParameter('150');
95+
DatasetManager.getUpdateParametersButton().should('be.disabled');
96+
cy.get(stockParameterSelector).find('input').click();
97+
editStockParameter('98');
98+
DatasetManager.getUpdateParametersButton().should('not.be.disabled');
99+
DatasetManager.uploadFileInParametersEditionDialog(NINE_CUSTOMERS_DATASET_ZIP_FILE_PATH);
100+
101+
DatasetManager.updateDatasetParameters(datasetETLLocalFile.id, {
102+
datasetsEvents: [{ id: 'd-stbddtspr1' }],
103+
importJobOptions: ingestionOptions,
104+
});
105+
DatasetManager.getRefreshDatasetSpinner(datasetETLLocalFile.id, 20).should('not.exist');
106+
DatasetManager.selectDatasetById(datasetETLDynamicValues.id);
107+
DatasetManager.openUpdateDatasetParametersDialog();
108+
cy.get(enumParameterSelector).find('input').should('have.value', 'First');
109+
DatasetManager.closeUpdateDatasetParametersDialog();
110+
DatasetManager.selectDatasetById(datasetETLLocalFile.id);
111+
DatasetManager.openUpdateDatasetParametersDialog();
112+
getStockParameterInput().should('have.value', '98');
113+
cy.get(fileParameterSelector)
114+
.find(GENERIC_SELECTORS.genericComponents.uploadFile.fileName)
115+
.should('have.text', 'customers2.csv');
116+
DatasetManager.closeUpdateDatasetParametersDialog();
117+
});
118+
});

cypress/e2e/brewery/SolutionUnauthorized.cy.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ describe('User has no access to the solution', () => {
2727
// The solution interception is replaced here by a custom one because in this specific case,
2828
// we need to return an error instead of the base stubbed solution
2929
const customSelectWorkspace = (workspaceId) => {
30-
const queries = [apiUtils.interceptPowerBIAzureFunction(), apiUtils.interceptGetScenarios()];
30+
const queries = [
31+
apiUtils.interceptPowerBIAzureFunction(),
32+
apiUtils.interceptGetScenarios(),
33+
apiUtils.interceptGetRunners(),
34+
];
3135
Workspaces.getWorkspaceCardById(workspaceId)
3236
.should('be.visible')
3337
.find(GENERIC_SELECTORS.workspace.openButton)
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
// Copyright (c) Cosmo Tech.
2+
// Licensed under the MIT license.
3+
import { DEFAULT_DATASET } from '../default';
4+
import { WORKSPACE } from './workspaces';
5+
6+
const EDITABLE_DATASET = {
7+
...DEFAULT_DATASET,
8+
ingestionStatus: 'SUCCESS',
9+
twincacheStatus: 'FULL',
10+
linkedWorkspaceIdList: [WORKSPACE.id],
11+
security: { default: 'admin', accessControlList: [] },
12+
};
13+
14+
const DATASET_PART_1 = {
15+
...EDITABLE_DATASET,
16+
id: 'D-stbdparams1',
17+
main: false,
18+
name: 'Parameters Dataset Reference',
19+
description: 'Reference dataset for parameters edition testing',
20+
tags: ['parameters', 'test', 'dataset_part'],
21+
connector: {
22+
name: 'Azure Storage Connector',
23+
parametersValues: {
24+
AZURE_STORAGE_CONTAINER_BLOB_PREFIX: '%WORKSPACE_FILE%/datasets/D-stbdparams1/reference.zip',
25+
},
26+
},
27+
};
28+
29+
const MAIN_DATASET_A = {
30+
...EDITABLE_DATASET,
31+
id: 'D-stbdparams2',
32+
main: true,
33+
name: 'Parameters Dataset A',
34+
description: 'Dataset for parameters edition testing A',
35+
tags: ['parameters', 'test'],
36+
sourceType: 'File',
37+
};
38+
39+
const MAIN_DATASET_B = {
40+
...EDITABLE_DATASET,
41+
id: 'D-stbdparams3',
42+
main: true,
43+
name: 'Parameters Dataset B',
44+
description: 'Dataset for parameters edition testing B',
45+
tags: ['parameters', 'test'],
46+
sourceType: 'File',
47+
};
48+
49+
const MAIN_DATASET_C = {
50+
...EDITABLE_DATASET,
51+
id: 'D-stbdparams4',
52+
parentId: 'D-stbdparams3',
53+
main: true,
54+
name: 'Parameters Dataset C',
55+
description: 'Dataset for parameters edition testing C with ETL',
56+
tags: ['parameters', 'test', 'etl'],
57+
sourceType: 'ETL',
58+
source: {
59+
location: 'W-stbbdbrwry',
60+
name: 'r-stbdparams1',
61+
path: null,
62+
jobId: 'run-stbrun1',
63+
},
64+
};
65+
66+
const MAIN_DATASET_D = {
67+
...EDITABLE_DATASET,
68+
id: 'D-stbdparams5',
69+
main: true,
70+
name: 'Parameters Dataset D',
71+
description: 'Dataset for parameters edition testing D with ETL',
72+
tags: ['parameters', 'test', 'etl'],
73+
sourceType: 'ETL',
74+
source: {
75+
location: 'W-stbbdbrwry',
76+
name: 'r-stbdparams2',
77+
path: null,
78+
jobId: 'run-stbrun2',
79+
},
80+
};
81+
82+
const MAIN_DATASET_E = {
83+
...EDITABLE_DATASET,
84+
id: 'D-stbdparams7',
85+
main: true,
86+
name: 'Parameters Dataset E',
87+
description: 'Dataset for parameters edition testing D with ETL',
88+
tags: ['parameters', 'test', 'etl'],
89+
sourceType: 'ETL',
90+
source: {
91+
location: 'W-stbbdbrwry',
92+
name: 'r-stbdparams3',
93+
path: null,
94+
jobId: 'run-stbrun3',
95+
},
96+
};
97+
98+
const DATASET_PART_2 = {
99+
...EDITABLE_DATASET,
100+
id: 'D-stbdparams6',
101+
main: false,
102+
name: 'Parameters Dataset Reference',
103+
description: 'Reference dataset for parameters edition testing',
104+
tags: ['parameters', 'test', 'dataset_part'],
105+
connector: {
106+
name: 'Azure Storage Connector',
107+
parametersValues: {
108+
AZURE_STORAGE_CONTAINER_BLOB_PREFIX: '%WORKSPACE_FILE%/datasets/D-stbdparams1/reference_two.zip',
109+
},
110+
},
111+
};
112+
113+
export const DATASETS = [
114+
DATASET_PART_1,
115+
MAIN_DATASET_A,
116+
MAIN_DATASET_B,
117+
MAIN_DATASET_C,
118+
MAIN_DATASET_D,
119+
DATASET_PART_2,
120+
MAIN_DATASET_E,
121+
];
122+
123+
DATASETS.forEach((dataset) => WORKSPACE.linkedDatasetIdList.push(dataset.id));
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Copyright (c) Cosmo Tech.
2+
// Licensed under the MIT license.
3+
4+
export { DATASETS } from './datasets';
5+
export { RUNNERS } from './runners';
6+
export { WORKSPACE } from './workspaces';
7+
export { SOLUTION } from './solutions';

0 commit comments

Comments
 (0)