mirror of
				https://github.com/open-metadata/OpenMetadata.git
				synced 2025-10-31 10:39:30 +00:00 
			
		
		
		
	migration: fully migrated customize landing page to playwright (#17803)
* fully migrated customize landing page to playwright * changes made as per comments
This commit is contained in:
		
							parent
							
								
									17744f42dc
								
							
						
					
					
						commit
						dbbd932cf7
					
				| @ -1,123 +0,0 @@ | |||||||
| /* |  | ||||||
|  *  Copyright 2024 Collate. |  | ||||||
|  *  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. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| import { GlobalSettingOptions } from '../constants/settings.constant'; |  | ||||||
| import { |  | ||||||
|   interceptURL, |  | ||||||
|   toastNotification, |  | ||||||
|   verifyResponseStatusCode, |  | ||||||
| } from './common'; |  | ||||||
| 
 |  | ||||||
| export const removeAndCheckWidget = ({ widgetTestId, widgetKey }) => { |  | ||||||
|   // Click on remove widget button
 |  | ||||||
|   cy.get( |  | ||||||
|     `[data-testid="${widgetTestId}"] [data-testid="remove-widget-button"]` |  | ||||||
|   ).click({ waitForAnimations: true }); |  | ||||||
| 
 |  | ||||||
|   cy.get(`[data-testid="${widgetTestId}"]`).should('not.exist'); |  | ||||||
| 
 |  | ||||||
|   // Check if empty widget placeholder is displayed in place of removed widget
 |  | ||||||
|   cy.get( |  | ||||||
|     `[data-testid*="${widgetKey}"][data-testid$="EmptyWidgetPlaceholder"]` |  | ||||||
|   ).should('exist'); |  | ||||||
| 
 |  | ||||||
|   // Remove empty widget placeholder
 |  | ||||||
|   cy.get( |  | ||||||
|     `[data-testid*="${widgetKey}"][data-testid$="EmptyWidgetPlaceholder"] [data-testid="remove-widget-button"]` |  | ||||||
|   ).click({ waitForAnimations: true }); |  | ||||||
|   cy.get( |  | ||||||
|     `[data-testid*="${widgetKey}"][data-testid$="EmptyWidgetPlaceholder"]` |  | ||||||
|   ).should('not.exist'); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export const navigateToCustomizeLandingPage = ({ |  | ||||||
|   personaName, |  | ||||||
|   customPageDataResponse, |  | ||||||
| }) => { |  | ||||||
|   interceptURL('GET', '/api/v1/personas*', 'getPersonas'); |  | ||||||
| 
 |  | ||||||
|   cy.settingClick(GlobalSettingOptions.CUSTOMIZE_LANDING_PAGE); |  | ||||||
| 
 |  | ||||||
|   verifyResponseStatusCode('@getPersonas', 200); |  | ||||||
| 
 |  | ||||||
|   interceptURL( |  | ||||||
|     'GET', |  | ||||||
|     `/api/v1/docStore/name/persona.${personaName}.Page.LandingPage`, |  | ||||||
|     'getCustomPageData' |  | ||||||
|   ); |  | ||||||
|   interceptURL( |  | ||||||
|     'GET', |  | ||||||
|     '/api/v1/search/query?q=*%20AND%20followers:**', |  | ||||||
|     'getFollowersData' |  | ||||||
|   ); |  | ||||||
| 
 |  | ||||||
|   cy.get( |  | ||||||
|     `[data-testid="persona-details-card-${personaName}"] [data-testid="customize-page-button"]` |  | ||||||
|   ).click(); |  | ||||||
| 
 |  | ||||||
|   verifyResponseStatusCode('@getCustomPageData', customPageDataResponse); |  | ||||||
|   verifyResponseStatusCode('@getFollowersData', 200); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export const saveLayout = () => { |  | ||||||
|   // Save layout
 |  | ||||||
|   interceptURL('PATCH', `/api/v1/docStore/*`, 'getMyData'); |  | ||||||
| 
 |  | ||||||
|   cy.get('[data-testid="save-button"]').click(); |  | ||||||
| 
 |  | ||||||
|   verifyResponseStatusCode('@getMyData', 200); |  | ||||||
| 
 |  | ||||||
|   toastNotification('Page layout updated successfully.'); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export const navigateToLandingPage = () => { |  | ||||||
|   interceptURL('GET', `/api/v1/feed*`, 'getFeedsData'); |  | ||||||
|   interceptURL( |  | ||||||
|     'GET', |  | ||||||
|     `/api/v1/analytics/dataInsights/system/charts/name/total_data_assets/data?*`, |  | ||||||
|     'getDataInsightReport' |  | ||||||
|   ); |  | ||||||
| 
 |  | ||||||
|   cy.get('#openmetadata_logo').click(); |  | ||||||
| 
 |  | ||||||
|   verifyResponseStatusCode('@getFeedsData', 200); |  | ||||||
|   verifyResponseStatusCode('@getDataInsightReport', 200); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export const openAddWidgetModal = () => { |  | ||||||
|   interceptURL( |  | ||||||
|     'GET', |  | ||||||
|     `/api/v1/docStore?fqnPrefix=KnowledgePanel&limit=25`, |  | ||||||
|     'getWidgetsList' |  | ||||||
|   ); |  | ||||||
| 
 |  | ||||||
|   cy.get( |  | ||||||
|     '[data-testid="ExtraWidget.EmptyWidgetPlaceholder"] [data-testid="add-widget-button"]' |  | ||||||
|   ).click(); |  | ||||||
| 
 |  | ||||||
|   verifyResponseStatusCode('@getWidgetsList', 200); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export const checkAllWidgets = (checkEmptyWidgetPlaceholder = false) => { |  | ||||||
|   cy.get('[data-testid="activity-feed-widget"]').should('exist'); |  | ||||||
|   cy.get('[data-testid="following-widget"]').should('exist'); |  | ||||||
|   cy.get('[data-testid="recently-viewed-widget"]').should('exist'); |  | ||||||
|   cy.get('[data-testid="my-data-widget"]').should('exist'); |  | ||||||
|   cy.get('[data-testid="kpi-widget"]').should('exist'); |  | ||||||
|   cy.get('[data-testid="total-assets-widget"]').should('exist'); |  | ||||||
|   if (checkEmptyWidgetPlaceholder) { |  | ||||||
|     cy.get('[data-testid="ExtraWidget.EmptyWidgetPlaceholder"]').should( |  | ||||||
|       'exist' |  | ||||||
|     ); |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| @ -446,12 +446,6 @@ export const USER_DETAILS = { | |||||||
|   password: 'User@OMD123', |   password: 'User@OMD123', | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export const PERSONA_DETAILS = { |  | ||||||
|   name: `persona-${uuid()}`, |  | ||||||
|   displayName: `persona ${uuid()}`, |  | ||||||
|   description: `Persona description.`, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| export const DOMAIN_CREATION_DETAILS = { | export const DOMAIN_CREATION_DETAILS = { | ||||||
|   name: `domain-name-${uuid()}`, |   name: `domain-name-${uuid()}`, | ||||||
|   description: `Description for`, |   description: `Description for`, | ||||||
|  | |||||||
| @ -1,238 +0,0 @@ | |||||||
| /* |  | ||||||
|  *  Copyright 2024 Collate. |  | ||||||
|  *  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. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| import { compare } from 'fast-json-patch'; |  | ||||||
| import { interceptURL, toastNotification } from '../../common/common'; |  | ||||||
| import { |  | ||||||
|   checkAllWidgets, |  | ||||||
|   navigateToCustomizeLandingPage, |  | ||||||
|   navigateToLandingPage, |  | ||||||
|   openAddWidgetModal, |  | ||||||
|   removeAndCheckWidget, |  | ||||||
|   saveLayout, |  | ||||||
| } from '../../common/CustomizeLandingPageUtils'; |  | ||||||
| import { getToken } from '../../common/Utils/LocalStorage'; |  | ||||||
| import { PERSONA_DETAILS } from '../../constants/EntityConstant'; |  | ||||||
| 
 |  | ||||||
| describe('Customize Landing Page Flow', { tags: 'Settings' }, () => { |  | ||||||
|   const testData = {}; |  | ||||||
|   before(() => { |  | ||||||
|     cy.login(); |  | ||||||
|     cy.getAllLocalStorage().then((data) => { |  | ||||||
|       const token = getToken(data); |  | ||||||
| 
 |  | ||||||
|       // Fetch logged in user details to get user id
 |  | ||||||
|       cy.request({ |  | ||||||
|         method: 'GET', |  | ||||||
|         url: `/api/v1/users/loggedInUser`, |  | ||||||
|         headers: { Authorization: `Bearer ${token}` }, |  | ||||||
|       }).then((userResponse) => { |  | ||||||
|         // Create a persona
 |  | ||||||
|         cy.request({ |  | ||||||
|           method: 'POST', |  | ||||||
|           url: `/api/v1/personas`, |  | ||||||
|           headers: { Authorization: `Bearer ${token}` }, |  | ||||||
|           body: { ...PERSONA_DETAILS, users: [userResponse.body.id] }, |  | ||||||
|         }).then((personaResponse) => { |  | ||||||
|           testData.user = userResponse.body; |  | ||||||
|           testData.persona = personaResponse.body; |  | ||||||
|           const { |  | ||||||
|             name, |  | ||||||
|             id, |  | ||||||
|             description, |  | ||||||
|             displayName, |  | ||||||
|             fullyQualifiedName, |  | ||||||
|             href, |  | ||||||
|           } = personaResponse.body; |  | ||||||
| 
 |  | ||||||
|           // Set newly created persona as default persona for the logged in user
 |  | ||||||
|           const patchData = compare(userResponse.body, { |  | ||||||
|             ...userResponse.body, |  | ||||||
|             defaultPersona: { |  | ||||||
|               name, |  | ||||||
|               id, |  | ||||||
|               description, |  | ||||||
|               displayName, |  | ||||||
|               fullyQualifiedName, |  | ||||||
|               href, |  | ||||||
|               type: 'persona', |  | ||||||
|             }, |  | ||||||
|           }); |  | ||||||
| 
 |  | ||||||
|           cy.request({ |  | ||||||
|             method: 'PATCH', |  | ||||||
|             url: `/api/v1/users/${testData.user.id}`, |  | ||||||
|             headers: { |  | ||||||
|               Authorization: `Bearer ${token}`, |  | ||||||
|               'Content-Type': 'application/json-patch+json', |  | ||||||
|             }, |  | ||||||
|             body: patchData, |  | ||||||
|           }); |  | ||||||
|         }); |  | ||||||
|       }); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   after(() => { |  | ||||||
|     cy.login(); |  | ||||||
|     cy.getAllLocalStorage().then((data) => { |  | ||||||
|       const token = getToken(data); |  | ||||||
| 
 |  | ||||||
|       // Delete created user
 |  | ||||||
|       cy.request({ |  | ||||||
|         method: 'DELETE', |  | ||||||
|         url: `/api/v1/personas/${testData.persona.id}`, |  | ||||||
|         headers: { Authorization: `Bearer ${token}` }, |  | ||||||
|       }); |  | ||||||
| 
 |  | ||||||
|       // Delete created landing page config doc
 |  | ||||||
|       cy.request({ |  | ||||||
|         method: 'DELETE', |  | ||||||
|         url: `/api/v1/docStore/${testData.docStoreData.id}`, |  | ||||||
|         headers: { Authorization: `Bearer ${token}` }, |  | ||||||
|       }); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   beforeEach(() => { |  | ||||||
|     cy.login(); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   it('Creation of custom landing page config and widget removal should work properly', () => { |  | ||||||
|     navigateToCustomizeLandingPage({ |  | ||||||
|       personaName: PERSONA_DETAILS.name, |  | ||||||
|       customPageDataResponse: 404, |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     checkAllWidgets(true); |  | ||||||
| 
 |  | ||||||
|     // Editing the layout
 |  | ||||||
|     removeAndCheckWidget({ |  | ||||||
|       widgetTestId: 'activity-feed-widget', |  | ||||||
|       widgetKey: 'KnowledgePanel.ActivityFeed', |  | ||||||
|     }); |  | ||||||
|     removeAndCheckWidget({ |  | ||||||
|       widgetTestId: 'following-widget', |  | ||||||
|       widgetKey: 'KnowledgePanel.Following', |  | ||||||
|     }); |  | ||||||
|     removeAndCheckWidget({ |  | ||||||
|       widgetTestId: 'kpi-widget', |  | ||||||
|       widgetKey: 'KnowledgePanel.KPI', |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     // Save layout
 |  | ||||||
|     interceptURL('POST', `/api/v1/docStore`, 'getMyData'); |  | ||||||
| 
 |  | ||||||
|     cy.get('[data-testid="save-button"]').click(); |  | ||||||
| 
 |  | ||||||
|     cy.wait('@getMyData').then((interception) => { |  | ||||||
|       testData.docStoreData = interception.response.body; |  | ||||||
| 
 |  | ||||||
|       expect(interception.response.statusCode).equal(201); |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     toastNotification('Page layout created successfully.'); |  | ||||||
| 
 |  | ||||||
|     cy.goToHomePage(); |  | ||||||
| 
 |  | ||||||
|     // Check if removed widgets are not present on landing page
 |  | ||||||
|     cy.get(`[data-testid="activity-feed-widget"]`).should('not.exist'); |  | ||||||
|     cy.get(`[data-testid="following-widget"]`).should('not.exist'); |  | ||||||
|     cy.get(`[data-testid="kpi-widget"]`).should('not.exist'); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   it('Adding new widget should work properly', () => { |  | ||||||
|     navigateToCustomizeLandingPage({ |  | ||||||
|       personaName: PERSONA_DETAILS.name, |  | ||||||
|       customPageDataResponse: 200, |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     // Check if removed widgets are not present on customize page
 |  | ||||||
|     cy.get('[data-testid="activity-feed-widget"]').should('not.exist'); |  | ||||||
|     cy.get('[data-testid="following-widget"]').should('not.exist'); |  | ||||||
|     cy.get('[data-testid="kpi-widget"]').should('not.exist'); |  | ||||||
| 
 |  | ||||||
|     // Check if other widgets are present
 |  | ||||||
|     cy.get('[data-testid="recently-viewed-widget"]').should('exist'); |  | ||||||
|     cy.get('[data-testid="my-data-widget"]').should('exist'); |  | ||||||
|     cy.get('[data-testid="total-assets-widget"]').should('exist'); |  | ||||||
|     cy.get('[data-testid="ExtraWidget.EmptyWidgetPlaceholder"]').should( |  | ||||||
|       'exist' |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     openAddWidgetModal(); |  | ||||||
| 
 |  | ||||||
|     // Check if 'check' icon is present for existing widgets
 |  | ||||||
|     cy.get('[data-testid="MyData-check-icon"]').should('exist'); |  | ||||||
|     cy.get('[data-testid="RecentlyViewed-check-icon"]').should('exist'); |  | ||||||
|     cy.get('[data-testid="TotalAssets-check-icon"]').should('exist'); |  | ||||||
| 
 |  | ||||||
|     // Check if 'check' icon is not present for removed widgets
 |  | ||||||
|     cy.get('[data-testid="ActivityFeed-check-icon"]').should('not.exist'); |  | ||||||
|     cy.get('[data-testid="Following-check-icon"]').should('not.exist'); |  | ||||||
|     cy.get('[data-testid="KPI-check-icon"]').should('not.exist'); |  | ||||||
| 
 |  | ||||||
|     // Add Following widget
 |  | ||||||
|     cy.get('[data-testid="Following-widget-tab-label"]').click(); |  | ||||||
|     cy.get( |  | ||||||
|       '[aria-labelledby$="KnowledgePanel.Following"] [data-testid="add-widget-button"]' |  | ||||||
|     ).click(); |  | ||||||
|     cy.get('[data-testid="following-widget"]').should('exist'); |  | ||||||
| 
 |  | ||||||
|     // Check if check icons are present in tab labels for newly added widgets
 |  | ||||||
|     openAddWidgetModal(); |  | ||||||
|     cy.get('[data-testid="Following-check-icon"]').should('exist'); |  | ||||||
|     cy.get('[data-testid="add-widget-modal"] [aria-label="Close"]').click(); |  | ||||||
| 
 |  | ||||||
|     saveLayout(); |  | ||||||
| 
 |  | ||||||
|     navigateToLandingPage(); |  | ||||||
| 
 |  | ||||||
|     cy.get(`[data-testid="activity-feed-widget"]`).should('not.exist'); |  | ||||||
|     cy.get(`[data-testid="kpi-widget"]`).should('not.exist'); |  | ||||||
| 
 |  | ||||||
|     // Check if newly added widgets are present on landing page
 |  | ||||||
|     cy.get(`[data-testid="following-widget"]`).should('exist'); |  | ||||||
|   }); |  | ||||||
| 
 |  | ||||||
|   it('Resetting the layout flow should work properly', () => { |  | ||||||
|     // Check if removed widgets are not present on landing page
 |  | ||||||
|     cy.get(`[data-testid="activity-feed-widget"]`).should('not.exist'); |  | ||||||
|     cy.get(`[data-testid="kpi-widget"]`).should('not.exist'); |  | ||||||
| 
 |  | ||||||
|     navigateToCustomizeLandingPage({ |  | ||||||
|       personaName: PERSONA_DETAILS.name, |  | ||||||
|       customPageDataResponse: 200, |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     // Check if removed widgets are not present on customize page
 |  | ||||||
|     cy.get(`[data-testid="activity-feed-widget"]`).should('not.exist'); |  | ||||||
|     cy.get(`[data-testid="kpi-widget"]`).should('not.exist'); |  | ||||||
| 
 |  | ||||||
|     cy.get(`[data-testid="reset-button"]`).click(); |  | ||||||
| 
 |  | ||||||
|     cy.get(`[data-testid="reset-layout-modal"] .ant-modal-footer`) |  | ||||||
|       .contains('Yes') |  | ||||||
|       .click(); |  | ||||||
| 
 |  | ||||||
|     toastNotification('Page layout updated successfully.'); |  | ||||||
| 
 |  | ||||||
|     // Check if all widgets are present after resetting the layout
 |  | ||||||
|     checkAllWidgets(true); |  | ||||||
| 
 |  | ||||||
|     // Check if all widgets are present on landing page
 |  | ||||||
|     navigateToLandingPage(); |  | ||||||
| 
 |  | ||||||
|     checkAllWidgets(); |  | ||||||
|   }); |  | ||||||
| }); |  | ||||||
| @ -14,11 +14,13 @@ import { expect, Page, test as base } from '@playwright/test'; | |||||||
| import { PersonaClass } from '../../support/persona/PersonaClass'; | import { PersonaClass } from '../../support/persona/PersonaClass'; | ||||||
| import { UserClass } from '../../support/user/UserClass'; | import { UserClass } from '../../support/user/UserClass'; | ||||||
| import { performAdminLogin } from '../../utils/admin'; | import { performAdminLogin } from '../../utils/admin'; | ||||||
| import { redirectToHomePage, toastNotification } from '../../utils/common'; | import { redirectToHomePage } from '../../utils/common'; | ||||||
| import { | import { | ||||||
|   checkAllDefaultWidgets, |   checkAllDefaultWidgets, | ||||||
|   navigateToCustomizeLandingPage, |   navigateToCustomizeLandingPage, | ||||||
|  |   openAddCustomizeWidgetModal, | ||||||
|   removeAndCheckWidget, |   removeAndCheckWidget, | ||||||
|  |   saveCustomizeLayoutPage, | ||||||
|   setUserDefaultPersona, |   setUserDefaultPersona, | ||||||
| } from '../../utils/customizeLandingPage'; | } from '../../utils/customizeLandingPage'; | ||||||
| 
 | 
 | ||||||
| @ -59,44 +61,199 @@ test.describe('Customize Landing Page Flow', () => { | |||||||
|     await checkAllDefaultWidgets(adminPage); |     await checkAllDefaultWidgets(adminPage); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   test('Remove and check widget', async ({ adminPage }) => { |   test('Add,Remove and Reset widget should work properly', async ({ | ||||||
|  |     adminPage, | ||||||
|  |   }) => { | ||||||
|  |     test.slow(true); | ||||||
|  | 
 | ||||||
|     await redirectToHomePage(adminPage); |     await redirectToHomePage(adminPage); | ||||||
|     await setUserDefaultPersona(adminPage, persona.responseData.displayName); |     await setUserDefaultPersona(adminPage, persona.responseData.displayName); | ||||||
|     await navigateToCustomizeLandingPage(adminPage, { | 
 | ||||||
|       personaName: persona.responseData.name, |     await test.step('Remove widget', async () => { | ||||||
|       customPageDataResponse: 404, |       await navigateToCustomizeLandingPage(adminPage, { | ||||||
|  |         personaName: persona.responseData.name, | ||||||
|  |         customPageDataResponse: 404, | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       await removeAndCheckWidget(adminPage, { | ||||||
|  |         widgetTestId: 'activity-feed-widget', | ||||||
|  |         widgetKey: 'KnowledgePanel.ActivityFeed', | ||||||
|  |       }); | ||||||
|  |       await removeAndCheckWidget(adminPage, { | ||||||
|  |         widgetTestId: 'following-widget', | ||||||
|  |         widgetKey: 'KnowledgePanel.Following', | ||||||
|  |       }); | ||||||
|  |       await removeAndCheckWidget(adminPage, { | ||||||
|  |         widgetTestId: 'kpi-widget', | ||||||
|  |         widgetKey: 'KnowledgePanel.KPI', | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       await saveCustomizeLayoutPage(adminPage, true); | ||||||
|  | 
 | ||||||
|  |       await redirectToHomePage(adminPage); | ||||||
|  | 
 | ||||||
|  |       // Check if removed widgets are not present on landing adminPage
 | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="activity-feed-widget"]') | ||||||
|  |       ).not.toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="following-widget"]') | ||||||
|  |       ).not.toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="kpi-widget"]') | ||||||
|  |       ).not.toBeVisible(); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     await removeAndCheckWidget(adminPage, { |     await test.step('Add widget', async () => { | ||||||
|       widgetTestId: 'activity-feed-widget', |       await navigateToCustomizeLandingPage(adminPage, { | ||||||
|       widgetKey: 'KnowledgePanel.ActivityFeed', |         personaName: persona.responseData.name, | ||||||
|     }); |         customPageDataResponse: 200, | ||||||
|     await removeAndCheckWidget(adminPage, { |       }); | ||||||
|       widgetTestId: 'following-widget', | 
 | ||||||
|       widgetKey: 'KnowledgePanel.Following', |       // Check if removed widgets are not present on customize page
 | ||||||
|     }); |       await expect( | ||||||
|     await removeAndCheckWidget(adminPage, { |         adminPage.locator('[data-testid="activity-feed-widget"]') | ||||||
|       widgetTestId: 'kpi-widget', |       ).not.toBeVisible(); | ||||||
|       widgetKey: 'KnowledgePanel.KPI', |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="following-widget"]') | ||||||
|  |       ).not.toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="kpi-widget"]') | ||||||
|  |       ).not.toBeVisible(); | ||||||
|  | 
 | ||||||
|  |       // Check if other widgets are present
 | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="recently-viewed-widget"]') | ||||||
|  |       ).toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="my-data-widget"]') | ||||||
|  |       ).toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="total-assets-widget"]') | ||||||
|  |       ).toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="ExtraWidget.EmptyWidgetPlaceholder"]') | ||||||
|  |       ).toBeVisible(); | ||||||
|  | 
 | ||||||
|  |       await openAddCustomizeWidgetModal(adminPage); | ||||||
|  | 
 | ||||||
|  |       // Check if 'check' icon is present for existing widgets
 | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="MyData-check-icon"]') | ||||||
|  |       ).toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="RecentlyViewed-check-icon"]') | ||||||
|  |       ).toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="TotalAssets-check-icon"]') | ||||||
|  |       ).toBeVisible(); | ||||||
|  | 
 | ||||||
|  |       // Check if 'check' icon is not present for removed widgets
 | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="ActivityFeed-check-icon"]') | ||||||
|  |       ).not.toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="Following-check-icon"]') | ||||||
|  |       ).not.toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="KPI-check-icon"]') | ||||||
|  |       ).not.toBeVisible(); | ||||||
|  | 
 | ||||||
|  |       // Add Following widget
 | ||||||
|  |       await adminPage | ||||||
|  |         .locator('[data-testid="Following-widget-tab-label"]') | ||||||
|  |         .click(); | ||||||
|  |       await adminPage | ||||||
|  |         .locator( | ||||||
|  |           '[aria-labelledby$="KnowledgePanel.Following"] [data-testid="add-widget-button"]' | ||||||
|  |         ) | ||||||
|  |         .click(); | ||||||
|  | 
 | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="following-widget"]') | ||||||
|  |       ).toBeVisible(); | ||||||
|  | 
 | ||||||
|  |       // Check if check icons are present in tab labels for newly added widgets
 | ||||||
|  |       await openAddCustomizeWidgetModal(adminPage); | ||||||
|  | 
 | ||||||
|  |       // Check if 'check' icon is present for the Following widget
 | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="Following-check-icon"]') | ||||||
|  |       ).toBeVisible(); | ||||||
|  | 
 | ||||||
|  |       // Close the add widget modal
 | ||||||
|  |       await adminPage | ||||||
|  |         .locator('[data-testid="add-widget-modal"] [aria-label="Close"]') | ||||||
|  |         .click(); | ||||||
|  | 
 | ||||||
|  |       // Save the updated layout
 | ||||||
|  |       await saveCustomizeLayoutPage(adminPage); | ||||||
|  | 
 | ||||||
|  |       // Navigate to the landing page
 | ||||||
|  |       await redirectToHomePage(adminPage); | ||||||
|  | 
 | ||||||
|  |       // Check if removed widgets are not present on the landing page
 | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="activity-feed-widget"]') | ||||||
|  |       ).not.toBeVisible(); | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="kpi-widget"]') | ||||||
|  |       ).not.toBeVisible(); | ||||||
|  | 
 | ||||||
|  |       // Check if newly added widgets are present on the landing page
 | ||||||
|  |       await expect( | ||||||
|  |         adminPage.locator('[data-testid="following-widget"]') | ||||||
|  |       ).toBeVisible(); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     const saveResponse = adminPage.waitForResponse('/api/v1/docStore'); |     await test.step( | ||||||
|     await adminPage.click('[data-testid="save-button"]'); |       'Resetting the layout flow should work properly', | ||||||
|     await saveResponse; |       async () => { | ||||||
|  |         // Check if removed widgets are not present on landing page
 | ||||||
|  |         await expect( | ||||||
|  |           adminPage.locator('[data-testid="activity-feed-widget"]') | ||||||
|  |         ).not.toBeVisible(); | ||||||
|  |         await expect( | ||||||
|  |           adminPage.locator('[data-testid="kpi-widget"]') | ||||||
|  |         ).not.toBeVisible(); | ||||||
| 
 | 
 | ||||||
|     await toastNotification(adminPage, 'Page layout created successfully.'); |         await navigateToCustomizeLandingPage(adminPage, { | ||||||
|     await redirectToHomePage(adminPage); |           personaName: persona.responseData.name, | ||||||
|  |           customPageDataResponse: 200, | ||||||
|  |         }); | ||||||
| 
 | 
 | ||||||
|     // Check if removed widgets are not present on landing adminPage
 |         // Check if removed widgets are not present on customize page
 | ||||||
|     await expect( |         await expect( | ||||||
|       adminPage.locator('[data-testid="activity-feed-widget"]') |           adminPage.locator('[data-testid="activity-feed-widget"]') | ||||||
|     ).not.toBeVisible(); |         ).not.toBeVisible(); | ||||||
|     await expect( |         await expect( | ||||||
|       adminPage.locator('[data-testid="following-widget"]') |           adminPage.locator('[data-testid="kpi-widget"]') | ||||||
|     ).not.toBeVisible(); |         ).not.toBeVisible(); | ||||||
|     await expect( | 
 | ||||||
|       adminPage.locator('[data-testid="kpi-widget"]') |         await adminPage.locator('[data-testid="reset-button"]').click(); | ||||||
|     ).not.toBeVisible(); | 
 | ||||||
|  |         // Confirm reset in modal
 | ||||||
|  |         await adminPage | ||||||
|  |           .locator('[data-testid="reset-layout-modal"] .ant-modal-footer') | ||||||
|  |           .locator('text=Yes') | ||||||
|  |           .click(); | ||||||
|  | 
 | ||||||
|  |         // Verify the toast notification
 | ||||||
|  |         const toastNotification = adminPage.locator('.Toastify__toast-body'); | ||||||
|  | 
 | ||||||
|  |         await expect(toastNotification).toContainText( | ||||||
|  |           'Page layout updated successfully.' | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         // Check if all widgets are present after resetting the layout
 | ||||||
|  |         await checkAllDefaultWidgets(adminPage, true); | ||||||
|  | 
 | ||||||
|  |         // Check if all widgets are present on landing page
 | ||||||
|  |         await redirectToHomePage(adminPage); | ||||||
|  | 
 | ||||||
|  |         await checkAllDefaultWidgets(adminPage); | ||||||
|  |       } | ||||||
|  |     ); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   test('Remove and add the widget in the same placeholder', async ({ |   test('Remove and add the widget in the same placeholder', async ({ | ||||||
| @ -175,10 +332,6 @@ test.describe('Customize Landing Page Flow', () => { | |||||||
|     // Check if the KPI widget is added in the same placeholder,by their transform property or placement.
 |     // Check if the KPI widget is added in the same placeholder,by their transform property or placement.
 | ||||||
|     expect(kpiElementStyle.transform).toEqual(followingElementStyle.transform); |     expect(kpiElementStyle.transform).toEqual(followingElementStyle.transform); | ||||||
| 
 | 
 | ||||||
|     const saveResponse = adminPage.waitForResponse('/api/v1/docStore'); |     await saveCustomizeLayoutPage(adminPage, true); | ||||||
|     await adminPage.click('[data-testid="save-button"]'); |  | ||||||
|     await saveResponse; |  | ||||||
| 
 |  | ||||||
|     await toastNotification(adminPage, 'Page layout created successfully.'); |  | ||||||
|   }); |   }); | ||||||
| }); | }); | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ | |||||||
|  */ |  */ | ||||||
| import { expect, Page } from '@playwright/test'; | import { expect, Page } from '@playwright/test'; | ||||||
| import { GlobalSettingOptions } from '../constant/settings'; | import { GlobalSettingOptions } from '../constant/settings'; | ||||||
| import { visitOwnProfilePage } from './common'; | import { toastNotification, visitOwnProfilePage } from './common'; | ||||||
| import { settingClick } from './sidebar'; | import { settingClick } from './sidebar'; | ||||||
| 
 | 
 | ||||||
| export const navigateToCustomizeLandingPage = async ( | export const navigateToCustomizeLandingPage = async ( | ||||||
| @ -117,3 +117,32 @@ export const setUserDefaultPersona = async ( | |||||||
|     page.locator('[data-testid="user-profile-details"]') |     page.locator('[data-testid="user-profile-details"]') | ||||||
|   ).toContainText(personaName); |   ).toContainText(personaName); | ||||||
| }; | }; | ||||||
|  | 
 | ||||||
|  | export const openAddCustomizeWidgetModal = async (page: Page) => { | ||||||
|  |   const fetchResponse = page.waitForResponse( | ||||||
|  |     '/api/v1/docStore?fqnPrefix=KnowledgePanel*' | ||||||
|  |   ); | ||||||
|  |   await page | ||||||
|  |     .locator( | ||||||
|  |       '[data-testid="ExtraWidget.EmptyWidgetPlaceholder"] [data-testid="add-widget-button"]' | ||||||
|  |     ) | ||||||
|  |     .click(); | ||||||
|  | 
 | ||||||
|  |   await fetchResponse; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | export const saveCustomizeLayoutPage = async ( | ||||||
|  |   page: Page, | ||||||
|  |   isCreated?: boolean | ||||||
|  | ) => { | ||||||
|  |   const saveResponse = page.waitForResponse( | ||||||
|  |     isCreated ? '/api/v1/docStore' : '/api/v1/docStore/*' | ||||||
|  |   ); | ||||||
|  |   await page.locator('[data-testid="save-button"]').click(); | ||||||
|  |   await saveResponse; | ||||||
|  | 
 | ||||||
|  |   await toastNotification( | ||||||
|  |     page, | ||||||
|  |     `Page layout ${isCreated ? 'created' : 'updated'} successfully.` | ||||||
|  |   ); | ||||||
|  | }; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Ashish Gupta
						Ashish Gupta