[ACS-5343] refactor Playwright framework in ACA (#3261)

* [ACS-5343] refactor Playwright framework in ACA

* Add the tests for Actions, from the Adam PR [ACS-5328]

* Small fixes

* Improve logs

* [ACS-5343] adding-goThroughPages-and-delete

* [ACS-5343] added git changes

* [ACS-5343] added git changes for playwright

* [ACS-5343] fix for e2e

* [ACS-5343] e2e protractor path fix

* remove import

* [ACS-5343] e2e playwright user fix

* [ACS-5343] e2e playwright user ids fix

* [ACS-5343] e2e playwright users ids fix

* changes for git

* fix playwright test run

* tsconfig path fix

* playwright action yml added

* retrigger checks

* add test id from testrail

* merge conflits

* fix gha

* fix credentials

---------

Co-authored-by: adam.zakrzewski <adam.zakrzewski@hyland.com>
Co-authored-by: akash.rathod@hyland.com <akash.rathod@hyland.com>
Co-authored-by: Denys Vuika <denys.vuika@gmail.com>
This commit is contained in:
Michał Fidor
2023-06-16 19:07:09 +02:00
committed by GitHub
parent e0a74d7fb9
commit c843a8dbaa
180 changed files with 897 additions and 235 deletions

View File

@@ -0,0 +1,138 @@
/*!
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Alfresco Example Content Application
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import {
AdminTenantsApi,
AdminUsersApi,
AlfrescoApi,
ContentClient,
GroupsApi,
NodesApi,
PeopleApi,
QueriesApi,
SearchApi,
SecurityGroupsApi,
SecurityMarksApi,
SitesApi,
UploadApi
} from '@alfresco/js-api';
import { logger } from '@alfresco/adf-cli/scripts/logger';
import { ActionTypes, Rule } from './rules-api';
import { users } from '../base-config';
export interface AcaBackend {
sites: SitesApi;
upload: UploadApi;
nodes: NodesApi;
tearDown(): Promise<any>;
}
const config = {
authType: process.env.APP_CONFIG_AUTH_TYPE,
hostBpm: process.env.APP_CONFIG_BPM_HOST,
hostEcm: process.env.APP_CONFIG_ECM_HOST,
provider: process.env.APP_CONFIG_PROVIDER,
contextRoot: 'alfresco'
};
export class ApiClientFactory {
public alfrescoApi: AlfrescoApi;
public sites: SitesApi;
public upload: UploadApi;
public nodes: NodesApi;
public people: PeopleApi;
public adminUsers: AdminUsersApi;
public adminTenant: AdminTenantsApi;
public groups: GroupsApi;
public queries: QueriesApi;
public search: SearchApi;
public securityGroupsApi: SecurityGroupsApi;
public securityMarksApi: SecurityMarksApi;
public contentClient: ContentClient;
constructor() {
this.alfrescoApi = new AlfrescoApi(config);
}
public async setUpAcaBackend(userProfile: keyof typeof users): Promise<AcaBackend> {
await this.login(userProfile);
this.sites = new SitesApi(this.alfrescoApi);
this.upload = new UploadApi(this.alfrescoApi);
this.nodes = new NodesApi(this.alfrescoApi);
this.people = new PeopleApi(this.alfrescoApi);
this.adminUsers = new AdminUsersApi(this.alfrescoApi);
this.adminTenant = new AdminTenantsApi(this.alfrescoApi);
this.groups = new GroupsApi(this.alfrescoApi);
this.queries = new QueriesApi(this.alfrescoApi);
this.search = new SearchApi(this.alfrescoApi);
this.securityGroupsApi = new SecurityGroupsApi(this.alfrescoApi);
this.securityMarksApi = new SecurityMarksApi(this.alfrescoApi);
return this;
}
async tearDown(): Promise<ApiClientFactory> {
await this.alfrescoApi.logout();
return this;
}
private callApi(path: string, httpMethod: string, body: object = {}): Promise<any> {
// APIs used by this service are still private and not yet available for public use
const params = [{}, {}, {}, {}, body, ['application/json'], ['application/json']];
return this.alfrescoApi.contentPrivateClient.callApi(path, httpMethod, ...params);
}
async createRule(nodeId: string, rule: Partial<Rule>, ruleSetId: string = '-default-'): Promise<Rule> {
const response = await this.callApi(`/nodes/${nodeId}/rule-sets/${ruleSetId}/rules`, 'POST', { ...rule });
return response.entry;
}
async createRandomRule(folderId: string, ruleName: string): Promise<Rule> {
const response = await this.createRule(folderId, {
name: ruleName,
isEnabled: true,
actions: [ActionTypes.ADDFEATURES.value, ActionTypes.CHECKIN.value]
});
return response;
}
async login(userProfile: keyof typeof users) {
const userToLog =
users[
Object.keys(users)
.filter((user) => user.match(new RegExp(`^${userProfile.toString()}$`)))
.toString()
] || userProfile;
let e: any;
try {
e = await this.alfrescoApi.login(userToLog.username, userToLog.password);
} catch (error) {
logger.error(`[API Client Factory] Log in user ${userToLog.username} failed ${e}`);
throw error;
}
}
}

View File

@@ -0,0 +1,26 @@
/*!
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Alfresco Example Content Application
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
export * from './rules-api';
export * from './api-client-factory';

View File

@@ -0,0 +1,72 @@
/*!
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Alfresco Example Content Application
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
type RuleTrigger = 'inbound' | 'update' | 'outbound';
export interface RuleCompositeCondition {
inverted: boolean;
booleanMode: 'and' | 'or';
compositeConditions: RuleCompositeCondition[];
simpleConditions: RuleSimpleCondition[];
}
export interface RuleSimpleCondition {
field: string;
comparator: string;
parameter: string;
}
export interface Rule {
id: string;
name: string;
description: string;
isEnabled: boolean;
isInheritable: boolean;
isAsynchronous: boolean;
errorScript: string;
isShared: boolean;
triggers: RuleTrigger[];
conditions: RuleCompositeCondition;
actions: RuleAction[];
}
export interface RuleAction {
actionDefinitionId: string;
params?: { [key: string]: unknown };
}
export class ActionTypes {
static ADDFEATURES = new ActionTypes('ADDFEATURES', {
actionDefinitionId: 'add-features',
params: { 'aspect-name': 'cm:thumbnailed' }
});
static CHECKIN = new ActionTypes('CHECKIN', {
actionDefinitionId: 'check-in',
params: {
description: 'test',
minorChange: true
}
});
constructor(public key: string, public value: RuleAction) {}
}