[AAE-1923] Form APS E2E (#5540)

* [AAE-1923] Form APS E2E

* * minor changes

* * fixed e2e
This commit is contained in:
dhrn
2020-03-16 17:19:11 +05:30
committed by GitHub
parent 8e5e5c90ac
commit c64396b2fe
21 changed files with 761 additions and 107 deletions

View File

@@ -22,15 +22,22 @@ import { LoginPage, BrowserActions, Widget } from '@alfresco/adf-testing';
import { TasksPage } from '../../pages/adf/process-services/tasks.page';
import CONSTANTS = require('../../util/constants');
import { browser } from 'protractor';
import { NavigationBarPage } from '../../pages/adf/navigation-bar.page';
describe('Dynamic Table widget ', () => {
const loginPage = new LoginPage();
let processUserModel;
const taskPage = new TasksPage();
const widget = new Widget();
let alfrescoJsApi;
const appsActions = new AppsActions();
const users = new UsersActions();
const navigationBarPage = new NavigationBarPage();
const alfrescoJsApi = new AlfrescoApi({
provider: 'BPM',
hostBpm: browser.params.testConfig.adf_aps.host
});
let processUserModel;
let appModel;
let deployedApp, process;
@@ -38,27 +45,16 @@ describe('Dynamic Table widget ', () => {
const app = browser.params.resources.Files.WIDGET_CHECK_APP.DYNAMIC_TABLE;
beforeAll(async () => {
const users = new UsersActions();
alfrescoJsApi = new AlfrescoApi({
provider: 'BPM',
hostBpm: browser.params.testConfig.adf_aps.host
});
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
processUserModel = await users.createTenantAndUser(alfrescoJsApi);
await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
deployedApp = appDefinitions.data.find((currentApp) => {
return currentApp.modelId === appModel.id;
});
deployedApp = appDefinitions.data.find((currentApp) => currentApp.modelId === appModel.id);
process = await appsActions.startProcess(alfrescoJsApi, appModel, app.processName);
await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
});
beforeEach(async () => {
@@ -72,7 +68,7 @@ describe('Dynamic Table widget ', () => {
await alfrescoJsApi.activiti.processApi.deleteProcessInstance(process.id);
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
await alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(processUserModel.tenantId);
await navigationBarPage.clickLogoutButton();
});
it('[C276729] Should be possible to set visibility properties for Dynamic Table', async () => {
@@ -82,7 +78,7 @@ describe('Dynamic Table widget ', () => {
});
it('[C279349] Should be able to have a Date Time widget in a Dynamic Table widget', async () => {
await widget.dynamicTable().clickAddButton();
await widget.dynamicTable().clickAddRow();
await widget.dateTimeWidget().openDatepicker(app.FIELD.dateTime_input_id);
await widget.dateTimeWidget().selectDay('10');
await widget.dateTimeWidget().selectHour('8');
@@ -95,50 +91,38 @@ describe('Dynamic Table widget ', () => {
});
describe('with People Widget App', () => {
const app = browser.params.resources.Files.WIDGET_CHECK_APP.DYNAMIC_TABLE_USERS;
beforeAll(async () => {
const users = new UsersActions();
alfrescoJsApi = new AlfrescoApi({
provider: 'BPM',
hostBpm: browser.params.testConfig.adf_aps.host
});
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
processUserModel = await users.createTenantAndUser(alfrescoJsApi);
await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, browser.params.resources.Files.WIDGET_CHECK_APP.file_location);
const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
deployedApp = appDefinitions.data.find((currentApp) => {
return currentApp.modelId === appModel.id;
});
deployedApp = appDefinitions.data.find((currentApp) => currentApp.modelId === appModel.id);
process = await appsActions.startProcess(alfrescoJsApi, appModel, app.processName);
await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.params.testConfig.adf.url}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});
afterAll(async () => {
await alfrescoJsApi.activiti.processApi.deleteProcessInstance(process.id);
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
await alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(processUserModel.tenantId);
await navigationBarPage.clickLogoutButton();
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.params.testConfig.adf.url}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.tasksListPage().checkTaskListIsLoaded();
await taskPage.formFields().checkFormIsDisplayed();
});
it('[C260407] Should be able to add/delete/update row in Dynamic Table widget', async () => {
await widget.dynamicTable().clickAddRow();
await widget.dynamicTable().clickAddRow(app.FIELD.dynamic_table_id);
await widget.dynamicTable().setDatatableInput('User1');
await widget.dynamicTable().clickSaveButton();
await expect(await widget.dynamicTable().getTableRowText(0)).toEqual('User1');
@@ -154,10 +138,65 @@ describe('Dynamic Table widget ', () => {
await widget.dynamicTable().clickSaveButton();
await expect(await widget.dynamicTable().getTableRowText(0)).toEqual('User2');
await widget.dynamicTable().clickAddRow();
await widget.dynamicTable().clickAddRow(app.FIELD.dynamic_table_id);
await widget.dynamicTable().setDatatableInput('User3');
await widget.dynamicTable().clickCancelButton();
await widget.dynamicTable().checkTableRowIsNotVisible(1);
});
});
describe('Custom validation', () => {
const app = browser.params.resources.Files.WIDGET_CHECK_APP;
beforeAll(async () => {
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
processUserModel = await users.createTenantAndUser(alfrescoJsApi);
await alfrescoJsApi.login(processUserModel.email, processUserModel.password);
const application = await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location);
const appDefinitions = await alfrescoJsApi.activiti.appsApi.getAppDefinitions();
deployedApp = appDefinitions.data.find((currentApp) => currentApp.modelId === application.id);
process = await appsActions.startProcess(alfrescoJsApi, application, app.CUSTOM_VALIDATOR.processName);
});
afterAll(async () => {
await alfrescoJsApi.activiti.processApi.deleteProcessInstance(process.id);
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
await alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(processUserModel.tenantId);
});
beforeEach(async () => {
await loginPage.loginToProcessServicesUsingUserModel(processUserModel);
const urlToNavigateTo = `${browser.params.testConfig.adf.url}/activiti/apps/${deployedApp.id}/tasks`;
await BrowserActions.getUrl(urlToNavigateTo);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.tasksListPage().checkTaskListIsLoaded();
await taskPage.formFields().checkFormIsDisplayed();
});
it('[C260437] Customised validator', async () => {
await widget.dynamicTable().clickAddRow();
await widget.dynamicTable().setDatatableInput('admin', app.CUSTOM_VALIDATOR.FIELD.NAME);
await widget.dynamicTable().clickSaveButton();
await expect(await widget.dynamicTable().checkErrorMessage()).toBe('Sorry, wrong value. You cannot use "admin".');
await widget.dynamicTable().setDatatableInput('name', app.CUSTOM_VALIDATOR.FIELD.NAME);
await widget.dynamicTable().clickSaveButton();
await expect(await widget.dynamicTable().checkErrorMessage()).toBe('Field \'Id\' is required.');
await widget.dynamicTable().setDatatableInput('id', app.CUSTOM_VALIDATOR.FIELD.ID);
await widget.dynamicTable().clickSaveButton();
await expect(await widget.dynamicTable().checkErrorMessage()).toBe('Field \'Number\' is required.' );
await widget.dynamicTable().setDatatableInput('12', app.CUSTOM_VALIDATOR.FIELD.NUM);
await widget.dynamicTable().clickSaveButton();
await expect(await widget.dynamicTable().checkErrorMessage()).toBe('Field \'Address\' is required.');
await widget.dynamicTable().setDatatableInput('address', app.CUSTOM_VALIDATOR.FIELD.ADDRESS);
await widget.dynamicTable().clickSaveButton();
await taskPage.taskDetails().clickCompleteFormTask();
});
});
});

View File

@@ -0,0 +1,152 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* 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 { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
import { AppsActions } from '../../actions/APS/apps.actions';
import { UsersActions } from '../../actions/users.actions';
import { LoginPage, StringUtil, Widget } from '@alfresco/adf-testing';
import { TasksPage } from '../../pages/adf/process-services/tasks.page';
import { browser } from 'protractor';
import { User } from '../../models/APS/user';
import { NavigationBarPage } from '../../pages/adf/navigation-bar.page';
import CONSTANTS = require('../../util/constants');
describe('People and Group widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const navigationBarPage = new NavigationBarPage();
const widget = new Widget();
const usersActions = new UsersActions();
const alfrescoJsApi = new AlfrescoApi({
provider: 'BPM',
hostBpm: browser.params.testConfig.adf_aps.host
});
const app = browser.params.resources.Files.MORE_WIDGETS;
let user: User;
beforeAll(async () => {
const appsActions = new AppsActions();
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
user = await usersActions.createTenantAndUser(alfrescoJsApi);
await createGroupAndUsers(user.tenantId);
await alfrescoJsApi.login(user.email, user.password);
try {
await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location, { renewIdmEntries: true });
} catch (e) { console.error('failed to deploy the application'); }
await loginPage.loginToProcessServicesUsingUserModel(user);
});
afterAll(async () => {
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
await alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(user.tenantId);
});
beforeEach(async () => {
await (await navigationBarPage.navigateToProcessServicesPage()).goToTaskApp();
await taskPage.tasksListPage().checkTaskListIsLoaded();
});
it('[C275715] Add group widget - Visibility and group restriction', async () => {
const name = 'group visibility task';
const groupVisibilityForm = app.ADD_GROUP_VISIBILITY;
await taskPage.createTask({name, formName: groupVisibilityForm.formName});
await expect(await taskPage.taskDetails().getTitle()).toEqual('Activities');
await taskPage.formFields().checkWidgetIsHidden(groupVisibilityForm.FIELD.widget_id);
await widget.checkboxWidget().clickCheckboxInput(groupVisibilityForm.FIELD.checkbox_id);
await taskPage.formFields().checkWidgetIsVisible(groupVisibilityForm.FIELD.widget_id);
await widget.groupWidget().insertGroup(groupVisibilityForm.FIELD.widget_id, groupVisibilityForm.searchTerm);
await widget.groupWidget().checkDropDownListIsDisplayed();
await expect(await widget.groupWidget().getDropDownList()).toEqual([ 'Heros', 'Users' ]);
await widget.groupWidget().selectGroupFromDropDown('Users');
await taskPage.taskDetails().clickCompleteFormTask();
});
it('[C275716] Add group widget - sub group restrictions', async () => {
const name = 'group widget - subgroup restriction';
const subgroupFrom = app.ADD_GROUP_AND_SUBGROUP_RESTRICTION;
await taskPage.createTask({name, formName: subgroupFrom.formName});
await expect(await taskPage.taskDetails().getTitle()).toEqual('Activities');
await taskPage.formFields().checkWidgetIsHidden(subgroupFrom.FIELD.widget_id);
await widget.checkboxWidget().clickCheckboxInput(subgroupFrom.FIELD.checkbox_id);
await taskPage.formFields().checkWidgetIsVisible(subgroupFrom.FIELD.widget_id);
await widget.groupWidget().insertGroup(subgroupFrom.FIELD.widget_id, subgroupFrom.searchTerm);
await widget.groupWidget().checkDropDownListIsDisplayed();
const suggestions = await widget.groupWidget().getDropDownList();
await expect(suggestions.sort()).toEqual(getSubGroupsName().sort());
await widget.groupWidget().selectGroupFromDropDown(getSubGroupsName()[0]);
await taskPage.taskDetails().clickCompleteFormTask();
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS);
await taskPage.tasksListPage().checkTaskListIsLoaded();
await taskPage.tasksListPage().selectRow(name);
await widget.groupWidget().checkGroupFieldIsDisplayed();
await expect(await widget.groupWidget().getFieldValue(subgroupFrom.FIELD.widget_id)).toBe('Heros');
});
it('[C275714] Add people widget - group restrictions', async () => {
const name = 'people widget - group restrictions';
const peopleWidget = app.ADD_PEOPLE_AND_GROUP_RESTRICTION;
await taskPage.createTask({name, formName: peopleWidget.formName});
await expect(await taskPage.taskDetails().getTitle()).toEqual('Activities');
await taskPage.formFields().checkWidgetIsHidden(peopleWidget.FIELD.widget_id);
await widget.checkboxWidget().clickCheckboxInput(peopleWidget.FIELD.checkbox_id);
await taskPage.formFields().checkWidgetIsVisible(peopleWidget.FIELD.widget_id);
await widget.peopleWidget().insertUser(peopleWidget.FIELD.widget_id, peopleWidget.searchTerm);
await widget.peopleWidget().checkDropDownListIsDisplayed();
const suggestions = await widget.peopleWidget().getDropDownList();
await expect(suggestions.sort()).toEqual(getGroupMembers().sort());
await widget.peopleWidget().selectUserFromDropDown(getGroupMembers()[0]);
await taskPage.taskDetails().clickCompleteFormTask();
});
async function createGroupAndUsers(tenantId) {
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
try {
const happyUsers: any[] = await Promise.all(app.groupUser.map(happyUser =>
usersActions.createApsUserWithName(alfrescoJsApi, tenantId, StringUtil.generateRandomString(), happyUser.firstName, happyUser.lastName)));
const subgroupUser = await usersActions.createApsUserWithName(
alfrescoJsApi, tenantId, StringUtil.generateRandomString(), app.subGroupUser.firstName, app.subGroupUser.lastName);
const group = await alfrescoJsApi.activiti.adminGroupsApi.createNewGroup({ name: app.group.name, tenantId, type: 1 });
await Promise.all(happyUsers.map(happyUser => alfrescoJsApi.activiti.adminGroupsApi.addGroupMember(group.id, happyUser.id)));
const subgroups: any[] = await Promise.all(getSubGroupsName().map((name) =>
alfrescoJsApi.activiti.adminGroupsApi.createNewGroup({ name, tenantId , type: 1, parentGroupId: group.id })));
await Promise.all(subgroups.map((subgroup) => alfrescoJsApi.activiti.adminGroupsApi.addGroupMember(subgroup.id, subgroupUser.id)));
} catch (e) {}
}
function getSubGroupsName() {
return app.group.subgroup.map(subgroup => subgroup.name);
}
function getGroupMembers() {
return app.groupUser.map(groupUser => `${groupUser.firstName} ${groupUser.lastName}`);
}
});

View File

@@ -0,0 +1,90 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* 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 { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api';
import { AppsActions } from '../../actions/APS/apps.actions';
import { UsersActions } from '../../actions/users.actions';
import { LoginPage, Widget } from '@alfresco/adf-testing';
import { TasksPage } from '../../pages/adf/process-services/tasks.page';
import { browser } from 'protractor';
import { User } from '../../models/APS/user';
import { NavigationBarPage } from '../../pages/adf/navigation-bar.page';
import CONSTANTS = require('../../util/constants');
describe('Typeahead widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const navigationBarPage = new NavigationBarPage();
const widget = new Widget();
const usersActions = new UsersActions();
const alfrescoJsApi = new AlfrescoApi({
provider: 'BPM',
hostBpm: browser.params.testConfig.adf_aps.host
});
const app = browser.params.resources.Files.WIDGET_CHECK_APP;
let user: User;
beforeAll(async () => {
const appsActions = new AppsActions();
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
user = await usersActions.createTenantAndUser(alfrescoJsApi);
await alfrescoJsApi.login(user.email, user.password);
await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location, { renewIdmEntries: true });
await loginPage.loginToProcessServicesUsingUserModel(user);
});
afterAll(async () => {
await alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword);
await alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(user.tenantId);
});
beforeEach(async () => {
await (await navigationBarPage.navigateToProcessServicesPage()).goToTaskApp();
await taskPage.tasksListPage().checkTaskListIsLoaded();
});
it('[C307988] Type ahead form control should work for URLs', async () => {
const name = 'typahead widget task';
const typeaheadWidget = app.TYPE_AHEAD_WIDGET;
await taskPage.createTask({name, formName: typeaheadWidget.formName});
await expect(await taskPage.taskDetails().getTitle()).toEqual('Activities');
await widget.typeahedWidget().checkTypeaheadFieldIsDisplayed();
await widget.typeahedWidget().fillTypeaheadField(typeaheadWidget.case1.searchTerm);
await widget.typeahedWidget().checkDropDownListIsDisplayed();
let suggestions = await widget.typeahedWidget().getDropDownList();
await expect(suggestions.sort()).toEqual(typeaheadWidget.case1.result.sort());
await widget.typeahedWidget().fillTypeaheadField(typeaheadWidget.case2.searchTerm);
await widget.typeahedWidget().checkDropDownListIsDisplayed();
suggestions = await widget.typeahedWidget().getDropDownList();
await expect(suggestions.sort()).toEqual(typeaheadWidget.case2.result);
await widget.typeahedWidget().selectOptionFromDropdown();
await taskPage.taskDetails().clickCompleteFormTask();
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS);
await taskPage.tasksListPage().checkTaskListIsLoaded();
await taskPage.tasksListPage().selectRow(name);
await widget.typeahedWidget().checkTypeaheadFieldIsDisplayed();
await expect(await widget.typeahedWidget().getFieldValue('1583773306434')).toBe(typeaheadWidget.case2.result[0]);
});
});