2024-05-31 11:01:10 +05:30
/ *
* 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 .
* /
2024-07-10 11:41:48 +05:30
import { Browser , expect , Page , request } from '@playwright/test' ;
2024-05-31 11:01:10 +05:30
import { randomUUID } from 'crypto' ;
2024-07-30 15:05:56 +05:30
import { SidebarItem } from '../constant/sidebar' ;
import { adjectives , nouns } from '../constant/user' ;
import { sidebarClick } from './sidebar' ;
2024-05-31 11:01:10 +05:30
export const uuid = ( ) = > randomUUID ( ) . split ( '-' ) [ 0 ] ;
2024-06-01 22:18:33 +05:30
2024-06-26 17:02:30 +05:30
export const descriptionBox =
'.toastui-editor-md-container > .toastui-editor > .ProseMirror' ;
2024-06-24 17:41:28 +05:30
export const INVALID_NAMES = {
MAX_LENGTH :
'a87439625b1c2d3e4f5061728394a5b6c7d8e90a1b2c3d4e5f67890aba87439625b1c2d3e4f5061728394a5b6c7d8e90a1b2c3d4e5f67890abName can be a maximum of 128 characters' ,
WITH_SPECIAL_CHARS : '::normalName::' ,
} ;
export const NAME_VALIDATION_ERROR =
'Name must contain only letters, numbers, underscores, hyphens, periods, parenthesis, and ampersands.' ;
export const NAME_MIN_MAX_LENGTH_VALIDATION_ERROR =
'Name size must be between 2 and 64' ;
export const NAME_MAX_LENGTH_VALIDATION_ERROR =
'Name can be a maximum of 128 characters' ;
2024-06-01 22:18:33 +05:30
export const getToken = async ( page : Page ) = > {
return page . evaluate (
( ) = >
JSON . parse ( localStorage . getItem ( 'om-session' ) ? ? '{}' ) ? . state
? . oidcIdToken ? ? ''
) ;
} ;
export const getAuthContext = async ( token : string ) = > {
return await request . newContext ( {
extraHTTPHeaders : {
Authorization : ` Bearer ${ token } ` ,
} ,
} ) ;
} ;
export const redirectToHomePage = async ( page : Page ) = > {
await page . goto ( '/' ) ;
await page . waitForURL ( '**/my-data' ) ;
} ;
export const createNewPage = async ( browser : Browser ) = > {
// create a new page
const page = await browser . newPage ( ) ;
await redirectToHomePage ( page ) ;
// get the token from localStorage
const token = await getToken ( page ) ;
// create a new context with the token
const apiContext = await getAuthContext ( token ) ;
const afterAction = async ( ) = > {
await apiContext . dispose ( ) ;
await page . close ( ) ;
} ;
return { page , apiContext , afterAction } ;
} ;
2024-06-14 11:55:59 +05:30
/ * *
* Retrieves the API context for the given page .
* @param page The Playwright page object .
* @returns An object containing the API context and a cleanup function .
* /
export const getApiContext = async ( page : Page ) = > {
const token = await getToken ( page ) ;
const apiContext = await getAuthContext ( token ) ;
const afterAction = async ( ) = > await apiContext . dispose ( ) ;
return { apiContext , afterAction } ;
} ;
2024-06-24 17:41:28 +05:30
2024-06-27 15:32:58 +05:30
export const getEntityTypeSearchIndexMapping = ( entityType : string ) = > {
const entityMapping = {
Table : 'table_search_index' ,
Topic : 'topic_search_index' ,
Dashboard : 'dashboard_search_index' ,
2024-07-01 20:16:54 +05:30
Pipeline : 'pipeline_search_index' ,
2024-06-27 15:32:58 +05:30
MlModel : 'mlmodel_search_index' ,
Container : 'container_search_index' ,
SearchIndex : 'search_entity_search_index' ,
2024-07-26 14:31:17 +05:30
ApiEndpoint : 'api_endpoint_search_index' ,
2024-06-27 15:32:58 +05:30
} ;
return entityMapping [ entityType ] ;
} ;
2024-07-10 11:41:48 +05:30
export const toastNotification = async (
page : Page ,
message : string | RegExp
) = > {
await expect ( page . getByRole ( 'alert' ) . first ( ) ) . toHaveText ( message ) ;
await page . getByLabel ( 'close' ) . first ( ) . click ( ) ;
} ;
2024-07-09 17:49:10 +05:30
export const clickOutside = async ( page : Page ) = > {
await page . locator ( 'body' ) . click ( {
position : {
x : 0 ,
y : 0 ,
} ,
} ) ; // with this action left menu bar is getting opened
await page . mouse . move ( 1280 , 0 ) ; // moving out side left menu bar to avoid random failure due to left menu bar
} ;
2024-07-15 15:37:41 +05:30
export const visitUserProfilePage = async ( page : Page ) = > {
2024-07-31 15:24:17 +05:30
await page . locator ( '[data-testid="dropdown-profile"] svg' ) . click ( ) ;
2024-07-22 12:45:07 +05:30
await page . waitForSelector ( '[role="menu"].profile-dropdown' , {
2024-07-15 15:37:41 +05:30
state : 'visible' ,
} ) ;
const userResponse = page . waitForResponse (
'/api/v1/users/name/*?fields=*&include=all'
) ;
2024-07-31 15:24:17 +05:30
await page . getByTestId ( 'user-name' ) . click ( ) ;
2024-07-15 15:37:41 +05:30
await userResponse ;
await clickOutside ( page ) ;
} ;
2024-07-30 15:05:56 +05:30
export const assignDomain = async (
page : Page ,
domain : { name : string ; displayName : string }
) = > {
await page . getByTestId ( 'add-domain' ) . click ( ) ;
await page . waitForSelector ( '[data-testid="loader"]' , { state : 'detached' } ) ;
await page
. getByTestId ( 'selectable-list' )
. getByTestId ( 'searchbar' )
. fill ( domain . name ) ;
await page . waitForResponse (
` /api/v1/search/query?q=* ${ encodeURIComponent ( domain . name ) } * `
) ;
await page . getByRole ( 'listitem' , { name : domain.displayName } ) . click ( ) ;
await expect ( page . getByTestId ( 'domain-link' ) ) . toContainText (
domain . displayName
) ;
} ;
export const updateDomain = async (
page : Page ,
domain : { name : string ; displayName : string }
) = > {
await page . getByTestId ( 'add-domain' ) . click ( ) ;
await page . waitForSelector ( '[data-testid="loader"]' , { state : 'detached' } ) ;
await page . getByTestId ( 'selectable-list' ) . getByTestId ( 'searchbar' ) . clear ( ) ;
await page
. getByTestId ( 'selectable-list' )
. getByTestId ( 'searchbar' )
. fill ( domain . name ) ;
await page . waitForResponse (
` /api/v1/search/query?q=* ${ encodeURIComponent ( domain . name ) } * `
) ;
await page . getByRole ( 'listitem' , { name : domain.displayName } ) . click ( ) ;
await expect ( page . getByTestId ( 'domain-link' ) ) . toContainText (
domain . displayName
) ;
} ;
export const removeDomain = async ( page : Page ) = > {
await page . getByTestId ( 'add-domain' ) . click ( ) ;
await page . waitForSelector ( '[data-testid="loader"]' , { state : 'detached' } ) ;
await expect ( page . getByTestId ( 'remove-owner' ) . locator ( 'path' ) ) . toBeVisible ( ) ;
await page . getByTestId ( 'remove-owner' ) . locator ( 'svg' ) . click ( ) ;
await expect ( page . getByTestId ( 'no-domain-text' ) ) . toContainText ( 'No Domain' ) ;
} ;
export const visitGlossaryPage = async ( page : Page , glossaryName : string ) = > {
await redirectToHomePage ( page ) ;
const glossaryResponse = page . waitForResponse ( '/api/v1/glossaries?fields=*' ) ;
await sidebarClick ( page , SidebarItem . GLOSSARY ) ;
await glossaryResponse ;
await page . getByRole ( 'menuitem' , { name : glossaryName } ) . click ( ) ;
} ;
export const getRandomFirstName = ( ) = > {
return ` ${
adjectives [ Math . floor ( Math . random ( ) * adjectives . length ) ]
} $ { uuid ( ) } ` ;
} ;
export const getRandomLastName = ( ) = > {
return ` ${ nouns [ Math . floor ( Math . random ( ) * nouns . length ) ] } ${ uuid ( ) } ` ;
} ;
export const generateRandomUsername = ( ) = > {
const firstName = getRandomFirstName ( ) ;
const lastName = getRandomLastName ( ) ;
return {
firstName ,
lastName ,
email : ` ${ firstName } . ${ lastName } @example.com ` ,
password : 'User@OMD123' ,
} ;
} ;