mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-09-01 13:13:10 +00:00
cypress: added cypress for incident manager (#14824)
* cypress: added cypress for incident manager * fixed failing cypress
This commit is contained in:
parent
9f5a70bd71
commit
569c668117
@ -96,7 +96,7 @@ const createCustomMetric = ({
|
|||||||
cy.get('[data-testid="custom-metric"]').click();
|
cy.get('[data-testid="custom-metric"]').click();
|
||||||
|
|
||||||
// validate redirection and cancel button
|
// validate redirection and cancel button
|
||||||
cy.get('[data-testid="heading"]').should('be.visible');
|
cy.get('[data-testid="heading"]').first().should('be.visible');
|
||||||
cy.get(
|
cy.get(
|
||||||
`[data-testid=${
|
`[data-testid=${
|
||||||
isColumnMetric
|
isColumnMetric
|
||||||
@ -108,6 +108,7 @@ const createCustomMetric = ({
|
|||||||
verifyResponseStatusCode('@getCustomMetric', 200);
|
verifyResponseStatusCode('@getCustomMetric', 200);
|
||||||
cy.url().should('include', 'profiler');
|
cy.url().should('include', 'profiler');
|
||||||
cy.get('[data-testid="heading"]')
|
cy.get('[data-testid="heading"]')
|
||||||
|
.first()
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('equal', isColumnMetric ? 'Column Profile' : 'Table Profile');
|
.should('equal', isColumnMetric ? 'Column Profile' : 'Table Profile');
|
||||||
|
|
||||||
@ -133,6 +134,7 @@ const createCustomMetric = ({
|
|||||||
// verify the created custom metric
|
// verify the created custom metric
|
||||||
cy.url().should('include', 'profiler');
|
cy.url().should('include', 'profiler');
|
||||||
cy.get('[data-testid="heading"]')
|
cy.get('[data-testid="heading"]')
|
||||||
|
.first()
|
||||||
.invoke('text')
|
.invoke('text')
|
||||||
.should('equal', isColumnMetric ? 'Column Profile' : 'Table Profile');
|
.should('equal', isColumnMetric ? 'Column Profile' : 'Table Profile');
|
||||||
cy.get(`[data-testid="${metric.name}-custom-metrics"]`)
|
cy.get(`[data-testid="${metric.name}-custom-metrics"]`)
|
||||||
|
@ -11,18 +11,30 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import {
|
import {
|
||||||
descriptionBox,
|
|
||||||
interceptURL,
|
interceptURL,
|
||||||
scheduleIngestion,
|
|
||||||
verifyResponseStatusCode,
|
verifyResponseStatusCode,
|
||||||
visitEntityDetailsPage,
|
visitEntityDetailsPage,
|
||||||
} from '../../common/common';
|
} from '../../common/common';
|
||||||
import { createEntityTableViaREST } from '../../common/Utils/Entity';
|
import {
|
||||||
import { DATA_ASSETS, NEW_TABLE_TEST_CASE } from '../../constants/constants';
|
createEntityTableViaREST,
|
||||||
import { SidebarItem } from '../../constants/Entity.interface';
|
deleteEntityViaREST,
|
||||||
|
} from '../../common/Utils/Entity';
|
||||||
|
import { DATA_ASSETS, uuid } from '../../constants/constants';
|
||||||
|
import { EntityType, SidebarItem } from '../../constants/Entity.interface';
|
||||||
import { DATABASE_SERVICE } from '../../constants/EntityConstant';
|
import { DATABASE_SERVICE } from '../../constants/EntityConstant';
|
||||||
const TABLE_NAME = DATABASE_SERVICE.entity.name;
|
const TABLE_NAME = DATABASE_SERVICE.entity.name;
|
||||||
|
|
||||||
|
const testSuite = {
|
||||||
|
name: `${DATABASE_SERVICE.entity.databaseSchema}.${DATABASE_SERVICE.entity.name}.testSuite`,
|
||||||
|
executableEntityReference: `${DATABASE_SERVICE.entity.databaseSchema}.${DATABASE_SERVICE.entity.name}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
const testCases = [
|
||||||
|
`cy_first_table_column_count_to_be_between_${uuid()}`,
|
||||||
|
`cy_second_table_column_count_to_be_between_${uuid()}`,
|
||||||
|
`cy_third_table_column_count_to_be_between_${uuid()}`,
|
||||||
|
];
|
||||||
|
|
||||||
const goToProfilerTab = () => {
|
const goToProfilerTab = () => {
|
||||||
interceptURL(
|
interceptURL(
|
||||||
'GET',
|
'GET',
|
||||||
@ -47,8 +59,9 @@ const acknowledgeTask = (testCase) => {
|
|||||||
.click();
|
.click();
|
||||||
cy.get(`[data-testid="${testCase}"]`)
|
cy.get(`[data-testid="${testCase}"]`)
|
||||||
.find('.last-run-box.failed')
|
.find('.last-run-box.failed')
|
||||||
|
.scrollIntoView()
|
||||||
.should('be.visible');
|
.should('be.visible');
|
||||||
cy.get('.ant-table-row-level-0').should('contain', 'New');
|
cy.get(`[data-testid="${testCase}-status"]`).should('contain', 'New');
|
||||||
cy.get(`[data-testid="${testCase}"]`).contains(testCase).click();
|
cy.get(`[data-testid="${testCase}"]`).contains(testCase).click();
|
||||||
cy.get('[data-testid="edit-resolution-icon"]').click();
|
cy.get('[data-testid="edit-resolution-icon"]').click();
|
||||||
cy.get('[data-testid="test-case-resolution-status-type"]').click();
|
cy.get('[data-testid="test-case-resolution-status-type"]').click();
|
||||||
@ -63,9 +76,72 @@ const acknowledgeTask = (testCase) => {
|
|||||||
cy.get(`[data-testid="${testCase}-status"]`).should('contain', 'Ack');
|
cy.get(`[data-testid="${testCase}-status"]`).should('contain', 'Ack');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const triggerTestCasePipeline = () => {
|
||||||
|
interceptURL('GET', `/api/v1/tables/*/systemProfile?*`, 'systemProfile');
|
||||||
|
interceptURL('GET', `/api/v1/tables/*/tableProfile?*`, 'tableProfile');
|
||||||
|
goToProfilerTab();
|
||||||
|
interceptURL(
|
||||||
|
'GET',
|
||||||
|
`api/v1/tables/name/${DATABASE_SERVICE.service.name}.*.${TABLE_NAME}?include=all`,
|
||||||
|
'addTableTestPage'
|
||||||
|
);
|
||||||
|
verifyResponseStatusCode('@systemProfile', 200);
|
||||||
|
verifyResponseStatusCode('@tableProfile', 200);
|
||||||
|
interceptURL('GET', '/api/v1/dataQuality/testCases?fields=*', 'testCase');
|
||||||
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
||||||
|
.contains('Data Quality')
|
||||||
|
.click();
|
||||||
|
verifyResponseStatusCode('@testCase', 200);
|
||||||
|
|
||||||
|
interceptURL(
|
||||||
|
'GET',
|
||||||
|
'/api/v1/services/ingestionPipelines/*/pipelineStatus?startTs=*&endTs=*',
|
||||||
|
'getPipelineStatus'
|
||||||
|
);
|
||||||
|
interceptURL(
|
||||||
|
'POST',
|
||||||
|
'/api/v1/services/ingestionPipelines/trigger/*',
|
||||||
|
'triggerPipeline'
|
||||||
|
);
|
||||||
|
cy.get('[id*="tab-pipeline"]').click();
|
||||||
|
verifyResponseStatusCode('@getPipelineStatus', 200);
|
||||||
|
cy.get('[data-testid="run"]').click();
|
||||||
|
cy.wait('@triggerPipeline');
|
||||||
|
};
|
||||||
|
|
||||||
|
const assignIncident = (testCaseName) => {
|
||||||
|
cy.sidebarClick(SidebarItem.INCIDENT_MANAGER);
|
||||||
|
cy.get(`[data-testid="test-case-${testCaseName}"]`).should('be.visible');
|
||||||
|
cy.get(`[data-testid="${testCaseName}-status"]`)
|
||||||
|
.find(`[data-testid="edit-resolution-icon"]`)
|
||||||
|
.click();
|
||||||
|
cy.get(`[data-testid="test-case-resolution-status-type"]`).click();
|
||||||
|
cy.get(`[title="Assigned"]`).click();
|
||||||
|
cy.get('#testCaseResolutionStatusDetails_assignee').should('be.visible');
|
||||||
|
interceptURL(
|
||||||
|
'GET',
|
||||||
|
'/api/v1/search/suggest?q=Aaron%20Johnson&index=user_search_index',
|
||||||
|
'searchAssignee'
|
||||||
|
);
|
||||||
|
cy.get('#testCaseResolutionStatusDetails_assignee').type('Aaron Johnson');
|
||||||
|
verifyResponseStatusCode('@searchAssignee', 200);
|
||||||
|
cy.get('[data-testid="aaron_johnson0"]').click();
|
||||||
|
interceptURL(
|
||||||
|
'POST',
|
||||||
|
'/api/v1/dataQuality/testCases/testCaseIncidentStatus',
|
||||||
|
'updateTestCaseIncidentStatus'
|
||||||
|
);
|
||||||
|
cy.get('#update-status-button').click();
|
||||||
|
verifyResponseStatusCode('@updateTestCaseIncidentStatus', 200);
|
||||||
|
cy.get(
|
||||||
|
`[data-testid="${testCaseName}-status"] [data-testid="badge-container"]`
|
||||||
|
).should('contain', 'Assigned');
|
||||||
|
};
|
||||||
|
|
||||||
describe('Incident Manager', () => {
|
describe('Incident Manager', () => {
|
||||||
before(() => {
|
before(() => {
|
||||||
cy.login();
|
cy.login();
|
||||||
|
|
||||||
cy.getAllLocalStorage().then((data) => {
|
cy.getAllLocalStorage().then((data) => {
|
||||||
const token = Object.values(data)[0].oidcIdToken;
|
const token = Object.values(data)[0].oidcIdToken;
|
||||||
|
|
||||||
@ -74,109 +150,90 @@ describe('Incident Manager', () => {
|
|||||||
...DATABASE_SERVICE,
|
...DATABASE_SERVICE,
|
||||||
tables: [DATABASE_SERVICE.entity],
|
tables: [DATABASE_SERVICE.entity],
|
||||||
});
|
});
|
||||||
|
// create testSuite
|
||||||
|
cy.request({
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/v1/dataQuality/testSuites/executable`,
|
||||||
|
headers: { Authorization: `Bearer ${token}` },
|
||||||
|
body: testSuite,
|
||||||
|
}).then((testSuiteResponse) => {
|
||||||
|
// creating test case
|
||||||
|
|
||||||
|
testCases.forEach((testCase) => {
|
||||||
|
cy.request({
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/v1/dataQuality/testCases`,
|
||||||
|
headers: { Authorization: `Bearer ${token}` },
|
||||||
|
body: {
|
||||||
|
name: testCase,
|
||||||
|
entityLink: `<#E::table::${testSuite.executableEntityReference}>`,
|
||||||
|
parameterValues: [
|
||||||
|
{ name: 'minColValue', value: 12 },
|
||||||
|
{ name: 'maxColValue', value: 24 },
|
||||||
|
],
|
||||||
|
testDefinition: 'tableColumnCountToBeBetween',
|
||||||
|
testSuite: testSuite.name,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
cy.request({
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/v1/services/ingestionPipelines`,
|
||||||
|
headers: { Authorization: `Bearer ${token}` },
|
||||||
|
body: {
|
||||||
|
airflowConfig: {},
|
||||||
|
name: `${testSuite.executableEntityReference}_test_suite`,
|
||||||
|
pipelineType: 'TestSuite',
|
||||||
|
service: {
|
||||||
|
id: testSuiteResponse.body.id,
|
||||||
|
type: 'testSuite',
|
||||||
|
},
|
||||||
|
sourceConfig: {
|
||||||
|
config: {
|
||||||
|
type: 'TestSuite',
|
||||||
|
entityFullyQualifiedName: testSuite.executableEntityReference,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}).then((response) =>
|
||||||
|
cy.request({
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/v1/services/ingestionPipelines/deploy/${response.body.id}`,
|
||||||
|
headers: { Authorization: `Bearer ${token}` },
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
triggerTestCasePipeline();
|
||||||
|
});
|
||||||
|
|
||||||
|
after(() => {
|
||||||
|
cy.login();
|
||||||
|
|
||||||
|
cy.getAllLocalStorage().then((data) => {
|
||||||
|
const token = Object.values(data)[0].oidcIdToken;
|
||||||
|
deleteEntityViaREST({
|
||||||
|
token,
|
||||||
|
endPoint: EntityType.DatabaseService,
|
||||||
|
entityName: DATABASE_SERVICE.service.name,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Basic Scenario', () => {
|
describe('Basic Scenario', () => {
|
||||||
|
const testCaseName = testCases[0];
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
cy.login();
|
cy.login();
|
||||||
interceptURL('GET', `/api/v1/tables/*/systemProfile?*`, 'systemProfile');
|
|
||||||
interceptURL('GET', `/api/v1/tables/*/tableProfile?*`, 'tableProfile');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Add table test case', () => {
|
|
||||||
const term = TABLE_NAME;
|
|
||||||
goToProfilerTab();
|
|
||||||
interceptURL(
|
|
||||||
'GET',
|
|
||||||
`api/v1/tables/name/${DATABASE_SERVICE.service.name}.*.${term}?include=all`,
|
|
||||||
'addTableTestPage'
|
|
||||||
);
|
|
||||||
verifyResponseStatusCode('@systemProfile', 200);
|
|
||||||
verifyResponseStatusCode('@tableProfile', 200);
|
|
||||||
interceptURL('GET', '/api/v1/dataQuality/testCases?fields=*', 'testCase');
|
|
||||||
cy.get('[data-testid="profiler-tab-left-panel"]')
|
|
||||||
.contains('Data Quality')
|
|
||||||
.click();
|
|
||||||
verifyResponseStatusCode('@testCase', 200);
|
|
||||||
cy.get('[data-testid="profiler-add-table-test-btn"]').click();
|
|
||||||
cy.get('[data-testid="table"]').click();
|
|
||||||
|
|
||||||
// creating new test case
|
|
||||||
cy.get('#tableTestForm_testTypeId').scrollIntoView().click();
|
|
||||||
cy.contains(NEW_TABLE_TEST_CASE.label).should('be.visible').click();
|
|
||||||
cy.get('#tableTestForm_testName').type(NEW_TABLE_TEST_CASE.name);
|
|
||||||
cy.get('#tableTestForm_params_columnName').type(
|
|
||||||
NEW_TABLE_TEST_CASE.field
|
|
||||||
);
|
|
||||||
cy.get(descriptionBox).scrollIntoView();
|
|
||||||
cy.get(descriptionBox).type(NEW_TABLE_TEST_CASE.description);
|
|
||||||
|
|
||||||
cy.get('[data-testid="submit-test"]').scrollIntoView().click();
|
|
||||||
|
|
||||||
cy.get('[data-testid="success-line"]')
|
|
||||||
.scrollIntoView()
|
|
||||||
.should('be.visible');
|
|
||||||
cy.get('[data-testid="add-ingestion-button"]').click();
|
|
||||||
scheduleIngestion(false);
|
|
||||||
|
|
||||||
cy.get('[data-testid="success-line"]')
|
|
||||||
.scrollIntoView()
|
|
||||||
.should('be.visible');
|
|
||||||
|
|
||||||
cy.get('[data-testid="view-service-button"]').click({ force: true });
|
|
||||||
|
|
||||||
verifyResponseStatusCode('@getEntityDetails', 200);
|
|
||||||
|
|
||||||
cy.get('[data-testid="profiler-tab-left-panel"]')
|
|
||||||
.contains('Data Quality')
|
|
||||||
.click();
|
|
||||||
verifyResponseStatusCode('@testCase', 200);
|
|
||||||
cy.contains(NEW_TABLE_TEST_CASE.name).should('be.visible');
|
|
||||||
|
|
||||||
interceptURL(
|
|
||||||
'GET',
|
|
||||||
'/api/v1/services/ingestionPipelines/*/pipelineStatus?startTs=*&endTs=*',
|
|
||||||
'getPipelineStatus'
|
|
||||||
);
|
|
||||||
cy.get('[id*="tab-pipeline"]').click();
|
|
||||||
verifyResponseStatusCode('@getPipelineStatus', 200);
|
|
||||||
cy.get('[data-testid="run"]').click();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Acknowledge table test case's failure", () => {
|
it("Acknowledge table test case's failure", () => {
|
||||||
acknowledgeTask(NEW_TABLE_TEST_CASE.name);
|
acknowledgeTask(testCaseName);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Assign incident to user', () => {
|
it('Assign incident to user', () => {
|
||||||
cy.sidebarClick(SidebarItem.INCIDENT_MANAGER);
|
assignIncident(testCaseName);
|
||||||
cy.get(`[data-testid="test-case-${NEW_TABLE_TEST_CASE.name}"]`).should(
|
|
||||||
'be.visible'
|
|
||||||
);
|
|
||||||
cy.get(`[data-testid="${NEW_TABLE_TEST_CASE.name}-status"]`)
|
|
||||||
.find(`[data-testid="edit-resolution-icon"]`)
|
|
||||||
.click();
|
|
||||||
cy.get(`[data-testid="test-case-resolution-status-type"]`).click();
|
|
||||||
cy.get(`[title="Assigned"]`).click();
|
|
||||||
cy.get('#testCaseResolutionStatusDetails_assignee').should('be.visible');
|
|
||||||
interceptURL(
|
|
||||||
'GET',
|
|
||||||
'/api/v1/search/suggest?q=Aaron%20Johnson&index=user_search_index',
|
|
||||||
'searchAssignee'
|
|
||||||
);
|
|
||||||
cy.get('#testCaseResolutionStatusDetails_assignee').type('Aaron Johnson');
|
|
||||||
verifyResponseStatusCode('@searchAssignee', 200);
|
|
||||||
cy.get('[data-testid="aaron_johnson0"]').click();
|
|
||||||
interceptURL(
|
|
||||||
'POST',
|
|
||||||
'/api/v1/dataQuality/testCases/testCaseIncidentStatus',
|
|
||||||
'updateTestCaseIncidentStatus'
|
|
||||||
);
|
|
||||||
cy.get('#update-status-button').click();
|
|
||||||
verifyResponseStatusCode('@updateTestCaseIncidentStatus', 200);
|
|
||||||
cy.get(
|
|
||||||
`[data-testid="${NEW_TABLE_TEST_CASE.name}-status"] [data-testid="badge-container"]`
|
|
||||||
).should('contain', 'Assigned');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Re-assign incident to user', () => {
|
it('Re-assign incident to user', () => {
|
||||||
@ -186,10 +243,8 @@ describe('Incident Manager', () => {
|
|||||||
'getTestCase'
|
'getTestCase'
|
||||||
);
|
);
|
||||||
interceptURL('GET', '/api/v1/feed?entityLink=*&type=Task', 'getTaskFeed');
|
interceptURL('GET', '/api/v1/feed?entityLink=*&type=Task', 'getTaskFeed');
|
||||||
|
|
||||||
cy.sidebarClick(SidebarItem.INCIDENT_MANAGER);
|
cy.sidebarClick(SidebarItem.INCIDENT_MANAGER);
|
||||||
|
cy.get(`[data-testid="test-case-${testCaseName}"]`).click();
|
||||||
cy.get(`[data-testid="test-case-${NEW_TABLE_TEST_CASE.name}"]`).click();
|
|
||||||
verifyResponseStatusCode('@getTestCase', 200);
|
verifyResponseStatusCode('@getTestCase', 200);
|
||||||
cy.get('[data-testid="incident"]').click();
|
cy.get('[data-testid="incident"]').click();
|
||||||
verifyResponseStatusCode('@getTaskFeed', 200);
|
verifyResponseStatusCode('@getTaskFeed', 200);
|
||||||
@ -226,7 +281,7 @@ describe('Incident Manager', () => {
|
|||||||
);
|
);
|
||||||
interceptURL('GET', '/api/v1/feed?entityLink=*&type=Task', 'getTaskFeed');
|
interceptURL('GET', '/api/v1/feed?entityLink=*&type=Task', 'getTaskFeed');
|
||||||
cy.sidebarClick(SidebarItem.INCIDENT_MANAGER);
|
cy.sidebarClick(SidebarItem.INCIDENT_MANAGER);
|
||||||
cy.get(`[data-testid="test-case-${NEW_TABLE_TEST_CASE.name}"]`).click();
|
cy.get(`[data-testid="test-case-${testCaseName}"]`).click();
|
||||||
verifyResponseStatusCode('@getTestCase', 200);
|
verifyResponseStatusCode('@getTestCase', 200);
|
||||||
cy.get('[data-testid="incident"]').click();
|
cy.get('[data-testid="incident"]').click();
|
||||||
verifyResponseStatusCode('@getTaskFeed', 200);
|
verifyResponseStatusCode('@getTaskFeed', 200);
|
||||||
@ -246,68 +301,11 @@ describe('Incident Manager', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Resolving task from the Incident List Page', () => {
|
describe('Resolving incident & re-run pipeline', () => {
|
||||||
const testName = `${NEW_TABLE_TEST_CASE.name}_new_name`;
|
const testName = testCases[1];
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
cy.login();
|
cy.login();
|
||||||
interceptURL('GET', `/api/v1/tables/*/systemProfile?*`, 'systemProfile');
|
|
||||||
interceptURL('GET', `/api/v1/tables/*/tableProfile?*`, 'tableProfile');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Add table test case', () => {
|
|
||||||
const term = TABLE_NAME;
|
|
||||||
|
|
||||||
goToProfilerTab();
|
|
||||||
interceptURL(
|
|
||||||
'GET',
|
|
||||||
`api/v1/tables/name/${DATABASE_SERVICE.service.name}.*.${term}?include=all`,
|
|
||||||
'addTableTestPage'
|
|
||||||
);
|
|
||||||
verifyResponseStatusCode('@systemProfile', 200);
|
|
||||||
verifyResponseStatusCode('@tableProfile', 200);
|
|
||||||
interceptURL('GET', '/api/v1/dataQuality/testCases?fields=*', 'testCase');
|
|
||||||
cy.get('[data-testid="profiler-tab-left-panel"]')
|
|
||||||
.contains('Data Quality')
|
|
||||||
.click();
|
|
||||||
verifyResponseStatusCode('@testCase', 200);
|
|
||||||
cy.get('[data-testid="profiler-add-table-test-btn"]').click();
|
|
||||||
cy.get('[data-testid="table"]').click();
|
|
||||||
|
|
||||||
// creating new test case
|
|
||||||
cy.get('#tableTestForm_testTypeId').scrollIntoView().click();
|
|
||||||
cy.contains(NEW_TABLE_TEST_CASE.label).should('be.visible').click();
|
|
||||||
cy.get('#tableTestForm_testName').type(testName);
|
|
||||||
cy.get('#tableTestForm_params_columnName').type(
|
|
||||||
NEW_TABLE_TEST_CASE.field
|
|
||||||
);
|
|
||||||
cy.get(descriptionBox).scrollIntoView();
|
|
||||||
cy.get(descriptionBox).type(NEW_TABLE_TEST_CASE.description);
|
|
||||||
|
|
||||||
cy.get('[data-testid="submit-test"]').scrollIntoView().click();
|
|
||||||
|
|
||||||
cy.get('[data-testid="success-line"]')
|
|
||||||
.scrollIntoView()
|
|
||||||
.should('be.visible');
|
|
||||||
|
|
||||||
cy.get('[data-testid="view-service-button"]').click({ force: true });
|
|
||||||
|
|
||||||
verifyResponseStatusCode('@getEntityDetails', 200);
|
|
||||||
|
|
||||||
cy.get('[data-testid="profiler-tab-left-panel"]')
|
|
||||||
.contains('Data Quality')
|
|
||||||
.click();
|
|
||||||
verifyResponseStatusCode('@testCase', 200);
|
|
||||||
cy.contains(testName).should('be.visible');
|
|
||||||
|
|
||||||
interceptURL(
|
|
||||||
'GET',
|
|
||||||
'/api/v1/services/ingestionPipelines/*/pipelineStatus?startTs=*&endTs=*',
|
|
||||||
'getPipelineStatus'
|
|
||||||
);
|
|
||||||
cy.get('[id*="tab-pipeline"]').click();
|
|
||||||
verifyResponseStatusCode('@getPipelineStatus', 200);
|
|
||||||
cy.get('[data-testid="run"]').click();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Acknowledge table test case's failure", () => {
|
it("Acknowledge table test case's failure", () => {
|
||||||
@ -328,8 +326,9 @@ describe('Incident Manager', () => {
|
|||||||
verifyResponseStatusCode('@testCaseList', 200);
|
verifyResponseStatusCode('@testCaseList', 200);
|
||||||
cy.get(`[data-testid="${testName}"]`)
|
cy.get(`[data-testid="${testName}"]`)
|
||||||
.find('.last-run-box.failed')
|
.find('.last-run-box.failed')
|
||||||
|
.scrollIntoView()
|
||||||
.should('be.visible');
|
.should('be.visible');
|
||||||
cy.get('.ant-table-row-level-0').should('contain', 'New');
|
cy.get('.ant-table-row-level-0').should('contain', 'Ack');
|
||||||
interceptURL(
|
interceptURL(
|
||||||
'GET',
|
'GET',
|
||||||
'/api/v1/dataQuality/testCases/testCaseIncidentStatus?latest=true&startTs=*&endTs=*&limit=*',
|
'/api/v1/dataQuality/testCases/testCaseIncidentStatus?latest=true&startTs=*&endTs=*&limit=*',
|
||||||
@ -378,6 +377,7 @@ describe('Incident Manager', () => {
|
|||||||
verifyResponseStatusCode('@testCaseList', 200);
|
verifyResponseStatusCode('@testCaseList', 200);
|
||||||
cy.get(`[data-testid="${testName}"]`)
|
cy.get(`[data-testid="${testName}"]`)
|
||||||
.find('.last-run-box.failed')
|
.find('.last-run-box.failed')
|
||||||
|
.scrollIntoView()
|
||||||
.should('be.visible');
|
.should('be.visible');
|
||||||
|
|
||||||
cy.get(`[data-testid="${testName}"]`).contains(testName).click();
|
cy.get(`[data-testid="${testName}"]`).contains(testName).click();
|
||||||
@ -391,5 +391,84 @@ describe('Incident Manager', () => {
|
|||||||
'Resolved the Task.'
|
'Resolved the Task.'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Re-run pipeline', () => {
|
||||||
|
triggerTestCasePipeline();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Verify open and closed task', () => {
|
||||||
|
acknowledgeTask(testName);
|
||||||
|
interceptURL(
|
||||||
|
'GET',
|
||||||
|
'/api/v1/dataQuality/testCases/name/*?fields=*',
|
||||||
|
'getTestCase'
|
||||||
|
);
|
||||||
|
interceptURL('GET', '/api/v1/feed?entityLink=*&type=Task', 'getTaskFeed');
|
||||||
|
cy.reload();
|
||||||
|
verifyResponseStatusCode('@getTestCase', 200);
|
||||||
|
cy.get('[data-testid="incident"]').click();
|
||||||
|
verifyResponseStatusCode('@getTaskFeed', 200);
|
||||||
|
cy.get('[data-testid="open-task"]')
|
||||||
|
.invoke('text')
|
||||||
|
.then((text) => {
|
||||||
|
expect(text.trim()).equal('1 Open');
|
||||||
|
});
|
||||||
|
cy.get('[data-testid="closed-task"]')
|
||||||
|
.invoke('text')
|
||||||
|
.then((text) => {
|
||||||
|
expect(text.trim()).equal('1 Closed');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Rerunning pipeline for an open incident', () => {
|
||||||
|
const testName = testCases[2];
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.login();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Ack incident and verify open task', () => {
|
||||||
|
acknowledgeTask(testName);
|
||||||
|
interceptURL(
|
||||||
|
'GET',
|
||||||
|
'/api/v1/dataQuality/testCases/name/*?fields=*',
|
||||||
|
'getTestCase'
|
||||||
|
);
|
||||||
|
interceptURL('GET', '/api/v1/feed?entityLink=*&type=Task', 'getTaskFeed');
|
||||||
|
cy.reload();
|
||||||
|
verifyResponseStatusCode('@getTestCase', 200);
|
||||||
|
cy.get('[data-testid="incident"]').click();
|
||||||
|
verifyResponseStatusCode('@getTaskFeed', 200);
|
||||||
|
cy.get('[data-testid="open-task"]')
|
||||||
|
.invoke('text')
|
||||||
|
.then((text) => {
|
||||||
|
expect(text.trim()).equal('1 Open');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Assign incident to user', () => {
|
||||||
|
assignIncident(testName);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Re-run pipeline', () => {
|
||||||
|
triggerTestCasePipeline();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("Verify incident's status on DQ page", () => {
|
||||||
|
goToProfilerTab();
|
||||||
|
|
||||||
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
||||||
|
.contains('Data Quality')
|
||||||
|
.click();
|
||||||
|
cy.get(`[data-testid="${testName}"]`)
|
||||||
|
.find('.last-run-box.failed')
|
||||||
|
.scrollIntoView()
|
||||||
|
.should('be.visible');
|
||||||
|
cy.get(`[data-testid="${testName}-status"]`).should(
|
||||||
|
'contain',
|
||||||
|
'Assigned'
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -247,10 +247,15 @@ const DataQualityTab: React.FC<DataQualityTabProps> = ({
|
|||||||
: ''
|
: ''
|
||||||
}`
|
}`
|
||||||
}>
|
}>
|
||||||
<AppBadge
|
<span data-testid={`${record.name}-status`}>
|
||||||
className={classNames('resolution', label.toLocaleLowerCase())}
|
<AppBadge
|
||||||
label={label}
|
className={classNames(
|
||||||
/>
|
'resolution',
|
||||||
|
label.toLocaleLowerCase()
|
||||||
|
)}
|
||||||
|
label={label}
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
) : (
|
) : (
|
||||||
'--'
|
'--'
|
||||||
|
@ -37,6 +37,7 @@ import {
|
|||||||
import { ReactComponent as IconDropdown } from '../../../assets/svg/menu.svg';
|
import { ReactComponent as IconDropdown } from '../../../assets/svg/menu.svg';
|
||||||
import { GRAPH_BACKGROUND_COLOR } from '../../../constants/constants';
|
import { GRAPH_BACKGROUND_COLOR } from '../../../constants/constants';
|
||||||
import { TOTAL_ENTITY_CHART_COLOR } from '../../../constants/DataInsight.constants';
|
import { TOTAL_ENTITY_CHART_COLOR } from '../../../constants/DataInsight.constants';
|
||||||
|
import { PAGE_HEADERS } from '../../../constants/PageHeaders.constant';
|
||||||
import { EntityType } from '../../../enums/entity.enum';
|
import { EntityType } from '../../../enums/entity.enum';
|
||||||
import { CustomMetric } from '../../../generated/entity/data/table';
|
import { CustomMetric } from '../../../generated/entity/data/table';
|
||||||
import {
|
import {
|
||||||
@ -49,6 +50,7 @@ import { showErrorToast, showSuccessToast } from '../../../utils/ToastUtils';
|
|||||||
import DeleteWidgetModal from '../../common/DeleteWidget/DeleteWidgetModal';
|
import DeleteWidgetModal from '../../common/DeleteWidget/DeleteWidgetModal';
|
||||||
import ErrorPlaceHolder from '../../common/ErrorWithPlaceholder/ErrorPlaceHolder';
|
import ErrorPlaceHolder from '../../common/ErrorWithPlaceholder/ErrorPlaceHolder';
|
||||||
import CustomMetricForm from '../../CustomMetricForm/CustomMetricForm.component';
|
import CustomMetricForm from '../../CustomMetricForm/CustomMetricForm.component';
|
||||||
|
import PageHeader from '../../PageHeader/PageHeader.component';
|
||||||
import ProfilerLatestValue from '../../ProfilerDashboard/component/ProfilerLatestValue';
|
import ProfilerLatestValue from '../../ProfilerDashboard/component/ProfilerLatestValue';
|
||||||
import { useTableProfiler } from '../TableProfilerProvider';
|
import { useTableProfiler } from '../TableProfilerProvider';
|
||||||
import './custom-metric-graphs.style.less';
|
import './custom-metric-graphs.style.less';
|
||||||
@ -169,6 +171,11 @@ const CustomMetricGraphs = ({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Row data-testid="custom-metric-graph-container" gutter={[16, 16]}>
|
<Row data-testid="custom-metric-graph-container" gutter={[16, 16]}>
|
||||||
|
{!isEmpty(customMetricsGraphData) && (
|
||||||
|
<Col span={24}>
|
||||||
|
<PageHeader data={PAGE_HEADERS.CUSTOM_METRICS} />
|
||||||
|
</Col>
|
||||||
|
)}
|
||||||
{toPairs(customMetricsGraphData).map(([key, metric], i) => {
|
{toPairs(customMetricsGraphData).map(([key, metric], i) => {
|
||||||
const color = TOTAL_ENTITY_CHART_COLOR[i] ?? getRandomHexColor();
|
const color = TOTAL_ENTITY_CHART_COLOR[i] ?? getRandomHexColor();
|
||||||
|
|
||||||
@ -196,18 +203,14 @@ const CustomMetricGraphs = ({
|
|||||||
) : null
|
) : null
|
||||||
}
|
}
|
||||||
loading={isLoading}
|
loading={isLoading}
|
||||||
title={
|
title={<Typography.Title level={5}>{key}</Typography.Title>}>
|
||||||
<Typography.Title level={5}>
|
|
||||||
{t('label.custom-metric')}
|
|
||||||
</Typography.Title>
|
|
||||||
}>
|
|
||||||
<Row gutter={[16, 16]}>
|
<Row gutter={[16, 16]}>
|
||||||
<Col span={4}>
|
<Col span={4}>
|
||||||
<ProfilerLatestValue
|
<ProfilerLatestValue
|
||||||
information={[
|
information={[
|
||||||
{
|
{
|
||||||
latestValue: last(metric)?.[key] ?? '--',
|
latestValue: last(metric)?.[key] ?? '--',
|
||||||
title: key,
|
title: '',
|
||||||
dataKey: key,
|
dataKey: key,
|
||||||
color,
|
color,
|
||||||
},
|
},
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
import { Col, Menu, MenuProps, Row, Space } from 'antd';
|
import { Col, Menu, MenuProps, Row, Space } from 'antd';
|
||||||
|
import { ItemType } from 'antd/lib/menu/hooks/useItems';
|
||||||
import Qs from 'qs';
|
import Qs from 'qs';
|
||||||
import React, { useMemo } from 'react';
|
import React, { useMemo } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
@ -54,7 +55,7 @@ const TableProfiler = (props: TableProfilerProps) => {
|
|||||||
};
|
};
|
||||||
}, [props.permissions]);
|
}, [props.permissions]);
|
||||||
|
|
||||||
const tabOptions = useMemo(
|
const tabOptions: ItemType[] = useMemo(
|
||||||
() => [
|
() => [
|
||||||
{
|
{
|
||||||
label: t('label.table-entity-text', {
|
label: t('label.table-entity-text', {
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
import { Col, Row, Space, Steps, Typography } from 'antd';
|
import { Col, Row, Space, Steps, Typography } from 'antd';
|
||||||
import { isEmpty, isUndefined, last, toLower } from 'lodash';
|
import { isEmpty, isUndefined, last, toLower } from 'lodash';
|
||||||
import React, { useMemo } from 'react';
|
import React, { ReactNode, useMemo } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import { NO_DATA_PLACEHOLDER } from '../../../constants/constants';
|
import { NO_DATA_PLACEHOLDER } from '../../../constants/constants';
|
||||||
import { TEST_CASE_STATUS } from '../../../constants/TestSuite.constant';
|
import { TEST_CASE_STATUS } from '../../../constants/TestSuite.constant';
|
||||||
@ -45,27 +45,41 @@ const TaskTabIncidentManagerHeader = ({ thread }: { thread: Thread }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return updatedData.map((status) => {
|
return updatedData.map((status) => {
|
||||||
const assigneeDetail =
|
let details: ReactNode = null;
|
||||||
TestCaseResolutionStatusTypes.Assigned ===
|
|
||||||
status.testCaseResolutionStatusType &&
|
|
||||||
status.testCaseResolutionStatusDetails?.assignee ? (
|
|
||||||
<Typography.Text className="text-grey-muted text-xss">
|
|
||||||
{`To ${getEntityName(
|
|
||||||
status.testCaseResolutionStatusDetails?.assignee
|
|
||||||
)} on `}
|
|
||||||
</Typography.Text>
|
|
||||||
) : null;
|
|
||||||
|
|
||||||
const resolvedDetail =
|
switch (status.testCaseResolutionStatusType) {
|
||||||
TestCaseResolutionStatusTypes.Resolved ===
|
case TestCaseResolutionStatusTypes.ACK:
|
||||||
status.testCaseResolutionStatusType &&
|
details = status.updatedBy ? (
|
||||||
status.testCaseResolutionStatusDetails?.resolvedBy ? (
|
<Typography.Text className="text-grey-muted text-xss">
|
||||||
<Typography.Text className="text-grey-muted text-xss">
|
{`By ${getEntityName(status.updatedBy)} on `}
|
||||||
{`By ${getEntityName(
|
</Typography.Text>
|
||||||
status.testCaseResolutionStatusDetails.resolvedBy
|
) : null;
|
||||||
)} on `}
|
|
||||||
</Typography.Text>
|
break;
|
||||||
) : null;
|
case TestCaseResolutionStatusTypes.Assigned:
|
||||||
|
details = status.testCaseResolutionStatusDetails?.assignee ? (
|
||||||
|
<Typography.Text className="text-grey-muted text-xss">
|
||||||
|
{`To ${getEntityName(
|
||||||
|
status.testCaseResolutionStatusDetails?.assignee
|
||||||
|
)} on `}
|
||||||
|
</Typography.Text>
|
||||||
|
) : null;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case TestCaseResolutionStatusTypes.Resolved:
|
||||||
|
details = status.testCaseResolutionStatusDetails?.resolvedBy ? (
|
||||||
|
<Typography.Text className="text-grey-muted text-xss">
|
||||||
|
{`By ${getEntityName(
|
||||||
|
status.testCaseResolutionStatusDetails.resolvedBy
|
||||||
|
)} on `}
|
||||||
|
</Typography.Text>
|
||||||
|
) : null;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
className: toLower(status.testCaseResolutionStatusType),
|
className: toLower(status.testCaseResolutionStatusType),
|
||||||
@ -75,8 +89,7 @@ const TaskTabIncidentManagerHeader = ({ thread }: { thread: Thread }) => {
|
|||||||
{status.testCaseResolutionStatusType}
|
{status.testCaseResolutionStatusType}
|
||||||
</Typography.Paragraph>
|
</Typography.Paragraph>
|
||||||
<Typography.Paragraph className="m-b-0">
|
<Typography.Paragraph className="m-b-0">
|
||||||
{assigneeDetail}
|
{details}
|
||||||
{resolvedDetail}
|
|
||||||
{status.updatedAt && (
|
{status.updatedAt && (
|
||||||
<Typography.Text className="text-grey-muted text-xss">
|
<Typography.Text className="text-grey-muted text-xss">
|
||||||
{formatDateTime(status.updatedAt)}
|
{formatDateTime(status.updatedAt)}
|
||||||
|
@ -123,7 +123,8 @@ const DeleteWidgetModal = ({
|
|||||||
|
|
||||||
const isDeleteTextPresent = useMemo(() => {
|
const isDeleteTextPresent = useMemo(() => {
|
||||||
return (
|
return (
|
||||||
deleteConfirmationText.toLowerCase() === DELETE_CONFIRMATION_TEXT.toLowerCase() &&
|
deleteConfirmationText.toLowerCase() ===
|
||||||
|
DELETE_CONFIRMATION_TEXT.toLowerCase() &&
|
||||||
(deletionType === DeleteType.SOFT_DELETE ||
|
(deletionType === DeleteType.SOFT_DELETE ||
|
||||||
deletionType === DeleteType.HARD_DELETE)
|
deletionType === DeleteType.HARD_DELETE)
|
||||||
);
|
);
|
||||||
|
@ -174,4 +174,9 @@ export const PAGE_HEADERS = {
|
|||||||
header: i18n.t('label.incident-manager'),
|
header: i18n.t('label.incident-manager'),
|
||||||
subHeader: i18n.t('message.page-sub-header-for-data-quality'),
|
subHeader: i18n.t('message.page-sub-header-for-data-quality'),
|
||||||
},
|
},
|
||||||
|
CUSTOM_METRICS: {
|
||||||
|
header: i18n.t('label.custom-metric'),
|
||||||
|
// Todo: need to update message once @harshach provides the message
|
||||||
|
subHeader: '',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user