From 50e00ea670fcc71a90ac4e4800a373febf351b5e Mon Sep 17 00:00:00 2001 From: Shailesh Parmar Date: Fri, 24 Nov 2023 09:45:07 +0530 Subject: [PATCH] cypress: work on advance search skip test (#14074) --- .../ui/cypress/common/advancedSearch.js | 332 ++++++++---- .../resources/ui/cypress/common/common.js | 23 +- .../Flow/AdvancedSearchQuickFilters.spec.js | 34 +- .../ui/cypress/e2e/Flow/SearchFlow.spec.js | 471 ++++++++---------- .../e2e/Pages/SearchIndexDetails.spec.js | 42 +- .../Explore/AdvanceSearchModal.component.tsx | 13 +- 6 files changed, 506 insertions(+), 409 deletions(-) diff --git a/openmetadata-ui/src/main/resources/ui/cypress/common/advancedSearch.js b/openmetadata-ui/src/main/resources/ui/cypress/common/advancedSearch.js index cd342d5cdeb..2fdf988c602 100644 --- a/openmetadata-ui/src/main/resources/ui/cypress/common/advancedSearch.js +++ b/openmetadata-ui/src/main/resources/ui/cypress/common/advancedSearch.js @@ -10,13 +10,81 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { SEARCH_ENTITY_TABLE } from '../constants/constants'; -import { MYSQL } from '../constants/service.constants'; +import { + DATABASE_DETAILS, + DATABASE_SERVICE_DETAILS, + SCHEMA_DETAILS, + TABLE_DETAILS, +} from '../constants/entityConstant'; +import { USER_CREDENTIALS } from '../constants/SearchIndexDetails.constants'; import { interceptURL, + uuid, verifyResponseStatusCode, visitEntityDetailsPage, } from './common'; +import { createEntityTable } from './entityUtils'; + +export const ADVANCE_SEARCH_TABLES = { + table1: TABLE_DETAILS, + table2: { + name: `cy-table2-${uuid()}`, + description: 'description', + columns: [ + { + name: 'cypress_first_name', + dataType: 'VARCHAR', + dataLength: 100, + dataTypeDisplay: 'varchar', + description: 'First name of the staff member.', + }, + { + name: 'cypress_last_name', + dataType: 'VARCHAR', + dataLength: 100, + dataTypeDisplay: 'varchar', + }, + { + name: 'cypress_email', + dataType: 'VARCHAR', + dataLength: 100, + dataTypeDisplay: 'varchar', + description: 'Email address of the staff member.', + }, + ], + databaseSchema: `${DATABASE_SERVICE_DETAILS.name}.${DATABASE_DETAILS.name}.${SCHEMA_DETAILS.name}`, + }, + table3: { + name: `cy-table3-${uuid()}`, + description: 'description', + columns: [ + { + name: 'cypress_user_id', + dataType: 'NUMERIC', + dataTypeDisplay: 'numeric', + description: + 'Unique identifier for the user of your Shopify POS or your Shopify admin.', + }, + { + name: 'cypress_shop_id', + dataType: 'NUMERIC', + dataTypeDisplay: 'numeric', + description: + 'The ID of the store. This column is a foreign key reference to the shop_id column in the dim.shop table.', + }, + ], + databaseSchema: `${DATABASE_SERVICE_DETAILS.name}.${DATABASE_DETAILS.name}.${SCHEMA_DETAILS.name}`, + }, +}; + +export const ADVANCE_SEARCH_DATABASE_SERVICE = { + service: DATABASE_SERVICE_DETAILS, + database: DATABASE_DETAILS, + schema: SCHEMA_DETAILS, + tables: Object.values(ADVANCE_SEARCH_TABLES), +}; export const CONDITIONS_MUST = { equalTo: { @@ -47,14 +115,15 @@ export const CONDITIONS_MUST_NOT = { filter: 'must_not', }, }; +const ownerFullName = `${USER_CREDENTIALS.firstName}${USER_CREDENTIALS.lastName}`; export const FIELDS = { Owner: { name: 'Owner', testid: '[title="Owner"]', - searchTerm1: 'Aaron Johnson', - searchCriteriaFirstGroup: 'Aaron Johnson', - responseValueFirstGroup: `"displayName":"Aaron Johnson"`, + searchTerm1: ownerFullName, + searchCriteriaFirstGroup: ownerFullName, + responseValueFirstGroup: `"displayName":"${ownerFullName}"`, searchCriteriaSecondGroup: 'Aaron Singh', owner: true, responseValueSecondGroup: 'Aaron Singh', @@ -81,32 +150,32 @@ export const FIELDS = { testid: '[title="Service"]', searchCriteriaFirstGroup: 'sample_data', responseValueFirstGroup: `"name":"sample_data"`, - searchCriteriaSecondGroup: MYSQL.serviceName, - responseValueSecondGroup: `"name":"${MYSQL.serviceName}"`, + searchCriteriaSecondGroup: DATABASE_SERVICE_DETAILS.name, + responseValueSecondGroup: `"name":"${DATABASE_SERVICE_DETAILS.name}"`, }, Database: { name: 'Database', testid: '[title="Database"]', - searchCriteriaFirstGroup: 'default', - responseValueFirstGroup: `"name":"default"`, - searchCriteriaSecondGroup: 'ecommerce_db', - responseValueSecondGroup: `"name":"ecommerce_db"`, + searchCriteriaFirstGroup: 'ecommerce_db', + responseValueFirstGroup: `"name":"ecommerce_db"`, + searchCriteriaSecondGroup: DATABASE_DETAILS.name, + responseValueSecondGroup: `"name":"${DATABASE_DETAILS.name}"`, }, Database_Schema: { name: 'Database Schema', testid: '[title="Database Schema"]', searchCriteriaFirstGroup: 'shopify', responseValueFirstGroup: `"name":"shopify"`, - searchCriteriaSecondGroup: 'cypress_integrations_test_db', - responseValueSecondGroup: `"name":"cypress_integrations_test_db"`, + searchCriteriaSecondGroup: SCHEMA_DETAILS.name, + responseValueSecondGroup: `"name":"${SCHEMA_DETAILS.name}"`, }, Column: { name: 'Column', testid: '[title="Column"]', - searchCriteriaFirstGroup: 'SKU', - responseValueFirstGroup: '"name":"SKU"', - searchCriteriaSecondGroup: 'api_client_id', - responseValueSecondGroup: '"name":"api_client_id"', + searchCriteriaFirstGroup: 'cypress_first_name', + responseValueFirstGroup: '"name":"cypress_first_name"', + searchCriteriaSecondGroup: 'cypress_user_id', + responseValueSecondGroup: '"name":"cypress_user_id"', }, }; @@ -122,42 +191,34 @@ export const OPERATOR = { }; export const searchForField = (condition, fieldid, searchCriteria, index) => { - interceptURL('GET', '/api/v1/search/suggest?q=*', 'suggestApi'); + interceptURL('GET', '/api/v1/search/aggregate?*', 'suggestApi'); // Click on field dropdown - cy.get('.rule--field > .ant-select > .ant-select-selector') - .eq(index) - .should('be.visible') - .click(); + cy.get('.rule--field > .ant-select > .ant-select-selector').eq(index).click(); // Select owner fields - cy.get(`${fieldid}`).eq(index).should('be.visible').click(); + cy.get(`${fieldid}`).eq(index).click(); // Select the condition cy.get('.rule--operator > .ant-select > .ant-select-selector') .eq(index) - .should('be.visible') .click(); - cy.get(`[title="${condition}"]`).eq(index).should('be.visible').click(); + cy.get(`[title="${condition}"]`).eq(index).click(); // Verify the condition - cy.get('.rule--operator .ant-select-selection-item') - .should('be.visible') - .should('contain', `${condition}`); + cy.get('.rule--operator .ant-select-selection-item').should( + 'contain', + `${condition}` + ); // Verify the search criteria for the condition cy.get('body').then(($body) => { if ($body.find('.ant-col > .ant-input').length) { - cy.get('.ant-col > .ant-input') - .eq(index) - .should('be.visible') - .type(searchCriteria); + cy.get('.ant-col > .ant-input').eq(index).type(searchCriteria); } else { cy.get('.widget--widget > .ant-select > .ant-select-selector') .eq(index) - .should('be.visible') .type(searchCriteria); // select value from dropdown verifyResponseStatusCode('@suggestApi', 200); cy.get(`.ant-select-dropdown [title = '${searchCriteria}']`) - .should('be.visible') .trigger('mouseover') .trigger('click'); } @@ -165,34 +226,10 @@ export const searchForField = (condition, fieldid, searchCriteria, index) => { }; export const goToAdvanceSearch = () => { - interceptURL( - 'GET', - '/api/v1/search/query?q=&index=*&from=0&size=10&deleted=false&query_filter=*&sort_field=_score&sort_order=desc', - 'explorePage' - ); // Navigate to explore page - cy.get('[data-testid="app-bar-item-explore"]') - .should('exist') - .and('be.visible') - .click(); - - cy.get('[data-testid="tables-tab"]') - .scrollIntoView() - .should('exist') - .and('be.visible'); - - cy.wait('@explorePage').then(() => { - // Click on advance search button - cy.get('[data-testid="advance-search-button"]') - .should('be.visible') - .click(); - - cy.get('.ant-btn') - .contains('Reset') - .scrollIntoView() - .should('be.visible') - .click(); - }); + cy.get('[data-testid="app-bar-item-explore"]').click(); + cy.get('[data-testid="advance-search-button"]').click(); + cy.get('[data-testid="reset-btn"]').click(); }; export const checkmustPaths = ( @@ -211,10 +248,11 @@ export const checkmustPaths = ( 'GET', `/api/v1/search/query?q=&index=*&from=0&size=10&deleted=false&query_filter=*must*${encodeURI( searchCriteria - )}*&sort_field=_score&sort_order=desc`, + )}*`, 'search' ); - // //Click on apply filter + + // Click on apply filter cy.get('.ant-btn-primary').contains('Apply').click(); cy.wait('@search').should(({ request, response }) => { @@ -240,7 +278,7 @@ export const checkmust_notPaths = ( 'GET', `/api/v1/search/query?q=&index=*&from=0&size=10&deleted=false&query_filter=*must_not*${encodeURI( searchCriteria - )}*&sort_field=_score&sort_order=desc`, + )}*`, 'search_must_not' ); // Click on apply filter @@ -271,11 +309,11 @@ export const removeOwner = () => { cy.get('[data-testid="owner-link"]').should('contain', 'No Owner'); }; -export const addOwner = (ownerName) => { +export const addOwner = ({ ownerName, term, serviceName, entity }) => { visitEntityDetailsPage({ - term: SEARCH_ENTITY_TABLE.table_1.term, - serviceName: SEARCH_ENTITY_TABLE.table_1.serviceName, - entity: SEARCH_ENTITY_TABLE.table_1.entity, + term, + serviceName, + entity, }); interceptURL( @@ -321,11 +359,11 @@ export const addOwner = (ownerName) => { }); }; -export const addTier = () => { +export const addTier = ({ term, serviceName, entity }) => { visitEntityDetailsPage({ - term: SEARCH_ENTITY_TABLE.table_2.term, - serviceName: SEARCH_ENTITY_TABLE.table_2.serviceName, - entity: SEARCH_ENTITY_TABLE.table_2.entity, + term, + serviceName, + entity, }); cy.get('[data-testid="edit-tier"]') @@ -343,11 +381,11 @@ export const addTier = () => { cy.get('[data-testid="tier-dropdown"]').should('contain', 'Tier1'); }; -export const addTag = (tag) => { +export const addTag = ({ tag, term, serviceName, entity }) => { visitEntityDetailsPage({ - term: SEARCH_ENTITY_TABLE.table_3.term, - serviceName: SEARCH_ENTITY_TABLE.table_3.serviceName, - entity: SEARCH_ENTITY_TABLE.table_3.entity, + term, + serviceName, + entity, }); cy.get('[data-testid="entity-right-panel"] [data-testid="entity-tags"]') @@ -415,7 +453,7 @@ export const checkAddGroupWithOperator = ( .should('be.visible') .type(searchCriteria_1); } else { - interceptURL('GET', '/api/v1/search/suggest?q=*', 'suggestApi'); + interceptURL('GET', '/api/v1/search/aggregate?*', 'suggestApi'); cy.get('.widget--widget > .ant-select > .ant-select-selector') .eq(index_1) .should('be.visible') @@ -468,7 +506,7 @@ export const checkAddGroupWithOperator = ( .should('be.visible') .type(searchCriteria_2); } else { - interceptURL('GET', '/api/v1/search/suggest?q=*', 'suggestApi'); + interceptURL('GET', '/api/v1/search/aggregate?*', 'suggestApi'); cy.get('.widget--widget > .ant-select > .ant-select-selector') .eq(index_2) .should('be.visible') @@ -488,14 +526,14 @@ export const checkAddGroupWithOperator = ( 'GET', `/api/v1/search/query?q=&index=*&from=0&size=10&deleted=false&query_filter=*${encodeURI( searchCriteria_1 - )}*&sort_field=_score&sort_order=desc`, - 'search' + )}*`, + `search${searchCriteria_1}` ); // Click on apply filter cy.get('.ant-btn-primary').contains('Apply').click(); - cy.wait('@search').should(({ request, response }) => { + cy.wait(`@search${searchCriteria_1}`).should(({ request, response }) => { const resBody = JSON.stringify(response.body); expect(request.url).to.contain(encodeURI(searchCriteria_1)); @@ -539,7 +577,7 @@ export const checkAddRuleWithOperator = ( .should('be.visible') .type(searchCriteria_1); } else { - interceptURL('GET', '/api/v1/search/suggest?q=*', 'suggestApi'); + interceptURL('GET', '/api/v1/search/aggregate?*', 'suggestApi'); cy.get('.widget--widget > .ant-select > .ant-select-selector') .eq(index_1) @@ -588,7 +626,7 @@ export const checkAddRuleWithOperator = ( .should('be.visible') .type(searchCriteria_2); } else { - interceptURL('GET', '/api/v1/search/suggest?q=*', 'suggestApi'); + interceptURL('GET', '/api/v1/search/aggregate?*', 'suggestApi'); cy.get('.widget--widget > .ant-select > .ant-select-selector') .eq(index_2) .should('be.visible') @@ -609,17 +647,141 @@ export const checkAddRuleWithOperator = ( 'GET', `/api/v1/search/query?q=&index=*&from=0&size=10&deleted=false&query_filter=*${filter_1}*${encodeURI( searchCriteria_1 - )}*${filter_2}*${encodeURI(response_2)}*&sort_field=_score&sort_order=desc`, - 'search' + )}*${filter_2}*${encodeURI(response_2)}*`, + `search${searchCriteria_1}` ); // Click on apply filter cy.get('.ant-btn-primary').contains('Apply').click(); - cy.wait('@search').should(({ request, response }) => { + cy.wait(`@search${searchCriteria_1}`).should(({ request, response }) => { const resBody = JSON.stringify(response.body); expect(request.url).to.contain(encodeURI(searchCriteria_1)); expect(resBody).to.not.include(response_2); }); }; + +export const advanceSearchPreRequests = (token) => { + // Create Table hierarchy + + createEntityTable({ + token, + ...ADVANCE_SEARCH_DATABASE_SERVICE, + }); + + // Create a new user + cy.request({ + method: 'POST', + url: `/api/v1/users/signup`, + headers: { Authorization: `Bearer ${token}` }, + body: USER_CREDENTIALS, + }).then((response) => { + USER_CREDENTIALS.id = response.body.id; + }); + + // Add owner to table 1 + cy.request({ + method: 'GET', + url: `/api/v1/tables/name/${ADVANCE_SEARCH_TABLES.table1.databaseSchema}.${ADVANCE_SEARCH_TABLES.table1.name}`, + headers: { Authorization: `Bearer ${token}` }, + }).then((response) => { + cy.request({ + method: 'PATCH', + url: `/api/v1/tables/${response.body.id}`, + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json-patch+json', + }, + body: [ + { + op: 'add', + path: '/owner', + value: { + id: USER_CREDENTIALS.id, + type: 'user', + }, + }, + ], + }); + }); + + // Add Tier to table 2 + cy.request({ + method: 'GET', + url: `/api/v1/tables/name/${ADVANCE_SEARCH_TABLES.table2.databaseSchema}.${ADVANCE_SEARCH_TABLES.table2.name}`, + headers: { Authorization: `Bearer ${token}` }, + }).then((response) => { + cy.request({ + method: 'PATCH', + url: `/api/v1/tables/${response.body.id}`, + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json-patch+json', + }, + body: [ + { + op: 'add', + path: '/tags/0', + value: { + name: 'Tier1', + tagFQN: 'Tier.Tier1', + labelType: 'Manual', + state: 'Confirmed', + }, + }, + { + op: 'add', + path: '/tags/1', + value: { + name: 'SpecialCategory', + tagFQN: 'PersonalData.SpecialCategory', + labelType: 'Manual', + state: 'Confirmed', + }, + }, + ], + }); + }); + + // Add Tag to table 3 + cy.request({ + method: 'GET', + url: `/api/v1/tables/name/${ADVANCE_SEARCH_TABLES.table3.databaseSchema}.${ADVANCE_SEARCH_TABLES.table3.name}`, + headers: { Authorization: `Bearer ${token}` }, + }).then((response) => { + cy.request({ + method: 'PATCH', + url: `/api/v1/tables/${response.body.id}`, + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json-patch+json', + }, + body: [ + { + op: 'add', + path: '/tags/0', + value: { + tagFQN: 'PersonalData.Personal', + source: 'Classification', + name: 'Personal', + description: + 'Data that can be used to directly or indirectly identify a person.', + labelType: 'Manual', + state: 'Confirmed', + }, + }, + { + op: 'add', + path: '/tags/1', + value: { + name: 'Tier2', + tagFQN: 'Tier.Tier2', + labelType: 'Manual', + state: 'Confirmed', + }, + }, + ], + }); + }); +}; diff --git a/openmetadata-ui/src/main/resources/ui/cypress/common/common.js b/openmetadata-ui/src/main/resources/ui/cypress/common/common.js index 73462f18acd..ffbfe4ee26b 100644 --- a/openmetadata-ui/src/main/resources/ui/cypress/common/common.js +++ b/openmetadata-ui/src/main/resources/ui/cypress/common/common.js @@ -908,20 +908,17 @@ export const editCreatedProperty = (propertyName) => { // Fetching for edit button cy.get(`[data-row-key="${propertyName}"]`) .find('[data-testid="edit-button"]') - .as('editbutton'); + .as('editButton'); - cy.get('@editbutton').click(); + cy.get('@editButton').click(); - cy.get(descriptionBox) - .should('be.visible') - .clear() - .type('This is new description'); + cy.get(descriptionBox).clear().type('This is new description'); interceptURL('PATCH', '/api/v1/metadata/types/*', 'checkPatchForDescription'); - cy.get('[data-testid="save"]').should('be.visible').click(); + cy.get('[data-testid="save"]').click(); - verifyResponseStatusCode('@checkPatchForDescription', 200); + cy.wait('@checkPatchForDescription', { timeout: 10000 }); cy.get('.ant-modal-wrap').should('not.exist'); @@ -934,10 +931,9 @@ export const editCreatedProperty = (propertyName) => { export const deleteCreatedProperty = (propertyName) => { // Fetching for delete button cy.get(`[data-row-key="${propertyName}"]`) + .scrollIntoView() .find('[data-testid="delete-button"]') - .as('deletebutton'); - - cy.get('@deletebutton').click(); + .click(); // Checking property name is present on the delete pop-up cy.get('[data-testid="body-text"]').should('contain', propertyName); @@ -1189,7 +1185,7 @@ export const addOwner = ( isGlossaryPage, isOwnerEmpty = false ) => { - interceptURL('GET', '/api/v1/users?limit=*&isBot=false', 'getUsers'); + interceptURL('GET', '/api/v1/users?limit=*&isBot=false*', 'getUsers'); if (isGlossaryPage && isOwnerEmpty) { cy.get('[data-testid="glossary-owner-name"] > [data-testid="Add"]').click(); } else { @@ -1221,10 +1217,11 @@ export const addOwner = ( }; export const removeOwner = (entity, isGlossaryPage) => { + interceptURL('GET', '/api/v1/users?limit=*&isBot=false*', 'getUsers'); interceptURL('PATCH', `/api/v1/${entity}/*`, 'patchOwner'); cy.get('[data-testid="edit-owner"]').click(); - + verifyResponseStatusCode('@getUsers', 200); cy.get('[data-testid="remove-owner"]').click(); verifyResponseStatusCode('@patchOwner', 200); if (isGlossaryPage) { diff --git a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Flow/AdvancedSearchQuickFilters.spec.js b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Flow/AdvancedSearchQuickFilters.spec.js index 3fc4595e824..13840387905 100644 --- a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Flow/AdvancedSearchQuickFilters.spec.js +++ b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Flow/AdvancedSearchQuickFilters.spec.js @@ -11,22 +11,24 @@ * limitations under the License. */ -import { addOwner, FIELDS, removeOwner } from '../../common/advancedSearch'; +import { addOwner, removeOwner } from '../../common/advancedSearch'; import { searchAndClickOnOption } from '../../common/advancedSearchQuickFilters'; import { interceptURL, verifyResponseStatusCode } from '../../common/common'; import { QUICK_FILTERS_BY_ASSETS } from '../../constants/advancedSearchQuickFilters.constants'; - -describe('Initial Setup for Advanced Search Quick Filters', () => { - beforeEach(() => { - cy.login(); - }); - - it('Pre-requisite for advance search', () => { - addOwner(FIELDS.Owner.searchCriteriaFirstGroup); - }); -}); +import { SEARCH_ENTITY_TABLE } from '../../constants/constants'; +const ownerName = 'Aaron Johnson'; describe(`Advanced search quick filters should work properly for assets`, () => { + before(() => { + cy.login(); + addOwner({ ownerName, ...SEARCH_ENTITY_TABLE.table_1 }); + }); + + after(() => { + cy.login(); + removeOwner(); + }); + beforeEach(() => { cy.login(); }); @@ -76,13 +78,3 @@ describe(`Advanced search quick filters should work properly for assets`, () => }); }); }); - -describe('Cleanup for Advanced Search Quick Filters', () => { - beforeEach(() => { - cy.login(); - }); - - it('Cleanup of owners', () => { - removeOwner(FIELDS.Owner.searchCriteriaFirstGroup); - }); -}); diff --git a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Flow/SearchFlow.spec.js b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Flow/SearchFlow.spec.js index fce7fccff31..b6163d275ad 100644 --- a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Flow/SearchFlow.spec.js +++ b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Flow/SearchFlow.spec.js @@ -14,9 +14,8 @@ // The spec is related to advance search feature import { - addOwner, - addTag, - addTier, + advanceSearchPreRequests, + ADVANCE_SEARCH_DATABASE_SERVICE, checkAddGroupWithOperator, checkAddRuleWithOperator, checkmustPaths, @@ -26,271 +25,229 @@ import { FIELDS, OPERATOR, } from '../../common/advancedSearch'; -import { - deleteCreatedService, - interceptURL, - mySqlConnectionInput, - testServiceCreationAndIngestion, - verifyResponseStatusCode, -} from '../../common/common'; -import { API_SERVICE, SERVICE_TYPE } from '../../constants/constants'; -import { MYSQL } from '../../constants/service.constants'; +import { hardDeleteService } from '../../common/entityUtils'; +import { USER_CREDENTIALS } from '../../constants/SearchIndexDetails.constants'; +import { SERVICE_CATEGORIES } from '../../constants/service.constants'; -const service_name = MYSQL.serviceName; - -describe.skip('pre-requests for test case', () => { - beforeEach(() => { +describe('Advance search', () => { + before(() => { cy.login(); - }); - - it('Pre-requisite for advance search', () => { - addOwner(FIELDS.Owner.searchCriteriaFirstGroup); - addTier(FIELDS.Tiers.searchCriteriaFirstGroup); - addTag(FIELDS.Tags.createTagName); - }); - - it('Mysql ingestion', () => { - interceptURL( - 'GET', - 'api/v1/teams/name/Organization?fields=*', - 'getSettingsPage' - ); - cy.get('[data-testid="app-bar-item-settings"]') - .should('be.visible') - .click(); - verifyResponseStatusCode('@getSettingsPage', 200); - // Services page - interceptURL('GET', '/api/v1/services/*', 'getServiceList'); - cy.get('[data-testid="global-setting-left-panel"]') - .contains(MYSQL.database) - .should('be.visible') - .click(); - - verifyResponseStatusCode('@getServiceList', 200); - - cy.get('[data-testid="add-service-button"]').should('be.visible').click(); - - // Add new service page - cy.url().should('include', '/add-service'); - cy.get('[data-testid="header"]').should('be.visible'); - cy.contains('Add New Service').should('be.visible'); - cy.get('[data-testid="service-category"]').should('be.visible'); - - const addIngestionInput = () => { - cy.get('[data-testid="schema-filter-pattern-checkbox"]') - .invoke('show') - .trigger('mouseover') - .check(); - cy.get('[data-testid="filter-pattern-includes-schema"]') - .scrollIntoView() - .should('be.visible') - .type(Cypress.env('mysqlDatabaseSchema')); - }; - - testServiceCreationAndIngestion({ - serviceType: MYSQL.serviceType, - connectionInput: mySqlConnectionInput, - addIngestionInput, - serviceName: service_name, - serviceCategory: SERVICE_TYPE.Database, - }); - }); -}); - -describe.skip('Single filed search', () => { - beforeEach(() => { - cy.login(); - }); - - Object.values(FIELDS).forEach((field) => { - it(`Verify advance search results for ${field.name} field and all condition`, () => { - Object.values(CONDITIONS_MUST).forEach((condition) => { - checkmustPaths( - condition.name, - field.testid, - field.searchCriteriaFirstGroup, - 0, - field.responseValueFirstGroup - ); - }); - - Object.values(CONDITIONS_MUST_NOT).forEach((condition) => { - checkmust_notPaths( - condition.name, - field.testid, - field.searchCriteriaFirstGroup, - 0, - field.responseValueFirstGroup - ); - }); + cy.getAllLocalStorage().then((data) => { + const token = Object.values(data)[0].oidcIdToken; + advanceSearchPreRequests(token); }); }); after(() => { - Cypress.session.clearAllSavedSessions(); - }); -}); - -describe.skip('Group search', () => { - beforeEach(() => { cy.login(); - }); + cy.getAllLocalStorage().then((data) => { + const token = Object.values(data)[0].oidcIdToken; - Object.values(OPERATOR).forEach((operator) => { - it(`Verify Add group functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.equalTo.name} and ${CONDITIONS_MUST_NOT.notEqualTo.name} `, () => { - Object.values(FIELDS).forEach((field) => { - let val = field.searchCriteriaSecondGroup; - if (field.owner) { - val = field.responseValueSecondGroup; - } - checkAddGroupWithOperator( - CONDITIONS_MUST.equalTo.name, - CONDITIONS_MUST_NOT.notEqualTo.name, - field.testid, - field.searchCriteriaFirstGroup, - field.searchCriteriaSecondGroup, - 0, - 1, - operator.index, - CONDITIONS_MUST.equalTo.filter, - CONDITIONS_MUST_NOT.notEqualTo.filter, - field.responseValueFirstGroup, - val - ); + hardDeleteService({ + token, + serviceFqn: ADVANCE_SEARCH_DATABASE_SERVICE.service.name, + serviceType: SERVICE_CATEGORIES.DATABASE_SERVICES, }); - }); - - it(`Verify Add group functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.anyIn.name} and ${CONDITIONS_MUST_NOT.notIn.name} `, () => { - Object.values(FIELDS).forEach((field) => { - let val = field.searchCriteriaSecondGroup; - if (field.owner) { - val = field.responseValueSecondGroup; - } - checkAddGroupWithOperator( - CONDITIONS_MUST.anyIn.name, - CONDITIONS_MUST_NOT.notIn.name, - field.testid, - field.searchCriteriaFirstGroup, - field.searchCriteriaSecondGroup, - 0, - 1, - operator.index, - CONDITIONS_MUST.anyIn.filter, - CONDITIONS_MUST_NOT.notIn.filter, - field.responseValueFirstGroup, - val - ); - }); - }); - - it(`Verify Add group functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.contains.name} and ${CONDITIONS_MUST_NOT.notContains.name} `, () => { - Object.values(FIELDS).forEach((field) => { - let val = field.searchCriteriaSecondGroup; - - checkAddGroupWithOperator( - CONDITIONS_MUST.contains.name, - CONDITIONS_MUST_NOT.notContains.name, - field.testid, - field.searchCriteriaFirstGroup, - field.searchCriteriaSecondGroup, - 0, - 1, - operator.index, - CONDITIONS_MUST.contains.filter, - CONDITIONS_MUST_NOT.notContains.filter, - field.responseValueFirstGroup, - val - ); + // Delete created user + cy.request({ + method: 'DELETE', + url: `/api/v1/users/${USER_CREDENTIALS.id}?hardDelete=true&recursive=false`, + headers: { Authorization: `Bearer ${token}` }, }); }); }); - after(() => { - Cypress.session.clearAllSavedSessions(); - }); -}); - -describe.skip('Search with additional rule', () => { - beforeEach(() => { - cy.login(); - }); - - Object.values(OPERATOR).forEach((operator) => { - it(`Verify Add Rule functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.equalTo.name} and ${CONDITIONS_MUST_NOT.notEqualTo.name} `, () => { - Object.values(FIELDS).forEach((field) => { - let val = field.searchCriteriaSecondGroup; - if (field.owner) { - val = field.responseValueSecondGroup; - } - checkAddRuleWithOperator( - CONDITIONS_MUST.equalTo.name, - CONDITIONS_MUST_NOT.notEqualTo.name, - field.testid, - field.searchCriteriaFirstGroup, - field.searchCriteriaSecondGroup, - 0, - 1, - operator.index, - CONDITIONS_MUST.equalTo.filter, - CONDITIONS_MUST_NOT.notEqualTo.filter, - field.responseValueFirstGroup, - val - ); - }); - }); - - it(`Verify Add Rule functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.anyIn.name} and ${CONDITIONS_MUST_NOT.notIn.name} `, () => { - Object.values(FIELDS).forEach((field) => { - let val = field.searchCriteriaSecondGroup; - if (field.owner) { - val = field.responseValueSecondGroup; - } - checkAddRuleWithOperator( - CONDITIONS_MUST.anyIn.name, - CONDITIONS_MUST_NOT.notIn.name, - field.testid, - field.searchCriteriaFirstGroup, - field.searchCriteriaSecondGroup, - 0, - 1, - operator.index, - CONDITIONS_MUST.anyIn.filter, - CONDITIONS_MUST_NOT.notIn.filter, - field.responseValueFirstGroup, - val - ); - }); - }); - - it(`Verify Add Rule functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.contains.name} and ${CONDITIONS_MUST_NOT.notContains.name} `, () => { - Object.values(FIELDS).forEach((field) => { - let val = field.searchCriteriaSecondGroup; - checkAddRuleWithOperator( - CONDITIONS_MUST.contains.name, - CONDITIONS_MUST_NOT.notContains.name, - field.testid, - field.searchCriteriaFirstGroup, - field.searchCriteriaSecondGroup, - 0, - 1, - operator.index, - CONDITIONS_MUST.contains.filter, - CONDITIONS_MUST_NOT.notContains.filter, - field.responseValueFirstGroup, - val - ); - }); - }); - }); - - it('Delete Created Service', () => { - deleteCreatedService( - MYSQL.database, - service_name, - API_SERVICE.databaseServices - ); - }); - - after(() => { - Cypress.session.clearAllSavedSessions(); + + describe('Single filed search', () => { + beforeEach(() => { + cy.login(); + }); + + Object.values(FIELDS).forEach((field) => { + it(`Verify advance search results for ${field.name} field and all condition`, () => { + Object.values(CONDITIONS_MUST).forEach((condition) => { + checkmustPaths( + condition.name, + field.testid, + field.searchCriteriaFirstGroup, + 0, + field.responseValueFirstGroup + ); + }); + + Object.values(CONDITIONS_MUST_NOT).forEach((condition) => { + checkmust_notPaths( + condition.name, + field.testid, + field.searchCriteriaFirstGroup, + 0, + field.responseValueFirstGroup + ); + }); + }); + }); + + after(() => { + cy.logout(); + Cypress.session.clearAllSavedSessions(); + }); + }); + + describe('Group search', () => { + beforeEach(() => { + cy.login(); + }); + + Object.values(OPERATOR).forEach((operator) => { + it(`Verify Add group functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.equalTo.name} and ${CONDITIONS_MUST_NOT.notEqualTo.name} `, () => { + Object.values(FIELDS).forEach((field) => { + let val = field.searchCriteriaSecondGroup; + if (field.owner) { + val = field.responseValueSecondGroup; + } + checkAddGroupWithOperator( + CONDITIONS_MUST.equalTo.name, + CONDITIONS_MUST_NOT.notEqualTo.name, + field.testid, + field.searchCriteriaFirstGroup, + field.searchCriteriaSecondGroup, + 0, + 1, + operator.index, + CONDITIONS_MUST.equalTo.filter, + CONDITIONS_MUST_NOT.notEqualTo.filter, + field.responseValueFirstGroup, + val + ); + }); + }); + + it(`Verify Add group functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.anyIn.name} and ${CONDITIONS_MUST_NOT.notIn.name} `, () => { + Object.values(FIELDS).forEach((field) => { + let val = field.searchCriteriaSecondGroup; + if (field.owner) { + val = field.responseValueSecondGroup; + } + checkAddGroupWithOperator( + CONDITIONS_MUST.anyIn.name, + CONDITIONS_MUST_NOT.notIn.name, + field.testid, + field.searchCriteriaFirstGroup, + field.searchCriteriaSecondGroup, + 0, + 1, + operator.index, + CONDITIONS_MUST.anyIn.filter, + CONDITIONS_MUST_NOT.notIn.filter, + field.responseValueFirstGroup, + val + ); + }); + }); + + it(`Verify Add group functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.contains.name} and ${CONDITIONS_MUST_NOT.notContains.name} `, () => { + Object.values(FIELDS).forEach((field) => { + let val = field.searchCriteriaSecondGroup; + + checkAddGroupWithOperator( + CONDITIONS_MUST.contains.name, + CONDITIONS_MUST_NOT.notContains.name, + field.testid, + field.searchCriteriaFirstGroup, + field.searchCriteriaSecondGroup, + 0, + 1, + operator.index, + CONDITIONS_MUST.contains.filter, + CONDITIONS_MUST_NOT.notContains.filter, + field.responseValueFirstGroup, + val + ); + }); + }); + }); + + after(() => { + cy.logout(); + Cypress.session.clearAllSavedSessions(); + }); + }); + + describe('Search with additional rule', () => { + beforeEach(() => { + cy.login(); + }); + + Object.values(OPERATOR).forEach((operator) => { + it(`Verify Add Rule functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.equalTo.name} and ${CONDITIONS_MUST_NOT.notEqualTo.name} `, () => { + Object.values(FIELDS).forEach((field) => { + let val = field.searchCriteriaSecondGroup; + if (field.owner) { + val = field.responseValueSecondGroup; + } + checkAddRuleWithOperator( + CONDITIONS_MUST.equalTo.name, + CONDITIONS_MUST_NOT.notEqualTo.name, + field.testid, + field.searchCriteriaFirstGroup, + field.searchCriteriaSecondGroup, + 0, + 1, + operator.index, + CONDITIONS_MUST.equalTo.filter, + CONDITIONS_MUST_NOT.notEqualTo.filter, + field.responseValueFirstGroup, + val + ); + }); + }); + + it(`Verify Add Rule functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.anyIn.name} and ${CONDITIONS_MUST_NOT.notIn.name} `, () => { + Object.values(FIELDS).forEach((field) => { + let val = field.searchCriteriaSecondGroup; + if (field.owner) { + val = field.responseValueSecondGroup; + } + checkAddRuleWithOperator( + CONDITIONS_MUST.anyIn.name, + CONDITIONS_MUST_NOT.notIn.name, + field.testid, + field.searchCriteriaFirstGroup, + field.searchCriteriaSecondGroup, + 0, + 1, + operator.index, + CONDITIONS_MUST.anyIn.filter, + CONDITIONS_MUST_NOT.notIn.filter, + field.responseValueFirstGroup, + val + ); + }); + }); + + it(`Verify Add Rule functionality for All with ${operator.name} operator & condition ${CONDITIONS_MUST.contains.name} and ${CONDITIONS_MUST_NOT.notContains.name} `, () => { + Object.values(FIELDS).forEach((field) => { + let val = field.searchCriteriaSecondGroup; + checkAddRuleWithOperator( + CONDITIONS_MUST.contains.name, + CONDITIONS_MUST_NOT.notContains.name, + field.testid, + field.searchCriteriaFirstGroup, + field.searchCriteriaSecondGroup, + 0, + 1, + operator.index, + CONDITIONS_MUST.contains.filter, + CONDITIONS_MUST_NOT.notContains.filter, + field.responseValueFirstGroup, + val + ); + }); + }); + }); + + after(() => { + cy.logout(); + Cypress.session.clearAllSavedSessions(); + }); }); }); diff --git a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/SearchIndexDetails.spec.js b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/SearchIndexDetails.spec.js index 8bb25cc9560..e3e042154db 100644 --- a/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/SearchIndexDetails.spec.js +++ b/openmetadata-ui/src/main/resources/ui/cypress/e2e/Pages/SearchIndexDetails.spec.js @@ -210,18 +210,14 @@ describe('SearchIndexDetails page should work properly for data consumer role', }); // Edit domain option should not be available - cy.get(`[data-testid="entity-page-header"]`).then(($body) => { - const editDomain = $body.find(`[data-testid="add-domain"]`); - - expect(editDomain.length).to.equal(0); - }); + cy.get( + `[data-testid="entity-page-header"] [data-testid="add-domain"]` + ).should('not.exist'); // Manage button should not be visible on service page - cy.get('[data-testid="asset-header-btn-group"]').then(($body) => { - const manageButton = $body.find(`[data-testid="manage-button"]`); - - expect(manageButton.length).to.equal(0); - }); + cy.get( + '[data-testid="asset-header-btn-group"] [data-testid="manage-button"]' + ).should('not.exist'); performCommonOperations(); }); @@ -376,31 +372,17 @@ describe('SearchIndexDetails page should work properly for admin role', () => { cy.get('[data-testid="deleted-badge"]').should('be.visible'); // Edit options for domain owner and tier should not be visible - cy.get(`[data-testid="entity-page-header"]`).then(($body) => { - const editDomain = $body.find(`[data-testid="add-domain"]`); - const editOwner = $body.find(`[data-testid="edit-owner"]`); - const editTier = $body.find(`[data-testid="edit-tier"]`); - - expect(editDomain.length).to.equal(0); - expect(editOwner.length).to.equal(0); - expect(editTier.length).to.equal(0); - }); + cy.get('[data-testid="add-domain"]').should('not.exist'); + cy.get('[data-testid="edit-owner"]').should('not.exist'); + cy.get('[data-testid="edit-tier"]').should('not.exist'); // Edit description button should not be visible - cy.get(`[data-testid="asset-description-container"]`).then(($body) => { - const editDescription = $body.find(`[data-testid="edit-description"]`); - - expect(editDescription.length).to.equal(0); - }); + cy.get('[data-testid="edit-description"]').should('not.exist'); // Edit tags button should not be visible cy.get( - `[data-testid="entity-right-panel"] [data-testid="tags-container"]` - ).then(($body) => { - const addTag = $body.find(`[data-testid="add-tag"]`); - - expect(addTag.length).to.equal(0); - }); + `[data-testid="entity-right-panel"] [data-testid="tags-container"] [data-testid="add-tag"]` + ).should('not.exist'); // Edit description and tags button for fields should not be visible cy.get( diff --git a/openmetadata-ui/src/main/resources/ui/src/components/Explore/AdvanceSearchModal.component.tsx b/openmetadata-ui/src/main/resources/ui/src/components/Explore/AdvanceSearchModal.component.tsx index 8f23da6fd18..523ccd8c34c 100644 --- a/openmetadata-ui/src/main/resources/ui/src/components/Explore/AdvanceSearchModal.component.tsx +++ b/openmetadata-ui/src/main/resources/ui/src/components/Explore/AdvanceSearchModal.component.tsx @@ -91,14 +91,21 @@ export const AdvancedSearchModal: FunctionComponent = ({ destroyOnClose className="advanced-search-modal" closeIcon={null} + data-testid="advanced-search-modal" footer={ -
- - +