2022-09-19 18:43:39 +05:30
|
|
|
/*
|
2022-12-27 12:37:58 +05:30
|
|
|
* Copyright 2022 Collate.
|
2022-09-19 18:43:39 +05:30
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
// eslint-disable-next-line spaced-comment
|
|
|
|
/// <reference types="cypress" />
|
2022-09-19 18:43:39 +05:30
|
|
|
|
2022-10-29 09:05:20 +05:30
|
|
|
import {
|
2023-01-15 18:24:10 +05:30
|
|
|
deleteCreatedService,
|
|
|
|
descriptionBox,
|
|
|
|
goToAddNewServicePage,
|
|
|
|
handleIngestionRetry,
|
|
|
|
interceptURL,
|
|
|
|
mySqlConnectionInput,
|
|
|
|
scheduleIngestion,
|
|
|
|
testServiceCreationAndIngestion,
|
|
|
|
toastNotification,
|
|
|
|
uuid,
|
|
|
|
verifyResponseStatusCode,
|
|
|
|
visitEntityDetailsPage,
|
2022-10-29 09:05:20 +05:30
|
|
|
} from '../../common/common';
|
|
|
|
import {
|
2023-01-15 18:24:10 +05:30
|
|
|
API_SERVICE,
|
|
|
|
DATA_QUALITY_SAMPLE_DATA_TABLE,
|
|
|
|
DELETE_TERM,
|
|
|
|
MYDATA_SUMMARY_OPTIONS,
|
|
|
|
NEW_COLUMN_TEST_CASE,
|
2023-02-03 16:30:50 +05:30
|
|
|
NEW_COLUMN_TEST_CASE_WITH_NULL_TYPE,
|
2023-01-15 18:24:10 +05:30
|
|
|
NEW_TABLE_TEST_CASE,
|
|
|
|
NEW_TEST_SUITE,
|
|
|
|
SERVICE_TYPE,
|
|
|
|
TEAM_ENTITY,
|
2022-10-29 09:05:20 +05:30
|
|
|
} from '../../constants/constants';
|
2022-09-19 18:43:39 +05:30
|
|
|
|
|
|
|
const serviceType = 'Mysql';
|
|
|
|
const serviceName = `${serviceType}-ct-test-${uuid()}`;
|
|
|
|
|
|
|
|
const goToProfilerTab = () => {
|
2022-12-23 15:24:14 +05:30
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
`api/v1/tables/name/${serviceName}.*.${TEAM_ENTITY}?fields=*&include=all`,
|
|
|
|
'waitForPageLoad'
|
|
|
|
);
|
2023-11-02 10:39:10 +05:30
|
|
|
visitEntityDetailsPage({
|
|
|
|
term: TEAM_ENTITY,
|
2022-09-29 15:21:33 +05:30
|
|
|
serviceName,
|
2023-11-02 10:39:10 +05:30
|
|
|
entity: MYDATA_SUMMARY_OPTIONS.tables,
|
|
|
|
});
|
2022-12-23 15:24:14 +05:30
|
|
|
verifyResponseStatusCode('@waitForPageLoad', 200);
|
2022-09-19 18:43:39 +05:30
|
|
|
|
2023-05-29 12:06:19 +05:30
|
|
|
cy.get('[data-testid="profiler"]').should('be.visible').click();
|
2022-09-19 18:43:39 +05:30
|
|
|
};
|
|
|
|
|
2023-11-07 22:42:11 +05:30
|
|
|
describe('Data Quality and Profiler should work properly', () => {
|
2022-11-28 12:40:19 +05:30
|
|
|
beforeEach(() => {
|
|
|
|
cy.login();
|
2023-08-03 09:57:55 +05:30
|
|
|
interceptURL('GET', `/api/v1/tables/*/systemProfile?*`, 'systemProfile');
|
|
|
|
interceptURL('GET', `/api/v1/tables/*/tableProfile?*`, 'tableProfile');
|
2022-12-13 23:42:29 +05:30
|
|
|
});
|
2023-01-15 18:24:10 +05:30
|
|
|
|
2022-09-19 18:43:39 +05:30
|
|
|
it('Add and ingest mysql data', () => {
|
|
|
|
goToAddNewServicePage(SERVICE_TYPE.Database);
|
|
|
|
|
|
|
|
const addIngestionInput = () => {
|
2023-08-20 12:01:06 +05:30
|
|
|
cy.get('#root\\/schemaFilterPattern\\/includes')
|
2023-04-17 19:23:23 +05:30
|
|
|
.scrollIntoView()
|
2023-06-02 00:55:59 +05:30
|
|
|
.type(`${Cypress.env('mysqlDatabaseSchema')}{enter}`);
|
2022-09-19 18:43:39 +05:30
|
|
|
};
|
|
|
|
|
2023-05-02 08:28:04 +05:30
|
|
|
testServiceCreationAndIngestion({
|
2022-09-19 18:43:39 +05:30
|
|
|
serviceType,
|
2023-05-02 08:28:04 +05:30
|
|
|
connectionInput: mySqlConnectionInput,
|
2022-09-19 18:43:39 +05:30
|
|
|
addIngestionInput,
|
2023-05-02 08:28:04 +05:30
|
|
|
serviceName,
|
|
|
|
serviceCategory: SERVICE_TYPE.Database,
|
|
|
|
});
|
2022-09-19 18:43:39 +05:30
|
|
|
});
|
2022-12-13 23:42:29 +05:30
|
|
|
|
2022-11-17 11:03:59 +05:30
|
|
|
it('Add Profiler ingestion', () => {
|
2022-12-13 23:42:29 +05:30
|
|
|
interceptURL(
|
|
|
|
'POST',
|
|
|
|
'/api/v1/services/ingestionPipelines/deploy/*',
|
|
|
|
'deployIngestion'
|
|
|
|
);
|
2022-12-02 15:43:12 +05:30
|
|
|
|
2022-09-19 18:43:39 +05:30
|
|
|
goToProfilerTab();
|
|
|
|
|
|
|
|
cy.get('[data-testid="no-profiler-placeholder"]').should('be.visible');
|
|
|
|
|
|
|
|
cy.clickOnLogo();
|
|
|
|
|
2023-08-29 13:01:06 +05:30
|
|
|
cy.get('[data-testid="app-bar-item-settings"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
2023-03-21 19:33:44 +05:30
|
|
|
cy.get('[data-menu-id*="databases"]').should('be.visible').click();
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.intercept('/api/v1/services/ingestionPipelines?*').as('ingestionData');
|
2023-02-07 16:30:42 +01:00
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
'/api/v1/system/config/pipeline-service-client',
|
|
|
|
'airflow'
|
|
|
|
);
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.get(`[data-testid="service-name-${serviceName}"]`)
|
|
|
|
.should('exist')
|
|
|
|
.click();
|
|
|
|
cy.get('[data-testid="tabs"]').should('exist');
|
|
|
|
cy.wait('@ingestionData');
|
2023-01-16 12:21:24 +05:30
|
|
|
verifyResponseStatusCode('@airflow', 200);
|
2023-05-30 12:56:13 +05:30
|
|
|
cy.get('[data-testid="ingestions"]')
|
2022-09-19 18:43:39 +05:30
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
cy.get('[data-testid="ingestion-details-container"]').should('exist');
|
|
|
|
cy.get('[data-testid="add-new-ingestion-button"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
2023-04-12 18:25:47 +05:30
|
|
|
cy.get('[data-menu-id*="profiler"')
|
2022-09-19 18:43:39 +05:30
|
|
|
.scrollIntoView()
|
|
|
|
.contains('Profiler Ingestion')
|
|
|
|
.click();
|
2023-08-20 12:01:06 +05:30
|
|
|
cy.get('#root\\/profileSample')
|
2023-01-15 18:24:10 +05:30
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.and('not.be.disabled')
|
|
|
|
.type(10);
|
2023-08-20 12:01:06 +05:30
|
|
|
cy.get('[data-testid="submit-btn"]')
|
2022-09-19 18:43:39 +05:30
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
|
2023-08-23 11:22:54 +02:00
|
|
|
scheduleIngestion(false);
|
2022-09-19 18:43:39 +05:30
|
|
|
|
2022-12-13 23:42:29 +05:30
|
|
|
cy.wait('@deployIngestion').then(() => {
|
|
|
|
cy.get('[data-testid="view-service-button"]')
|
2022-12-02 15:43:12 +05:30
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
2022-12-13 23:42:29 +05:30
|
|
|
.click();
|
2022-09-19 18:43:39 +05:30
|
|
|
|
2022-12-13 23:42:29 +05:30
|
|
|
handleIngestionRetry('database', true, 0, 'profiler');
|
|
|
|
});
|
2022-09-29 15:21:33 +05:30
|
|
|
});
|
2022-12-13 23:42:29 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
it('Verifying profiler ingestion', () => {
|
2022-09-19 18:43:39 +05:30
|
|
|
goToProfilerTab();
|
|
|
|
cy.get('[data-testid="no-profiler-placeholder"]').should('not.exist');
|
2022-10-08 00:07:24 +05:30
|
|
|
});
|
2022-09-19 18:43:39 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
it('Add table test case', () => {
|
2022-12-23 15:24:14 +05:30
|
|
|
const term = TEAM_ENTITY;
|
2022-09-19 18:43:39 +05:30
|
|
|
goToProfilerTab();
|
2023-01-15 18:24:10 +05:30
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
`api/v1/tables/name/${serviceName}.*.${term}?include=all`,
|
|
|
|
'addTableTestPage'
|
|
|
|
);
|
2023-08-03 09:57:55 +05:30
|
|
|
verifyResponseStatusCode('@systemProfile', 200);
|
|
|
|
verifyResponseStatusCode('@tableProfile', 200);
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="profiler-add-table-test-btn"]').click();
|
|
|
|
cy.get('[data-testid="table"]').click();
|
2022-09-19 18:43:39 +05:30
|
|
|
|
|
|
|
// creating new test case
|
|
|
|
cy.get('#tableTestForm_testTypeId').scrollIntoView().click();
|
2023-04-24 18:42:40 +02:00
|
|
|
cy.contains(NEW_TABLE_TEST_CASE.label).should('be.visible').click();
|
2023-07-17 16:57:40 +05:30
|
|
|
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);
|
2022-09-19 18:43:39 +05:30
|
|
|
|
|
|
|
cy.get('[data-testid="submit-test"]')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
|
2023-02-03 20:48:41 +05:30
|
|
|
cy.get('[data-testid="success-line"]')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible');
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.get('[data-testid="add-ingestion-button"]').should('be.visible').click();
|
2023-08-23 11:22:54 +02:00
|
|
|
scheduleIngestion(false);
|
2022-09-19 18:43:39 +05:30
|
|
|
|
2023-02-03 20:48:41 +05:30
|
|
|
cy.get('[data-testid="success-line"]')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible');
|
2022-09-19 18:43:39 +05:30
|
|
|
|
2023-04-14 09:14:49 +02:00
|
|
|
interceptURL('GET', '/api/v1/dataQuality/testCases?fields=*', 'testCase');
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.get('[data-testid="view-service-button"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.click({ force: true });
|
|
|
|
|
2022-10-29 09:05:20 +05:30
|
|
|
verifyResponseStatusCode('@getEntityDetails', 200);
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
|
|
|
.contains('Data Quality')
|
|
|
|
.click();
|
2023-07-25 00:06:07 +05:30
|
|
|
verifyResponseStatusCode('@testCase', 200);
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.contains(NEW_TABLE_TEST_CASE.name).should('be.visible');
|
2022-09-19 18:43:39 +05:30
|
|
|
});
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
it('Edit table test case', () => {
|
2022-09-19 18:43:39 +05:30
|
|
|
goToProfilerTab();
|
|
|
|
|
2022-12-14 20:04:48 +05:30
|
|
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
2022-09-19 18:43:39 +05:30
|
|
|
.contains('Data Quality')
|
|
|
|
.click();
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get(`[data-testid="${NEW_TABLE_TEST_CASE.name}"]`).should('be.visible');
|
|
|
|
cy.get(`[data-testid="edit-${NEW_TABLE_TEST_CASE.name}"]`).click();
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.get('#tableTestForm_params_columnName')
|
|
|
|
.scrollIntoView()
|
|
|
|
.clear()
|
|
|
|
.type('test');
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('#tableTestForm_params_columnName').type('test');
|
2023-04-14 09:14:49 +02:00
|
|
|
interceptURL('PATCH', '/api/v1/dataQuality/testCases/*', 'updateTest');
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.get('.ant-modal-footer').contains('Submit').click();
|
|
|
|
verifyResponseStatusCode('@updateTest', 200);
|
|
|
|
cy.get('.Toastify__toast-body')
|
2023-02-16 17:28:00 +05:30
|
|
|
.contains('Test case updated successfully.')
|
2023-07-17 16:57:40 +05:30
|
|
|
.should('be.visible');
|
|
|
|
|
|
|
|
cy.get(`[data-testid="${NEW_TABLE_TEST_CASE.name}"]`)
|
2022-09-19 18:43:39 +05:30
|
|
|
.should('be.visible')
|
2023-07-17 16:57:40 +05:30
|
|
|
.click();
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.contains('columnName: test').scrollIntoView().should('exist');
|
|
|
|
});
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
it('Delete table test case', () => {
|
|
|
|
const testName = NEW_TABLE_TEST_CASE.name;
|
2022-09-19 18:43:39 +05:30
|
|
|
|
|
|
|
goToProfilerTab();
|
|
|
|
|
2022-12-14 20:04:48 +05:30
|
|
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
2022-09-19 18:43:39 +05:30
|
|
|
.contains('Data Quality')
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
|
|
|
|
cy.get(`[data-testid="${testName}"]`).should('be.visible');
|
|
|
|
cy.get(`[data-testid="delete-${testName}"]`).should('be.visible').click();
|
|
|
|
cy.get('[data-testid="hard-delete-option"]').should('be.visible').click();
|
|
|
|
cy.get('[data-testid="confirmation-text-input"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.type(DELETE_TERM);
|
|
|
|
interceptURL(
|
|
|
|
'DELETE',
|
2023-04-14 09:14:49 +02:00
|
|
|
'/api/v1/dataQuality/testCases/*?hardDelete=true&recursive=false',
|
2022-09-19 18:43:39 +05:30
|
|
|
'deleteTest'
|
|
|
|
);
|
2023-04-14 09:14:49 +02:00
|
|
|
interceptURL('GET', '/api/v1/dataQuality/testCases?*', 'getTestCase');
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.get('[data-testid="confirm-button"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.should('not.be.disabled')
|
|
|
|
.click();
|
|
|
|
verifyResponseStatusCode('@deleteTest', 200);
|
|
|
|
verifyResponseStatusCode('@getTestCase', 200);
|
|
|
|
});
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
it('Add Column test case with min max params', () => {
|
2022-09-19 18:43:39 +05:30
|
|
|
goToProfilerTab();
|
2023-07-17 16:57:40 +05:30
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
`api/v1/tables/name/${serviceName}.*.${TEAM_ENTITY}?include=all`,
|
|
|
|
'addTableTestPage'
|
|
|
|
);
|
2023-08-03 09:57:55 +05:30
|
|
|
verifyResponseStatusCode('@systemProfile', 200);
|
|
|
|
verifyResponseStatusCode('@tableProfile', 200);
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="profiler-add-table-test-btn"]').click();
|
|
|
|
cy.get('[data-testid="column"]').click();
|
2022-09-19 18:43:39 +05:30
|
|
|
|
|
|
|
// creating new test case
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('#tableTestForm_column').click();
|
|
|
|
cy.get(`[title="${NEW_COLUMN_TEST_CASE.column}"]`).scrollIntoView().click();
|
|
|
|
cy.get('#tableTestForm_testName').type(NEW_COLUMN_TEST_CASE.name);
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.get('#tableTestForm_testTypeId').scrollIntoView().click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get(`[title="${NEW_COLUMN_TEST_CASE.label}"]`).scrollIntoView().click();
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.get('#tableTestForm_params_minLength')
|
|
|
|
.scrollIntoView()
|
|
|
|
.type(NEW_COLUMN_TEST_CASE.min);
|
|
|
|
cy.get('#tableTestForm_params_maxLength')
|
|
|
|
.scrollIntoView()
|
|
|
|
.type(NEW_COLUMN_TEST_CASE.max);
|
|
|
|
cy.get(descriptionBox)
|
|
|
|
.scrollIntoView()
|
|
|
|
.type(NEW_COLUMN_TEST_CASE.description);
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="submit-test"]').scrollIntoView().click();
|
2022-09-19 18:43:39 +05:30
|
|
|
|
|
|
|
cy.get('[data-testid="success-line"]')
|
2023-02-03 20:48:41 +05:30
|
|
|
.scrollIntoView()
|
2022-09-19 18:43:39 +05:30
|
|
|
.contains(
|
|
|
|
'has been created successfully. This will be picked up in the next run.'
|
|
|
|
)
|
|
|
|
.should('be.visible');
|
|
|
|
cy.get('[data-testid="view-service-button"]').scrollIntoView().click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
|
|
|
.contains('Data Quality')
|
|
|
|
.click();
|
|
|
|
cy.contains(NEW_COLUMN_TEST_CASE.name).should('be.visible');
|
|
|
|
});
|
2023-02-03 16:30:50 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
it('Add column test case for columnValuesToBeNotNull', () => {
|
2023-02-03 16:30:50 +05:30
|
|
|
// Creating new test case and selecting Null team type
|
|
|
|
|
|
|
|
goToProfilerTab();
|
2023-07-17 16:57:40 +05:30
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
`api/v1/tables/name/${serviceName}.*.${TEAM_ENTITY}?include=all`,
|
|
|
|
'addTableTestPage'
|
|
|
|
);
|
2023-08-03 09:57:55 +05:30
|
|
|
verifyResponseStatusCode('@systemProfile', 200);
|
|
|
|
verifyResponseStatusCode('@tableProfile', 200);
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="profiler-add-table-test-btn"]').click();
|
|
|
|
cy.get('[data-testid="column"]').click();
|
2023-02-03 16:30:50 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('#tableTestForm_column').click();
|
|
|
|
cy.get(`[title="${NEW_COLUMN_TEST_CASE_WITH_NULL_TYPE.column}"]`)
|
2023-02-03 16:30:50 +05:30
|
|
|
.scrollIntoView()
|
|
|
|
.click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('#tableTestForm_testName').type(
|
|
|
|
NEW_COLUMN_TEST_CASE_WITH_NULL_TYPE.name
|
|
|
|
);
|
|
|
|
cy.get('#tableTestForm_testTypeId').type(
|
|
|
|
NEW_COLUMN_TEST_CASE_WITH_NULL_TYPE.type
|
|
|
|
);
|
|
|
|
cy.get(`[title="${NEW_COLUMN_TEST_CASE_WITH_NULL_TYPE.label}"]`).click();
|
2023-02-03 16:30:50 +05:30
|
|
|
cy.get(descriptionBox)
|
|
|
|
.scrollIntoView()
|
|
|
|
.type(NEW_COLUMN_TEST_CASE_WITH_NULL_TYPE.description);
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="submit-test"]').scrollIntoView().click();
|
2023-02-03 16:30:50 +05:30
|
|
|
|
|
|
|
cy.get('[data-testid="success-line"]')
|
|
|
|
.contains(
|
|
|
|
'has been created successfully. This will be picked up in the next run.'
|
|
|
|
)
|
|
|
|
.should('be.visible');
|
|
|
|
cy.get('[data-testid="view-service-button"]').scrollIntoView().click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
|
|
|
.contains('Data Quality')
|
|
|
|
.click();
|
|
|
|
cy.contains(NEW_COLUMN_TEST_CASE_WITH_NULL_TYPE.name).should('be.visible');
|
2022-09-19 18:43:39 +05:30
|
|
|
});
|
|
|
|
|
|
|
|
it('Edit column test case should work properly', () => {
|
2023-04-14 09:14:49 +02:00
|
|
|
interceptURL('GET', '/api/v1/dataQuality/testCases?*', 'testCase');
|
2022-09-19 18:43:39 +05:30
|
|
|
goToProfilerTab();
|
2022-12-14 20:04:48 +05:30
|
|
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
2023-01-15 18:24:10 +05:30
|
|
|
.contains('Column Profile')
|
|
|
|
.click();
|
2023-07-25 00:06:07 +05:30
|
|
|
verifyResponseStatusCode('@testCase', 200);
|
2023-01-27 11:10:07 +05:30
|
|
|
cy.get('[data-testid="id-test-count"]')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get(`[data-testid="${NEW_COLUMN_TEST_CASE.name}"]`).should('be.visible');
|
|
|
|
cy.get(`[data-testid="edit-${NEW_COLUMN_TEST_CASE.name}"]`)
|
2023-01-27 11:10:07 +05:30
|
|
|
.scrollIntoView()
|
2022-09-19 18:43:39 +05:30
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
cy.get('#tableTestForm_params_minLength')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.clear()
|
|
|
|
.type(4);
|
2023-04-14 09:14:49 +02:00
|
|
|
interceptURL('PATCH', '/api/v1/dataQuality/testCases/*', 'updateTest');
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.get('.ant-modal-footer').contains('Submit').click();
|
|
|
|
verifyResponseStatusCode('@updateTest', 200);
|
|
|
|
cy.get('.Toastify__toast-body')
|
2023-02-16 17:28:00 +05:30
|
|
|
.contains('Test case updated successfully.')
|
2023-07-17 16:57:40 +05:30
|
|
|
.should('be.visible');
|
|
|
|
|
|
|
|
cy.get(`[data-testid="${NEW_COLUMN_TEST_CASE.name}"]`)
|
2022-09-19 18:43:39 +05:30
|
|
|
.should('be.visible')
|
2023-07-17 16:57:40 +05:30
|
|
|
.click();
|
2022-09-19 18:43:39 +05:30
|
|
|
cy.contains('minLength: 4').scrollIntoView().should('exist');
|
2023-02-03 16:30:50 +05:30
|
|
|
|
|
|
|
// Editing Non Team Type Test Case
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get(
|
|
|
|
`[data-testid="${NEW_COLUMN_TEST_CASE_WITH_NULL_TYPE.name}"]`
|
|
|
|
).should('be.visible');
|
|
|
|
cy.get(`[data-testid="edit-${NEW_COLUMN_TEST_CASE_WITH_NULL_TYPE.name}"]`)
|
2023-02-03 16:30:50 +05:30
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
cy.get('.ant-modal-footer').contains('Cancel').click();
|
2022-09-19 18:43:39 +05:30
|
|
|
});
|
|
|
|
|
2023-05-24 18:14:21 +05:30
|
|
|
it('Delete Column Test Case should work properly', () => {
|
2023-04-14 09:14:49 +02:00
|
|
|
interceptURL('GET', '/api/v1/dataQuality/testCases?*', 'testCase');
|
2022-09-19 18:43:39 +05:30
|
|
|
goToProfilerTab();
|
2022-12-14 20:04:48 +05:30
|
|
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
2023-01-15 18:24:10 +05:30
|
|
|
.contains('Column Profile')
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
2023-07-25 00:06:07 +05:30
|
|
|
verifyResponseStatusCode('@testCase', 200);
|
2023-01-27 11:10:07 +05:30
|
|
|
cy.get('[data-testid="id-test-count"]')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
2022-09-19 18:43:39 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
[NEW_COLUMN_TEST_CASE.name, NEW_COLUMN_TEST_CASE_WITH_NULL_TYPE.name].map(
|
|
|
|
(test) => {
|
|
|
|
cy.get(`[data-testid="${test}"]`).scrollIntoView().should('be.visible');
|
|
|
|
cy.get(`[data-testid="delete-${test}"]`)
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
cy.get('[data-testid="hard-delete-option"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
cy.get('[data-testid="confirmation-text-input"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.type(DELETE_TERM);
|
|
|
|
interceptURL(
|
|
|
|
'DELETE',
|
|
|
|
'/api/v1/dataQuality/testCases/*?hardDelete=true&recursive=false',
|
|
|
|
'deleteTest'
|
|
|
|
);
|
|
|
|
interceptURL('GET', '/api/v1/dataQuality/testCases?*', 'getTestCase');
|
|
|
|
cy.get('[data-testid="confirm-button"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.should('not.be.disabled')
|
|
|
|
.click();
|
|
|
|
verifyResponseStatusCode('@deleteTest', 200);
|
|
|
|
verifyResponseStatusCode('@getTestCase', 200);
|
|
|
|
toastNotification('Test Case deleted successfully!');
|
|
|
|
}
|
|
|
|
);
|
2022-09-19 18:43:39 +05:30
|
|
|
});
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
it('Create logical test suite', () => {
|
2023-08-03 09:57:55 +05:30
|
|
|
const testCaseName = 'column_value_max_to_be_between';
|
2023-07-17 16:57:40 +05:30
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
'/api/v1/dataQuality/testSuites?fields=*&testSuiteType=logical',
|
|
|
|
'testSuite'
|
|
|
|
);
|
2023-08-03 09:57:55 +05:30
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
'/api/v1/search/query?q=*&index=test_case_search_index*',
|
|
|
|
'getTestCase'
|
|
|
|
);
|
2023-08-29 13:01:06 +05:30
|
|
|
cy.get('[data-testid="app-bar-item-data-quality"]').click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="by-test-suites"]').click();
|
|
|
|
verifyResponseStatusCode('@testSuite', 200);
|
|
|
|
cy.get('[data-testid="add-test-suite-btn"]').click();
|
2023-03-10 14:30:53 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
// creating test suite
|
|
|
|
cy.get('[data-testid="test-suite-name"]').type(NEW_TEST_SUITE.name);
|
|
|
|
cy.get(descriptionBox).scrollIntoView().type(NEW_TEST_SUITE.description);
|
2023-03-10 14:30:53 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="submit-button"]').click();
|
2023-08-03 09:57:55 +05:30
|
|
|
cy.get('[data-testid="searchbar"]').type(testCaseName);
|
|
|
|
verifyResponseStatusCode('@getTestCase', 200);
|
|
|
|
cy.get(`[data-testid="${testCaseName}"]`).scrollIntoView().as('testCase');
|
|
|
|
cy.get('@testCase').click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="submit"]').scrollIntoView().click();
|
2023-03-10 14:30:53 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="success-line"]').should(
|
|
|
|
'contain',
|
|
|
|
'has been created successfully'
|
2022-09-19 18:43:39 +05:30
|
|
|
);
|
2023-03-10 14:30:53 +05:30
|
|
|
});
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
it('Add test case to logical test suite', () => {
|
2023-08-03 09:57:55 +05:30
|
|
|
const testCaseName = 'column_values_to_be_between';
|
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
'/api/v1/search/query?q=*&index=test_case_search_index*',
|
|
|
|
'searchTestCase'
|
|
|
|
);
|
2023-07-17 16:57:40 +05:30
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
'/api/v1/dataQuality/testSuites?fields=*&testSuiteType=logical',
|
|
|
|
'testSuite'
|
|
|
|
);
|
|
|
|
interceptURL('GET', '/api/v1/dataQuality/testCases?fields=*', 'testCase');
|
|
|
|
interceptURL(
|
|
|
|
'PUT',
|
|
|
|
'/api/v1/dataQuality/testCases/logicalTestCases',
|
|
|
|
'putTestCase'
|
|
|
|
);
|
2023-08-29 13:01:06 +05:30
|
|
|
cy.get('[data-testid="app-bar-item-data-quality"]').click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="by-test-suites"]').click();
|
|
|
|
verifyResponseStatusCode('@testSuite', 200);
|
|
|
|
cy.get('[data-testid="test-suite-container"]')
|
|
|
|
.contains(NEW_TEST_SUITE.name)
|
2023-03-10 14:30:53 +05:30
|
|
|
.click();
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="add-test-case-btn"]').click();
|
|
|
|
verifyResponseStatusCode('@testCase', 200);
|
2023-08-03 09:57:55 +05:30
|
|
|
|
|
|
|
cy.get('[data-testid="searchbar"]').type(testCaseName);
|
|
|
|
verifyResponseStatusCode('@searchTestCase', 200);
|
|
|
|
cy.get(`[data-testid="${testCaseName}"]`)
|
|
|
|
.scrollIntoView()
|
|
|
|
.as('newTestCase');
|
|
|
|
cy.get('@newTestCase').click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="submit"]').scrollIntoView().click();
|
|
|
|
verifyResponseStatusCode('@putTestCase', 200);
|
|
|
|
});
|
2023-03-10 14:30:53 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
it('Remove test case from logical test suite', () => {
|
2023-04-14 09:14:49 +02:00
|
|
|
interceptURL(
|
2023-07-17 16:57:40 +05:30
|
|
|
'GET',
|
|
|
|
'/api/v1/dataQuality/testSuites?fields=*&testSuiteType=logical',
|
|
|
|
'testSuite'
|
2023-04-14 09:14:49 +02:00
|
|
|
);
|
2023-07-17 16:57:40 +05:30
|
|
|
interceptURL('GET', '/api/v1/dataQuality/testCases?fields=*', 'testCase');
|
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
'/api/v1/permissions/testSuite/name/mysql_matrix',
|
|
|
|
'testSuitePermission'
|
|
|
|
);
|
|
|
|
interceptURL(
|
|
|
|
'DELETE',
|
|
|
|
'/api/v1/dataQuality/testCases/logicalTestCases/*/*',
|
|
|
|
'removeTestCase'
|
|
|
|
);
|
2023-08-29 13:01:06 +05:30
|
|
|
cy.get('[data-testid="app-bar-item-data-quality"]').click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="by-test-suites"]').click();
|
|
|
|
verifyResponseStatusCode('@testSuite', 200);
|
|
|
|
cy.get('[data-testid="test-suite-container"]')
|
|
|
|
.contains(NEW_TEST_SUITE.name)
|
|
|
|
.click();
|
|
|
|
verifyResponseStatusCode('@testSuitePermission', 200);
|
|
|
|
verifyResponseStatusCode('@testCase', 200);
|
2023-03-10 14:30:53 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="remove-column_values_to_be_between"]').click();
|
|
|
|
cy.get('[data-testid="save-button"]').click();
|
|
|
|
verifyResponseStatusCode('@removeTestCase', 200);
|
2023-03-10 14:30:53 +05:30
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="remove-column_value_max_to_be_between"]').click();
|
|
|
|
cy.get('[data-testid="save-button"]').click();
|
|
|
|
verifyResponseStatusCode('@removeTestCase', 200);
|
2023-03-10 14:30:53 +05:30
|
|
|
});
|
|
|
|
|
2023-07-17 16:57:40 +05:30
|
|
|
it('Delete test suite', () => {
|
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
'/api/v1/dataQuality/testSuites?fields=*&testSuiteType=logical',
|
|
|
|
'testSuite'
|
|
|
|
);
|
2023-08-29 13:01:06 +05:30
|
|
|
cy.get('[data-testid="app-bar-item-data-quality"]').click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="by-test-suites"]').click();
|
|
|
|
verifyResponseStatusCode('@testSuite', 200);
|
|
|
|
cy.get('[data-testid="test-suite-container"]')
|
|
|
|
.contains(NEW_TEST_SUITE.name)
|
2023-03-10 14:30:53 +05:30
|
|
|
.click();
|
|
|
|
|
|
|
|
cy.get('[data-testid="manage-button"]').should('be.visible').click();
|
|
|
|
|
|
|
|
cy.get('[data-testid="delete-button"]').should('be.visible').click();
|
|
|
|
|
|
|
|
// Click on Permanent/Hard delete option
|
|
|
|
cy.get('[data-testid="hard-delete-option"]')
|
|
|
|
.should('contain', NEW_TEST_SUITE.name)
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
|
|
|
|
cy.get('[data-testid="confirm-button"]')
|
|
|
|
.should('exist')
|
|
|
|
.should('be.disabled');
|
|
|
|
|
|
|
|
cy.get('[data-testid="confirmation-text-input"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.type(DELETE_TERM);
|
|
|
|
interceptURL(
|
|
|
|
'DELETE',
|
2023-04-14 09:14:49 +02:00
|
|
|
'/api/v1/dataQuality/testSuites/*?hardDelete=true&recursive=true',
|
2023-03-10 14:30:53 +05:30
|
|
|
'deleteTestSuite'
|
|
|
|
);
|
|
|
|
cy.get('[data-testid="confirm-button"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.should('not.be.disabled')
|
|
|
|
.click();
|
|
|
|
verifyResponseStatusCode('@deleteTestSuite', 200);
|
|
|
|
|
|
|
|
toastNotification('Test Suite deleted successfully!');
|
2022-09-19 18:43:39 +05:30
|
|
|
});
|
2022-09-21 22:25:33 +05:30
|
|
|
|
|
|
|
it('delete created service', () => {
|
2022-12-13 23:42:29 +05:30
|
|
|
deleteCreatedService(
|
|
|
|
SERVICE_TYPE.Database,
|
|
|
|
serviceName,
|
|
|
|
API_SERVICE.databaseServices
|
|
|
|
);
|
2022-09-21 22:25:33 +05:30
|
|
|
});
|
2022-10-13 15:27:06 +05:30
|
|
|
|
|
|
|
it('Profiler matrix and test case graph should visible', () => {
|
|
|
|
const { term, entity, serviceName, testCaseName } =
|
|
|
|
DATA_QUALITY_SAMPLE_DATA_TABLE;
|
2023-11-02 10:39:10 +05:30
|
|
|
visitEntityDetailsPage({ term, serviceName, entity });
|
2023-05-19 23:29:54 +05:30
|
|
|
cy.get('[data-testid="entity-header-display-name"]')
|
2023-07-17 16:57:40 +05:30
|
|
|
.contains(term)
|
|
|
|
.should('be.visible');
|
|
|
|
|
2023-05-29 12:06:19 +05:30
|
|
|
cy.get('[data-testid="profiler"]').should('be.visible').click();
|
2022-10-13 15:27:06 +05:30
|
|
|
interceptURL('GET', '/api/v1/tables/*/columnProfile?*', 'getProfilerInfo');
|
2023-08-10 12:30:16 +05:30
|
|
|
interceptURL('GET', '/api/v1/dataQuality/testCases?*', 'getTestCaseInfo');
|
2022-10-13 15:27:06 +05:30
|
|
|
|
2022-12-14 20:04:48 +05:30
|
|
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
2023-01-15 18:24:10 +05:30
|
|
|
.contains('Column Profile')
|
|
|
|
.click();
|
2023-08-10 12:30:16 +05:30
|
|
|
verifyResponseStatusCode('@getTestCaseInfo', 200);
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-row-key="shop_id"]')
|
|
|
|
.contains('shop_id')
|
2022-10-13 15:27:06 +05:30
|
|
|
.scrollIntoView()
|
|
|
|
.click();
|
|
|
|
verifyResponseStatusCode('@getProfilerInfo', 200);
|
|
|
|
|
|
|
|
cy.get('#count_graph').scrollIntoView().should('be.visible');
|
|
|
|
cy.get('#proportion_graph').scrollIntoView().should('be.visible');
|
|
|
|
cy.get('#math_graph').scrollIntoView().should('be.visible');
|
|
|
|
cy.get('#sum_graph').scrollIntoView().should('be.visible');
|
|
|
|
|
2023-04-03 13:03:48 -07:00
|
|
|
interceptURL(
|
|
|
|
'GET',
|
2023-04-14 09:14:49 +02:00
|
|
|
'/api/v1/dataQuality/testCases/*/testCaseResult?*',
|
2023-04-03 13:03:48 -07:00
|
|
|
'getTestResult'
|
|
|
|
);
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
2022-10-13 15:27:06 +05:30
|
|
|
.contains('Data Quality')
|
|
|
|
.click();
|
2023-07-17 16:57:40 +05:30
|
|
|
|
|
|
|
cy.get(`[data-testid="${testCaseName}"]`).click();
|
2023-08-10 12:30:16 +05:30
|
|
|
cy.wait('@getTestResult').then(() => {
|
|
|
|
cy.get(`[id="${testCaseName}_graph"]`)
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible');
|
|
|
|
});
|
2022-10-13 15:27:06 +05:30
|
|
|
});
|
2022-12-13 23:42:29 +05:30
|
|
|
|
|
|
|
it('SQL query should be visible while editing the test case', () => {
|
2023-07-17 16:57:40 +05:30
|
|
|
const {
|
|
|
|
term,
|
|
|
|
entity,
|
|
|
|
serviceName,
|
|
|
|
sqlTestCase,
|
|
|
|
sqlQuery,
|
|
|
|
sqlTestCaseName,
|
|
|
|
} = DATA_QUALITY_SAMPLE_DATA_TABLE;
|
2022-12-23 15:24:14 +05:30
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
`api/v1/tables/name/${serviceName}.*.${term}?fields=*&include=all`,
|
|
|
|
'waitForPageLoad'
|
|
|
|
);
|
2023-11-02 10:39:10 +05:30
|
|
|
visitEntityDetailsPage({ term, serviceName, entity });
|
2022-12-23 15:24:14 +05:30
|
|
|
verifyResponseStatusCode('@waitForPageLoad', 200);
|
2023-05-19 23:29:54 +05:30
|
|
|
cy.get('[data-testid="entity-header-display-name"]')
|
2023-04-14 11:28:11 +05:30
|
|
|
.should('be.visible')
|
|
|
|
.contains(term);
|
2023-05-29 12:06:19 +05:30
|
|
|
cy.get('[data-testid="profiler"]').should('be.visible').click();
|
2022-12-13 23:42:29 +05:30
|
|
|
cy.get('[data-testid="profiler-add-table-test-btn"]')
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="table"]').click();
|
2022-12-13 23:42:29 +05:30
|
|
|
|
|
|
|
// creating new test case
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('#tableTestForm_testName').type(sqlTestCaseName);
|
2022-12-13 23:42:29 +05:30
|
|
|
cy.get('#tableTestForm_testTypeId').scrollIntoView().click();
|
|
|
|
cy.contains(sqlTestCase).should('be.visible').click();
|
|
|
|
cy.get('.CodeMirror-scroll')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.type(sqlQuery);
|
|
|
|
cy.get(descriptionBox).scrollIntoView().type(sqlTestCase);
|
|
|
|
|
|
|
|
cy.get('[data-testid="submit-test"]')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
|
2023-04-14 09:14:49 +02:00
|
|
|
interceptURL('GET', '/api/v1/dataQuality/testCases?fields=*', 'testCase');
|
|
|
|
interceptURL(
|
|
|
|
'GET',
|
|
|
|
'/api/v1/dataQuality/testDefinitions/*',
|
|
|
|
'testCaseDefinition'
|
|
|
|
);
|
2022-12-13 23:42:29 +05:30
|
|
|
|
2023-02-03 20:48:41 +05:30
|
|
|
cy.get('[data-testid="success-line"]')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible');
|
2022-12-13 23:42:29 +05:30
|
|
|
cy.get('[data-testid="view-service-button"]').should('be.visible').click();
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="profiler-tab-left-panel"]')
|
|
|
|
.contains('Data Quality')
|
|
|
|
.click();
|
2022-12-13 23:42:29 +05:30
|
|
|
verifyResponseStatusCode('@testCase', 200);
|
2023-07-17 16:57:40 +05:30
|
|
|
cy.get('[data-testid="my_sql_test_case_cypress"]')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible');
|
|
|
|
cy.get('[data-testid="edit-my_sql_test_case_cypress"]')
|
2022-12-13 23:42:29 +05:30
|
|
|
.should('be.visible')
|
|
|
|
.click();
|
|
|
|
|
|
|
|
verifyResponseStatusCode('@testCaseDefinition', 200);
|
|
|
|
cy.get('#tableTestForm').should('be.visible');
|
|
|
|
cy.get('.CodeMirror-scroll')
|
|
|
|
.scrollIntoView()
|
|
|
|
.should('be.visible')
|
|
|
|
.contains(sqlQuery);
|
|
|
|
});
|
2022-09-19 18:43:39 +05:30
|
|
|
});
|