mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-07-24 09:50:01 +00:00
fix: cypress issues (#12620)
* fix: cypress issues * fix: cypress tests * fix: tags cypress * miner fix in tag spec --------- Co-authored-by: Shailesh Parmar <shailesh.parmar.webdev@gmail.com>
This commit is contained in:
parent
fde17d44b8
commit
94d49e1c53
@ -20,6 +20,7 @@ export const visitServiceDetailsPage = (service, verifyHeader = true) => {
|
||||
'getSettingsPage'
|
||||
);
|
||||
cy.get('[data-testid="appbar-item-settings"]').should('be.visible').click();
|
||||
|
||||
verifyResponseStatusCode('@getSettingsPage', 200);
|
||||
// Services page
|
||||
interceptURL('GET', '/api/v1/services/*', 'getServices');
|
||||
@ -29,7 +30,15 @@ export const visitServiceDetailsPage = (service, verifyHeader = true) => {
|
||||
.should('be.visible')
|
||||
.click();
|
||||
|
||||
verifyResponseStatusCode('@getServices', 200);
|
||||
cy.wait('@getServices').then((interception) => {
|
||||
const responseBody = interception.response.body;
|
||||
// check if service name is received on the first page otherwise, click on Next button
|
||||
const item = responseBody.data.find((item) => item.name === service.name);
|
||||
if (!item && responseBody.paging.after) {
|
||||
cy.get('[data-testid="next"]').click();
|
||||
verifyResponseStatusCode('@getServices', 200);
|
||||
}
|
||||
});
|
||||
|
||||
// click on created service
|
||||
cy.get(`[data-testid="service-name-${service.name}"]`)
|
||||
@ -43,7 +52,7 @@ export const visitServiceDetailsPage = (service, verifyHeader = true) => {
|
||||
.should('be.visible')
|
||||
.invoke('text')
|
||||
.then((text) => {
|
||||
expect(text).to.equal(service.name);
|
||||
expect(text).to.equal(service.displayName);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -236,13 +236,13 @@ export const NEW_TAG = {
|
||||
};
|
||||
|
||||
export const NEW_GLOSSARY = {
|
||||
name: 'Business Glossary',
|
||||
description: 'This is the Business glossary',
|
||||
name: 'Cypress Glossary',
|
||||
description: 'This is the Cypress Glossary',
|
||||
reviewer: 'Aaron Johnson',
|
||||
tag: 'PII.None',
|
||||
};
|
||||
export const NEW_GLOSSARY_1 = {
|
||||
name: 'Product%Glossary',
|
||||
name: 'Cypress Product%Glossary',
|
||||
description: 'This is the Product glossary with percentage',
|
||||
reviewer: 'Brandy Miller',
|
||||
tag: 'PII.None',
|
||||
@ -250,16 +250,16 @@ export const NEW_GLOSSARY_1 = {
|
||||
|
||||
export const NEW_GLOSSARY_TERMS = {
|
||||
term_1: {
|
||||
name: 'Purchase',
|
||||
description: 'This is the Purchase',
|
||||
name: 'CypressPurchase',
|
||||
description: 'This is the Cypress Purchase',
|
||||
synonyms: 'buy,collect,acquire',
|
||||
fullyQualifiedName: 'Business Glossary.Purchase',
|
||||
fullyQualifiedName: 'Cypress Glossary.CypressPurchase',
|
||||
},
|
||||
term_2: {
|
||||
name: 'Sales',
|
||||
description: 'This is the Sales',
|
||||
name: 'CypressSales',
|
||||
description: 'This is the Cypress Sales',
|
||||
synonyms: 'give,disposal,deal',
|
||||
fullyQualifiedName: 'Business Glossary.Sales',
|
||||
fullyQualifiedName: 'Cypress Glossary.CypressSales',
|
||||
},
|
||||
};
|
||||
export const GLOSSARY_TERM_WITH_DETAILS = {
|
||||
@ -267,10 +267,10 @@ export const GLOSSARY_TERM_WITH_DETAILS = {
|
||||
description: 'This is the Accounts',
|
||||
tag: 'PersonalData.Personal',
|
||||
synonyms: 'book,ledger,results',
|
||||
relatedTerms: 'Sales',
|
||||
relatedTerms: 'CypressSales',
|
||||
reviewer: 'Colin Ho',
|
||||
inheritedReviewer: 'Aaron Johnson',
|
||||
fullyQualifiedName: 'Business Glossary.Accounts',
|
||||
fullyQualifiedName: 'Cypress Glossary.Accounts',
|
||||
};
|
||||
|
||||
export const NEW_GLOSSARY_1_TERMS = {
|
||||
@ -278,13 +278,13 @@ export const NEW_GLOSSARY_1_TERMS = {
|
||||
name: 'Features%Term',
|
||||
description: 'This is the Features',
|
||||
synonyms: 'data,collect,time',
|
||||
fullyQualifiedName: 'Product%Glossary.Features%Term',
|
||||
fullyQualifiedName: 'Cypress Product%Glossary.Features%Term',
|
||||
},
|
||||
term_2: {
|
||||
name: 'Uses',
|
||||
description: 'This is the Uses',
|
||||
synonyms: 'home,business,adventure',
|
||||
fullyQualifiedName: 'Product%Glossary.Uses',
|
||||
fullyQualifiedName: 'Cypress Product%Glossary.Uses',
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -63,7 +63,7 @@ describe('Edit displayName for all the entities, services and verify breadcrumb'
|
||||
|
||||
Object.entries(SERVICES).map(([serviceType, service]) => {
|
||||
it(`${service.type}`, () => {
|
||||
visitServiceDetailsPage(service);
|
||||
visitServiceDetailsPage(service, false);
|
||||
updateDisplayName(
|
||||
service.displayName,
|
||||
`/api/v1/services/${serviceType}/*`
|
||||
@ -85,7 +85,7 @@ describe('Edit displayName for all the entities, services and verify breadcrumb'
|
||||
visitServiceDetailsPage(
|
||||
{
|
||||
type: DASHBOARD_DATA_MODEL.service.type,
|
||||
name: DASHBOARD_DATA_MODEL.service.displayName,
|
||||
name: DASHBOARD_DATA_MODEL.service.name,
|
||||
},
|
||||
false
|
||||
);
|
||||
@ -111,6 +111,7 @@ describe('Edit displayName for all the entities, services and verify breadcrumb'
|
||||
SCHEMA_AND_DATABASE_DISPLAY_NAME.serviceName,
|
||||
SCHEMA_AND_DATABASE_DISPLAY_NAME.entity
|
||||
);
|
||||
cy.log(SCHEMA_AND_DATABASE_DISPLAY_NAME.database);
|
||||
cy.get('[data-testid="breadcrumb"]')
|
||||
.contains(SCHEMA_AND_DATABASE_DISPLAY_NAME.database)
|
||||
.click();
|
||||
@ -223,7 +224,7 @@ describe('Cleanup', () => {
|
||||
visitServiceDetailsPage(
|
||||
{
|
||||
type: DASHBOARD_DATA_MODEL.service.type,
|
||||
name: DASHBOARD_DATA_MODEL.service.displayName,
|
||||
name: DASHBOARD_DATA_MODEL.service.name,
|
||||
},
|
||||
false
|
||||
);
|
||||
@ -244,7 +245,7 @@ describe('Cleanup', () => {
|
||||
visitServiceDetailsPage(
|
||||
{
|
||||
type: service.type,
|
||||
name: service.displayName,
|
||||
name: service.name,
|
||||
},
|
||||
false
|
||||
);
|
||||
|
@ -61,6 +61,36 @@ const visitGlossaryTermPage = (termName, fqn, fetchPermission) => {
|
||||
cy.get('.ant-tabs .glossary-overview-tab').should('be.visible').click();
|
||||
};
|
||||
|
||||
const deleteGlossary = (glossary) => {
|
||||
cy.get('.ant-menu-item').contains(glossary).click();
|
||||
cy.get('[data-testid="manage-button"]').should('be.visible').click();
|
||||
cy.get('[data-testid="delete-button"]')
|
||||
.scrollIntoView()
|
||||
.should('be.visible')
|
||||
.click();
|
||||
|
||||
cy.get('[data-testid="delete-confirmation-modal"]')
|
||||
.should('exist')
|
||||
.then(() => {
|
||||
cy.get('[role="dialog"]').should('be.visible');
|
||||
cy.get('[data-testid="modal-header"]').should('be.visible');
|
||||
});
|
||||
cy.get('[data-testid="modal-header"]')
|
||||
.should('be.visible')
|
||||
.should('contain', `Delete ${glossary}`);
|
||||
cy.get('[data-testid="confirmation-text-input"]')
|
||||
.should('be.visible')
|
||||
.type(DELETE_TERM);
|
||||
interceptURL('DELETE', '/api/v1/glossaries/*', 'getGlossary');
|
||||
cy.get('[data-testid="confirm-button"]')
|
||||
.should('be.visible')
|
||||
.should('not.disabled')
|
||||
.click();
|
||||
verifyResponseStatusCode('@getGlossary', 200);
|
||||
|
||||
toastNotification('Glossary deleted successfully!');
|
||||
};
|
||||
|
||||
const checkDisplayName = (displayName) => {
|
||||
cy.get('[data-testid="entity-header-display-name"]')
|
||||
.scrollIntoView()
|
||||
@ -207,7 +237,7 @@ const goToAssetsTab = (name, fqn, fetchPermission) => {
|
||||
|
||||
const selectActiveGlossary = (glossaryName) => {
|
||||
interceptURL('GET', '/api/v1/glossaryTerms*', 'getGlossaryTerms');
|
||||
cy.get('.ant-menu-item').contains(glossaryName).should('be.visible').click();
|
||||
cy.get('.ant-menu-item').contains(glossaryName).click();
|
||||
verifyResponseStatusCode('@getGlossaryTerms', 200);
|
||||
};
|
||||
|
||||
@ -283,7 +313,10 @@ const updateTerms = (newTerm) => {
|
||||
.scrollIntoView()
|
||||
.should('be.visible')
|
||||
.click({ force: true });
|
||||
cy.get('.ant-select-selection-overflow').should('be.visible').click();
|
||||
cy.get('.ant-select-selection-overflow')
|
||||
.should('be.visible')
|
||||
.click()
|
||||
.type(newTerm);
|
||||
verifyResponseStatusCode('@getGlossaryTerm', 200);
|
||||
cy.get('.ant-select-item-option-content')
|
||||
.contains(newTerm)
|
||||
@ -538,14 +571,12 @@ describe('Glossary page should work properly', () => {
|
||||
});
|
||||
|
||||
// Verify Product glossary details
|
||||
cy.get('.ant-menu-item')
|
||||
.contains(NEW_GLOSSARY_1.name)
|
||||
.should('be.visible')
|
||||
.click();
|
||||
cy.get('.ant-menu-item').contains(NEW_GLOSSARY_1.name).click();
|
||||
|
||||
cy.get('[data-testid="glossary-left-panel"]')
|
||||
.contains(NEW_GLOSSARY_1.name)
|
||||
.should('be.visible');
|
||||
.should('be.visible')
|
||||
.scrollIntoView();
|
||||
|
||||
selectActiveGlossary(NEW_GLOSSARY_1.name);
|
||||
|
||||
@ -593,10 +624,7 @@ describe('Glossary page should work properly', () => {
|
||||
interceptURL('GET', `/api/v1/glossaryTerms?glossary=*`, 'glossaryTerm');
|
||||
interceptURL('GET', `/api/v1/permissions/glossary/*`, 'permissions');
|
||||
|
||||
cy.get('.ant-menu-item')
|
||||
.contains(NEW_GLOSSARY_1.name)
|
||||
.should('be.visible')
|
||||
.click();
|
||||
cy.get('.ant-menu-item').contains(NEW_GLOSSARY_1.name).click();
|
||||
verifyMultipleResponseStatusCode(['@glossaryTerm', '@permissions'], 200);
|
||||
|
||||
// visit glossary term page
|
||||
@ -650,10 +678,7 @@ describe('Glossary page should work properly', () => {
|
||||
|
||||
const entity = SEARCH_ENTITY_TABLE.table_3;
|
||||
|
||||
cy.get('.ant-menu-item')
|
||||
.contains(NEW_GLOSSARY_1.name)
|
||||
.should('be.visible')
|
||||
.click();
|
||||
cy.get('.ant-menu-item').contains(NEW_GLOSSARY_1.name).click();
|
||||
|
||||
goToAssetsTab(
|
||||
NEW_GLOSSARY_1_TERMS.term_1.name,
|
||||
@ -665,10 +690,29 @@ describe('Glossary page should work properly', () => {
|
||||
);
|
||||
visitEntityDetailsPage(entity.term, entity.serviceName, entity.entity);
|
||||
|
||||
const parentPath =
|
||||
'[data-testid="entity-right-panel"] [data-testid="glossary-container"]';
|
||||
|
||||
// Add glossary tag to entity for mutually exclusive
|
||||
cy.get(
|
||||
'[data-testid="entity-right-panel"] [data-testid="glossary-container"] > [data-testid="entity-tags"] [data-testid="add-tag"]'
|
||||
).click();
|
||||
cy.get(parentPath).then((glossaryContainer) => {
|
||||
// Check if the "Add Tag" button is visible
|
||||
if (!glossaryContainer.find('[data-testid="add-tag"]').is(':visible')) {
|
||||
// If "Add Tag" is not visible, click on "Edit Tag"
|
||||
cy.get(
|
||||
'[data-testid="entity-right-panel"] [data-testid="glossary-container"] [data-testid="edit-button"]'
|
||||
).click();
|
||||
cy.get('[data-testid="remove-tags"]')
|
||||
.should('be.visible')
|
||||
.click({ multiple: true });
|
||||
|
||||
interceptURL('PATCH', '/api/v1/tables/*', 'removeTags');
|
||||
cy.get('[data-testid="saveAssociatedTag"]').scrollIntoView().click();
|
||||
verifyResponseStatusCode('@removeTags', 200);
|
||||
}
|
||||
});
|
||||
|
||||
cy.get(`${parentPath} [data-testid="add-tag"]`).click();
|
||||
|
||||
// Select 1st term
|
||||
cy.get('[data-testid="tag-selector"]').click().type(term1);
|
||||
cy.get(`[data-testid="tag-${glossary}.${term1}"]`).click();
|
||||
@ -683,6 +727,7 @@ describe('Glossary page should work properly', () => {
|
||||
interceptURL('PATCH', '/api/v1/tables/*', 'saveTag');
|
||||
|
||||
cy.get('[data-testid="saveAssociatedTag"]').scrollIntoView();
|
||||
cy.clickOutside();
|
||||
cy.get('[data-testid="saveAssociatedTag"]').click();
|
||||
verifyResponseStatusCode('@saveTag', 400);
|
||||
toastNotification(
|
||||
@ -702,6 +747,7 @@ describe('Glossary page should work properly', () => {
|
||||
// Select 2nd term
|
||||
cy.get('[data-testid="tag-selector"]').click().type(term4);
|
||||
cy.get(`[data-testid="tag-${glossary1}.${term4}"]`).click();
|
||||
cy.clickOutside();
|
||||
cy.get('[data-testid="saveAssociatedTag"]').scrollIntoView().click();
|
||||
verifyResponseStatusCode('@saveTag', 200);
|
||||
verifyResponseStatusCode('@countTag', 200);
|
||||
@ -726,6 +772,7 @@ describe('Glossary page should work properly', () => {
|
||||
cy.get('[data-testid="tag-selector"] > .ant-select-selector').contains(
|
||||
term3
|
||||
);
|
||||
cy.clickOutside();
|
||||
cy.get('[data-testid="saveAssociatedTag"]').scrollIntoView().click();
|
||||
verifyResponseStatusCode('@countTag', 200);
|
||||
cy.get(
|
||||
@ -778,6 +825,7 @@ describe('Glossary page should work properly', () => {
|
||||
.click({ multiple: true });
|
||||
|
||||
interceptURL('PATCH', '/api/v1/tables/*', 'removeTags');
|
||||
cy.clickOutside();
|
||||
cy.get('[data-testid="saveAssociatedTag"]').scrollIntoView().click();
|
||||
verifyResponseStatusCode('@removeTags', 200);
|
||||
|
||||
@ -828,36 +876,9 @@ describe('Glossary page should work properly', () => {
|
||||
});
|
||||
|
||||
it('Delete glossary should work properly', () => {
|
||||
verifyResponseStatusCode('@fetchGlossaries', 200);
|
||||
[NEW_GLOSSARY.name, NEW_GLOSSARY_1.name].forEach((glossary) => {
|
||||
verifyResponseStatusCode('@fetchGlossaries', 200);
|
||||
cy.get('.ant-menu-item').contains(glossary).should('be.visible').click();
|
||||
|
||||
cy.get('[data-testid="manage-button"]').should('be.visible').click();
|
||||
cy.get('[data-testid="delete-button"]')
|
||||
.scrollIntoView()
|
||||
.should('be.visible')
|
||||
.click();
|
||||
|
||||
cy.get('[data-testid="delete-confirmation-modal"]')
|
||||
.should('exist')
|
||||
.then(() => {
|
||||
cy.get('[role="dialog"]').should('be.visible');
|
||||
cy.get('[data-testid="modal-header"]').should('be.visible');
|
||||
});
|
||||
cy.get('[data-testid="modal-header"]')
|
||||
.should('be.visible')
|
||||
.should('contain', `Delete ${glossary}`);
|
||||
cy.get('[data-testid="confirmation-text-input"]')
|
||||
.should('be.visible')
|
||||
.type(DELETE_TERM);
|
||||
interceptURL('DELETE', '/api/v1/glossaries/*', 'getGlossary');
|
||||
cy.get('[data-testid="confirm-button"]')
|
||||
.should('be.visible')
|
||||
.should('not.disabled')
|
||||
.click();
|
||||
verifyResponseStatusCode('@getGlossary', 200);
|
||||
|
||||
toastNotification('Glossary deleted successfully!');
|
||||
deleteGlossary(glossary);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -381,12 +381,21 @@ describe('Tags page should work', () => {
|
||||
.contains(NEW_CLASSIFICATION.displayName)
|
||||
.should('be.visible')
|
||||
.as('newCategory');
|
||||
|
||||
cy.get('@newCategory')
|
||||
.click()
|
||||
.parent()
|
||||
.should('have.class', 'activeCategory');
|
||||
|
||||
verifyResponseStatusCode('@permissions', 200);
|
||||
cy.get('[data-testid="entity-header-display-name"]')
|
||||
.invoke('text')
|
||||
.then((text) => {
|
||||
// Get the text of the first menu item
|
||||
if (text !== NEW_CLASSIFICATION.displayName) {
|
||||
verifyResponseStatusCode('@getTags', 200);
|
||||
}
|
||||
});
|
||||
|
||||
cy.get('[data-testid="usage-count"]').should('be.visible').as('count');
|
||||
cy.get('@count')
|
||||
@ -404,39 +413,6 @@ describe('Tags page should work', () => {
|
||||
verifyResponseStatusCode('@getEntityDetailsPage', 200);
|
||||
});
|
||||
|
||||
it('Rename tag flow should work properly', () => {
|
||||
cy.get('[data-testid="data-summary-container"]')
|
||||
.contains(NEW_CLASSIFICATION.displayName)
|
||||
.should('be.visible')
|
||||
.as('newCategory');
|
||||
|
||||
cy.get('@newCategory')
|
||||
.click()
|
||||
.parent()
|
||||
.should('have.class', 'activeCategory');
|
||||
cy.get('[data-testid="edit-button"]').should('be.visible').click();
|
||||
cy.get('[data-testid="modal-container"]')
|
||||
.should('exist')
|
||||
.then(() => {
|
||||
cy.get('[role="dialog"]').should('be.visible');
|
||||
});
|
||||
cy.get('[data-testid="header"] > strong')
|
||||
.should('be.visible')
|
||||
.contains('Edit Tag');
|
||||
|
||||
interceptURL('PATCH', '/api/v1/tags/*', 'renamedName');
|
||||
cy.get('[data-testid="name"]')
|
||||
.should('be.visible')
|
||||
.clear()
|
||||
.type(NEW_TAG.renamedName);
|
||||
|
||||
submitForm();
|
||||
|
||||
verifyResponseStatusCode('@renamedName', 200);
|
||||
|
||||
cy.get('[data-testid="table"]').should('contain', NEW_TAG.renamedName);
|
||||
});
|
||||
|
||||
it('Delete Tag flow should work properly', () => {
|
||||
interceptURL(
|
||||
'DELETE',
|
||||
@ -457,7 +433,7 @@ describe('Tags page should work', () => {
|
||||
|
||||
cy.get('[data-testid="table"]')
|
||||
.should('be.visible')
|
||||
.should('contain', NEW_TAG.renamedName);
|
||||
.should('contain', NEW_TAG.name);
|
||||
|
||||
cy.get('[data-testid="table"]')
|
||||
.find('[data-testid="delete-tag"]')
|
||||
@ -466,12 +442,12 @@ describe('Tags page should work', () => {
|
||||
.click();
|
||||
|
||||
cy.wait(5000); // adding manual wait to open modal, as it depends on click not an api.
|
||||
permanentDeleteModal(NEW_TAG.renamedName);
|
||||
permanentDeleteModal(NEW_TAG.name);
|
||||
|
||||
verifyResponseStatusCode('@deleteTag', 200);
|
||||
cy.wait(5000); // adding manual wait to open modal, as it depends on click not an api.
|
||||
cy.get('[data-testid="table"]')
|
||||
.contains(NEW_TAG.renamedName)
|
||||
.contains(NEW_TAG.name)
|
||||
.should('not.be.exist');
|
||||
});
|
||||
|
||||
|
@ -177,9 +177,7 @@ const Services = ({
|
||||
<button>
|
||||
<h6
|
||||
className="tw-text-base tw-text-grey-body tw-font-medium tw-text-left tw-truncate tw-w-48"
|
||||
data-testid={`service-name-${getEntityName(
|
||||
service
|
||||
)}`}
|
||||
data-testid={`service-name-${service.name}`}
|
||||
title={getEntityName(service)}>
|
||||
{getEntityName(service)}
|
||||
</h6>
|
||||
|
Loading…
x
Reference in New Issue
Block a user