@umbraco/playwright-testhelpers 2.0.0-beta.96 → 2.0.0-beta.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/helpers/ApiHelpers.d.ts +10 -2
- package/dist/lib/helpers/ApiHelpers.js +8 -8
- package/dist/lib/helpers/ApiHelpers.js.map +1 -1
- package/dist/lib/helpers/ContentUiHelper.d.ts +56 -2
- package/dist/lib/helpers/ContentUiHelper.js +171 -4
- package/dist/lib/helpers/ContentUiHelper.js.map +1 -1
- package/dist/lib/helpers/DataTypeApiHelper.d.ts +1 -0
- package/dist/lib/helpers/DataTypeApiHelper.js +12 -0
- package/dist/lib/helpers/DataTypeApiHelper.js.map +1 -1
- package/dist/lib/helpers/DocumentApiHelper.d.ts +2 -0
- package/dist/lib/helpers/DocumentApiHelper.js +11 -0
- package/dist/lib/helpers/DocumentApiHelper.js.map +1 -1
- package/dist/lib/helpers/DocumentBlueprintApiHelper.d.ts +1 -1
- package/dist/lib/helpers/DocumentBlueprintApiHelper.js +4 -5
- package/dist/lib/helpers/DocumentBlueprintApiHelper.js.map +1 -1
- package/dist/lib/helpers/DocumentTypeApiHelper.d.ts +1 -0
- package/dist/lib/helpers/DocumentTypeApiHelper.js +25 -0
- package/dist/lib/helpers/DocumentTypeApiHelper.js.map +1 -1
- package/dist/lib/helpers/NotificationConstantHelper.d.ts +5 -0
- package/dist/lib/helpers/NotificationConstantHelper.js +7 -2
- package/dist/lib/helpers/NotificationConstantHelper.js.map +1 -1
- package/dist/lib/helpers/PartialViewUiHelper.d.ts +0 -1
- package/dist/lib/helpers/PartialViewUiHelper.js +5 -7
- package/dist/lib/helpers/PartialViewUiHelper.js.map +1 -1
- package/dist/lib/helpers/ScriptUiHelper.d.ts +0 -1
- package/dist/lib/helpers/ScriptUiHelper.js +2 -4
- package/dist/lib/helpers/ScriptUiHelper.js.map +1 -1
- package/dist/lib/helpers/StylesheetApiHelper.d.ts +1 -0
- package/dist/lib/helpers/StylesheetApiHelper.js +8 -0
- package/dist/lib/helpers/StylesheetApiHelper.js.map +1 -1
- package/dist/lib/helpers/TemplateUiHelper.d.ts +0 -1
- package/dist/lib/helpers/TemplateUiHelper.js +5 -7
- package/dist/lib/helpers/TemplateUiHelper.js.map +1 -1
- package/dist/lib/helpers/UiBaseLocators.d.ts +5 -2
- package/dist/lib/helpers/UiBaseLocators.js +13 -4
- package/dist/lib/helpers/UiBaseLocators.js.map +1 -1
- package/dist/lib/helpers/UserGroupApiHelper.d.ts +18 -1
- package/dist/lib/helpers/UserGroupApiHelper.js +218 -1
- package/dist/lib/helpers/UserGroupApiHelper.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -83,10 +83,18 @@ export declare class ApiHelpers {
|
|
|
83
83
|
private getTokenIssuedTime;
|
|
84
84
|
private getTokenExpireTime;
|
|
85
85
|
getRefreshToken(): Promise<any>;
|
|
86
|
-
isAccessTokenValid(): Promise<void
|
|
86
|
+
isAccessTokenValid(): Promise<void | {
|
|
87
|
+
cookie: string;
|
|
88
|
+
accessToken: any;
|
|
89
|
+
refreshToken: any;
|
|
90
|
+
}>;
|
|
87
91
|
private currentDateToEpoch;
|
|
88
92
|
private dateToEpoch;
|
|
89
|
-
refreshAccessToken(userEmail: string, userPassword: string): Promise<void
|
|
93
|
+
refreshAccessToken(userEmail: string, userPassword: string): Promise<void | {
|
|
94
|
+
cookie: string;
|
|
95
|
+
accessToken: any;
|
|
96
|
+
refreshToken: any;
|
|
97
|
+
}>;
|
|
90
98
|
updateTokenAndCookie(userEmail: string, userPassword: string): Promise<{
|
|
91
99
|
cookie: string;
|
|
92
100
|
accessToken: any;
|
|
@@ -130,7 +130,7 @@ class ApiHelpers {
|
|
|
130
130
|
params: params,
|
|
131
131
|
ignoreHTTPSErrors: true
|
|
132
132
|
};
|
|
133
|
-
return this.page.request.get(url, options);
|
|
133
|
+
return await this.page.request.get(url, options);
|
|
134
134
|
}
|
|
135
135
|
async saveCodeFile(codeFile) {
|
|
136
136
|
if (codeFile == null) {
|
|
@@ -190,7 +190,7 @@ class ApiHelpers {
|
|
|
190
190
|
async getRefreshToken() {
|
|
191
191
|
let someStorage = await this.page.context().storageState();
|
|
192
192
|
let someObject = JSON.parse(someStorage.origins[0].localStorage[0].value);
|
|
193
|
-
return someObject.refresh_token;
|
|
193
|
+
return await someObject.refresh_token;
|
|
194
194
|
}
|
|
195
195
|
async isAccessTokenValid() {
|
|
196
196
|
const tokenTimeIssued = await this.getTokenIssuedTime();
|
|
@@ -208,7 +208,7 @@ class ApiHelpers {
|
|
|
208
208
|
}
|
|
209
209
|
async currentDateToEpoch() {
|
|
210
210
|
const currentTime = new Date(Date.now());
|
|
211
|
-
return this.dateToEpoch(currentTime);
|
|
211
|
+
return await this.dateToEpoch(currentTime);
|
|
212
212
|
}
|
|
213
213
|
async dateToEpoch(date) {
|
|
214
214
|
const dateToEpoch = date.getTime();
|
|
@@ -234,10 +234,10 @@ class ApiHelpers {
|
|
|
234
234
|
});
|
|
235
235
|
if (response.status() === 200) {
|
|
236
236
|
const jsonStorageValue = await response.json();
|
|
237
|
-
return this.updateLocalStorage(jsonStorageValue);
|
|
237
|
+
return await this.updateLocalStorage(jsonStorageValue);
|
|
238
238
|
}
|
|
239
239
|
console.log('Error refreshing access token.');
|
|
240
|
-
await this.updateTokenAndCookie(userEmail, userPassword);
|
|
240
|
+
return await this.updateTokenAndCookie(userEmail, userPassword);
|
|
241
241
|
}
|
|
242
242
|
async updateTokenAndCookie(userEmail, userPassword) {
|
|
243
243
|
const storageStateValues = await this.login.login(userEmail, userPassword);
|
|
@@ -266,8 +266,8 @@ class ApiHelpers {
|
|
|
266
266
|
}
|
|
267
267
|
try {
|
|
268
268
|
const data = await JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
269
|
-
const localStorageItem = data.origins[0]?.localStorage?.find(item => item.name === 'umb:userAuthTokenResponse');
|
|
270
|
-
const parsedValue = JSON.parse(localStorageItem.value);
|
|
269
|
+
const localStorageItem = await data.origins[0]?.localStorage?.find(item => item.name === 'umb:userAuthTokenResponse');
|
|
270
|
+
const parsedValue = await JSON.parse(localStorageItem.value);
|
|
271
271
|
return `Bearer ${parsedValue.access_token}`;
|
|
272
272
|
}
|
|
273
273
|
catch {
|
|
@@ -282,7 +282,7 @@ class ApiHelpers {
|
|
|
282
282
|
}
|
|
283
283
|
try {
|
|
284
284
|
const data = await JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
285
|
-
return data.cookies.map(cookie => `${cookie.name}=${cookie.value}`).join('; ') + ';';
|
|
285
|
+
return await data.cookies.map(cookie => `${cookie.name}=${cookie.value}`).join('; ') + ';';
|
|
286
286
|
}
|
|
287
287
|
catch {
|
|
288
288
|
// If the file is not found, return the current cookie from the page context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiHelpers.js","sourceRoot":"","sources":["../../../lib/helpers/ApiHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {Page} from \"@playwright/test\"\nimport {umbracoConfig} from \"../../umbraco.config\";\nimport {ReportHelper} from \"./ReportHelper\";\nimport {TelemetryDataApiHelper} from \"./TelemetryDataApiHelper\";\nimport {LanguageApiHelper} from \"./LanguageApiHelper\";\nimport {DictionaryApiHelper} from \"./DictionaryApiHelper\";\nimport {RelationTypeApiHelper} from \"./RelationTypeApiHelper\";\nimport {UserGroupApiHelper} from \"./UserGroupApiHelper\";\nimport {TemplateApiHelper} from \"./TemplateApiHelper\";\nimport {AliasHelper} from \"./AliasHelper\";\nimport {DataTypeApiHelper} from \"./DataTypeApiHelper\";\nimport {UserApiHelper} from \"./UserApiHelper\";\nimport {TemporaryFileApiHelper} from \"./TemporaryFileApiHelper\";\nimport {PackageApiHelper} from \"./PackageApiHelper\";\nimport {ScriptApiHelper} from \"./ScriptApiHelper\";\nimport {PartialViewApiHelper} from \"./PartialViewApiHelper\";\nimport {StylesheetApiHelper} from \"./StylesheetApiHelper\";\nimport * as fs from \"fs\";\nimport {LogViewerApiHelper} from \"./LogViewerApiHelper\";\nimport {DocumentTypeApiHelper} from \"./DocumentTypeApiHelper\";\nimport {DocumentApiHelper} from \"./DocumentApiHelper\";\nimport {MediaTypeApiHelper} from \"./MediaTypeApiHelper\";\nimport {MediaApiHelper} from \"./MediaApiHelper\";\nimport {ObjectTypesApiHelper} from \"./ObjectTypesApiHelper\";\nimport {ModelsBuilderApiHelper} from \"./ModelsBuilderApiHelper\";\nimport {HealthCheckApiHelper} from \"./HealthCheckApiHelper\";\nimport {IndexerApiHelper} from \"./IndexerApiHelper\";\nimport {PublishedCacheApiHelper} from \"./PublishedCacheApiHelper\";\nimport {RedirectManagementApiHelper} from './RedirectManagementApiHelper';\nimport {MemberGroupApiHelper} from './MemberGroupApiHelper';\nimport {MemberApiHelper} from './MemberApiHelper';\nimport {MemberTypeApiHelper} from \"./MemberTypeApiHelper\";\nimport {DocumentBlueprintApiHelper} from \"./DocumentBlueprintApiHelper\";\nimport {LoginApiHelper} from \"./LoginApiHelper\";\n\nexport class ApiHelpers {\n baseUrl: string = umbracoConfig.environment.baseUrl;\n page: Page;\n alias: AliasHelper;\n report: ReportHelper;\n telemetry: TelemetryDataApiHelper;\n language: LanguageApiHelper;\n dictionary: DictionaryApiHelper;\n relationType: RelationTypeApiHelper;\n userGroup: UserGroupApiHelper;\n template: TemplateApiHelper;\n dataType: DataTypeApiHelper;\n user: UserApiHelper;\n temporaryFile: TemporaryFileApiHelper;\n documentType: DocumentTypeApiHelper;\n document: DocumentApiHelper;\n package: PackageApiHelper;\n script: ScriptApiHelper;\n partialView: PartialViewApiHelper;\n stylesheet: StylesheetApiHelper;\n logViewer: LogViewerApiHelper;\n mediaType: MediaTypeApiHelper;\n media: MediaApiHelper;\n objectTypes: ObjectTypesApiHelper;\n modelsBuilder: ModelsBuilderApiHelper;\n healthCheck: HealthCheckApiHelper;\n indexer: IndexerApiHelper;\n publishedCache: PublishedCacheApiHelper;\n redirectManagement: RedirectManagementApiHelper;\n memberGroup: MemberGroupApiHelper;\n member: MemberApiHelper;\n memberType: MemberTypeApiHelper;\n documentBlueprint: DocumentBlueprintApiHelper;\n login: LoginApiHelper;\n\n constructor(page: Page) {\n this.page = page;\n this.alias = new AliasHelper();\n this.report = new ReportHelper(this);\n this.telemetry = new TelemetryDataApiHelper(this);\n this.language = new LanguageApiHelper(this);\n this.dictionary = new DictionaryApiHelper(this);\n this.relationType = new RelationTypeApiHelper(this);\n this.userGroup = new UserGroupApiHelper(this);\n this.template = new TemplateApiHelper(this);\n this.dataType = new DataTypeApiHelper(this);\n this.user = new UserApiHelper(this, page);\n this.temporaryFile = new TemporaryFileApiHelper(this);\n this.documentType = new DocumentTypeApiHelper(this);\n this.document = new DocumentApiHelper(this);\n this.package = new PackageApiHelper(this);\n this.script = new ScriptApiHelper(this);\n this.partialView = new PartialViewApiHelper(this);\n this.stylesheet = new StylesheetApiHelper(this);\n this.logViewer = new LogViewerApiHelper(this);\n this.mediaType = new MediaTypeApiHelper(this);\n this.media = new MediaApiHelper(this);\n this.objectTypes = new ObjectTypesApiHelper(this);\n this.modelsBuilder = new ModelsBuilderApiHelper(this);\n this.healthCheck = new HealthCheckApiHelper(this);\n this.indexer = new IndexerApiHelper(this);\n this.publishedCache = new PublishedCacheApiHelper(this);\n this.redirectManagement = new RedirectManagementApiHelper(this);\n this.memberGroup = new MemberGroupApiHelper(this);\n this.member = new MemberApiHelper(this);\n this.memberType = new MemberTypeApiHelper(this);\n this.documentBlueprint = new DocumentBlueprintApiHelper(this);\n this.login = new LoginApiHelper(this, this.page);\n }\n\n async getAccessToken() {\n let someStorage = await this.page.context().storageState();\n let someObject = JSON.parse(someStorage.origins[0].localStorage[0].value);\n return someObject.access_token;\n }\n\n async getBearerToken() {\n return 'Bearer ' + await this.getAccessToken();\n }\n\n async getCookie() {\n let someStorage = await this.page.context().storageState();\n let cookieString = \"\";\n for (let cookie of someStorage.cookies) {\n cookieString += cookie.name + '=' + cookie.value + ';';\n }\n return cookieString;\n }\n\n async getHeaders() {\n return {\n 'Authorization': await this.readLocalBearerToken(),\n 'Cookie': await this.readLocalCookie(),\n }\n }\n\n async get(url: string, params?: { [key: string]: string | number | boolean; }) {\n const options = {\n headers: await this.getHeaders(),\n params: params,\n ignoreHTTPSErrors: true\n }\n return this.page.request.get(url, options);\n }\n\n async saveCodeFile(codeFile) {\n if (codeFile == null) {\n return;\n }\n return await this.post(umbracoConfig.environment.baseUrl + '/umbraco/backoffice/UmbracoApi/CodeFile/PostSave', codeFile);\n }\n\n async post(url: string, data?: object) {\n const options = {\n headers: await this.getHeaders(),\n data: data,\n ignoreHTTPSErrors: true\n }\n return await this.page.request.post(url, options);\n }\n\n async delete(url: string, data?: object) {\n const options = {\n headers: await this.getHeaders(),\n data: data,\n ignoreHTTPSErrors: true\n }\n return await this.page.request.delete(url, options);\n }\n\n async put(url: string, data?: object) {\n const options = {\n headers: await this.getHeaders(),\n data: data,\n ignoreHTTPSErrors: true\n }\n return await this.page.request.put(url, options);\n }\n\n async postMultiPartForm(url: string, id, name: string, mimeType: string, filePath) {\n const options = {\n headers: await this.getHeaders(),\n multipart: {\n Id: id,\n File: {\n name: name,\n mimeType: mimeType,\n buffer: fs.readFileSync(filePath)\n }\n },\n ignoreHTTPSErrors: true\n }\n return await this.page.request.post(url, options);\n }\n\n private async getTokenIssuedTime() {\n let someStorage = await this.page.context().storageState();\n let someObject = JSON.parse(someStorage.origins[0].localStorage[0].value);\n return Number(someObject.issued_at);\n }\n\n private async getTokenExpireTime() {\n let someStorage = await this.page.context().storageState();\n let someObject = JSON.parse(someStorage.origins[0].localStorage[0].value);\n return Number(someObject.expires_in);\n }\n\n async getRefreshToken() {\n let someStorage = await this.page.context().storageState();\n let someObject = JSON.parse(someStorage.origins[0].localStorage[0].value);\n return someObject.refresh_token;\n }\n\n async isAccessTokenValid() {\n const tokenTimeIssued = await this.getTokenIssuedTime();\n const tokenExpireTime = await this.getTokenExpireTime();\n // Should use a global value\n const globalTestTimeout: number = 45;\n // We want to have the date minus the globalTimeout, the reason for this is that while a test is running, the token could expire.\n // The refresh token lasts for 300 seconds, while the access token lasts for 60 seconds (NOT TOTALLY SURE) this is why we add 240 seconds\n const tokenRefreshTime = tokenTimeIssued + tokenExpireTime - (globalTestTimeout);\n // We need the currentTimeInEpoch so we can check if the tokenRefreshTime is close to expiring.\n const currentTimeInEpoch = await this.currentDateToEpoch();\n\n if (tokenRefreshTime <= currentTimeInEpoch) {\n return await this.refreshAccessToken(umbracoConfig.user.login, umbracoConfig.user.password);\n }\n }\n\n private async currentDateToEpoch() {\n const currentTime = new Date(Date.now());\n return this.dateToEpoch(currentTime);\n }\n\n private async dateToEpoch(date: Date) {\n const dateToEpoch = date.getTime();\n // The epoch is in milliseconds, but we want it to be in seconds(Like it is in the token).\n const millisecondsToSeconds = dateToEpoch / 1000;\n // There is no need to have anything after .\n return Number(millisecondsToSeconds.toString().split('.')[0]);\n }\n\n async refreshAccessToken(userEmail: string, userPassword: string) {\n const response = await this.page.request.post(this.baseUrl + '/umbraco/management/api/v1/security/back-office/token', {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Cookie: await this.readLocalCookie(),\n Origin: this.baseUrl\n },\n form:\n {\n grant_type: 'refresh_token',\n client_id: 'umbraco-back-office',\n redirect_uri: this.baseUrl + '/umbraco/oauth_complete',\n refresh_token: await this.getRefreshToken()\n },\n ignoreHTTPSErrors: true\n });\n\n if (response.status() === 200) {\n const jsonStorageValue = await response.json();\n return this.updateLocalStorage(jsonStorageValue);\n }\n console.log('Error refreshing access token.');\n await this.updateTokenAndCookie(userEmail, userPassword);\n }\n\n async updateTokenAndCookie(userEmail: string, userPassword: string) {\n const storageStateValues = await this.login.login(userEmail, userPassword);\n await this.updateCookie(storageStateValues.cookie);\n await this.updateLocalStorage(storageStateValues.accessToken);\n return {\n cookie: storageStateValues.cookie,\n accessToken: storageStateValues.accessToken.access_token,\n refreshToken: storageStateValues.refreshToken.refresh_token\n };\n }\n\n async readFileContent(filePath) {\n try {\n const jsonString = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(jsonString);\n } catch (error) {\n console.log('Error reading file:', error);\n throw error;\n }\n }\n\n async readLocalBearerToken() {\n const filePath = process.env.STORAGE_STAGE_PATH;\n if (!filePath) {\n return await this.getBearerToken();\n }\n\n try {\n const data = await JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n const localStorageItem = data.origins[0]?.localStorage?.find(item => item.name === 'umb:userAuthTokenResponse');\n const parsedValue = JSON.parse(localStorageItem.value);\n return `Bearer ${parsedValue.access_token}`;\n } catch {\n // If the file is not found, return the current access token from the page context\n return await this.getBearerToken();\n }\n }\n\n async readLocalCookie() {\n const filePath = process.env.STORAGE_STAGE_PATH;\n if (!filePath) {\n return await this.getCookie();\n }\n\n try {\n const data = await JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n return data.cookies.map(cookie => `${cookie.name}=${cookie.value}`).join('; ') + ';';\n } catch {\n // If the file is not found, return the current cookie from the page context\n return await this.getCookie();\n }\n }\n\n private async updateLocalStorage(localStorageValue) {\n const currentStorageState = await this.page.context().storageState();\n let currentLocalStorageValue = JSON.parse(currentStorageState.origins[0].localStorage[0].value);\n const newIssuedTime = await this.currentDateToEpoch();\n\n currentLocalStorageValue.access_token = localStorageValue.access_token;\n currentLocalStorageValue.refresh_token = localStorageValue.refresh_token;\n currentLocalStorageValue.issued_at = newIssuedTime;\n currentLocalStorageValue.scope = localStorageValue.scope;\n currentLocalStorageValue.token_type = localStorageValue.token_type;\n currentLocalStorageValue.expires_in = localStorageValue.expires_in.toString();\n\n const filePath = process.env.STORAGE_STAGE_PATH;\n // Updates the user.json file in our CMS project\n if (filePath) {\n try {\n const data = await this.readFileContent(filePath);\n const localStorage = data.origins[0].localStorage[0];\n if (localStorage.name === 'umb:userAuthTokenResponse') {\n localStorage.value = JSON.stringify(currentLocalStorageValue);\n }\n\n // Converts the object to JSON string\n const updatedJsonString = JSON.stringify(data, null, 2);\n // Writes the updated JSON content to the file\n fs.writeFileSync(filePath, updatedJsonString, 'utf-8');\n } catch (error) {\n console.error('Error updating token:', error);\n }\n }\n }\n\n private async updateCookie(cookieString: string) {\n const currentStorageState = await this.page.context().storageState();\n let currentCookie = currentStorageState.cookies[0];\n\n const parts = cookieString.split(';').map(part => part.trim());\n // Extract the main key-value pair\n const [nameValue, ...attributes] = parts;\n const [, value] = nameValue.split('=');\n // Updates the cookie value\n currentCookie.value = value;\n // Process each attribute\n for (const attr of attributes) {\n const [key, val] = attr.split('=');\n if (key.trim().toLowerCase() === 'expires') {\n // Updates the expires value and converts it to Epoch\n currentCookie.expires = await this.dateToEpoch(new Date(val));\n }\n }\n\n const filePath = process.env.STORAGE_STAGE_PATH;\n\n if (filePath) {\n try {\n const data = await this.readFileContent(filePath);\n data.cookies[0] = currentCookie;\n const updatedJsonString = JSON.stringify(data, null, 2);\n fs.writeFileSync(filePath, updatedJsonString, 'utf-8');\n } catch (error) {\n console.error('Error updating cookie:', error);\n }\n }\n }\n\n async revokeAccessToken(cookie: string, accessToken: string) {\n return await this.page.request.post(this.baseUrl + '/umbraco/management/api/v1/security/back-office/revoke', {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Cookie: cookie,\n Origin: this.baseUrl\n },\n form:\n {\n token: accessToken,\n token_type_hint: 'access_token',\n client_id: 'umbraco-back-office'\n },\n ignoreHTTPSErrors: true\n });\n }\n\n async revokeRefreshToken(cookie: string, refreshToken: string) {\n return await this.page.request.post(this.baseUrl + '/umbraco/management/api/v1/security/back-office/revoke', {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Cookie: cookie,\n Origin: this.baseUrl\n },\n form:\n {\n token: refreshToken,\n token_type_hint: 'refresh_token',\n client_id: 'umbraco-back-office'\n },\n ignoreHTTPSErrors: true\n });\n }\n\n async loginToAdminUser(testUserCookie: string, testUserAccessToken: string, testUserRefreshToken: string) {\n await this.revokeAccessToken(testUserCookie, testUserAccessToken);\n await this.revokeRefreshToken(testUserCookie, testUserRefreshToken);\n await this.updateTokenAndCookie(umbracoConfig.user.login, umbracoConfig.user.password);\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"ApiHelpers.js","sourceRoot":"","sources":["../../../lib/helpers/ApiHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["import {Page} from \"@playwright/test\"\nimport {umbracoConfig} from \"../../umbraco.config\";\nimport {ReportHelper} from \"./ReportHelper\";\nimport {TelemetryDataApiHelper} from \"./TelemetryDataApiHelper\";\nimport {LanguageApiHelper} from \"./LanguageApiHelper\";\nimport {DictionaryApiHelper} from \"./DictionaryApiHelper\";\nimport {RelationTypeApiHelper} from \"./RelationTypeApiHelper\";\nimport {UserGroupApiHelper} from \"./UserGroupApiHelper\";\nimport {TemplateApiHelper} from \"./TemplateApiHelper\";\nimport {AliasHelper} from \"./AliasHelper\";\nimport {DataTypeApiHelper} from \"./DataTypeApiHelper\";\nimport {UserApiHelper} from \"./UserApiHelper\";\nimport {TemporaryFileApiHelper} from \"./TemporaryFileApiHelper\";\nimport {PackageApiHelper} from \"./PackageApiHelper\";\nimport {ScriptApiHelper} from \"./ScriptApiHelper\";\nimport {PartialViewApiHelper} from \"./PartialViewApiHelper\";\nimport {StylesheetApiHelper} from \"./StylesheetApiHelper\";\nimport * as fs from \"fs\";\nimport {LogViewerApiHelper} from \"./LogViewerApiHelper\";\nimport {DocumentTypeApiHelper} from \"./DocumentTypeApiHelper\";\nimport {DocumentApiHelper} from \"./DocumentApiHelper\";\nimport {MediaTypeApiHelper} from \"./MediaTypeApiHelper\";\nimport {MediaApiHelper} from \"./MediaApiHelper\";\nimport {ObjectTypesApiHelper} from \"./ObjectTypesApiHelper\";\nimport {ModelsBuilderApiHelper} from \"./ModelsBuilderApiHelper\";\nimport {HealthCheckApiHelper} from \"./HealthCheckApiHelper\";\nimport {IndexerApiHelper} from \"./IndexerApiHelper\";\nimport {PublishedCacheApiHelper} from \"./PublishedCacheApiHelper\";\nimport {RedirectManagementApiHelper} from './RedirectManagementApiHelper';\nimport {MemberGroupApiHelper} from './MemberGroupApiHelper';\nimport {MemberApiHelper} from './MemberApiHelper';\nimport {MemberTypeApiHelper} from \"./MemberTypeApiHelper\";\nimport {DocumentBlueprintApiHelper} from \"./DocumentBlueprintApiHelper\";\nimport {LoginApiHelper} from \"./LoginApiHelper\";\n\nexport class ApiHelpers {\n baseUrl: string = umbracoConfig.environment.baseUrl;\n page: Page;\n alias: AliasHelper;\n report: ReportHelper;\n telemetry: TelemetryDataApiHelper;\n language: LanguageApiHelper;\n dictionary: DictionaryApiHelper;\n relationType: RelationTypeApiHelper;\n userGroup: UserGroupApiHelper;\n template: TemplateApiHelper;\n dataType: DataTypeApiHelper;\n user: UserApiHelper;\n temporaryFile: TemporaryFileApiHelper;\n documentType: DocumentTypeApiHelper;\n document: DocumentApiHelper;\n package: PackageApiHelper;\n script: ScriptApiHelper;\n partialView: PartialViewApiHelper;\n stylesheet: StylesheetApiHelper;\n logViewer: LogViewerApiHelper;\n mediaType: MediaTypeApiHelper;\n media: MediaApiHelper;\n objectTypes: ObjectTypesApiHelper;\n modelsBuilder: ModelsBuilderApiHelper;\n healthCheck: HealthCheckApiHelper;\n indexer: IndexerApiHelper;\n publishedCache: PublishedCacheApiHelper;\n redirectManagement: RedirectManagementApiHelper;\n memberGroup: MemberGroupApiHelper;\n member: MemberApiHelper;\n memberType: MemberTypeApiHelper;\n documentBlueprint: DocumentBlueprintApiHelper;\n login: LoginApiHelper;\n\n constructor(page: Page) {\n this.page = page;\n this.alias = new AliasHelper();\n this.report = new ReportHelper(this);\n this.telemetry = new TelemetryDataApiHelper(this);\n this.language = new LanguageApiHelper(this);\n this.dictionary = new DictionaryApiHelper(this);\n this.relationType = new RelationTypeApiHelper(this);\n this.userGroup = new UserGroupApiHelper(this);\n this.template = new TemplateApiHelper(this);\n this.dataType = new DataTypeApiHelper(this);\n this.user = new UserApiHelper(this, page);\n this.temporaryFile = new TemporaryFileApiHelper(this);\n this.documentType = new DocumentTypeApiHelper(this);\n this.document = new DocumentApiHelper(this);\n this.package = new PackageApiHelper(this);\n this.script = new ScriptApiHelper(this);\n this.partialView = new PartialViewApiHelper(this);\n this.stylesheet = new StylesheetApiHelper(this);\n this.logViewer = new LogViewerApiHelper(this);\n this.mediaType = new MediaTypeApiHelper(this);\n this.media = new MediaApiHelper(this);\n this.objectTypes = new ObjectTypesApiHelper(this);\n this.modelsBuilder = new ModelsBuilderApiHelper(this);\n this.healthCheck = new HealthCheckApiHelper(this);\n this.indexer = new IndexerApiHelper(this);\n this.publishedCache = new PublishedCacheApiHelper(this);\n this.redirectManagement = new RedirectManagementApiHelper(this);\n this.memberGroup = new MemberGroupApiHelper(this);\n this.member = new MemberApiHelper(this);\n this.memberType = new MemberTypeApiHelper(this);\n this.documentBlueprint = new DocumentBlueprintApiHelper(this);\n this.login = new LoginApiHelper(this, this.page);\n }\n\n async getAccessToken() {\n let someStorage = await this.page.context().storageState();\n let someObject = JSON.parse(someStorage.origins[0].localStorage[0].value);\n return someObject.access_token;\n }\n\n async getBearerToken() {\n return 'Bearer ' + await this.getAccessToken();\n }\n\n async getCookie() {\n let someStorage = await this.page.context().storageState();\n let cookieString = \"\";\n for (let cookie of someStorage.cookies) {\n cookieString += cookie.name + '=' + cookie.value + ';';\n }\n return cookieString;\n }\n\n async getHeaders() {\n return {\n 'Authorization': await this.readLocalBearerToken(),\n 'Cookie': await this.readLocalCookie(),\n }\n }\n\n async get(url: string, params?: { [key: string]: string | number | boolean; }) {\n const options = {\n headers: await this.getHeaders(),\n params: params,\n ignoreHTTPSErrors: true\n }\n return await this.page.request.get(url, options);\n }\n\n async saveCodeFile(codeFile) {\n if (codeFile == null) {\n return;\n }\n return await this.post(umbracoConfig.environment.baseUrl + '/umbraco/backoffice/UmbracoApi/CodeFile/PostSave', codeFile);\n }\n\n async post(url: string, data?: object) {\n const options = {\n headers: await this.getHeaders(),\n data: data,\n ignoreHTTPSErrors: true\n }\n return await this.page.request.post(url, options);\n }\n\n async delete(url: string, data?: object) {\n const options = {\n headers: await this.getHeaders(),\n data: data,\n ignoreHTTPSErrors: true\n }\n return await this.page.request.delete(url, options);\n }\n\n async put(url: string, data?: object) {\n const options = {\n headers: await this.getHeaders(),\n data: data,\n ignoreHTTPSErrors: true\n }\n return await this.page.request.put(url, options);\n }\n\n async postMultiPartForm(url: string, id, name: string, mimeType: string, filePath) {\n const options = {\n headers: await this.getHeaders(),\n multipart: {\n Id: id,\n File: {\n name: name,\n mimeType: mimeType,\n buffer: fs.readFileSync(filePath)\n }\n },\n ignoreHTTPSErrors: true\n }\n return await this.page.request.post(url, options);\n }\n\n private async getTokenIssuedTime() {\n let someStorage = await this.page.context().storageState();\n let someObject = JSON.parse(someStorage.origins[0].localStorage[0].value);\n return Number(someObject.issued_at);\n }\n\n private async getTokenExpireTime() {\n let someStorage = await this.page.context().storageState();\n let someObject = JSON.parse(someStorage.origins[0].localStorage[0].value);\n return Number(someObject.expires_in);\n }\n\n async getRefreshToken() {\n let someStorage = await this.page.context().storageState();\n let someObject = JSON.parse(someStorage.origins[0].localStorage[0].value);\n return await someObject.refresh_token;\n }\n\n async isAccessTokenValid() {\n const tokenTimeIssued = await this.getTokenIssuedTime();\n const tokenExpireTime = await this.getTokenExpireTime();\n // Should use a global value\n const globalTestTimeout: number = 45;\n // We want to have the date minus the globalTimeout, the reason for this is that while a test is running, the token could expire.\n // The refresh token lasts for 300 seconds, while the access token lasts for 60 seconds (NOT TOTALLY SURE) this is why we add 240 seconds\n const tokenRefreshTime = tokenTimeIssued + tokenExpireTime - (globalTestTimeout);\n // We need the currentTimeInEpoch so we can check if the tokenRefreshTime is close to expiring.\n const currentTimeInEpoch = await this.currentDateToEpoch();\n\n if (tokenRefreshTime <= currentTimeInEpoch) {\n return await this.refreshAccessToken(umbracoConfig.user.login, umbracoConfig.user.password);\n }\n }\n\n private async currentDateToEpoch() {\n const currentTime = new Date(Date.now());\n return await this.dateToEpoch(currentTime);\n }\n\n private async dateToEpoch(date: Date) {\n const dateToEpoch = date.getTime();\n // The epoch is in milliseconds, but we want it to be in seconds(Like it is in the token).\n const millisecondsToSeconds = dateToEpoch / 1000;\n // There is no need to have anything after .\n return Number(millisecondsToSeconds.toString().split('.')[0]);\n }\n\n async refreshAccessToken(userEmail: string, userPassword: string) {\n const response = await this.page.request.post(this.baseUrl + '/umbraco/management/api/v1/security/back-office/token', {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Cookie: await this.readLocalCookie(),\n Origin: this.baseUrl\n },\n form:\n {\n grant_type: 'refresh_token',\n client_id: 'umbraco-back-office',\n redirect_uri: this.baseUrl + '/umbraco/oauth_complete',\n refresh_token: await this.getRefreshToken()\n },\n ignoreHTTPSErrors: true\n });\n\n if (response.status() === 200) {\n const jsonStorageValue = await response.json();\n return await this.updateLocalStorage(jsonStorageValue);\n }\n console.log('Error refreshing access token.');\n return await this.updateTokenAndCookie(userEmail, userPassword);\n }\n\n async updateTokenAndCookie(userEmail: string, userPassword: string) {\n const storageStateValues = await this.login.login(userEmail, userPassword);\n await this.updateCookie(storageStateValues.cookie);\n await this.updateLocalStorage(storageStateValues.accessToken);\n return {\n cookie: storageStateValues.cookie,\n accessToken: storageStateValues.accessToken.access_token,\n refreshToken: storageStateValues.refreshToken.refresh_token\n };\n }\n\n async readFileContent(filePath) {\n try {\n const jsonString = fs.readFileSync(filePath, 'utf-8');\n return JSON.parse(jsonString);\n } catch (error) {\n console.log('Error reading file:', error);\n throw error;\n }\n }\n\n async readLocalBearerToken() {\n const filePath = process.env.STORAGE_STAGE_PATH;\n if (!filePath) {\n return await this.getBearerToken();\n }\n\n try {\n const data = await JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n const localStorageItem = await data.origins[0]?.localStorage?.find(item => item.name === 'umb:userAuthTokenResponse');\n const parsedValue = await JSON.parse(localStorageItem.value);\n return `Bearer ${parsedValue.access_token}`;\n } catch {\n // If the file is not found, return the current access token from the page context\n return await this.getBearerToken();\n }\n }\n\n async readLocalCookie() {\n const filePath = process.env.STORAGE_STAGE_PATH;\n if (!filePath) {\n return await this.getCookie();\n }\n\n try {\n const data = await JSON.parse(fs.readFileSync(filePath, 'utf-8'));\n return await data.cookies.map(cookie => `${cookie.name}=${cookie.value}`).join('; ') + ';';\n } catch {\n // If the file is not found, return the current cookie from the page context\n return await this.getCookie();\n }\n }\n\n private async updateLocalStorage(localStorageValue) {\n const currentStorageState = await this.page.context().storageState();\n let currentLocalStorageValue = JSON.parse(currentStorageState.origins[0].localStorage[0].value);\n const newIssuedTime = await this.currentDateToEpoch();\n\n currentLocalStorageValue.access_token = localStorageValue.access_token;\n currentLocalStorageValue.refresh_token = localStorageValue.refresh_token;\n currentLocalStorageValue.issued_at = newIssuedTime;\n currentLocalStorageValue.scope = localStorageValue.scope;\n currentLocalStorageValue.token_type = localStorageValue.token_type;\n currentLocalStorageValue.expires_in = localStorageValue.expires_in.toString();\n\n const filePath = process.env.STORAGE_STAGE_PATH;\n // Updates the user.json file in our CMS project\n if (filePath) {\n try {\n const data = await this.readFileContent(filePath);\n const localStorage = data.origins[0].localStorage[0];\n if (localStorage.name === 'umb:userAuthTokenResponse') {\n localStorage.value = JSON.stringify(currentLocalStorageValue);\n }\n\n // Converts the object to JSON string\n const updatedJsonString = JSON.stringify(data, null, 2);\n // Writes the updated JSON content to the file\n fs.writeFileSync(filePath, updatedJsonString, 'utf-8');\n } catch (error) {\n console.error('Error updating token:', error);\n }\n }\n }\n\n private async updateCookie(cookieString: string) {\n const currentStorageState = await this.page.context().storageState();\n let currentCookie = currentStorageState.cookies[0];\n\n const parts = cookieString.split(';').map(part => part.trim());\n // Extract the main key-value pair\n const [nameValue, ...attributes] = parts;\n const [, value] = nameValue.split('=');\n // Updates the cookie value\n currentCookie.value = value;\n // Process each attribute\n for (const attr of attributes) {\n const [key, val] = attr.split('=');\n if (key.trim().toLowerCase() === 'expires') {\n // Updates the expires value and converts it to Epoch\n currentCookie.expires = await this.dateToEpoch(new Date(val));\n }\n }\n\n const filePath = process.env.STORAGE_STAGE_PATH;\n\n if (filePath) {\n try {\n const data = await this.readFileContent(filePath);\n data.cookies[0] = currentCookie;\n const updatedJsonString = JSON.stringify(data, null, 2);\n fs.writeFileSync(filePath, updatedJsonString, 'utf-8');\n } catch (error) {\n console.error('Error updating cookie:', error);\n }\n }\n }\n\n async revokeAccessToken(cookie: string, accessToken: string) {\n return await this.page.request.post(this.baseUrl + '/umbraco/management/api/v1/security/back-office/revoke', {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Cookie: cookie,\n Origin: this.baseUrl\n },\n form:\n {\n token: accessToken,\n token_type_hint: 'access_token',\n client_id: 'umbraco-back-office'\n },\n ignoreHTTPSErrors: true\n });\n }\n\n async revokeRefreshToken(cookie: string, refreshToken: string) {\n return await this.page.request.post(this.baseUrl + '/umbraco/management/api/v1/security/back-office/revoke', {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Cookie: cookie,\n Origin: this.baseUrl\n },\n form:\n {\n token: refreshToken,\n token_type_hint: 'refresh_token',\n client_id: 'umbraco-back-office'\n },\n ignoreHTTPSErrors: true\n });\n }\n\n async loginToAdminUser(testUserCookie: string, testUserAccessToken: string, testUserRefreshToken: string) {\n await this.revokeAccessToken(testUserCookie, testUserAccessToken);\n await this.revokeRefreshToken(testUserCookie, testUserRefreshToken);\n await this.updateTokenAndCookie(umbracoConfig.user.login, umbracoConfig.user.password);\n }\n}"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Page } from "@playwright/test";
|
|
1
|
+
import { Page, Locator } from "@playwright/test";
|
|
2
2
|
import { UiBaseLocators } from "./UiBaseLocators";
|
|
3
3
|
export declare class ContentUiHelper extends UiBaseLocators {
|
|
4
4
|
private readonly contentNameTxt;
|
|
@@ -79,6 +79,33 @@ export declare class ContentUiHelper extends UiBaseLocators {
|
|
|
79
79
|
private readonly documentLanguageSelect;
|
|
80
80
|
private readonly documentLanguageSelectPopover;
|
|
81
81
|
private readonly documentReadOnly;
|
|
82
|
+
private readonly documentWorkspaceEditor;
|
|
83
|
+
private readonly documentBlueprintModal;
|
|
84
|
+
private readonly documentBlueprintModalEnterNameTxt;
|
|
85
|
+
private readonly documentBlueprintSaveBtn;
|
|
86
|
+
private readonly exactTrashBtn;
|
|
87
|
+
private readonly emptyRecycleBinBtn;
|
|
88
|
+
private readonly confirmEmptyRecycleBinBtn;
|
|
89
|
+
private readonly duplicateToBtn;
|
|
90
|
+
private readonly moveToBtn;
|
|
91
|
+
private readonly duplicateBtn;
|
|
92
|
+
private readonly contentTreeRefreshBtn;
|
|
93
|
+
private readonly sortChildrenBtn;
|
|
94
|
+
private readonly rollbackBtn;
|
|
95
|
+
private readonly rollbackContainerBtn;
|
|
96
|
+
private readonly publicAccessBtn;
|
|
97
|
+
private readonly uuiCheckbox;
|
|
98
|
+
private readonly sortBtn;
|
|
99
|
+
private readonly modalChooseBtn;
|
|
100
|
+
private readonly containerSaveBtn;
|
|
101
|
+
private readonly groupBasedProtectionBtn;
|
|
102
|
+
private readonly nextBtn;
|
|
103
|
+
private readonly chooseMemberGroupBtn;
|
|
104
|
+
private readonly selectLoginPageDocument;
|
|
105
|
+
private readonly selectErrorPageDocument;
|
|
106
|
+
private readonly rollbackItem;
|
|
107
|
+
private readonly expandChildItemsForContent;
|
|
108
|
+
private readonly actionsMenu;
|
|
82
109
|
constructor(page: Page);
|
|
83
110
|
enterContentName(name: string): Promise<void>;
|
|
84
111
|
clickSaveAndPublishButton(): Promise<void>;
|
|
@@ -167,7 +194,7 @@ export declare class ContentUiHelper extends UiBaseLocators {
|
|
|
167
194
|
isDocumentTypeNameVisible(contentName: string, isVisible?: boolean): Promise<void>;
|
|
168
195
|
doesModalHaveText(text: string): Promise<void>;
|
|
169
196
|
isTabNameVisible(tabName: string): Promise<void>;
|
|
170
|
-
|
|
197
|
+
doesDocumentHaveName(name: string): Promise<void>;
|
|
171
198
|
doesDocumentTableColumnNameValuesMatch(expectedValues: string[]): Promise<void>;
|
|
172
199
|
searchByKeywordInCollection(keyword: string): Promise<void>;
|
|
173
200
|
clickVariantSelectorButton(): Promise<void>;
|
|
@@ -188,12 +215,39 @@ export declare class ContentUiHelper extends UiBaseLocators {
|
|
|
188
215
|
clickTrashSelectedListItems(): Promise<void>;
|
|
189
216
|
selectDocumentWithNameAtRoot(name: string): Promise<void>;
|
|
190
217
|
clickTrashButton(toForceClick?: boolean): Promise<void>;
|
|
218
|
+
clickExactTrashButton(): Promise<void>;
|
|
191
219
|
isDocumentListViewVisible(isVisible?: boolean): Promise<void>;
|
|
192
220
|
isDocumentGridViewVisible(isVisible?: boolean): Promise<void>;
|
|
193
221
|
changeDocumentSectionLanguage(newLanguageName: string): Promise<void>;
|
|
194
222
|
doesDocumentSectionHaveLanguageSelected(languageName: string): Promise<void>;
|
|
195
223
|
isDocumentReadOnly(isVisible?: boolean): Promise<void>;
|
|
196
224
|
isDocumentNameInputEditable(isEditable?: boolean): Promise<void>;
|
|
225
|
+
isActionsMenuForRecycleBinVisible(isVisible?: boolean): Promise<void>;
|
|
226
|
+
isActionsMenuForRootVisible(isVisible?: boolean): Promise<void>;
|
|
227
|
+
clickEmptyRecycleBinButton(): Promise<void>;
|
|
228
|
+
clickConfirmEmptyRecycleBinButton(): Promise<void>;
|
|
197
229
|
isDocumentPropertyEditable(propertyName: string, isEditable?: boolean): Promise<void>;
|
|
230
|
+
doesDocumentPropertyHaveValue(propertyName: string, value: string): Promise<void>;
|
|
198
231
|
isDocumentTreeEmpty(): Promise<void>;
|
|
232
|
+
doesDocumentWorkspaceContainName(name: string): Promise<void>;
|
|
233
|
+
doesDocumentWorkspaceHaveText(text: string): Promise<void>;
|
|
234
|
+
enterDocumentBlueprintName(name: string): Promise<void>;
|
|
235
|
+
clickSaveDocumentBlueprintButton(): Promise<void>;
|
|
236
|
+
clickDuplicateToButton(): Promise<void>;
|
|
237
|
+
clickDuplicateButton(): Promise<void>;
|
|
238
|
+
clickMoveToButton(): Promise<void>;
|
|
239
|
+
moveToContentWithName(parentNames: string[], moveTo: string): Promise<void>;
|
|
240
|
+
isCaretButtonVisibleForContentName(contentName: string, isVisible?: boolean): Promise<void>;
|
|
241
|
+
reloadContentTree(): Promise<void>;
|
|
242
|
+
clickSortChildrenButton(): Promise<void>;
|
|
243
|
+
clickRollbackButton(): Promise<void>;
|
|
244
|
+
clickRollbackContainerButton(): Promise<void>;
|
|
245
|
+
clickLatestRollBackItem(): Promise<void>;
|
|
246
|
+
clickPublicAccessButton(): Promise<void>;
|
|
247
|
+
addGroupBasedPublicAccess(memberGroupName: string, documentName: string): Promise<void>;
|
|
248
|
+
sortChildrenDragAndDrop(dragFromSelector: Locator, dragToSelector: Locator, verticalOffset?: number, horizontalOffset?: number, steps?: number): Promise<void>;
|
|
249
|
+
clickSortButton(): Promise<void>;
|
|
250
|
+
doesIndexDocumentInTreeContainName(parentName: string, childName: string, index: number): Promise<void>;
|
|
251
|
+
selectMemberGroup(memberGroupName: string): Promise<void>;
|
|
252
|
+
isPermissionInActionsMenuVisible(permissionName: string, isVisible?: boolean): Promise<void>;
|
|
199
253
|
}
|
|
@@ -82,6 +82,33 @@ class ContentUiHelper extends UiBaseLocators_1.UiBaseLocators {
|
|
|
82
82
|
documentLanguageSelect;
|
|
83
83
|
documentLanguageSelectPopover;
|
|
84
84
|
documentReadOnly;
|
|
85
|
+
documentWorkspaceEditor;
|
|
86
|
+
documentBlueprintModal;
|
|
87
|
+
documentBlueprintModalEnterNameTxt;
|
|
88
|
+
documentBlueprintSaveBtn;
|
|
89
|
+
exactTrashBtn;
|
|
90
|
+
emptyRecycleBinBtn;
|
|
91
|
+
confirmEmptyRecycleBinBtn;
|
|
92
|
+
duplicateToBtn;
|
|
93
|
+
moveToBtn;
|
|
94
|
+
duplicateBtn;
|
|
95
|
+
contentTreeRefreshBtn;
|
|
96
|
+
sortChildrenBtn;
|
|
97
|
+
rollbackBtn;
|
|
98
|
+
rollbackContainerBtn;
|
|
99
|
+
publicAccessBtn;
|
|
100
|
+
uuiCheckbox;
|
|
101
|
+
sortBtn;
|
|
102
|
+
modalChooseBtn;
|
|
103
|
+
containerSaveBtn;
|
|
104
|
+
groupBasedProtectionBtn;
|
|
105
|
+
nextBtn;
|
|
106
|
+
chooseMemberGroupBtn;
|
|
107
|
+
selectLoginPageDocument;
|
|
108
|
+
selectErrorPageDocument;
|
|
109
|
+
rollbackItem;
|
|
110
|
+
expandChildItemsForContent;
|
|
111
|
+
actionsMenu;
|
|
85
112
|
constructor(page) {
|
|
86
113
|
super(page);
|
|
87
114
|
this.contentNameTxt = page.locator('#name-input input');
|
|
@@ -152,7 +179,7 @@ class ContentUiHelper extends UiBaseLocators_1.UiBaseLocators {
|
|
|
152
179
|
this.saveModalBtn = this.sidebarModal.getByLabel('Save', { exact: true });
|
|
153
180
|
this.resetFocalPointBtn = this.page.getByLabel('Reset focal point');
|
|
154
181
|
// List View
|
|
155
|
-
this.enterNameInContainerTxt =
|
|
182
|
+
this.enterNameInContainerTxt = this.container.getByLabel('Enter a name...');
|
|
156
183
|
this.listView = page.locator('umb-document-table-collection-view');
|
|
157
184
|
this.nameBtn = page.getByRole('button', { name: 'Name' });
|
|
158
185
|
this.listViewTableRow = this.listView.locator('uui-table-row');
|
|
@@ -163,8 +190,35 @@ class ContentUiHelper extends UiBaseLocators_1.UiBaseLocators {
|
|
|
163
190
|
this.trashSelectedListItems = page.getByRole('button', { name: 'Trash', exact: true });
|
|
164
191
|
this.modalContent = page.locator('umb-tree-picker-modal');
|
|
165
192
|
this.trashBtn = page.getByLabel('Trash');
|
|
193
|
+
this.exactTrashBtn = page.getByRole('button', { name: 'Trash', exact: true });
|
|
166
194
|
this.documentListView = page.locator('umb-document-table-collection-view');
|
|
167
195
|
this.documentGridView = page.locator('umb-document-grid-collection-view');
|
|
196
|
+
this.documentWorkspaceEditor = page.locator('umb-workspace-editor');
|
|
197
|
+
this.documentBlueprintModal = page.locator('umb-create-blueprint-modal');
|
|
198
|
+
this.documentBlueprintModalEnterNameTxt = this.documentBlueprintModal.locator('input');
|
|
199
|
+
this.documentBlueprintSaveBtn = this.documentBlueprintModal.getByLabel('Save');
|
|
200
|
+
this.emptyRecycleBinBtn = page.getByLabel('Empty recycle bin..');
|
|
201
|
+
this.confirmEmptyRecycleBinBtn = page.getByLabel('Empty Recycle Bin', { exact: true });
|
|
202
|
+
this.duplicateToBtn = page.getByRole('button', { name: 'Duplicate to' });
|
|
203
|
+
this.moveToBtn = page.getByRole('button', { name: 'Move to' });
|
|
204
|
+
this.duplicateBtn = page.getByLabel('Duplicate', { exact: true });
|
|
205
|
+
this.contentTreeRefreshBtn = page.locator('#header').getByLabel('#actions_refreshNode');
|
|
206
|
+
this.sortChildrenBtn = page.getByRole('button', { name: 'Sort children' });
|
|
207
|
+
this.rollbackBtn = page.getByRole('button', { name: 'Rollback' });
|
|
208
|
+
this.rollbackContainerBtn = this.container.getByLabel('Rollback');
|
|
209
|
+
this.publicAccessBtn = page.getByRole('button', { name: 'Public Access' });
|
|
210
|
+
this.uuiCheckbox = page.locator('uui-checkbox');
|
|
211
|
+
this.sortBtn = page.getByLabel('Sort', { exact: true });
|
|
212
|
+
this.modalChooseBtn = page.locator('umb-tree-picker-modal').getByLabel('Choose');
|
|
213
|
+
this.containerSaveBtn = this.container.getByLabel('Save');
|
|
214
|
+
this.groupBasedProtectionBtn = page.locator('span').filter({ hasText: 'Group based protection' });
|
|
215
|
+
this.nextBtn = page.getByLabel('Next');
|
|
216
|
+
this.chooseMemberGroupBtn = page.locator('umb-input-member-group').getByLabel('Choose');
|
|
217
|
+
this.selectLoginPageDocument = page.locator('.select-item').filter({ hasText: 'Login Page' }).locator('umb-input-document');
|
|
218
|
+
this.selectErrorPageDocument = page.locator('.select-item').filter({ hasText: 'Error Page' }).locator('umb-input-document');
|
|
219
|
+
this.rollbackItem = page.locator('.rollback-item');
|
|
220
|
+
this.expandChildItemsForContent = page.getByLabel('Expand child items for Content');
|
|
221
|
+
this.actionsMenu = page.locator('uui-scroll-container');
|
|
168
222
|
}
|
|
169
223
|
async enterContentName(name) {
|
|
170
224
|
await (0, test_1.expect)(this.contentNameTxt).toBeVisible();
|
|
@@ -333,7 +387,7 @@ class ContentUiHelper extends UiBaseLocators_1.UiBaseLocators {
|
|
|
333
387
|
await (0, test_1.expect)(this.documentTreeItem.getByLabel(name, { exact: true })).toBeVisible({ visible: isVisible });
|
|
334
388
|
}
|
|
335
389
|
async isChildContentInTreeVisible(parentName, childName, isVisible = true) {
|
|
336
|
-
await (0, test_1.expect)(this.documentTreeItem.
|
|
390
|
+
await (0, test_1.expect)(this.documentTreeItem.locator('[label="' + parentName + '"]').getByLabel(childName)).toBeVisible({ visible: isVisible });
|
|
337
391
|
}
|
|
338
392
|
async removeContentPicker(contentPickerName) {
|
|
339
393
|
await this.page.locator('[name="' + contentPickerName + '"]').getByLabel('Remove').click();
|
|
@@ -491,8 +545,8 @@ class ContentUiHelper extends UiBaseLocators_1.UiBaseLocators {
|
|
|
491
545
|
async isTabNameVisible(tabName) {
|
|
492
546
|
return (0, test_1.expect)(this.tabItems.filter({ hasText: tabName })).toBeVisible();
|
|
493
547
|
}
|
|
494
|
-
async
|
|
495
|
-
return (0, test_1.expect)(this.
|
|
548
|
+
async doesDocumentHaveName(name) {
|
|
549
|
+
return (0, test_1.expect)(this.enterAName).toHaveValue(name);
|
|
496
550
|
}
|
|
497
551
|
async doesDocumentTableColumnNameValuesMatch(expectedValues) {
|
|
498
552
|
return expectedValues.forEach((text, index) => {
|
|
@@ -564,6 +618,9 @@ class ContentUiHelper extends UiBaseLocators_1.UiBaseLocators {
|
|
|
564
618
|
async clickTrashButton(toForceClick = false) {
|
|
565
619
|
await this.trashBtn.click({ force: toForceClick });
|
|
566
620
|
}
|
|
621
|
+
async clickExactTrashButton() {
|
|
622
|
+
await this.exactTrashBtn.click();
|
|
623
|
+
}
|
|
567
624
|
async isDocumentListViewVisible(isVisible = true) {
|
|
568
625
|
await (0, test_1.expect)(this.documentListView).toBeVisible({ visible: isVisible });
|
|
569
626
|
}
|
|
@@ -584,14 +641,124 @@ class ContentUiHelper extends UiBaseLocators_1.UiBaseLocators {
|
|
|
584
641
|
await (0, test_1.expect)(this.contentNameTxt).toBeVisible();
|
|
585
642
|
await (0, test_1.expect)(this.contentNameTxt).toBeEditable({ editable: isEditable });
|
|
586
643
|
}
|
|
644
|
+
async isActionsMenuForRecycleBinVisible(isVisible = true) {
|
|
645
|
+
await this.isActionsMenuForNameVisible('Recycle Bin', isVisible);
|
|
646
|
+
}
|
|
647
|
+
async isActionsMenuForRootVisible(isVisible = true) {
|
|
648
|
+
await this.isActionsMenuForNameVisible('Content', isVisible);
|
|
649
|
+
}
|
|
650
|
+
async clickEmptyRecycleBinButton() {
|
|
651
|
+
await this.emptyRecycleBinBtn.click({ force: true });
|
|
652
|
+
}
|
|
653
|
+
async clickConfirmEmptyRecycleBinButton() {
|
|
654
|
+
await this.confirmEmptyRecycleBinBtn.click();
|
|
655
|
+
}
|
|
587
656
|
async isDocumentPropertyEditable(propertyName, isEditable = true) {
|
|
588
657
|
const propertyLocator = this.documentWorkspace.locator('umb-property').filter({ hasText: propertyName }).locator('#input');
|
|
589
658
|
await (0, test_1.expect)(propertyLocator).toBeVisible();
|
|
590
659
|
await (0, test_1.expect)(propertyLocator).toBeEditable({ editable: isEditable });
|
|
591
660
|
}
|
|
661
|
+
async doesDocumentPropertyHaveValue(propertyName, value) {
|
|
662
|
+
const propertyLocator = this.documentWorkspace.locator('umb-property').filter({ hasText: propertyName }).locator('#input');
|
|
663
|
+
await (0, test_1.expect)(propertyLocator).toHaveValue(value);
|
|
664
|
+
}
|
|
592
665
|
async isDocumentTreeEmpty() {
|
|
593
666
|
await (0, test_1.expect)(this.documentTreeItem).toHaveCount(0);
|
|
594
667
|
}
|
|
668
|
+
async doesDocumentWorkspaceContainName(name) {
|
|
669
|
+
await (0, test_1.expect)(this.documentWorkspaceEditor.locator('#input')).toHaveValue(name);
|
|
670
|
+
}
|
|
671
|
+
async doesDocumentWorkspaceHaveText(text) {
|
|
672
|
+
return (0, test_1.expect)(this.documentWorkspace).toContainText(text);
|
|
673
|
+
}
|
|
674
|
+
async enterDocumentBlueprintName(name) {
|
|
675
|
+
await this.documentBlueprintModalEnterNameTxt.clear();
|
|
676
|
+
await this.documentBlueprintModalEnterNameTxt.fill(name);
|
|
677
|
+
}
|
|
678
|
+
async clickSaveDocumentBlueprintButton() {
|
|
679
|
+
await this.documentBlueprintSaveBtn.click();
|
|
680
|
+
}
|
|
681
|
+
async clickDuplicateToButton() {
|
|
682
|
+
await this.duplicateToBtn.click();
|
|
683
|
+
}
|
|
684
|
+
async clickDuplicateButton() {
|
|
685
|
+
await this.duplicateBtn.click();
|
|
686
|
+
}
|
|
687
|
+
async clickMoveToButton() {
|
|
688
|
+
await this.moveToBtn.click();
|
|
689
|
+
}
|
|
690
|
+
async moveToContentWithName(parentNames, moveTo) {
|
|
691
|
+
await this.expandChildItemsForContent.click();
|
|
692
|
+
for (const contentName of parentNames) {
|
|
693
|
+
await this.container.getByLabel('Expand child items for ' + contentName).click();
|
|
694
|
+
}
|
|
695
|
+
await this.container.getByLabel(moveTo).click();
|
|
696
|
+
await this.clickChooseContainerButton();
|
|
697
|
+
}
|
|
698
|
+
async isCaretButtonVisibleForContentName(contentName, isVisible = true) {
|
|
699
|
+
await (0, test_1.expect)(this.page.locator('[label="' + contentName + '"]').getByLabel('Expand child items for ')).toBeVisible({ visible: isVisible });
|
|
700
|
+
}
|
|
701
|
+
async reloadContentTree() {
|
|
702
|
+
await this.contentTreeRefreshBtn.click({ force: true });
|
|
703
|
+
}
|
|
704
|
+
async clickSortChildrenButton() {
|
|
705
|
+
await this.sortChildrenBtn.click();
|
|
706
|
+
}
|
|
707
|
+
async clickRollbackButton() {
|
|
708
|
+
await this.rollbackBtn.click();
|
|
709
|
+
}
|
|
710
|
+
async clickRollbackContainerButton() {
|
|
711
|
+
await this.rollbackContainerBtn.click();
|
|
712
|
+
}
|
|
713
|
+
async clickLatestRollBackItem() {
|
|
714
|
+
await this.rollbackItem.last().click();
|
|
715
|
+
}
|
|
716
|
+
async clickPublicAccessButton() {
|
|
717
|
+
await this.publicAccessBtn.click();
|
|
718
|
+
}
|
|
719
|
+
async addGroupBasedPublicAccess(memberGroupName, documentName) {
|
|
720
|
+
await this.groupBasedProtectionBtn.click();
|
|
721
|
+
await this.nextBtn.click();
|
|
722
|
+
await this.chooseMemberGroupBtn.click();
|
|
723
|
+
await this.page.getByLabel(memberGroupName).click();
|
|
724
|
+
await this.clickSubmitButton();
|
|
725
|
+
await this.selectLoginPageDocument.click();
|
|
726
|
+
await this.container.getByLabel(documentName, { exact: true }).click();
|
|
727
|
+
await this.modalChooseBtn.click();
|
|
728
|
+
await this.selectErrorPageDocument.click();
|
|
729
|
+
await this.container.getByLabel(documentName, { exact: true }).click();
|
|
730
|
+
await this.modalChooseBtn.click();
|
|
731
|
+
await this.containerSaveBtn.click();
|
|
732
|
+
}
|
|
733
|
+
async sortChildrenDragAndDrop(dragFromSelector, dragToSelector, verticalOffset = 0, horizontalOffset = 0, steps = 5) {
|
|
734
|
+
await (0, test_1.expect)(dragFromSelector).toBeVisible();
|
|
735
|
+
await (0, test_1.expect)(dragToSelector).toBeVisible();
|
|
736
|
+
const targetLocation = await dragToSelector.boundingBox();
|
|
737
|
+
const elementCenterX = targetLocation.x + targetLocation.width / 2;
|
|
738
|
+
const elementCenterY = targetLocation.y + targetLocation.height / 2;
|
|
739
|
+
await dragFromSelector.hover();
|
|
740
|
+
await this.page.mouse.move(10, 10);
|
|
741
|
+
await dragFromSelector.hover();
|
|
742
|
+
await this.page.mouse.down();
|
|
743
|
+
await this.page.waitForTimeout(400);
|
|
744
|
+
await this.page.mouse.move(elementCenterX + horizontalOffset, elementCenterY + verticalOffset, { steps: steps });
|
|
745
|
+
await this.page.waitForTimeout(400);
|
|
746
|
+
// If we do not have this, the drag and drop will not work
|
|
747
|
+
await dragToSelector.hover();
|
|
748
|
+
await this.page.mouse.up();
|
|
749
|
+
}
|
|
750
|
+
async clickSortButton() {
|
|
751
|
+
await this.sortBtn.click();
|
|
752
|
+
}
|
|
753
|
+
async doesIndexDocumentInTreeContainName(parentName, childName, index) {
|
|
754
|
+
await (0, test_1.expect)(this.documentTreeItem.locator('[label="' + parentName + '"]').locator('umb-tree-item').nth(index).locator('#label')).toHaveText(childName);
|
|
755
|
+
}
|
|
756
|
+
async selectMemberGroup(memberGroupName) {
|
|
757
|
+
await this.uuiCheckbox.getByLabel(memberGroupName).click();
|
|
758
|
+
}
|
|
759
|
+
async isPermissionInActionsMenuVisible(permissionName, isVisible = true) {
|
|
760
|
+
await (0, test_1.expect)(this.actionsMenu.getByRole('button', { name: permissionName, exact: true })).toBeVisible({ visible: isVisible });
|
|
761
|
+
}
|
|
595
762
|
}
|
|
596
763
|
exports.ContentUiHelper = ContentUiHelper;
|
|
597
764
|
//# sourceMappingURL=ContentUiHelper.js.map
|