diff --git a/.angular-cli.json b/.angular-cli.json index a5f19b9c08..33e28149de 100644 --- a/.angular-cli.json +++ b/.angular-cli.json @@ -192,7 +192,7 @@ ], "e2e": { "protractor": { - "config": "./demo-shell/protractor.conf.js" + "config": "./protractor.conf.js" } }, "lint": [ diff --git a/.gitignore b/.gitignore index 6d6ebc0d2d..e54d6df3e0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ bundles workspace.xml .idea/ dist/ +e2e-output/ ng2-components/coverage/ !systemjs.config.js demo-shell-ng2/app/components/router/ diff --git a/.travis.yml b/.travis.yml index b49c9edc42..4c069c96b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ before_install: - export CHROME_BIN=chromium-browser - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start + - sleep 3 # give xvfb some time to start env: matrix: @@ -70,7 +71,6 @@ jobs: script: ./scripts/test-e2e-bc.sh - # Test expors script: npm run test-export - - stage: Update Apps dependencies - # Test Update generator-ng2-alfresco-app if: tag =~ .*beta.* script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n generator-ng2-alfresco-app @@ -86,6 +86,8 @@ jobs: - # Test Update alfresco-modeler-app if: tag =~ .*beta.* script: ./scripts/update-project.sh -gnu -t $GITHUB_TOKEN -n alfresco-modeler-app + - stage: e2e Test + script: ./scripts/test-e2e-lib.sh -host localhost:4200 -proxy $E2E_HOST -u $E2E_USERNAME -p $E2E_PASSWORD -e $E2E_EMAIL -save - stage: Deploy PR script: node ./scripts/pr-deploy.js -n $TRAVIS_BUILD_NUMBER -u $RANCHER_TOKEN -p $RANCHER_SECRET -s $REPO_RANCHER --image "docker:$REPO_DOCKER/adf/demo-shell:$TRAVIS_BUILD_NUMBER" --env $ENVIRONMENT_NAME -r $ENVIRONMENT_URL || exit 1 diff --git a/demo-shell/protractor.conf.js b/demo-shell/protractor.conf.js deleted file mode 100644 index 9242cbed82..0000000000 --- a/demo-shell/protractor.conf.js +++ /dev/null @@ -1,30 +0,0 @@ -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter } = require('jasmine-spec-reporter'); - -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './e2e/**/*.e2e-spec.ts' - ], - capabilities: { - 'browserName': 'chrome' - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {} - }, - beforeLaunch: function() { - require('ts-node').register({ - project: './demo-shell/e2e/tsconfig.e2e.json' - }); - }, - onPrepare() { - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; diff --git a/demo-shell/src/app/app.component.ts b/demo-shell/src/app/app.component.ts index a1bebfd3c6..eb321d25a8 100644 --- a/demo-shell/src/app/app.component.ts +++ b/demo-shell/src/app/app.component.ts @@ -43,7 +43,6 @@ export class AppComponent implements OnInit { this.router.navigate(['/login']); } } - }); } } diff --git a/e2e/actions/ACS/upload.actions.ts b/e2e/actions/ACS/upload.actions.ts new file mode 100644 index 0000000000..fb305ff29e --- /dev/null +++ b/e2e/actions/ACS/upload.actions.ts @@ -0,0 +1,46 @@ +import path = require('path'); +import fs = require('fs'); +import TestConfig = require('../../test.config'); + +export class UploadActions { + + async uploadFile(alfrescoJsApi, fileLocation, fileName, parentFolderId) { + + let pathFile = path.join(TestConfig.main.rootPath + fileLocation); + let file = fs.createReadStream(pathFile); + + return alfrescoJsApi.upload.uploadFile( + file, + '', + parentFolderId, + null, + { + 'name': fileName, + 'nodeType': 'cm:content' + } + ); + } + + async createEmptyFiles(alfrescoJsApi, emptyFileNames: string[], parentFolderId) { + let filesRequest = []; + + for (let i = 0; i < emptyFileNames.length; i++) { + let jsonItem = {}; + jsonItem['name'] = emptyFileNames[i]; + jsonItem['nodeType'] = 'cm:content'; + filesRequest.push(jsonItem); + } + + return alfrescoJsApi.nodes.addNode(parentFolderId, filesRequest, {}, { + filedata: '' + }); + } + + async uploadFolder(alfrescoJsApi, folderName, parentFolderId) { + return alfrescoJsApi.nodes.addNode(parentFolderId, { + 'name': folderName, + 'nodeType': 'cm:folder' + }, {}, {}); + } + +} diff --git a/e2e/actions/APS/apps.actions.ts b/e2e/actions/APS/apps.actions.ts new file mode 100644 index 0000000000..2dce26780c --- /dev/null +++ b/e2e/actions/APS/apps.actions.ts @@ -0,0 +1,42 @@ +import path = require('path'); +import fs = require('fs'); +import TestConfig = require('../../test.config'); +import AppPublish = require('../../models/APS/AppPublish'); + +export class AppsActions { + + async importPublishDeployApp(alfrescoJsApi, appFileLocation) { + + let pathFile = path.join(TestConfig.main.rootPath + appFileLocation); + let file = fs.createReadStream(pathFile); + + let appCreated = await alfrescoJsApi.activiti.appsApi.importAppDefinition(file); + + let publishApp = await alfrescoJsApi.activiti.appsApi.publishAppDefinition(appCreated.id, new AppPublish()); + + let published = await alfrescoJsApi.activiti.appsApi.deployAppDefinitions({ appDefinitions: [{ id: publishApp.appDefinition.id }] }); + + return appCreated; + } + + async startProcess(alfrescoJsApi, app, processName) { + + let appDefinitionsList = await alfrescoJsApi.activiti.appsApi.getAppDefinitions(); + + let appDefinition = appDefinitionsList.data.filter((currentApp) => { + return currentApp.name === app.name; + }); + + let processDefinitionList = await alfrescoJsApi.activiti.processApi.getProcessDefinitions({ deploymentId: appDefinition.deploymentId }); + + let startProcessOptions = { processDefinitionId: processDefinitionList.data[0].id }; + + if (typeof processName !== 'undefined') { + startProcessOptions.name = processName; + } + + return await alfrescoJsApi.activiti.processApi.startNewProcessInstance(startProcessOptions); + + } + +} diff --git a/e2e/actions/users.actions.ts b/e2e/actions/users.actions.ts new file mode 100644 index 0000000000..d93559c092 --- /dev/null +++ b/e2e/actions/users.actions.ts @@ -0,0 +1,38 @@ +import Tenant = require('../models/APS/Tenant'); +import User = require('../models/APS/User'); +import TestConfig = require('../test.config'); +import path = require('path'); +import fs = require('fs'); + +export class UsersActions { + + async createTenantAndUser(alfrescoJsApi) { + let newTenant = await alfrescoJsApi.activiti.adminTenantsApi.createTenant(new Tenant()); + + let user = new User({ tenantId: newTenant.id }); + + await alfrescoJsApi.activiti.adminUsersApi.createNewUser(user); + + return user; + } + + async createApsUser(alfrescoJsApi, tenantId) { + let user = new User({ tenantId: tenantId }); + + await alfrescoJsApi.activiti.adminUsersApi.createNewUser(user); + + return user; + } + + async cleanupTenant(alfrescoJsApi, tenantId) { + return alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(tenantId); + } + + async changeProfilePictureAps(alfrescoJsApi, fileLocation) { + let pathFile = path.join(TestConfig.main.rootPath + fileLocation); + let file = fs.createReadStream(pathFile); + + return alfrescoJsApi.activiti.profileApi.uploadProfilePicture(file); + } + +} diff --git a/e2e/analytics-component.e2e.ts b/e2e/analytics-component.e2e.ts new file mode 100644 index 0000000000..0ef806480b --- /dev/null +++ b/e2e/analytics-component.e2e.ts @@ -0,0 +1,74 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); +import AnalyticsPage = require('./pages/adf/process_services/analyticsPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import AppNavigationBarPage = require('./pages/adf/process_services/appNavigationBarPage'); +import TestConfig = require('./test.config'); +import Tenant = require('./models/APS/Tenant'); +import User = require('./models/APS/User'); + +import AlfrescoApi = require('alfresco-js-api-node'); + +describe('Analytics Smoke Test', () => { + + let loginPage = new LoginPage(); + let navigationBarPage = new NavigationBarPage(); + let appNavigationBarPage = new AppNavigationBarPage(); + let analyticsPage = new AnalyticsPage(); + let processServicesPage = new ProcessServicesPage(); + let tenantId; + let reportTitle = 'New Title'; + + beforeAll(async (done) => { + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + let newTenant = await this.alfrescoJsApi.activiti.adminTenantsApi.createTenant(new Tenant()); + + tenantId = newTenant.id; + let procUserModel = new User({ tenantId: tenantId }); + + await this.alfrescoJsApi.activiti.adminUsersApi.createNewUser(procUserModel); + + loginPage.loginToProcessServicesUsingUserModel(procUserModel); + + done(); + }); + + afterAll(async (done) => { + await this.alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(tenantId); + done(); + }); + + it('Change name from Process Definition Heat Map', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp('Task App'); + appNavigationBarPage.clickReportsButton(); + analyticsPage.checkNoReportMessage(); + analyticsPage.getReport('Process definition heat map'); + analyticsPage.changeReportTitle(reportTitle); + expect(analyticsPage.getReportTitle()).toEqual(reportTitle); + }); +}); diff --git a/e2e/apps-section.e2e.ts b/e2e/apps-section.e2e.ts new file mode 100644 index 0000000000..e3a741bf28 --- /dev/null +++ b/e2e/apps-section.e2e.ts @@ -0,0 +1,70 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); + +import CONSTANTS = require('./util/constants'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UsersActions } from './actions/users.actions'; +import { AppsActions } from './actions/APS/apps.actions'; + +describe('Attachment list', () => { + + let loginPage = new LoginPage(); + let navigationBarPage = new NavigationBarPage(); + let processServicesPage = new ProcessServicesPage(); + let app = resources.Files.APP_WITH_PROCESSES; + + beforeAll(async (done) => { + let apps = new AppsActions(); + let users = new UsersActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + let user = await users.createTenantAndUser(this.alfrescoJsApi); + + await this.alfrescoJsApi.login(user.email, user.password); + + await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + + loginPage.loginToProcessServicesUsingUserModel(user); + + done(); + }); + + it('[C260198] Publish on ADF side', () => { + navigationBarPage.clickProcessServicesButton(); + + processServicesPage.checkApsContainer(); + + expect(processServicesPage.getAppIconType(app.title)).toEqual('ac_unit'); + expect(processServicesPage.getBackgroundColor(app.title)).toEqual(CONSTANTS.APP_COLOR.BLUE); + expect(processServicesPage.getDescription(app.title)).toEqual('Description for app'); + }); + +}); diff --git a/e2e/attach-file-widget.e2e.ts b/e2e/attach-file-widget.e2e.ts new file mode 100644 index 0000000000..b07e422353 --- /dev/null +++ b/e2e/attach-file-widget.e2e.ts @@ -0,0 +1,104 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import TasksPage = require('./pages/adf/process_services/tasksPage'); +import ViewerPage = require('./pages/adf/viewerPage'); +import UsingWidget = require('./pages/adf/process_services/widgets/usingWidget'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); + +import CONSTANTS = require('./util/constants'); + +import FileModel = require('./models/ACS/fileModel'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +import { AppsActions } from './actions/APS/apps.actions'; +import AlfrescoApi = require('alfresco-js-api-node'); +import { UsersActions } from './actions/users.actions'; + +describe('Start Task - Task App', () => { + + let loginPage = new LoginPage(); + let viewerPage = new ViewerPage(); + let usingWidget = new UsingWidget(); + let processServicesPage = new ProcessServicesPage(); + let taskPage = new TasksPage(); + + let processUserModel; + let app = resources.Files.WIDGETS_SMOKE_TEST; + let pdfFile = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name }); + let appFields = app.form_fields; + + beforeAll(async (done) => { + let users = new UsersActions(); + let apps = new AppsActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + processUserModel = await users.createTenantAndUser(this.alfrescoJsApi); + + await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password); + + await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + + await loginPage.loginToProcessServicesUsingUserModel(processUserModel); + + done(); + }); + + afterAll(async (done) => { + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(processUserModel.tenantId); + + done(); + }); + + it('[C274690] Task List attachment - View file', () => { + processServicesPage.goToProcessServices().goToTaskApp().clickTasksButton(); + + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + + taskPage.createNewTask() + .addName('View file') + .addForm(app.formName) + .clickStartButton() + .then(() => { + usingWidget.usingAttachFileWidget().attachFile(appFields.attachfile_id, pdfFile.location); + usingWidget.usingAttachFileWidget().checkFileIsAttached(appFields.attachfile_id, pdfFile.name); + + usingWidget.usingAttachFileWidget().viewFile(pdfFile.name); + viewerPage.checkFileContent('1', pdfFile.firstPageText); + viewerPage.checkCloseButtonIsDisplayed(); + viewerPage.clickCloseButton(); + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList('View file'); + }); + }); + +}); diff --git a/e2e/attachment-list-process.e2e.ts b/e2e/attachment-list-process.e2e.ts new file mode 100644 index 0000000000..f4f2c08dd2 --- /dev/null +++ b/e2e/attachment-list-process.e2e.ts @@ -0,0 +1,91 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import ProcessFiltersPage = require('./pages/adf/process_services/processFiltersPage'); +import AttachmentListPage = require('./pages/adf/process_services/attachmentListPage'); +import FileModel = require('./models/ACS/fileModel'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UsersActions } from './actions/users.actions'; +import { AppsActions } from './actions/APS/apps.actions'; + +describe('Attachment list', () => { + + let loginPage = new LoginPage(); + let processServicesPage = new ProcessServicesPage(); + let attachmentListPage = new AttachmentListPage(); + let processFiltersPage = new ProcessFiltersPage(); + + let processUserModel; + let app = resources.Files.APP_WITH_PROCESSES; + let jpgFile = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.JPG.file_location, + 'name': resources.Files.ADF_DOCUMENTS.JPG.file_name + }); + let pdfFile = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name }); + + beforeAll(async (done) => { + let users = new UsersActions(); + let apps = new AppsActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + processUserModel = await users.createTenantAndUser(this.alfrescoJsApi); + + await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password); + + await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + + loginPage.loginToProcessServicesUsingUserModel(processUserModel); + + done(); + }); + + it('[C277296] Attach a file to task app - process list', function () { + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.startProcess().selectFromProcessDropdown(app.process_se_name).clickFormStartProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.selectFromProcessList('My Default Name'); + attachmentListPage.clickAttachFileButton(jpgFile.location); + attachmentListPage.checkFileIsAttached(jpgFile.name); + attachmentListPage.clickAttachFileButton(pdfFile.location); + attachmentListPage.checkFileIsAttached(jpgFile.name); + attachmentListPage.checkFileIsAttached(pdfFile.name); + }); + + it('[C277299] Attach a file to custom app - process list', function () { + processServicesPage.goToProcessServices().goToApp(app.title).clickProcessButton(); + processFiltersPage.startProcess().selectFromProcessDropdown(app.process_se_name).clickFormStartProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.selectFromProcessList('My Default Name'); + attachmentListPage.clickAttachFileButton(jpgFile.location); + attachmentListPage.checkFileIsAttached(jpgFile.name); + attachmentListPage.clickAttachFileButton(pdfFile.location); + attachmentListPage.checkFileIsAttached(jpgFile.name); + attachmentListPage.checkFileIsAttached(pdfFile.name); + }); +}); diff --git a/e2e/card-view-smoke-tests.e2e.ts b/e2e/card-view-smoke-tests.e2e.ts new file mode 100644 index 0000000000..c41774b3ea --- /dev/null +++ b/e2e/card-view-smoke-tests.e2e.ts @@ -0,0 +1,139 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ContentServicesPage = require('./pages/adf/contentServicesPage'); +import AdfViewerPage = require('./pages/adf/viewerPage'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import FileModel = require('./models/ACS/fileModel'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); +import dateFormat = require('dateformat'); +import CONSTANTS = require('./util/constants'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Metadata component', () => { + + let loginPage = new LoginPage(); + let contentServicesPage = new ContentServicesPage(); + let adfViewerPage = new AdfViewerPage(); + let cardViewPage; + + let acsUser = new AcsUserModel(); + + let pdfFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF_ALL.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PDF_ALL.file_location + }); + + beforeAll(async (done) => { + + let uploadActions = new UploadActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + let pdfUploadedFile = await uploadActions.uploadFile(this.alfrescoJsApi, pdfFileModel.location, pdfFileModel.name, '-my-'); + + Object.assign(pdfFileModel, pdfUploadedFile.entry); + + pdfFileModel.update( pdfUploadedFile.entry); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + done(); + }); + + it('Properties', () => { + contentServicesPage.navigateToDocumentList(); + adfViewerPage.viewFile(pdfFileModel.name); + + cardViewPage = adfViewerPage.clickInfoButton(); + adfViewerPage.checkInfoSideBarIsDisplayed(); + cardViewPage.clickOnPropertiesTab(); + + expect(cardViewPage.getTitle()).toEqual(CONSTANTS.METADATA.TITLE); + expect(cardViewPage.getActiveTab()).toEqual(CONSTANTS.METADATA.PROPERTY_TAB); + expect(cardViewPage.getExpandedAspectName()).toEqual(CONSTANTS.METADATA.DEFAULT_ASPECT); + expect(cardViewPage.getName()).toEqual(pdfFileModel.name); + expect(cardViewPage.getCreator()).toEqual(pdfFileModel.getCreatedByUser().displayName); + expect(cardViewPage.getCreatedDate()).toEqual(dateFormat(pdfFileModel.createdAt, CONSTANTS.METADATA.DATAFORMAT)); + expect(cardViewPage.getModifier()).toEqual(pdfFileModel.getCreatedByUser().displayName); + expect(cardViewPage.getModifiedDate()).toEqual(dateFormat(pdfFileModel.createdAt, CONSTANTS.METADATA.DATAFORMAT)); + expect(cardViewPage.getMimetypeName()).toEqual(pdfFileModel.getContent().mimeTypeName); + expect(cardViewPage.getSize()).toEqual(pdfFileModel.getContent().getSizeInBytes()); + expect(cardViewPage.getAuthor()).toEqual(pdfFileModel.properties['cm:author']); + + cardViewPage.editIconIsDisplayed(); + cardViewPage.informationButtonIsDisplayed(); + expect(cardViewPage.getInformationButtonText()).toEqual(CONSTANTS.METADATA.MORE_INFO_BUTTON); + expect(cardViewPage.getInformationIconText()).toEqual(CONSTANTS.METADATA.ARROW_DOWN); + }); + + it('Information button', () => { + contentServicesPage.navigateToDocumentList(); + adfViewerPage.viewFile(pdfFileModel.name); + cardViewPage = adfViewerPage.clickInfoButton(); + adfViewerPage.checkInfoSideBarIsDisplayed(); + cardViewPage.clickOnPropertiesTab(); + cardViewPage.informationButtonIsDisplayed(); + cardViewPage.clickOnInformationButton(); + expect(cardViewPage.getInformationButtonText()).toEqual(CONSTANTS.METADATA.LESS_INFO_BUTTON); + expect(cardViewPage.getInformationIconText()).toEqual(CONSTANTS.METADATA.ARROW_UP); + }); + + it('Versions', () => { + contentServicesPage.navigateToDocumentList(); + adfViewerPage.viewFile(pdfFileModel.name); + cardViewPage = adfViewerPage.clickInfoButton(); + adfViewerPage.checkInfoSideBarIsDisplayed(); + cardViewPage.clickOnVersionsTab().checkUploadVersionsButtonIsDisplayed(); + expect(cardViewPage.getActiveTab()).toEqual(CONSTANTS.METADATA.VERSIONS_TAB); + cardViewPage.checkVersionIsDisplayed(pdfFileModel.name); + }); + + it('Info icon', () => { + contentServicesPage.navigateToDocumentList(); + adfViewerPage.viewFile(pdfFileModel.name); + cardViewPage = adfViewerPage.clickInfoButton(); + adfViewerPage.checkInfoSideBarIsDisplayed(); + cardViewPage.clickOnVersionsTab().checkUploadVersionsButtonIsDisplayed(); + expect(cardViewPage.getActiveTab()).toEqual(CONSTANTS.METADATA.VERSIONS_TAB); + cardViewPage.clickOnPropertiesTab().informationButtonIsDisplayed(); + adfViewerPage.clickInfoButton(); + adfViewerPage.checkInfoSideBarIsNotDisplayed(); + adfViewerPage.clickInfoButton(); + adfViewerPage.checkInfoSideBarIsDisplayed(); + expect(cardViewPage.getActiveTab()).toEqual(CONSTANTS.METADATA.COMMENTS_TAB); + cardViewPage.clickOnPropertiesTab(); + expect(cardViewPage.getActiveTab()).toEqual(CONSTANTS.METADATA.PROPERTY_TAB); + expect(cardViewPage.getEditIconTooltip()).toEqual(CONSTANTS.METADATA.EDIT_BUTTON_TOOLTIP); + }); + +}); diff --git a/e2e/data-table-component-selection.e2e.ts b/e2e/data-table-component-selection.e2e.ts new file mode 100644 index 0000000000..f8225c7304 --- /dev/null +++ b/e2e/data-table-component-selection.e2e.ts @@ -0,0 +1,92 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import DataTablePage = require('./pages/adf/dataTablePage'); +import TestConfig = require('./test.config'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import AlfrescoApi = require('alfresco-js-api-node'); + +describe('Test Datatable component - selection', () => { + + let dataTablePage = new DataTablePage(); + let loginPage = new LoginPage(); + let acsUser = new AcsUserModel(); + + beforeAll(async (done) => { + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + dataTablePage.goToDatatable(); + + done(); + }); + + it('1. Data Table Selection Modes', () => { + dataTablePage.selectRow('2'); + dataTablePage.checkRowIsSelected('2'); + dataTablePage.getNumberOfSelectedRows().then(function (result) { + expect(result).toEqual(1); + }); + dataTablePage.selectRow('3'); + dataTablePage.checkRowIsSelected('3'); + dataTablePage.getNumberOfSelectedRows().then(function (result) { + expect(result).toEqual(1); + }); + dataTablePage.selectSelectionMode('Multiple'); + dataTablePage.selectRow('1'); + dataTablePage.checkRowIsSelected('1'); + dataTablePage.selectRowWithKeyboard('3'); + dataTablePage.checkRowIsSelected('1'); + dataTablePage.checkRowIsSelected('3'); + dataTablePage.checkRowIsNotSelected('2'); + dataTablePage.checkRowIsNotSelected('4'); + dataTablePage.selectSelectionMode('None'); + dataTablePage.selectRow('1'); + dataTablePage.checkNoRowIsSelected(); + }); + + it('2. Data Table allows the multiselection of rows', () => { + dataTablePage.clickMultiSelect(); + dataTablePage.clickCheckbox('1'); + dataTablePage.checkRowIsChecked('1'); + dataTablePage.clickCheckbox('3'); + dataTablePage.checkRowIsChecked('3'); + dataTablePage.checkRowIsNotChecked('2'); + dataTablePage.checkRowIsNotChecked('4'); + dataTablePage.clickCheckbox('3'); + dataTablePage.checkRowIsNotChecked('3'); + dataTablePage.checkRowIsChecked('1'); + }); + + it('3. Can select all in data table', () => { + dataTablePage.checkAllRows(); + dataTablePage.checkRowIsChecked('1'); + dataTablePage.checkRowIsChecked('2'); + dataTablePage.checkRowIsChecked('3'); + dataTablePage.checkRowIsChecked('4'); + }); +}); diff --git a/e2e/data-table-component.e2e.ts b/e2e/data-table-component.e2e.ts new file mode 100644 index 0000000000..07f2180809 --- /dev/null +++ b/e2e/data-table-component.e2e.ts @@ -0,0 +1,65 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage.js'); +import DataTablePage = require('./pages/adf/dataTablePage.js'); +import AcsUserModel = require('./models/ACS/acsUserModel.js'); +import TestConfig = require('./test.config.js'); + +import AlfrescoApi = require('alfresco-js-api-node'); + +describe('Test Datatable component', () => { + + let dataTablePage = new DataTablePage(); + let loginPage = new LoginPage(); + let acsUser = new AcsUserModel(); + + beforeAll(async (done) => { + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + dataTablePage.goToDatatable(); + + done(); + }); + + it('1. DataTable allows extra rows to be added', () => { + dataTablePage.getNumberOfRows().then(function (result) { + dataTablePage.addRow(); + expect(dataTablePage.getNumberOfRows()).toEqual(result + 1); + dataTablePage.addRow(); + expect(dataTablePage.getNumberOfRows()).toEqual(result + 2); + }); + }); + + it('2. Data Table can replace rows', () => { + dataTablePage.replaceRows(1); + }); + + it('3. Data Table can replace columns', () => { + dataTablePage.replaceColumns(); + }); + +}); diff --git a/e2e/document_list_component.e2e.ts b/e2e/document_list_component.e2e.ts new file mode 100644 index 0000000000..334b3164ca --- /dev/null +++ b/e2e/document_list_component.e2e.ts @@ -0,0 +1,182 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ContentServicesPage = require('./pages/adf/contentServicesPage'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import FileModel = require('./models/ACS/fileModel'); +import FolderModel = require('./models/ACS/folderModel'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); +import Util = require('./util/util'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Test DocumentList component', () => { + + let loginPage = new LoginPage(); + let contentServicesPage = new ContentServicesPage(); + + let acsUser = new AcsUserModel(); + let pdfFileModel = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name }); + let docxFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.DOCX.file_name, + 'location': resources.Files.ADF_DOCUMENTS.DOCX.file_location + }); + let testFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.TEST.file_name, + 'location': resources.Files.ADF_DOCUMENTS.TEST.file_location + }); + let folderOneModel = new FolderModel({ 'name': 'folderOne' + Util.generateRandomString() }); + let folderTwoModel = new FolderModel({ 'name': 'folderTwo' + Util.generateRandomString() }); + + let uploadedFolder; + let rootFolder = 'APP.PERSONAL-FILES', userHomes = 'User Homes', rootFolderName = 'Personal Files'; + let fileNames = [], adminFileNames = [], nrOfFiles = 15, adminNrOfFiles = 5; + + let files = { + base: 'newFile', + firstFile: 'newFile14.txt', + extension: '.txt' + }; + + let extensions = { + pdf: 'pdf', + docx: 'word', + test: 'document' + }; + + beforeAll(async (done) => { + let uploadActions = new UploadActions(); + + fileNames = Util.generateSeqeunceFiles(1, nrOfFiles, files.base, files.extension); + adminFileNames = Util.generateSeqeunceFiles(nrOfFiles + 1, nrOfFiles + adminNrOfFiles, files.base, files.extension); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + await uploadActions.uploadFile(this.alfrescoJsApi, pdfFileModel.location, pdfFileModel.name, '-my-'); + await uploadActions.uploadFile(this.alfrescoJsApi, docxFileModel.location, docxFileModel.name, '-my-'); + await uploadActions.uploadFile(this.alfrescoJsApi, testFileModel.location, testFileModel.name, '-my-'); + + uploadedFolder = await uploadActions.uploadFolder(this.alfrescoJsApi, folderOneModel.name, '-my-'); + + await uploadActions.createEmptyFiles(this.alfrescoJsApi, fileNames, uploadedFolder.entry.id); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await uploadActions.createEmptyFiles(this.alfrescoJsApi, adminFileNames, uploadedFolder.entry.id); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + contentServicesPage.goToDocumentList(); + + done(); + }); + + it('1. File has tooltip', () => { + expect(contentServicesPage.getTooltip(pdfFileModel.name)).toEqual(pdfFileModel.name); + }); + + it('2. Folder has tooltip', () => { + expect(contentServicesPage.getTooltip(folderOneModel.name)).toEqual(folderOneModel.name); + expect(contentServicesPage.getBreadcrumbTooltip(rootFolderName)).toEqual(rootFolderName); + }); + + it('4. Sort content ascending by name.', () => { + contentServicesPage.doubleClickRow(folderOneModel.name).checkContentIsDisplayed(files.firstFile); + expect(contentServicesPage.getActiveBreadcrumb()).toEqual(uploadedFolder.entry.name); + expect(contentServicesPage.getCurrentFolderID()).toContain(uploadedFolder.entry.id); + expect(contentServicesPage.sortAndCheckListIsOrderedByName(true)).toEqual(true); + }); + + it('5. Sort content descending by name.', () => { + expect(contentServicesPage.sortAndCheckListIsOrderedByName(false)).toEqual(true); + }); + + it('6. Sort content ascending by author.', () => { + expect(contentServicesPage.sortAndCheckListIsOrderedByAuthor(true)).toEqual(true); + }); + + it('7. Sort content descending by author.', () => { + expect(contentServicesPage.sortAndCheckListIsOrderedByAuthor(false)).toEqual(true); + }); + + it('8. Sort content ascending by created date.', () => { + expect(contentServicesPage.sortAndCheckListIsOrderedByCreated(true)).toEqual(true); + }); + + it('9. Sort content descending by created date.', () => { + expect(contentServicesPage.sortAndCheckListIsOrderedByCreated(false)).toEqual(true); + }); + + it('10. File can be uploaded in a new created folder.', () => { + contentServicesPage.createNewFolder(folderTwoModel.name).checkContentIsDisplayed(folderTwoModel.name); + contentServicesPage.doubleClickRow(folderTwoModel.name).checkEmptyFolderMessageIsDisplayed(); + }); + + it('11. Navigate to child folder via breadcrumbs.', () => { + contentServicesPage.navigateToFolderViaBreadcrumbs(acsUser.getId()); + + contentServicesPage + .checkContentIsDisplayed(folderOneModel.name) + .doubleClickRow(folderOneModel.name) + .checkContentIsDisplayed(folderTwoModel.name) + .doubleClickRow(folderTwoModel.name); + + expect(contentServicesPage.getActiveBreadcrumb()).toEqual(folderTwoModel.name); + }); + + it('12. Navigate to parent folder via breadcrumbs.', () => { + contentServicesPage.navigateToFolderViaBreadcrumbs(uploadedFolder.entry.name); + + expect(contentServicesPage.getActiveBreadcrumb()).toEqual(uploadedFolder.entry.name); + + expect(contentServicesPage.getCurrentFolderID()).toContain(uploadedFolder.entry.id); + + Util.refreshBrowser(); + expect(contentServicesPage.getActiveBreadcrumb()).toEqual(uploadedFolder.entry.name); + expect(contentServicesPage.getCurrentFolderID()).toContain(uploadedFolder.entry.id); + }); + + it('13. Each known extension has it s own icon.', () => { + contentServicesPage.navigateToFolderViaBreadcrumbs(acsUser.getId()); + + contentServicesPage.checkContentIsDisplayed(pdfFileModel.name); + contentServicesPage.checkContentIsDisplayed(docxFileModel.name); + contentServicesPage.checkContentIsDisplayed(testFileModel.name); + contentServicesPage.checkIconColumn(pdfFileModel.name, extensions.pdf); + contentServicesPage.checkIconColumn(docxFileModel.name, extensions.docx); + contentServicesPage.checkIconColumn(testFileModel.name, extensions.test); + }); + + it('14. Navigate to root folder via breadcrumbs.', () => { + contentServicesPage.navigateToFolderViaBreadcrumbs(rootFolder); + expect(contentServicesPage.getActiveBreadcrumb()).toEqual(rootFolderName); + }); +}); diff --git a/e2e/document_list_pagination.e2e.ts b/e2e/document_list_pagination.e2e.ts new file mode 100644 index 0000000000..9e49ffc165 --- /dev/null +++ b/e2e/document_list_pagination.e2e.ts @@ -0,0 +1,365 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ContentServicesPage = require('./pages/adf/contentServicesPage'); +import PaginationPage = require('./pages/adf/paginationPage'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import FolderModel = require('./models/ACS/folderModel'); + +import TestConfig = require('./test.config'); +import Util = require('./util/util'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Test Document List - Pagination', function () { + let pagination = { + base: 'newFile', + secondSetBase: 'secondSet', + extension: '.txt' + }; + + let itemsPerPage = { + five: '5', + fiveValue: 5, + ten: '10', + tenValue: 10, + fifteen: '15', + fifteenValue: 15, + twenty: '20', + twentyValue: 20, + default: '25' + }; + + let loginPage = new LoginPage(); + let contentServicesPage = new ContentServicesPage(); + let paginationPage = new PaginationPage(); + let navigationBarPage = new NavigationBarPage(); + + let acsUser = new AcsUserModel(); + let newFolderModel = new FolderModel({ 'name': 'newFolder' }); + let fileNames = [], nrOfFiles = 20, currentPage = 1, secondSetOfFiles, secondSetNumber = 25; + let folderTwoModel = new FolderModel({ 'name': 'folderTwo' }); + let folderThreeModel = new FolderModel({ 'name': 'folderThree' }); + + beforeAll(async (done) => { + let uploadActions = new UploadActions(); + + fileNames = Util.generateSeqeunceFiles(10, nrOfFiles + 9, pagination.base, pagination.extension); + secondSetOfFiles = Util.generateSeqeunceFiles(10, secondSetNumber + 9, pagination.secondSetBase, pagination.extension); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + let folderThreeUploadedModel = await uploadActions.uploadFolder(this.alfrescoJsApi, folderThreeModel.name, '-my-'); + let newFolderUploadeModel = await uploadActions.uploadFolder(this.alfrescoJsApi, newFolderModel.name, '-my-'); + + await uploadActions.createEmptyFiles(this.alfrescoJsApi, fileNames, newFolderUploadeModel.entry.id); + + await uploadActions.createEmptyFiles(this.alfrescoJsApi, fileNames, folderThreeUploadedModel.entry.id); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + done(); + }); + + it('[C260062] Default pagination settings', function () { + contentServicesPage.goToDocumentList(); + contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.default); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfFiles + ' of ' + nrOfFiles); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(nrOfFiles); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, fileNames)).toEqual(true); + }); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + }); + + it('[C274713] 20 Items per page', function () { + contentServicesPage.goToDocumentList(); + contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.twenty); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfFiles + ' of ' + nrOfFiles); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(nrOfFiles); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, fileNames)).toEqual(true); + }); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + + navigationBarPage.clickLogoutButton(); + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); + navigationBarPage.clickLogoutButton(); + loginPage.loginToContentServicesUsingUserModel(acsUser); + }); + + it('[C260069] 5 Items per page', function () { + contentServicesPage.goToDocumentList(); + contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.five); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfFiles); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fiveValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, fileNames.slice(0, 5))).toEqual(true); + }); + paginationPage.clickOnNextPage(); + currentPage++; + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 6-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfFiles); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fiveValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, fileNames.slice(5, 10))).toEqual(true); + }); + paginationPage.clickOnNextPage(); + currentPage++; + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfFiles); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fiveValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, fileNames.slice(10, 15))).toEqual(true); + }); + paginationPage.clickOnNextPage(); + currentPage++; + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfFiles); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fiveValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, fileNames.slice(15, 20))).toEqual(true); + }); + + navigationBarPage.clickLogoutButton(); + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + navigationBarPage.clickLogoutButton(); + loginPage.loginToContentServicesUsingUserModel(acsUser); + }); + + it('[C260067] 10 Items per page', function () { + currentPage = 1; + contentServicesPage.goToDocumentList(); + contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.ten); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfFiles); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.tenValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, fileNames.slice(0, 10))).toEqual(true); + }); + paginationPage.clickOnNextPage(); + currentPage++; + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfFiles); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.tenValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, fileNames.slice(10, 20))).toEqual(true); + }); + + navigationBarPage.clickLogoutButton(); + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + navigationBarPage.clickLogoutButton(); + loginPage.loginToContentServicesUsingUserModel(acsUser); + currentPage = 1; + }); + + it('[C260065] 15 Items per page', function () { + currentPage = 1; + contentServicesPage.goToDocumentList(); + contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(contentServicesPage.getActiveBreadcrumb()).toEqual(newFolderModel.name); + paginationPage.selectItemsPerPage(itemsPerPage.fifteen); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue * currentPage + ' of ' + nrOfFiles); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fifteenValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, fileNames.slice(0, 15))).toEqual(true); + }); + currentPage++; + paginationPage.clickOnNextPage(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + nrOfFiles + ' of ' + nrOfFiles); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(nrOfFiles - itemsPerPage.fifteenValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, fileNames.slice(15, 20))).toEqual(true); + }); + + navigationBarPage.clickLogoutButton(); + loginPage.loginToContentServicesUsingUserModel(acsUser); + contentServicesPage.goToDocumentList(); + contentServicesPage.checkAcsContainer(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + }); + + it('[C91320] Pagination when the content is sorted', function () { + contentServicesPage.goToDocumentList(); + contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(contentServicesPage.getActiveBreadcrumb()).toEqual(newFolderModel.name); + paginationPage.selectItemsPerPage(itemsPerPage.twenty); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(JSON.stringify(list) === JSON.stringify(fileNames)).toEqual(true); + }); + contentServicesPage.sortByName(false); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + fileNames.reverse(); + expect(JSON.stringify(list) === JSON.stringify(fileNames)).toEqual(true); + }); + + paginationPage.selectItemsPerPage(itemsPerPage.five); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(JSON.stringify(list) === JSON.stringify(fileNames.slice(15, 20))).toEqual(true); + }); + + paginationPage.clickOnNextPage(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(JSON.stringify(list) === JSON.stringify(fileNames.slice(10, 15))).toEqual(true); + }); + + paginationPage.selectItemsPerPage(itemsPerPage.ten); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(JSON.stringify(list) === JSON.stringify(fileNames.slice(10, 20))).toEqual(true); + }); + }); + + it('[C260107] Pagination in an empty folder', function () { + contentServicesPage.goToDocumentList(); + paginationPage.selectItemsPerPage(itemsPerPage.five); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + contentServicesPage.navigateToFolder(newFolderModel.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(contentServicesPage.getActiveBreadcrumb()).toEqual(newFolderModel.name); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + contentServicesPage.createNewFolder(folderTwoModel.name).checkContentIsDisplayed(folderTwoModel.name); + contentServicesPage.navigateToFolder(folderTwoModel.name); + contentServicesPage.checkPaginationIsNotDisplayed(); + }); + + xit('[C260071] Items per page when having 25 files', function () { + currentPage = 1; + contentServicesPage.goToDocumentList(); + contentServicesPage.navigateToFolder(folderThreeModel.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(contentServicesPage.getActiveBreadcrumb()).toEqual(folderThreeModel.name); + paginationPage.selectItemsPerPage(itemsPerPage.fifteen); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue * currentPage + ' of ' + secondSetNumber); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fifteenValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, secondSetOfFiles.slice(0, 15))).toEqual(true); + }); + + currentPage++; + paginationPage.clickOnNextPage(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + secondSetNumber + ' of ' + secondSetNumber); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(secondSetNumber - itemsPerPage.fifteenValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, secondSetOfFiles.slice(15, 25))).toEqual(true); + }); + + currentPage = 1; + paginationPage.selectItemsPerPage(itemsPerPage.twenty); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.twentyValue * currentPage + ' of ' + secondSetNumber); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.twentyValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, secondSetOfFiles.slice(0, 20))).toEqual(true); + }); + + currentPage++; + paginationPage.clickOnNextPage(); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); + expect(paginationPage.getPaginationRange()).toEqual('Showing 21-' + secondSetNumber + ' of ' + secondSetNumber); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(secondSetNumber - itemsPerPage.twentyValue); + contentServicesPage.getAllRowsNameColumn().then(function (list) { + expect(Util.arrayContainsArray(list, secondSetOfFiles.slice(20, 25))).toEqual(true); + }); + }); +}); diff --git a/e2e/form_widgets_component.e2e.ts b/e2e/form_widgets_component.e2e.ts new file mode 100644 index 0000000000..2fabd6e941 --- /dev/null +++ b/e2e/form_widgets_component.e2e.ts @@ -0,0 +1,213 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import TasksPage = require('./pages/adf/process_services/tasksPage'); +import UsingWidget = require('./pages/adf/process_services/widgets/usingWidget'); + +import CONSTANTS = require('./util/constants'); + +import FormDefinitionModel = require('./models/APS/FormDefinitionModel'); +import Task = require('./models/APS/Task'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +let formInstance = new FormDefinitionModel(); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { AppsActions } from './actions/APS/apps.actions'; +import { UsersActions } from './actions/users.actions'; + +describe('Form widgets', () => { + + let loginPage = new LoginPage(); + let processServicesPage = new ProcessServicesPage(); + let processUserModel; + let app = resources.Files.WIDGETS_SMOKE_TEST; + let appFields = app.form_fields; + let taskPage = new TasksPage(); + let appModel; + let taskModel; + let newTask = 'First task'; + let usingWidget = new UsingWidget(); + let procUserModel; + let alfrescoJsApi; + + beforeAll(async (done) => { + let users = new UsersActions(); + let appsActions = new AppsActions(); + + alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + processUserModel = await users.createTenantAndUser(alfrescoJsApi); + + await alfrescoJsApi.login(processUserModel.email, processUserModel.password); + + appModel = await appsActions.importPublishDeployApp(alfrescoJsApi, app.file_location); + + done(); + }); + + afterAll(async (done) => { + + await alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(processUserModel.tenantId); + + done(); + }); + + it('Check text, multiline widgets - label, value and displayed', () => { + loginPage.loginToProcessServicesUsingUserModel(processUserModel); + processServicesPage.goToProcessServices().goToApp(appModel.name) + .clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(newTask).addDescription('Description').addForm(app.formName).clickStartButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(newTask); + taskPage.usingFormFields().checkFormIsDisplayed(); + expect(taskPage.usingTaskDetails().getTitle()).toEqual('Activities'); + }) + .then(() => { + return alfrescoJsApi.activiti.taskApi.listTasks(new Task({ sort: 'created-desc' })); + }) + .then( (response) => { + return alfrescoJsApi.activiti.taskFormsApi.getTaskForm(response.data[0].id); + }) + .then((formDefinition) => { + formInstance.setFields(formDefinition.fields); + formInstance.setAllWidgets(formDefinition.fields); + return formInstance; + }) + .then(() => { + expect(taskPage.usingFormFields().getFieldLabel(appFields.text_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.text_id).name); + expect(taskPage.usingFormFields().getFieldValue(appFields.text_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.text_id).value || ''); + + expect(usingWidget.usingMultilineTextWidget().getFieldValue(appFields.multiline_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.multiline_id).value || ''); + expect(taskPage.usingFormFields().getFieldLabel(appFields.multiline_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.multiline_id).name); + }); + + }); + + it('Check number, amount widgets - label, value and displayed', () => { + + expect(taskPage.usingFormFields().getFieldValue(appFields.number_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.number_id).value || ''); + expect(taskPage.usingFormFields().getFieldLabel(appFields.number_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.number_id).name); + + expect(taskPage.usingFormFields().getFieldValue(appFields.amount_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.amount_id).value || ''); + expect(taskPage.usingFormFields().getFieldLabel(appFields.amount_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.amount_id).name); + }); + + it('Check attachfolder, attachfile widgets - label and displayed', () => { + + expect(taskPage.usingFormFields().getFieldLabel(appFields.attachfolder_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.attachfolder_id).name); + expect(taskPage.usingFormFields().getFieldLabel(appFields.attachfile_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.attachfile_id).name); + }); + + it('Check date, date & time widgets - label, value and displayed', () => { + + expect(taskPage.usingFormFields().getFieldLabel(appFields.date_id)) + .toContain(formInstance.getWidgetBy('id', appFields.date_id).name); + expect(taskPage.usingFormFields().getFieldValue(appFields.date_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.date_id).value || ''); + + expect(taskPage.usingFormFields().getFieldLabel(appFields.dateTime_id)) + .toContain(formInstance.getWidgetBy('id', appFields.dateTime_id).name); + expect(taskPage.usingFormFields().getFieldValue(appFields.dateTime_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.dateTime_id).value || ''); + }); + + it('Check people, group widgets - label, value and displayed', () => { + + expect(taskPage.usingFormFields().getFieldValue(appFields.people_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.people_id).value || ''); + expect(taskPage.usingFormFields().getFieldLabel(appFields.people_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.people_id).name); + + expect(taskPage.usingFormFields().getFieldValue(appFields.group_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.group_id).value || ''); + expect(taskPage.usingFormFields().getFieldLabel(appFields.group_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.group_id).name); + }); + + it('Check displayText, displayValue widgets - value and displayed', () => { + + expect(usingWidget.usingDisplayTextWidget().getFieldLabel(appFields.displaytext_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.displaytext_id).value); + expect(usingWidget.usingDisplayValueWidget().getFieldLabel(appFields.displayvalue_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.displayvalue_id).value || 'Unknown type: readonly'); + }); + + it('Check typeahead, header widgets - label, value and displayed', () => { + + expect(usingWidget.usingHeaderWidget().getFieldLabel(appFields.header_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.header_id).name); + + expect(taskPage.usingFormFields().getFieldValue(appFields.typeahead_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.typeahead_id).value || ''); + expect(taskPage.usingFormFields().getFieldLabel(appFields.typeahead_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.typeahead_id).name); + }); + + it('Check checkbox, radiobuttons widgets - label, value and displayed', () => { + let radioOption = 1; + + expect(taskPage.usingFormFields().getFieldLabel(appFields.checkbox_id)) + .toContain(formInstance.getWidgetBy('id', appFields.checkbox_id).name); + + expect(taskPage.usingFormFields().getFieldLabel(appFields.radiobuttons_id)) + .toContain(formInstance.getWidgetBy('id', appFields.radiobuttons_id).name); + expect(usingWidget.usingRadioWidget().getSpecificOptionLabel(appFields.radiobuttons_id, radioOption)) + .toContain(formInstance.getWidgetBy('id', appFields.radiobuttons_id).options[radioOption - 1].name); + }); + + it('Check hyperlink, dropdown, dynamictable widgets - label, value and displayed', () => { + + expect(usingWidget.usingHyperlink().getFieldText(appFields.hyperlink_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.hyperlink_id).hyperlinkUrl || ''); + expect(taskPage.usingFormFields().getFieldLabel(appFields.hyperlink_id)) + .toEqual(formInstance.getWidgetBy('id', appFields.hyperlink_id).name); + + expect(taskPage.usingFormFields().getFieldLabel(appFields.dropdown_id)) + .toContain(formInstance.getWidgetBy('id', appFields.dropdown_id).name); + expect(usingWidget.usingDropdown().getSelectedOptionText(appFields.dropdown_id)) + .toContain(formInstance.getWidgetBy('id', appFields.dropdown_id).value); + + expect(usingWidget.usingDynamicTable().getFieldLabel(appFields.dynamictable_id)) + .toContain(formInstance.getWidgetBy('id', appFields.dynamictable_id).name); + expect(usingWidget.usingDynamicTable().getColumnName(appFields.dynamictable_id)) + .toContain(formInstance.getWidgetBy('id', appFields.dynamictable_id).columnDefinitions[0].name); + }); + +}); diff --git a/e2e/infinite_scrolling.e2e.ts b/e2e/infinite_scrolling.e2e.ts new file mode 100644 index 0000000000..bb38975d1c --- /dev/null +++ b/e2e/infinite_scrolling.e2e.ts @@ -0,0 +1,81 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ContentServicesPage = require('./pages/adf/contentServicesPage'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import FolderModel = require('./models/ACS/folderModel'); + +import TestConfig = require('./test.config'); +import Util = require('./util/util'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Enable infinite scrolling', () => { + + let loginPage = new LoginPage(); + let contentServicesPage = new ContentServicesPage(); + + let acsUser = new AcsUserModel(); + let folderModel = new FolderModel({ 'name': 'folderOne' }); + + let fileNames = [], nrOfFiles = 30; + let fileNum = 0; + + let files = { + base: 'newFile', + extension: '.txt' + }; + + beforeAll(async (done) => { + let uploadActions = new UploadActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + contentServicesPage.goToDocumentList(); + + fileNames = Util.generateSeqeunceFiles(1, nrOfFiles, files.base, files.extension); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + let folderUploadedModel = await uploadActions.uploadFolder(this.alfrescoJsApi, folderModel.name, '-my-'); + + await uploadActions.createEmptyFiles(this.alfrescoJsApi, fileNames, folderUploadedModel.entry.id); + + done(); + }); + + it('Enable infinite scrolling', () => { + contentServicesPage.navigateToFolder(folderModel.name); + contentServicesPage.enableInfiniteScrolling(); + contentServicesPage.clickLoadMoreButton(); + for (fileNum; fileNum < nrOfFiles; fileNum++) { + contentServicesPage.checkContentIsDisplayed(fileNames[fileNum]); + } + }); +}); diff --git a/e2e/login_component.e2e.ts b/e2e/login_component.e2e.ts new file mode 100644 index 0000000000..5c1c341623 --- /dev/null +++ b/e2e/login_component.e2e.ts @@ -0,0 +1,156 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import AdfContentServicesPage = require('./pages/adf/contentServicesPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); + +import TestConfig = require('./test.config'); +import AcsUserModel = require('./models/ACS/acsUserModel'); + +import AdfSettingsPage = require('./pages/adf/settingsPage'); + +describe('Test Login component', () => { + + let adfSettingsPage = new AdfSettingsPage(); + let processServicesPage = new ProcessServicesPage(); + let navigationBarPage = new NavigationBarPage(); + let adfContentServicesPage = new AdfContentServicesPage(); + let loginPage = new LoginPage(); + let adminUserModel = new AcsUserModel({ + 'id': TestConfig.adf.adminUser, + 'password': TestConfig.adf.adminPassword + }); + + let errorMessages = { + username: 'Your username needs to be at least 2 characters.', + invalid_credentials: 'You\'ve entered an unknown username or password', + password: 'Enter your password to sign in', + required: 'Required' + }; + + beforeAll( (done) => { + adfSettingsPage.setProviderEcmBpm(); + done(); + }); + + it('1. Username Required', () => { + loginPage.checkUsernameInactive(); + loginPage.checkSignInButtonIsDisabled(); + loginPage.enterUsername('A'); + loginPage.checkUsernameTooltip(errorMessages.username); + loginPage.clearUsername(); + loginPage.checkUsernameTooltip(errorMessages.required); + loginPage.checkUsernameHighlighted(); + loginPage.checkSignInButtonIsDisabled(); + }); + + it('2. Enter Password to sign in', () => { + loginPage.checkPasswordInactive(); + loginPage.checkSignInButtonIsDisabled(); + loginPage.enterPassword('A'); + loginPage.checkPasswordTooltipIsNotVisible(); + loginPage.clearPassword(); + loginPage.checkPasswordTooltip(errorMessages.password); + loginPage.checkPasswordHighlighted(); + loginPage.checkSignInButtonIsDisabled(); + }); + + it('3. Username must be at least 2 characters long', () => { + loginPage.checkSignInButtonIsDisabled(); + loginPage.enterUsername('A'); + loginPage.checkUsernameTooltip(errorMessages.username); + loginPage.enterUsername('AB'); + loginPage.checkUsernameTooltipIsNotVisible(); + loginPage.checkSignInButtonIsDisabled(); + loginPage.clearUsername(); + }); + + it('4. Login button is enabled', () => { + loginPage.enterUsername(adminUserModel.id); + loginPage.checkSignInButtonIsDisabled(); + loginPage.enterPassword('a'); + loginPage.checkSignInButtonIsEnabled(); + loginPage.clearUsername(adminUserModel.id); + loginPage.clearPassword(); + }); + + it('5. You have entered an invalid username or password', () => { + loginPage.checkSignInButtonIsDisabled(); + loginPage.enterUsername('test'); + loginPage.enterPassword('test'); + loginPage.checkSignInButtonIsEnabled(); + loginPage.clickSignInButton(); + loginPage.checkLoginError(errorMessages.invalid_credentials); + loginPage.clearUsername(); + loginPage.clearPassword(); + }); + + it('6. Password field is crypted', () => { + loginPage.checkSignInButtonIsDisabled(); + loginPage.enterPassword('test'); + loginPage.showPassword(); + loginPage.checkPasswordIsShown('test'); + loginPage.hidePassword(); + loginPage.checkPasswordIsHidden(); + loginPage.clearPassword(); + }); + + it('7. Remember Need Help? and Register are displayed and hidden', () => { + loginPage.enableFooter(); + loginPage.checkRememberIsDisplayed(); + loginPage.checkNeedHelpIsDisplayed(); + loginPage.checkRegisterDisplayed(); + loginPage.disableFooter(); + loginPage.checkRememberIsNotDisplayed(); + loginPage.checkNeedHelpIsNotDisplayed(); + loginPage.checkRegisterIsNotDisplayed(); + }); + + it('8. Login to Process Services with Content Services disabled', () => { + loginPage.checkSignInButtonIsDisabled(); + adfSettingsPage.setProviderBpm(); + loginPage.login(adminUserModel.id, adminUserModel.password); + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + navigationBarPage.clickContentServicesButton(); + loginPage.waitForElements(); + }); + + it('9. Login to Content Services with Process Services disabled', () => { + loginPage.checkSignInButtonIsDisabled(); + adfSettingsPage.setProviderEcm(); + loginPage.login(TestConfig.adf.adminUser, TestConfig.adf.adminPassword); + navigationBarPage.clickContentServicesButton(); + adfContentServicesPage.checkAcsContainer(); + navigationBarPage.clickProcessServicesButton(); + loginPage.waitForElements(); + }); + + it('10. Able to login to both Content Services and Process Services', () => { + loginPage.checkSignInButtonIsDisabled(); + adfSettingsPage.setProviderEcmBpm(); + loginPage.login(adminUserModel.id, adminUserModel.password); + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + navigationBarPage.clickContentServicesButton(); + adfContentServicesPage.checkAcsContainer(); + navigationBarPage.clickLoginButton(); + loginPage.waitForElements(); + }); +}); diff --git a/e2e/models/ACS/acsUserModel.js b/e2e/models/ACS/acsUserModel.js new file mode 100644 index 0000000000..dc2a378368 --- /dev/null +++ b/e2e/models/ACS/acsUserModel.js @@ -0,0 +1,56 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +var AcsUserModel = function (details) { + + this.firstName = Util.generateRandomString(); + this.lastName = Util.generateRandomString(); + this.password = Util.generateRandomString(); + this.email = Util.generateRandomString(); + this.id = Util.generateRandomString(); + this.jobTitle = "N/A"; + + this.getFirstName = function () { + return this.firstName; + }; + + this.getLastName = function () { + return this.lastName; + }; + + this.getPassword = function () { + return this.password; + }; + + this.getEmail = function () { + return this.email; + }; + + this.getId = function () { + return this.id; + }; + + this.getJobTitle = function () { + return this.jobTitle; + }; + + Object.assign(this, details); + +}; +module.exports = AcsUserModel; diff --git a/e2e/models/ACS/contentModel.js b/e2e/models/ACS/contentModel.js new file mode 100644 index 0000000000..9cbaddd5cc --- /dev/null +++ b/e2e/models/ACS/contentModel.js @@ -0,0 +1,51 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var ContentModel = function (details) { + + this.mimeType = ''; + this.mimeTypeName = ''; + this.sizeInBytes = ''; + this.encoding = ''; + + this.getMimeType = function () { + return this.mimeType; + }; + + this.getMimeTypeName = function () { + return this.mimeTypeName; + }; + + this.getSizeInBytes = function () { + if (this.sizeInBytes>=1024) + { + var bytes=(this.sizeInBytes/1024).toFixed(2)+' KB'; + return bytes; + } + else { + return this.sizeInBytes; + } + }; + + this.getEncoding = function () { + return this.encoding; + }; + + Object.assign(this, details); + +}; +module.exports = ContentModel; diff --git a/e2e/models/ACS/contentProperties.js b/e2e/models/ACS/contentProperties.js new file mode 100644 index 0000000000..d7349324a0 --- /dev/null +++ b/e2e/models/ACS/contentProperties.js @@ -0,0 +1,38 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var ContentPropertiesModel = function (details) { + this['cm:author'] = ''; + this['cm:description'] = ''; + this['cm:title'] = ''; + + this.getAuthor = function () { + return this['cm:author']; + }; + + this.getDescription = function () { + return this['cm:description']; + }; + + this.getTitle = function () { + return this['cm:title']; + }; + + Object.assign(this, details); + +}; +module.exports = ContentPropertiesModel; diff --git a/e2e/models/ACS/createdByModel.js b/e2e/models/ACS/createdByModel.js new file mode 100644 index 0000000000..ba39dd069e --- /dev/null +++ b/e2e/models/ACS/createdByModel.js @@ -0,0 +1,36 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +var AcsUserModel = function (details) { + + this.displayName = Util.generateRandomString(); + this.id = Util.generateRandomString(); + + this.getId = function () { + return this.id; + }; + + this.getDisplayName = function () { + return this.displayName; + }; + + Object.assign(this, details); + +}; +module.exports = AcsUserModel; diff --git a/e2e/models/ACS/fileModel.js b/e2e/models/ACS/fileModel.js new file mode 100644 index 0000000000..9f637dbbde --- /dev/null +++ b/e2e/models/ACS/fileModel.js @@ -0,0 +1,116 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); +var resources = require('../../util/resources'); +var CreatedByModel = require('./createdByModel'); +var ContentModel = require('./contentModel'); +var ContentPropertiesModel = require('./contentProperties'); + +var FileModel = function (details) { + + this.id = Util.generateRandomString(); + this.name = Util.generateRandomString(); + this.shortName = this.name; + this.location = resources.Files.ADF_DOCUMENTS.PDF.file_location; + this.tooltip = this.name; + this.version = ""; + this.firstPageText = resources.Files.ADF_DOCUMENTS.PDF.first_page_text; + this.lastPageText = resources.Files.ADF_DOCUMENTS.PDF.last_page_text; + this.secondPageText = resources.Files.ADF_DOCUMENTS.PDF.second_page_text; + this.lastPageNumber = resources.Files.ADF_DOCUMENTS.PDF.last_page_number; + this.createdAt = ""; + this.createdByUser = {}; + this.modifiedByUser = {}; + this.content = {}; + this.properties = {}; + + this.getName = function () { + return this.name; + }; + + this.setVersion = function (ver) { + this.version = "-" + ver; + }; + + this.getVersionName = function () { + var extension = this.name.split(".")[1]; + var name = this.name.split(".")[0]; + return name + this.version + "." + extension; + }; + + this.getShortName = function () { + return this.shortName; + }; + + this.getLocation = function () { + return this.location; + }; + + this.getTooltip = function () { + return this.tooltip; + }; + + this.getId = function () { + return this.id; + }; + + this.getFirstPageText = function () { + return this.firstPageText; + }; + + this.getLastPageText = function () { + return this.lastPageText; + }; + + this.getSecondPageText = function () { + return this.secondPageText; + }; + + this.getLastPageNumber = function () { + return this.lastPageNumber; + }; + + this.getCreatedByUser = function () { + return this.createdByUser; + }; + + this.getModifiedByUser = function () { + return this.modifiedByUser; + }; + + this.getContent = function () { + return this.content; + }; + + this.getProperties = function () { + return this.properties; + }; + + this.update = function(details) { + Object.assign(this, { + createdByUser: new CreatedByModel(details.createdByUser), + modifiedByUser: new CreatedByModel(details.modifiedByUser), + content: new ContentModel(details.content), + properties: new ContentPropertiesModel(details.properties) + }) + } + + Object.assign(this, details); + +}; +module.exports = FileModel; diff --git a/e2e/models/ACS/filesModel.js b/e2e/models/ACS/filesModel.js new file mode 100644 index 0000000000..c2d02d32b1 --- /dev/null +++ b/e2e/models/ACS/filesModel.js @@ -0,0 +1,34 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FileModel = require('./fileModel'); + +var FilesModel = function () { + + var files = null; + + this.setFiles = function (arr) { + files = arr.map(function(item) { + return new FileModel(item.entry); + }); + }; + + this.getFiles = function () { + return files; + }; +}; +module.exports = FilesModel; diff --git a/e2e/models/ACS/folderModel.js b/e2e/models/ACS/folderModel.js new file mode 100644 index 0000000000..5082c46fc1 --- /dev/null +++ b/e2e/models/ACS/folderModel.js @@ -0,0 +1,52 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +var FolderModel = function (details) { + + this.id = Util.generateRandomString(); + this.name = Util.generateRandomString(); + this.shortName = this.name; + this.tooltip = this.name; + this.location = ""; + + this.getName = function () { + return this.name; + }; + + this.getShortName = function () { + return this.shortName; + }; + + this.getTooltip = function () { + return this.tooltip; + }; + + this.getId = function () { + return this.id; + }; + + this.getLocation = function () { + return this.location; + }; + + Object.assign(this, details); + +}; +module.exports = FolderModel; + diff --git a/e2e/models/APS/AppDefinition.js b/e2e/models/APS/AppDefinition.js new file mode 100644 index 0000000000..25980fcfda --- /dev/null +++ b/e2e/models/APS/AppDefinition.js @@ -0,0 +1,39 @@ +/*! + * @license + * Copyright 2016 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. + */ + +/** + * App definition representation JSON Object + * + * @param details - JSON object used to overwrite the default values + * @constructor + */ + +var AppDefinition = function (details) { + this.defaultAppId = "1"; + this.deploymentId = "1"; + this.description = "App deployment"; + this.icon = "default icon"; + this.id = 0; + this.modelId = 0; + this.name = "App name"; + this.tenantId = 0; + this.theme = "default theme"; + + Object.assign(this, details); +}; + +module.exports = AppDefinition; \ No newline at end of file diff --git a/e2e/models/APS/AppPublish.js b/e2e/models/APS/AppPublish.js new file mode 100644 index 0000000000..546accb1de --- /dev/null +++ b/e2e/models/APS/AppPublish.js @@ -0,0 +1,31 @@ +/*! + * @license + * Copyright 2016 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. + */ + +/** + * App definition publish representation JSON Object + * + * @param details - JSON object used to overwrite the default values + * @constructor + */ +var AppPublish = function (details) { + this.comment = ''; + this.force = true; + + Object.assign(this, details); +}; + +module.exports = AppPublish; \ No newline at end of file diff --git a/e2e/models/APS/FormDefinitionFieldModel.js b/e2e/models/APS/FormDefinitionFieldModel.js new file mode 100644 index 0000000000..8fc5ee7a2d --- /dev/null +++ b/e2e/models/APS/FormDefinitionFieldModel.js @@ -0,0 +1,58 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormDefinitionFieldModel = function (details) { + + this.fieldType; + this.id; + this.name; + this.value; + this.type; + this.required; + this.readOnly; + this.overrideId; + this.colspan; + this.placeholder; + this.minLength; + this.maxLength; + this.minValue; + this.maxValue; + this.regexPattern; + this.optionType; + this.hasEmptyValue; + this.options; + this.restUrl; + this.restResponsePath; + this.restIdProperty; + this.setRestLabelProperty; + this.tab; + this.className; + this.dateDisplayFormat; + this.layout = {}; + this.sizeX; + this.sizeY; + this.row; + this.col; + this.columnDefinitions; + this.visibilityCondition; + this.numberOfColumns; + this.fields = {}; + + Object.assign(this, details); +}; +module.exports = FormDefinitionFieldModel; + diff --git a/e2e/models/APS/FormDefinitionModel.js b/e2e/models/APS/FormDefinitionModel.js new file mode 100644 index 0000000000..1a48e918a3 --- /dev/null +++ b/e2e/models/APS/FormDefinitionModel.js @@ -0,0 +1,61 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormDefinitionFieldModel = require('./FormDefinitionFieldModel'); + +var FormDefinitionModel = function (fields) { + + var fields = null; + var widgets = null; + + this.setFields = function (arr) { + fields = arr.map(function(item) { + return new FormDefinitionFieldModel(item); + }) + }; + + this.setAllWidgets = function (arr) { + widgets = arr.reduce(function(acc, item) { + if(item.type === 'container') { + var children = Object.keys(item.fields).map(function(key) { + return item.fields[key][0]; + }); + + return acc.concat(children); + } + return acc.concat(item); + }, []); + }; + + this.getWidgets = function () { + return widgets; + }; + + this.getWidgetBy = function (key, value) { + return widgets.find(function(widget) { + return widget[key]===value; + }) + }; + + this.findFieldBy = function(key, value) { + return fields.find(function(field) { + return field[key]===value; + }) + }; +} + +module.exports = FormDefinitionModel; diff --git a/e2e/models/APS/FormModel.js b/e2e/models/APS/FormModel.js new file mode 100644 index 0000000000..dc38632af2 --- /dev/null +++ b/e2e/models/APS/FormModel.js @@ -0,0 +1,58 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormModel = function (details) { + + this.id; + this.name; + this.description; + this.modelId; + this.appDefinitionId; + this.appDeploymentId; + this.tenantId; + + this.getName = function () { + return this.name; + }; + + this.getId = function () { + return this.id; + }; + + this.getDescription = function () { + return this.description; + }; + + this.getModelId = function () { + return this.modelId; + }; + + this.getAppDefinitionId = function () { + return this.appDefinitionId; + }; + + this.getAppDeploymentId = function () { + return this.appDeploymentId; + }; + + this.getTenantId = function () { + return this.tenantId; + }; + + Object.assign(this, details); +}; +module.exports = FormModel; diff --git a/e2e/models/APS/Group.js b/e2e/models/APS/Group.js new file mode 100644 index 0000000000..77826d5990 --- /dev/null +++ b/e2e/models/APS/Group.js @@ -0,0 +1,37 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +/** + * Create Group Object + * + * @param details - Group object used to overwrite the default values + * @constructor + */ + +var Group = function (details) { + + this.name = Util.generateRandomString(); + this.type = "1"; + this.parentGroupId = null; + this.tenantId = "1"; + + Object.assign(this, details); +}; + +module.exports = Group; diff --git a/e2e/models/APS/ProcessCreatedByModel.js b/e2e/models/APS/ProcessCreatedByModel.js new file mode 100644 index 0000000000..61080af75f --- /dev/null +++ b/e2e/models/APS/ProcessCreatedByModel.js @@ -0,0 +1,49 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var ProcessCreatedByModel = function (details) { + + this.id; + this.firstName; + this.lastName; + this.email; + + this.getFirstName = function () { + return this.firstName; + }; + + this.getId = function () { + return this.id; + }; + + this.getLastName = function () { + return this.lastName; + }; + + this.getEmail = function () { + return this.email; + }; + + this.getEntireName = function() { + return this.firstName + " " + this.getLastName(); + }; + + Object.assign(this, details); + +}; + +module.exports = ProcessCreatedByModel; diff --git a/e2e/models/APS/ProcessInstance.js b/e2e/models/APS/ProcessInstance.js new file mode 100644 index 0000000000..6446cd7d37 --- /dev/null +++ b/e2e/models/APS/ProcessInstance.js @@ -0,0 +1,32 @@ +/*! + * @license + * Copyright 2016 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. + */ + +/** + * Process Instance representation JSON Object + * + * @param details - JSON object used to overwrite the default values + * @constructor + */ + +var ProcessInstance = function (details) { + this.processDefinitionId = 1234; + this.name = "Process started from REST API"; + + Object.assign(this, details); +}; + +module.exports = ProcessInstance; diff --git a/e2e/models/APS/ProcessModel.js b/e2e/models/APS/ProcessModel.js new file mode 100644 index 0000000000..0d88eee1c3 --- /dev/null +++ b/e2e/models/APS/ProcessModel.js @@ -0,0 +1,83 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var ProcessCreatedByModel = require('./ProcessCreatedByModel'); + +var ProcessModel = function (details) { + + this.id; + this.name; + this.version; + this.modelType; + this.description; + this.createdByFullName; + this.createdBy; + this.lastUpdatedByFullName; + this.lastUpdatedBy; + this.lastUpdated; + this.startedBy = {}; + + this.getName = function () { + return this.name; + }; + + this.getId = function () { + return this.id; + }; + + this.getVersion = function () { + return this.version; + }; + + this.getModelType = function () { + return this.modelType; + }; + + this.getDescription = function () { + return this.description; + }; + + this.getCreatedByFullName = function () { + return this.createdByFullName; + }; + + this.getCreatedBy = function () { + return this.createdBy; + }; + + this.getLastUpdatedByFullName = function () { + return this.lastUpdatedByFullName; + }; + + this.getLastUpdatedBy = function () { + return this.lastUpdatedBy; + }; + + this.getLastUpdated = function () { + return this.lastUpdated; + }; + + this.getStartedBy = function () { + return this.startedBy; + }; + + Object.assign(this, details); + Object.assign(this.startedBy, new ProcessCreatedByModel(details.startedBy)); + + +}; +module.exports = ProcessModel; diff --git a/e2e/models/APS/StandaloneTask.js b/e2e/models/APS/StandaloneTask.js new file mode 100644 index 0000000000..f23cdb4c8a --- /dev/null +++ b/e2e/models/APS/StandaloneTask.js @@ -0,0 +1,33 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +/** + * Create Json Object for standalone task + * + * @param details - JSON object used to overwrite the default values + * @constructor + */ + +var StandaloneTask = function (details) { + + this.name = Util.generateRandomString(); + + Object.assign(this, details); +}; +module.exports = StandaloneTask; diff --git a/e2e/models/APS/Task.js b/e2e/models/APS/Task.js new file mode 100644 index 0000000000..416de6e008 --- /dev/null +++ b/e2e/models/APS/Task.js @@ -0,0 +1,32 @@ +/*! + * @license + * Copyright 2016 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. + */ + +/** + * Create and manage task JSON Object + * + * @param details - JSON object used to overwrite the default values + * @constructor + */ + +var Task = function (details) { + + this.processInstanceId; + this.sort; + + Object.assign(this, details); +}; +module.exports = Task; diff --git a/e2e/models/APS/TaskAssigneeModel.js b/e2e/models/APS/TaskAssigneeModel.js new file mode 100644 index 0000000000..1ca3f68f0c --- /dev/null +++ b/e2e/models/APS/TaskAssigneeModel.js @@ -0,0 +1,49 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var TaskAssigneeModel = function (details) { + + this.id; + this.firstName; + this.lastName; + this.email; + + this.getFirstName = function () { + return this.firstName; + }; + + this.getId = function () { + return this.id; + }; + + this.getLastName = function () { + return this.lastName; + }; + + this.getEmail = function () { + return this.email; + }; + + this.getEntireName = function() { + return this.firstName + " " + this.getLastName(); + }; + + Object.assign(this, details); + +}; + +module.exports = TaskAssigneeModel; diff --git a/e2e/models/APS/TaskModel.js b/e2e/models/APS/TaskModel.js new file mode 100644 index 0000000000..8c9a763f18 --- /dev/null +++ b/e2e/models/APS/TaskModel.js @@ -0,0 +1,76 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var TaskAssigneeModel = require('./TaskAssigneeModel'); + +var TaskModel = function (details) { + + this.id; + this.name; + this.description; + this.category; + this.created; + this.dueDate; + this.priority; + this.parentTaskName; + this.formKey; + this.assignee = {}; + + this.getName = function () { + return this.name; + }; + + this.getId = function () { + return this.id; + }; + + this.getDescription = function () { + return this.description; + }; + + this.getCategory = function () { + return this.category; + }; + + this.getCreated = function () { + return this.created; + }; + + this.getDueDate = function () { + return this.dueDate; + }; + + this.getPriority = function () { + return this.priority; + }; + + this.getParentTaskName = function () { + return this.parentTaskName; + }; + + this.getFormKey = function () { + return this.formKey; + }; + + this.getAssignee = function () { + return this.assignee; + }; + + Object.assign(this, details); + Object.assign(this.assignee, new TaskAssigneeModel(details.assignee)); +}; +module.exports = TaskModel; diff --git a/e2e/models/APS/Tenant.js b/e2e/models/APS/Tenant.js new file mode 100644 index 0000000000..80e1f7feaf --- /dev/null +++ b/e2e/models/APS/Tenant.js @@ -0,0 +1,36 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +/** + * Create tenant JSON Object + * + * @param details - JSON object used to overwrite the default values + * @constructor + */ +var Tenant = function (details) { + this.active = true; + this.configuration = "DefaultConfig"; + this.domain = "DefaultDomain"; + this.maxUsers = 10; + this.name = Util.generateRandomString(); + + Object.assign(this, details); +}; + +module.exports = Tenant; diff --git a/e2e/models/APS/User.js b/e2e/models/APS/User.js new file mode 100644 index 0000000000..7c7c5e4163 --- /dev/null +++ b/e2e/models/APS/User.js @@ -0,0 +1,39 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +/** + * Create User JSON Object + * + * @param details - JSON object used to overwrite the default values + * @constructor + */ + +var User = function (details) { + + this.email = Util.generateRandomEmail(); + this.firstName = Util.generateRandomString(); + this.lastName = Util.generateRandomString(); + this.password = Util.generatePasswordString(); + this.type = 'enterprise'; + this.tenantId = "1"; + this.company = null; + + Object.assign(this, details); +}; +module.exports = User; diff --git a/e2e/pages/adf/activiti/appsPage.js b/e2e/pages/adf/activiti/appsPage.js new file mode 100644 index 0000000000..58f8c37fae --- /dev/null +++ b/e2e/pages/adf/activiti/appsPage.js @@ -0,0 +1,382 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Page = require('astrolabe').Page; +var Util = require('../../../util/util'); + +/** + * Provides activiti + * @module pages + * @submodule share + * @class pages.share.LoginPage + */ +module.exports = Page.create({ + + /** + * Provides the task App + * @property taskApp + * @type protractor.Element + */ + taskApp: { + get: function () { + return element(by.cssContainingText("h1[class*='mdl-card__title-text']", "Task App")); + } + }, + + /** + * clicks the activiti option + * @property clickActiviti + * */ + clickActiviti: { + value: function() { + var activitiButton = element(by.css("a[data-automation-id='activiti']")); + Util.waitUntilElementIsVisible(activitiButton); + activitiButton.click(); + } + }, + + /** + * Provides the wait required for the page + * @property waitForElements + * @type protractor.Element + * */ + waitForElements: { + value: function () { + Util.waitUntilElementIsVisible(this.taskApp); + Util.waitUntilElementIsVisible(element(by.css("i[class='material-icons']"))); + } + }, + + /** + * Fills the username input + * @method enterUsername + * @param {String} username + */ + enterUsername: { + value: function (username) { + Util.waitUntilElementIsVisible(this.txtUsername); + this.txtUsername.clear(); + this.txtUsername.sendKeys(username); + } + }, + + /** + * Fills the password input + * @method enterPassword + * @param {String} password + */ + enterPassword: { + value: function (password) { + Util.waitUntilElementIsVisible(this.txtPassword); + this.txtPassword.clear(); + this.txtPassword.sendKeys(password); + } + }, + + /** + * Logs into adf + * @method login + * @param {String} username, {String} password + */ + login: { + value: function (username, password) { + this.waitForElements(); + this.enterUsername(username); + this.enterPassword(password); + Util.waitUntilElementIsVisible(element(by.css("ol[data-automation-id='breadcrumb']"))); + } + }, + + /** + * Logs out + * @method logout + */ + logout: { + value: function () { + var menuButton = element(by.css("button[data-automation-id='right-action-menu']")); + var logoutOption = element(by.cssContainingText("li[class*='mdl-menu__item'] > label", "Logout")); + + Util.waitUntilElementIsVisible(menuButton); + menuButton.click(); + Util.waitUntilElementIsVisible(logoutOption); + logoutOption.click(); + this.waitForElements(); + } + }, + + + + /** + * Enable ECM + * @method enableECM + */ + enableECM: { + value: function () { + Util.waitUntilElementIsVisible(this.ecmSwitch); + this.ecmSwitch.click(); + Util.waitUntilElementIsVisible(element(by.css("label[class*='is-checked'][for='switch1']"))); + + element(by.css("label[class*='is-checked'][for='switch2']")).isPresent().then(function(check) { + if(check) { + Util.waitUntilElementIsVisible(element(by.css("alfresco-login[ng-reflect-providers*='ALL']"))); + } + else { + Util.waitUntilElementIsVisible(element(by.css("alfresco-login[ng-reflect-providers='ECM']"))); + } + }); + } + }, + + /** + * Disable ECM + * @method enableECM + */ + disableECM: { + value: function () { + Util.waitUntilElementIsVisible(this.ecmSwitch); + this.ecmSwitch.click(); + + element(by.css("label[class*='is-checked'][for='switch2']")).isPresent().then(function(check) { + if(check) { + Util.waitUntilElementIsVisible(element(by.css("alfresco-login[ng-reflect-providers*='BPM']"))); + } + else { + Util.waitUntilElementIsVisible(element(by.css("alfresco-login[ng-reflect-providers='']"))); + } + }); + } + }, + + /** + * Enable BPM + * @method enableBPM + */ + enableBPM: { + value: function () { + Util.waitUntilElementIsVisible(this.bpmSwitch); + this.bpmSwitch.click(); + Util.waitUntilElementIsVisible(element(by.css("label[class*='is-checked'][for='switch2']"))); + + element(by.css("label[class*='is-checked'][for='switch1']")).isPresent().then(function(check) { + if(check) { + Util.waitUntilElementIsVisible(element(by.css("alfresco-login[ng-reflect-providers*='ALL']"))); + } + else { + Util.waitUntilElementIsVisible(element(by.css("alfresco-login[ng-reflect-providers='BPM']"))); + } + }); + } + }, + + /** + * Disable BPM + * @method enableBPM + */ + disableBPM: { + value: function () { + Util.waitUntilElementIsVisible(this.bpmSwitch); + this.bpmSwitch.click(); + + element(by.css("label[class*='is-checked'][for='switch1']")).isPresent().then(function(check) { + if(check) { + Util.waitUntilElementIsVisible(element(by.css("alfresco-login[ng-reflect-providers*='ECM']"))); + } + else { + Util.waitUntilElementIsVisible(element(by.css("alfresco-login[ng-reflect-providers='']"))); + } + }); + } + }, + + /** + * Enable CSRF + * @method enableBPM + */ + enableCSRF: { + value: function () { + Util.waitUntilElementIsVisible(this.csrfSwitch); + this.csrfSwitch.click(); + Util.waitUntilElementIsVisible(element(by.css("label[class*='is-checked'][for='switch3']"))); + } + }, + + /** + * Disable BPM + * @method enableBPM + */ + disableBPM: { + value: function () { + Util.waitUntilElementIsVisible(this.bpmSwitch); + this.bpmSwitch.click(); + Util.waitUntilElementIsVisible(element(by.css("alfresco-login[ng-reflect-disable-csrf='true']"))); + + } + }, + + /** + * clears the username input + * @method clearUsername + */ + clearUsername: { + value: function () { + Util.waitUntilElementIsVisible(this.txtUsername); + this.txtUsername.clear(); + } + }, + + /** + * Check username tooltip + * @method checkUsernameTooltip + * @param {String} message + */ + checkUsernameTooltip: { + value: function (message) { + Util.waitUntilElementIsPresent(element(by.css("span[data-automation-id='username-error']"))); + Util.waitUntilElementIsPresent(element(by.cssContainingText("span[data-automation-id='username-error']"), message)); + } + }, + + /** + * Check username tooltip not visible + * @method checkUsernameTooltipNotVisible + */ + checkUsernameTooltipNotVisible: { + value: function () { + var error = "span[data-automation-id='username-error']"; + Util.waitUntilElementIsNotVisible(element(by.css(error))); + } + }, + + /** + * Check sign in button disabled + * @method checkSignInButtonIsDisabled + */ + checkSignInButtonIsDisabled: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("button[data-automation-id='login-button'][ng-reflect-disabled='true']"))); + } + }, + + /** + * Check sign in button enabled + * @method checkSignInButtonIsEnabled + */ + checkSignInButtonIsEnabled: { + value: function () { + Util.waitUntilElementIsNotVisible(element(by.css("button[data-automation-id='login-button'][ng-reflect-disabled='true']"))); + } + }, + + /** + * Click sign in button + * @method clickSignInButton + */ + clickSignInButton: { + value: function () { + Util.waitUntilElementIsVisible(this.signInButton); + this.signInButton.click(); + } + }, + + /** + * Check login error + * @method checkLoginError + * * @param {String} message + */ + checkLoginError: { + value: function (message) { + Util.waitUntilElementIsVisible(element(by.cssContainingText("div[data-automation-id='login-error']", message))); + } + }, + + /** + * Check password is hidden + * @method checkPasswordIsHidden + */ + checkPasswordIsHidden: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("input[data-automation-id='password'][type='password']"))); + } + }, + + /** + * Click show password + * @method showPassword + */ + showPassword: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("i[data-automation-id='show_password']"))); + element(by.css("i[data-automation-id='show_password']")).click(); + } + }, + + /** + * Click hide password + * @method hidePassword + */ + hidePassword: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("i[data-automation-id='hide_password']"))); + element(by.css("i[data-automation-id='hide_password']")).click(); + } + }, + + /** + * Check password is shown + * @method checkPasswordIsShown + * @param {String} password + */ + checkPasswordIsShown: { + value: function (password) { + var passwordText = element(by.css("input[data-automation-id='password']")); + + passwordText.getAttribute('value').then(function (text) { + expect(passwordText.getAttribute('value')).toEqual(password); + }); + } + }, + + /** + * Check 'Remember' is displayed + * @method checkRememberIsDisplayed + */ + checkRememberIsDisplayed: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("span[id='login-remember']"))); + } + }, + + /** + * Check 'Need Help' is displayed + * @method checkNeedHelpIsDisplayed + */ + checkNeedHelpIsDisplayed: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("div[id='login-action-help']"))); + } + }, + + /** + * Check 'Register' is displayed + * @method checkRegisterDisplayed + */ + checkRegisterDisplayed: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("div[id='login-action-register']"))); + } + }, +}); diff --git a/e2e/pages/adf/cardViewPage.js b/e2e/pages/adf/cardViewPage.js new file mode 100644 index 0000000000..79e672262d --- /dev/null +++ b/e2e/pages/adf/cardViewPage.js @@ -0,0 +1,188 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +var CardViewPage = function () { + + var title = element(by.css("div[info-drawer-title]")); + var activeTab = element(by.css("div[class*='mat-tab-label-active']")); + var expandedAspect = element(by.css("mat-expansion-panel-header[aria-expanded='true']")); + var aspectTitle = by.css("mat-panel-title"); + var name = element(by.css("span[data-automation-id='card-textitem-value-name'] span")); + var creator = element(by.css("span[data-automation-id='card-textitem-value-createdByUser.displayName'] span")); + var createdDate = element(by.css("span[data-automation-id='card-dateitem-createdAt'] span")); + var modifier = element(by.css("span[data-automation-id='card-textitem-value-modifiedByUser.displayName'] span")); + var modifiedDate = element(by.css("span[data-automation-id='card-dateitem-modifiedAt'] span")); + var mimetypeName = element(by.css("span[data-automation-id='card-textitem-value-content.mimeTypeName']")); + var size = element(by.css("span[data-automation-id='card-textitem-value-content.sizeInBytes']")); + var description = element(by.css("span[data-automation-id='card-textitem-value-properties.cm:description'] span")); + var author = element(by.css("span[data-automation-id='card-textitem-value-properties.cm:author'] span")); + var titleProperty = element(by.css("span[data-automation-id='card-textitem-value-properties.cm:title'] span")); + var editIcon = element(by.css("button[data-automation-id='mata-data-card-toggle-edit']")); + var informationButton = element(by.css("button[data-automation-id='mata-data-card-toggle-expand']")); + var informationSpan = element(by.css("span[data-automation-id='mata-data-card-toggle-expand-label']")); + var informationIcon = element(by.css("span[data-automation-id='mata-data-card-toggle-expand-label'] ~ mat-icon")); + var uploadNewVersionButton = element(by.css("input[data-automation-id='upload-single-file']")); + var rightChevron = element(by.css("div[class*='header-pagination-after']")); + + this.getTitle = function () { + Util.waitUntilElementIsVisible(title); + return title.getText(); + }; + + this.getActiveTab = function () { + Util.waitUntilElementIsVisible(activeTab); + return activeTab.getText(); + }; + + this.getExpandedAspectName = function () { + Util.waitUntilElementIsVisible(expandedAspect); + return expandedAspect.element(aspectTitle).getText(); + }; + + this.getName = function () { + Util.waitUntilElementIsVisible(name); + return name.getText(); + }; + + this.getCreator = function () { + Util.waitUntilElementIsVisible(creator); + return creator.getText(); + }; + + this.getCreatedDate = function () { + Util.waitUntilElementIsVisible(createdDate); + return createdDate.getText(); + }; + + this.getModifier = function () { + Util.waitUntilElementIsVisible(modifier); + return modifier.getText(); + }; + + this.getModifiedDate = function () { + Util.waitUntilElementIsVisible(modifiedDate); + return modifiedDate.getText(); + }; + + this.getMimetypeName = function () { + Util.waitUntilElementIsVisible(mimetypeName); + return mimetypeName.getText(); + }; + + this.getSize = function () { + Util.waitUntilElementIsVisible(size); + return size.getText(); + }; + + this.getDescription = function () { + Util.waitUntilElementIsVisible(description); + return description.getText(); + }; + + this.getAuthor = function () { + Util.waitUntilElementIsVisible(author); + return author.getText(); + }; + + this.getTitleProperty = function () { + Util.waitUntilElementIsVisible(titleProperty); + return titleProperty.getText(); + }; + + this.editIconIsDisplayed = function() { + Util.waitUntilElementIsVisible(editIcon); + return editIcon.getText(); + }; + + this.informationButtonIsDisplayed = function() { + Util.waitUntilElementIsVisible(informationSpan); + return informationSpan.getText(); + }; + + this.clickOnInformationButton = function() { + Util.waitUntilElementIsVisible(informationButton); + Util.waitUntilElementIsClickable(informationButton); + informationButton.click(); + return this; + }; + + this.getInformationButtonText = function() { + Util.waitUntilElementIsVisible(informationSpan); + return informationSpan.getText(); + }; + + this.getInformationIconText = function() { + Util.waitUntilElementIsVisible(informationIcon); + return informationIcon.getText(); + }; + + this.clickOnVersionsTab = function() { + this.clickRightChevronToGetToTab('Versions'); + var versionsTab = element(by.cssContainingText("div[id*='mat-tab-label']", "Versions")); + Util.waitUntilElementIsVisible(versionsTab); + versionsTab.click(); + return this; + }; + + this.clickOnPropertiesTab = function() { + var propertiesTab = element(by.cssContainingText("div[class='mat-tab-labels'] div", "Properties")); + Util.waitUntilElementIsVisible(propertiesTab); + propertiesTab.click(); + return this; + }; + + this.clickRightChevron = function() { + Util.waitUntilElementIsVisible(rightChevron); + rightChevron.click(); + return this; + }; + + this.clickRightChevronToGetToTab = (tabName) => { + element.all(by.css('.mat-tab-label')) + .map((element) => element.getAttribute('innerText')) + .then((texts) => { + for (let text of texts) { + if (text === tabName ) { + break; + } + this.clickRightChevron(); + } + }); + }; + + this.checkUploadVersionsButtonIsDisplayed = function() { + Util.waitUntilElementIsVisible(uploadNewVersionButton); + return this; + }; + + this.checkVersionIsDisplayed = function(version) { + Util.waitUntilElementIsVisible(element(by.cssContainingText("h4[class*='adf-version-list-item-name']", version))); + return this; + }; + + this.getEditIconTooltip = function () { + return editIcon.getAttribute('title'); + }; + + this.getInformationButtonTooltip = function () { + return informationSpan.getAttribute('title'); + }; +}; + +module.exports = CardViewPage; diff --git a/e2e/pages/adf/contentServicesPage.js b/e2e/pages/adf/contentServicesPage.js new file mode 100644 index 0000000000..a62323a2ca --- /dev/null +++ b/e2e/pages/adf/contentServicesPage.js @@ -0,0 +1,337 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); +var ContentList = require('./dialog/contentList'); +var CreateFolderDialog = require('./dialog/createFolderDialog'); +var path = require('path'); +var TestConfig = require('../../test.config'); + +var ContentServicesPage = function (){ + + var contentList = new ContentList(); + var createFolderDialog = new CreateFolderDialog(); + var uploadBorder = element(by.css("div[class='document-list-container']")); + var tableBody = element.all(by.css("adf-document-list div[class='adf-datatable-body']")).first(); + var contentServices = element(by.css("a[data-automation-id='Content Services']")); + var currentFolder = element(by.css("div[class*='adf-breadcrumb-item active'] div")); + var createFolderButton = element(by.cssContainingText("mat-icon", "create_new_folder")); + var activeBreadcrumb = element(by.css("div[class*='active']")); + var folderID = element.all(by.css("div[class*='settings'] p")).first(); + var tooltip = by.css("div[class*='--text full-width'] span"); + var uploadFileButton = element(by.css("input[data-automation-id='upload-single-file']")); + var uploadMultipleFileButton = element(by.css("input[data-automation-id='upload-multiple-files']")); + var uploadFolderButton = element(by.css("input[data-automation-id='uploadFolder']")); + var errorSnackBar = element(by.css("simple-snack-bar[class*='mat-simple-snackbar']")); + var contentServicesURL = TestConfig.adf.url + TestConfig.adf.port + "/files"; + var loadMoreButton = element(by.css("button[data-automation-id='adf-infinite-pagination-button']")); + var emptyPagination = element(by.css("adf-pagination[class*='adf-pagination__empty']")); + + /** + * Check Document List is displayed + * @method checkAcsContainer + */ + this.checkAcsContainer = function (){ + Util.waitUntilElementIsVisible(uploadBorder); + return this; + }; + + this.waitForTableBody = function (){ + Util.waitUntilElementIsVisible(tableBody); + }; + + /** + * Go to Document List Page + * @method goToDocumentList + * */ + this.goToDocumentList = function() { + Util.waitUntilElementIsVisible(contentServices); + Util.waitUntilElementIsClickable(contentServices); + contentServices.click(); + this.checkAcsContainer(); + }; + + this.navigateToDocumentList = function() { + browser.driver.get(contentServicesURL); + this.checkAcsContainer(); + }; + + this.numberOfResultsDisplayed = function () { + return contentList.getAllDisplayedRows(); + }; + + this.currentFolderName = function() { + var deferred = protractor.promise.defer(); + Util.waitUntilElementIsVisible(currentFolder); + currentFolder.getText().then(function (result) { + deferred.fulfill(result); + }); + return deferred.promise; + }; + + this.getTooltip = function (content) { + return contentList.getRowByRowName(content).element(tooltip).getAttribute('title'); + }; + + this.getBreadcrumbTooltip = function (content) { + return element(by.css("nav[data-automation-id='breadcrumb'] div[title='" +content +"']")).getAttribute('title'); + }; + + this.getAllRowsNameColumn = function () { + return contentList.getAllRowsNameColumn(); + }; + /** + * Sort the list by name column. + * + * @param sortOrder : 'true' to sort the list ascendant and 'false' for descendant + */ + this.sortByName = function (sortOrder) { + contentList.sortByName(sortOrder); + }; + + /** + * Sort the list by author column. + * + * @param sortOrder : 'true' to sort the list ascendant and 'false' for descendant + */ + this.sortByAuthor = function (sortOrder) { + contentList.sortByAuthor(sortOrder); + }; + + /** + * Sort the list by created column. + * + * @param sortOrder : 'true' to sort the list ascendant and 'false' for descendant + */ + this.sortByCreated = function (sortOrder) { + return contentList.sortByCreated(sortOrder); + }; + + /** + * Sort by name and check the list is sorted. + * + * @param sortOrder : 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @return result : 'true' if the list is sorted as expected and 'false' if it isn't + */ + this.sortAndCheckListIsOrderedByName = function (sortOrder) { + this.sortByName(sortOrder); + var deferred = protractor.promise.defer(); + contentList.checkListIsOrderedByNameColumn(sortOrder).then(function(result) { + deferred.fulfill(result); + }); + return deferred.promise; + }; + + /** + * Sort by author and check the list is sorted. + * + * @param sortOrder : 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @return result : 'true' if the list is sorted as expected and 'false' if it isn't + */ + this.sortAndCheckListIsOrderedByAuthor = function (sortOrder) { + this.sortByAuthor(sortOrder); + var deferred = protractor.promise.defer(); + contentList.checkListIsOrderedByAuthorColumn(sortOrder).then(function(result) { + deferred.fulfill(result); + }); + return deferred.promise; + }; + + /** + * Sort by created and check the list is sorted. + * + * @param sortOrder : 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @return result : 'true' if the list is sorted as expected and 'false' if it isn't + */ + this.sortAndCheckListIsOrderedByCreated = function (sortOrder) { + this.sortByCreated(sortOrder); + var deferred = protractor.promise.defer(); + contentList.checkListIsOrderedByCreatedColumn(sortOrder).then(function(result) { + deferred.fulfill(result); + }); + return deferred.promise; + }; + + this.navigateToFolder = function (folder) { + contentList.navigateToFolder(folder); + return this; + }; + + this.doubleClickRow = function (folder) { + contentList.doubleClickRow(folder); + return this; + }; + + this.doubleClickEntireRow = function (folder) { + contentList.doubleClickEntireRow(folder); + return this; + }; + + this.createNewFolder = function (folder) { + Util.waitUntilElementIsVisible(createFolderButton); + createFolderButton.click(); + createFolderDialog.addFolderName(folder); + createFolderDialog.clickOnCreateButton(); + return this; + }; + + this.checkContentIsDisplayed = function (content) { + contentList.checkContentIsDisplayed(content); + return this; + }; + + this.checkContentsAreDisplayed = function (content) { + for( i=0; i < content.length; i++) { + this.checkContentIsDisplayed(content[i]); + } + return this; + }; + + this.checkContentIsNotDisplayed = function (content) { + contentList.checkContentIsNotDisplayed(content); + return this; + }; + + this.checkContentsAreNotDisplayed = function (content) { + for( i=0; i < content.length; i++) { + this.checkContentIsNotDisplayed(content[i]); + } + return this; + }; + + this.checkEmptyFolderMessageIsDisplayed = function () { + contentList.checkEmptyFolderMessageIsDisplayed(); + return this; + }; + + this.navigateToFolderViaBreadcrumbs = function (folder) { + contentList.tableIsLoaded(); + var breadcrumb = element(by.css("a[data-automation-id='breadcrumb_"+ folder +"']")); + Util.waitUntilElementIsVisible(breadcrumb); + breadcrumb.click(); + contentList.tableIsLoaded(); + return this; + }; + + this.getActiveBreadcrumb = function () { + Util.waitUntilElementIsVisible(activeBreadcrumb); + return activeBreadcrumb.getAttribute("title"); + }; + + this.getCurrentFolderID = function() { + Util.waitUntilElementIsVisible(folderID); + return folderID.getText(); + }; + + this.checkIconColumn = function (file, extension) { + contentList.checkIconColumn(file, extension); + return this; + }; + + this.uploadFile = function (fileLocation) { + this.checkUploadButton(); + uploadFileButton.sendKeys(path.resolve(path.join(TestConfig.main.rootPath, fileLocation))); + this.checkUploadButton(); + return this; + }; + + this.uploadMultipleFile = function (files) { + Util.waitUntilElementIsVisible(uploadMultipleFileButton); + var allFiles = path.resolve(path.join(TestConfig.main.rootPath, files[0])); + for(var i =1; i< files.length; i++) { + allFiles = allFiles + "\n" + path.resolve(path.join(TestConfig.main.rootPath, files[i])); + }; + uploadMultipleFileButton.sendKeys(allFiles); + Util.waitUntilElementIsVisible(uploadMultipleFileButton); + return this; + }; + + this.uploadFolder = function (folder) { + Util.waitUntilElementIsVisible(uploadFolderButton); + uploadFolderButton.sendKeys(path.resolve(path.join(TestConfig.main.rootPath, folder))); + Util.waitUntilElementIsVisible(uploadFolderButton); + return this; + }; + + this.getSingleFileButtonTooltip = function () { + Util.waitUntilElementIsVisible(uploadFileButton); + return uploadFileButton.getAttribute("title"); + }; + + this.getMultipleFileButtonTooltip = function () { + Util.waitUntilElementIsVisible(uploadMultipleFileButton); + return uploadMultipleFileButton.getAttribute("title"); + }; + + this.getFolderButtonTooltip = function () { + Util.waitUntilElementIsVisible(uploadFolderButton); + return uploadFolderButton.getAttribute("title"); + }; + + this.checkUploadButton = function () { + Util.waitUntilElementIsVisible(uploadFileButton); + Util.waitUntilElementIsClickable(uploadFileButton); + return this; + }; + + this.deleteContent = function (content) { + contentList.deleteContent(content); + return this; + }; + + this.deleteContents = function (content) { + for( i=0; i div[class='mat-checkbox-inner-container']")); + var selectionButton = element(by.css("div[class='mat-select-arrow']")); + var selectionDropDown = element(by.css("div[class*='ng-trigger-transformPanel']")); + var allSelectedRows = element.all(by.css("div[class*='is-selected']")); + var selectedRowNumber = element(by.css("div[class*='is-selected'] div[data-automation-id*='text_']")); + var selectAll = element(by.css("div[class*='header'] label")); + var list = element.all(by.css("div[class*=adf-datatable-row]")); + var addRow = element(by.xpath("//span[contains(text(),'Add row')]/..")); + var replaceRows = element(by.xpath("//span[contains(text(),'Replace rows')]/..")); + var replaceColumns = element(by.xpath("//span[contains(text(),'Replace columns')]/..")); + var loadNode = element(by.xpath("//span[contains(text(),'Load Node')]/..")); + var createdOnColumn = element(by.css("div[data-automation-id='auto_id_createdOn']")); + var pageLoaded = element(by.css("div[data-automation-id='auto_id_id']")); + var tableBody = element.all(by.css("adf-document-list div[class='adf-datatable-body']")).first(); + + this.goToDatatable = function () { + browser.driver.get(dataTableURL); + Util.waitUntilElementIsVisible(pageLoaded); + }; + + /** + * Retrieve row by row number + * + * @param rowNumber + */ + this.getRowByRowNumber = function (rowNumber) { + Util.waitUntilElementIsVisible(element(by.css("div[data-automation-id='text_" + rowNumber +"']"))); + return element(by.css("div[data-automation-id='text_" + rowNumber +"']")); + }; + + /** + * Retrieve the checkbox of the row + * + * @param rowNumber + */ + this.getRowCheckbox = function (rowNumber) { + return this.getRowByRowNumber(rowNumber).element(by.xpath("ancestor::div/div/mat-checkbox[contains(@class, 'mat-checkbox-checked')]")); + }; + + /** + * Click multiselect option + * @property clickMultiSelect + * */ + this.clickMultiSelect = function () { + Util.waitUntilElementIsVisible(multiSelect); + multiSelect.click(); + }; + + /** + * Click specific checkbox in row + * @method clickCheckbox + * @param {String} row number + */ + this.clickCheckbox = function (rowNumber) { + var checkbox = this.getRowByRowNumber(rowNumber).element(by.xpath("ancestor::div[contains(@class, 'adf-datatable-row')]//mat-checkbox/label")); + Util.waitUntilElementIsVisible(checkbox); + checkbox.click(); + }; + + /** + * Select a specific row + * @method selectRow + * @param {String} row number + */ + this.selectRow = function (rowNumber) { + return this.getRowByRowNumber(rowNumber).click(); + }; + + /** + * Select a specific row using command key + * @method selectRow + * @param {String} row number + */ + this.selectRowWithKeyboard = function (rowNumber) { + var row = this.getRowByRowNumber(rowNumber); + browser.actions().sendKeys(protractor.Key.COMMAND).click(row).perform(); + }; + + /** + * Select a specific selection mode + * @method selectSelectionMode + * @param {String} selection mode + */ + this.selectSelectionMode = function (selectionMode) { + var selectMode = element(by.cssContainingText("span[class='mat-option-text']", selectionMode)); + selectionButton.click(); + Util.waitUntilElementIsVisible(selectionDropDown); + selectMode.click(); + }; + + /** + * Check if a specific row is selected + * @method checkRowIsSelected + * @param {String} row number + */ + this.checkRowIsSelected = function (rowNumber) { + var isRowSelected = this.getRowByRowNumber(rowNumber).element(by.xpath("ancestor::div[contains(@class, 'is-selected')]")); + Util.waitUntilElementIsVisible(isRowSelected); + }; + + /** + * Check if a specific row is not selected + * @method checkRowIsNotSelected + * @param {String} row number + */ + this.checkRowIsNotSelected = function (rowNumber) { + var isRowSelected = this.getRowByRowNumber(rowNumber).element(by.xpath("ancestor::div[contains(@class, 'adf-datatable-row custom-row-style ng-star-inserted is-selected')]")); + Util.waitUntilElementIsNotOnPage(isRowSelected); + }; + + /** + * Check no row is selected + * @method checkNoRowIsSelected + */ + this.checkNoRowIsSelected = function () { + Util.waitUntilElementIsNotOnPage(selectedRowNumber); + }; + + this.checkAllRows = function () { + Util.waitUntilElementIsVisible(selectAll); + selectAll.click(); + }; + + /** + * Check specfic row is checked + * @method checkRowIsChecked + * @param {String} row number + */ + this.checkRowIsChecked = function (rowNumber) { + Util.waitUntilElementIsVisible(this.getRowCheckbox(rowNumber)); + }; + + /** + * Check specfic row is not checked + * @method checkRowIsNotChecked + * @param {String} row number + */ + this.checkRowIsNotChecked = function (rowNumber) { + Util.waitUntilElementIsNotOnPage(this.getRowCheckbox(rowNumber)); + }; + + /** + * Add a row to the table + * @method addRow + */ + this.addRow = function () { + Util.waitUntilElementIsVisible(addRow); + addRow.click(); + }; + + /** + * Get the number of rows of the table + * @method getNumberOfRows + */ + this.getNumberOfRows = function () { + return list.count(); + }; + + /** + * Get the number of selected rows of the table + * @method getNumberOfSelectedRows + */ + this.getNumberOfSelectedRows = function () { + return allSelectedRows.count(); + }; + + /** + * replace rows + * @method replaceRows + * @param {String} id + */ + this.replaceRows = function (id) { + var rowID = this.getRowByRowNumber(id); + Util.waitUntilElementIsVisible(rowID); + replaceRows.click(); + Util.waitUntilElementIsNotOnPage(rowID); + }; + + /** + * replace columns + * @method replaceColumns + */ + this.replaceColumns = function () { + Util.waitUntilElementIsVisible(replaceColumns); + replaceColumns.click(); + Util.waitUntilElementIsNotOnPage(createdOnColumn); + }; + + /** + * check the nodeID is the same with the userHome folder's ID + * @method replaceColumns + */ + this.checkLoadNode = function (userHome) { + var nodeId = element(by.css("div[data-automation-id*='" + userHome + "']")); + + Util.waitUntilElementIsVisible(loadNode); + loadNode.click(); + Util.waitUntilElementIsVisible(nodeId, 10000); + }; + + this.navigateToContent = function(content) { + var row = this.getRowByRowName(content); + Util.waitUntilElementIsPresent(row); + row.click(); + this.checkRowIsSelected(content); + browser.actions().sendKeys(protractor.Key.ENTER).perform(); + return this; + }; + + this.getRowsName = function (content) { + var row = element(by.css("div[data-automation-id*='" + content + "']")); + Util.waitUntilElementIsPresent(row); + return row; + }; + + this.getRowByRowName = function (content) { + var rowByRowName = by.xpath("ancestor::div[contains(@class, 'adf-datatable-row')]"); + Util.waitUntilElementIsPresent(this.getRowsName(content).element(rowByRowName)); + return this.getRowsName(content).element(rowByRowName); + }; + + this.waitForTableBody = function (){ + Util.waitUntilElementIsVisible(tableBody); + }; + +}; +module.exports = DataTablePage; diff --git a/e2e/pages/adf/dialog/contentList.js b/e2e/pages/adf/dialog/contentList.js new file mode 100644 index 0000000000..8558fd7794 --- /dev/null +++ b/e2e/pages/adf/dialog/contentList.js @@ -0,0 +1,301 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); + +var ContentList = function () { + + var deleteContent = element(by.css("button[data-automation-id*='DELETE']")); + var moveContent = element(by.css("button[data-automation-id*='MOVE']")); + var copyContent = element(by.css("button[data-automation-id*='COPY']")); + var downloadContent = element(by.css("button[data-automation-id*='DOWNLOAD']")); + var actionMenu = element(by.css("div[role='menu']")); + var optionButton = by.css("button[data-automation-id*='action_menu_']"); + var rowByRowName = by.xpath("ancestor::div[contains(@class, 'adf-datatable-row')]"); + var nameColumn = by.css("div[class*='document-list-container'] div[class*='adf-datatable-row'] div[class*='--text full-width'] span"); + var nameColumnHeader = by.css("div[data-automation-id='auto_id_name']"); + var createdByColumn = by.css("div[class*='--text'][title='Created by'] span"); + var createdByColumnHeader = by.css("div[data-automation-id*='auto_id_createdByUser']"); + var createdColumn = by.css("div[class*='--date'] span"); + var createdColumnHeader = by.css("div[data-automation-id*='auto_id_createdAt']"); + var rows = by.css("div[class='document-list-container'] div[class*='adf-datatable-body'] div[class*='adf-datatable-row']"); + var emptyFolderMessage = element(by.css("div[class='adf-empty-folder-this-space-is-empty']")); + var table = element(by.css("div[class*='upload-border']")); + + this.getRowsName = function (content) { + var row = element(by.xpath("//div[@class='document-list-container']//span[@title='" + content + "']")); + Util.waitUntilElementIsVisible(row); + return row; + }; + + this.getRowByRowName = function (content) { + Util.waitUntilElementIsOnPage(this.getRowsName(content).element(rowByRowName)); + Util.waitUntilElementIsVisible(this.getRowsName(content).element(rowByRowName)); + return this.getRowsName(content).element(rowByRowName); + }; + + this.getAllDisplayedRows = function () { + return element.all(rows).count(); + }; + + this.getAllRowsNameColumn = function () { + return this.getAllRowsColumnValues(nameColumn); + }; + + this.getAllRowsColumnValues = function (locator) { + var deferred = protractor.promise.defer(); + Util.waitUntilElementIsVisible(element.all(locator).first()); + var initialList = []; + + element.all(locator).each(function (element) { + element.getText().then(function (text) { + if (text !== '') { + initialList.push(text); + } + ; + }); + }).then(function () { + deferred.fulfill(initialList); + }); + + return deferred.promise; + }; + + this.deleteContent = function (content) { + this.clickOnActionMenu(content); + this.waitForContentOptions(); + deleteContent.click(); + }; + + this.moveContent = function (content) { + this.clickOnActionMenu(content); + moveContent.click(); + }; + + this.copyContent = function (content) { + this.clickOnActionMenu(content); + copyContent.click(); + }; + + this.waitForContentOptions = function () { + Util.waitUntilElementIsVisible(copyContent); + Util.waitUntilElementIsVisible(moveContent); + Util.waitUntilElementIsVisible(deleteContent); + Util.waitUntilElementIsVisible(downloadContent); + }; + + this.clickOnActionMenu = function (content) { + this.getRowByRowName(content).element(optionButton).click(); + Util.waitUntilElementIsVisible(actionMenu); + return this; + }; + + this.sortByColumn = function (sortOrder, locator) { + Util.waitUntilElementIsVisible(element(locator)); + return element(locator).getAttribute('class').then(function (result) { + if (sortOrder === true) { + if (!result.includes('sorted-asc')) { + if (result.includes('sorted-desc') || result.includes('sortable')) { + element(locator).click(); + } + } + } + else { + if (result.includes('sorted-asc')) { + element(locator).click(); + } else if (result.includes('sortable')) { + element(locator).click(); + element(locator).click(); + } + } + + return Promise.resolve(); + }); + }; + + /** + * Sort the list by name column. + * + * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant + */ + this.sortByName = function (sortOrder) { + this.sortByColumn(sortOrder, nameColumnHeader); + }; + + /** + * Sort the list by author column. + * + * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant + */ + this.sortByAuthor = function (sortOrder) { + this.sortByColumn(sortOrder, createdByColumnHeader); + }; + + /** + * Sort the list by created column. + * + * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant + */ + this.sortByCreated = function (sortOrder) { + this.sortByColumn(sortOrder, createdColumnHeader); + }; + + /** + * Check the list is sorted by name column. + * + * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @return sorted : 'true' if the list is sorted as expected and 'false' if it isn't + */ + this.checkListIsOrderedByNameColumn = function (sortOrder) { + var deferred = protractor.promise.defer(); + deferred.fulfill(this.checkListIsSorted(sortOrder, nameColumn)); + return deferred.promise; + }; + + /** + * Check the list is sorted by author column. + * + * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @return sorted : 'true' if the list is sorted as expected and 'false' if it isn't + */ + this.checkListIsOrderedByAuthorColumn = function (sortOrder) { + var deferred = protractor.promise.defer(); + deferred.fulfill(this.checkListIsSorted(sortOrder, createdByColumn)); + return deferred.promise; + }; + + /** + * Check the list is sorted by created column. + * + * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @return sorted : 'true' if the list is sorted as expected and 'false' if it isn't + */ + this.checkListIsOrderedByCreatedColumn = function (sortOrder) { + var deferred = protractor.promise.defer(); + var lastValue; + var sorted = true; + + element.all(createdColumn).map(function (element) { + return element.getText(); + }).then(function (texts) { + texts.forEach(function (text) { + if (lastValue !== undefined) { + var currentDate = new Date(text); + var lastDate = new Date(lastValue); + if (sortOrder === true && currentDate.getTime() < lastDate.getTime()) { + sorted = false; + } + if (sortOrder === false && currentDate.getTime() > lastDate.getTime()) { + sorted = false; + } + } + lastValue = text; + }); + deferred.fulfill(sorted); + }); + return deferred.promise; + }; + + /** + * Check the list is sorted. + * + * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @param locator: locator for column + * @return 'true' if the list is sorted as expected and 'false' if it isn't + */ + this.checkListIsSorted = function (sortOrder, locator) { + var deferred = protractor.promise.defer(); + Util.waitUntilElementIsVisible(element.all(locator).first()); + var initialList = []; + element.all(locator).each(function (element) { + element.getText().then(function (text) { + initialList.push(text); + }); + }).then(function () { + var sortedList = initialList; + sortedList = sortedList.sort(); + if (sortOrder === false) { + sortedList = sortedList.reverse(); + } + deferred.fulfill(initialList.toString() === sortedList.toString()); + }); + return deferred.promise; + }; + + this.navigateToFolder = function (folder) { + var row = this.getRowsName(folder); + Util.waitUntilElementIsVisible(row); + Util.waitUntilElementIsOnPage(row); + row.click(); + this.checkRowIsSelected(folder); + browser.actions().sendKeys(protractor.Key.ENTER).perform(); + return this; + }; + + this.doubleClickRow = function (selectRow) { + var row = this.getRowsName(selectRow); + Util.waitUntilElementIsVisible(row); + Util.waitUntilElementIsClickable(row); + row.click(); + Util.waitUntilElementIsVisible(this.getRowByRowName(selectRow).element(by.css("div[class*='--image'] mat-icon[svgicon*='selected']"))); + browser.actions().sendKeys(protractor.Key.ENTER).perform(); + return this; + }; + + this.doubleClickEntireRow = function (selectRow) { + var row = this.getRowByRowName(selectRow); + Util.waitUntilElementIsVisible(row); + Util.waitUntilElementIsClickable(row); + row.click(); + Util.waitUntilElementIsVisible(this.getRowByRowName(selectRow).element(by.css("div[class*='--image'] mat-icon[svgicon*='selected']"))); + browser.actions().sendKeys(protractor.Key.ENTER).perform(); + return this; + }; + + this.checkRowIsSelected = function (content) { + var isRowSelected = this.getRowsName(content).element(by.xpath("ancestor::div[contains(@class, 'is-selected')]")); + Util.waitUntilElementIsVisible(isRowSelected); + }; + + this.checkContentIsDisplayed = function (content) { + Util.waitUntilElementIsVisible(this.getRowByRowName(content)); + return this; + }; + + this.checkContentIsNotDisplayed = function (content) { + Util.waitUntilElementIsNotVisible(element(by.css("span[title='" + content + "']"))); + return this; + }; + + this.checkEmptyFolderMessageIsDisplayed = function () { + Util.waitUntilElementIsVisible(emptyFolderMessage); + return this; + }; + + this.tableIsLoaded = function () { + Util.waitUntilElementIsVisible(table); + return this; + }; + + this.checkIconColumn = function (file, extension) { + var row = this.getRowByRowName(file); + Util.waitUntilElementIsVisible(row); + Util.waitUntilElementIsVisible(row.element(by.css("div[class*='--image'] img[alt*='" + extension + "']"))); + }; + +}; +module.exports = ContentList; diff --git a/e2e/pages/adf/dialog/createFolderDialog.js b/e2e/pages/adf/dialog/createFolderDialog.js new file mode 100644 index 0000000000..8c4b57b0fa --- /dev/null +++ b/e2e/pages/adf/dialog/createFolderDialog.js @@ -0,0 +1,52 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); + +var CreateFolderDialog = function () { + + var folderNameField = element(by.css("input[placeholder='Name']")); + var folderDescriptionField = element(by.css("textarea[placeholder='Description']")); + var createButton = element(by.cssContainingText("button span", "Create")); + var cancelButton = element(by.cssContainingText("button span", "Cancel")); + + this.clickOnCreateButton = function () { + Util.waitUntilElementIsVisible(createButton); + createButton.click(); + return this; + }; + + this.clickOnCancelButton = function () { + Util.waitUntilElementIsVisible(cancelButton); + cancelButton.click(); + return this; + }; + + this.addFolderName = function (folderName) { + Util.waitUntilElementIsVisible(folderNameField); + folderNameField.sendKeys(folderName); + return this; + }; + + this.addFolderDescription = function (folderDescription) { + Util.waitUntilElementIsVisible(folderDescriptionField); + folderDescriptionField.sendKeys(folderDescription); + return this; + }; + +}; +module.exports = CreateFolderDialog; diff --git a/e2e/pages/adf/dialog/searchDialog.js b/e2e/pages/adf/dialog/searchDialog.js new file mode 100644 index 0000000000..bd8a86c8f1 --- /dev/null +++ b/e2e/pages/adf/dialog/searchDialog.js @@ -0,0 +1,171 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); + + var SearchDialog = function () { + + var searchIcon = element(by.css("button[class*='adf-search-button']")); + var searchBar = element(by.css("adf-search-control div[style*='translateX(0%)'] input")); + var searchBarNotExpanded = element(by.css("adf-search-control div[style*='translateX(81%)']")); + var no_result_message = element(by.css("p[class*='adf-search-fixed-text']")); + var rowsAuthor = by.css("div[class='mat-list-text'] p[class*='adf-search-fixed-text']"); + var completeName = by.css("h4[class*='adf-search-fixed-text']"); + var highlightName = by.css("div[id*='results-content'] span[class='highlight']"); + var searchDialog = element(by.css("mat-list[id*='autocomplete-search-result-list']")); + var allRows = element.all(by.css("h4[class*='adf-search-fixed-text']")); + + this.clickOnSearchIcon = function () { + Util.waitUntilElementIsVisible(searchIcon); + searchIcon.click(); + return this; + }; + + this.checkSearchIconIsVisible = function () { + Util.waitUntilElementIsVisible(searchIcon); + return this; + }; + + this.checkSearchBarIsVisible = function () { + Util.waitUntilElementIsVisible(searchBar); + return this; + }; + + this.checkSearchBarIsNotVisible = function () { + Util.waitUntilElementIsVisible(searchBarNotExpanded); + return this; + }; + + this.checkNoResultMessageIsDisplayed = function () { + Util.waitUntilElementIsVisible(no_result_message); + return this; + }; + + this.checkNoResultMessageIsNotDisplayed = function () { + Util.waitUntilElementIsNotOnPage(no_result_message); + return this; + }; + + this.enterText = function (text) { + Util.waitUntilElementIsVisible(searchBar); + searchBar.click(); + searchBar.sendKeys(text); + return this; + }; + + this.enterTextAndPressEnter = function (text) { + Util.waitUntilElementIsVisible(searchBar); + searchBar.click(); + searchBar.sendKeys(text); + searchBar.sendKeys(protractor.Key.ENTER); + return this; + }; + + this.resultTableContainsRow = function (name) { + Util.waitUntilElementIsVisible(searchDialog); + Util.waitUntilElementIsVisible(this.getRowByRowName(name)); + return this; + }; + this.clickOnSpecificRow = function (name) { + this.resultTableContainsRow(name); + this.getRowByRowName(name).click(); + return this; + }; + + this.getRowByRowName = function (name) { + return element(by.css("mat-list-item[data-automation-id='autocomplete_for_" + name +"']")); + }; + + this.getAllRowsValues = function () { + var deferred = protractor.promise.defer(); + var array = [], i =0; + + allRows.map(function(element) { + return element.getText(); + }).then(function (texts) { + texts.forEach(function (text) { + array[i] = text; + i++; + }); + }); + + deferred.fulfill(array); + return deferred.promise; + }; + + this.getSpecificRowsHighlightName = function (name) { + var deferred = protractor.promise.defer(); + this.getRowByRowName(name).element(highlightName).getText().then(function (result) { + deferred.fulfill(result); + }) + return deferred.promise; + }; + + this.getSpecificRowsCompleteName = function (name) { + var deferred = protractor.promise.defer(); + this.getRowByRowName(name).element(completeName).getText().then(function (result) { + deferred.fulfill(result); + }) + return deferred.promise; + }; + + this.getSpecificRowsAuthor = function (name) { + var deferred = protractor.promise.defer(); + this.getRowByRowName(name).element(rowsAuthor).getText().then(function (result) { + deferred.fulfill(result); + }) + return deferred.promise; + }; + + this.clearText = function () { + Util.waitUntilElementIsVisible(searchBar); + var deferred = protractor.promise.defer(); + searchBar.clear().then(function (value) { + searchBar.sendKeys(protractor.Key.ESCAPE); + }); + return deferred.promise; + }; + + this.resultTableContainsRowWithRetry = function (name, retry) { + + var isPresent = false; + + function run() { + element(by.css("mat-list-item[data-automation-id='autocomplete_for_" + name +"']")).isPresent().then( + function (result) { + if(result === true) { + isPresent = true; + } + else { + retry --; + + if(retry > 0) { + // console.log("Retry: " + retry); + run(); + }; + } + + } + + ); + }; + + run(); + + }; +}; +module.exports = SearchDialog; diff --git a/e2e/pages/adf/dialog/uploadDialog.js b/e2e/pages/adf/dialog/uploadDialog.js new file mode 100644 index 0000000000..ee7be3dc45 --- /dev/null +++ b/e2e/pages/adf/dialog/uploadDialog.js @@ -0,0 +1,185 @@ +/*! + * @license + * Copyright 2016 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. + */ + + +var Util = require('../../../util/util'); + +var UploadDialog = function () { + + var closeButton = element.all((by.css("footer[class*='upload-dialog__actions'] button"))).first(); + var dialog = element.all(by.css("div[class*='upload-dialog']")).first(); + var minimizedDialog = element(by.css("div[class*='upload-dialog--minimized']")); + var uploadedStatusIcon = by.css("mat-icon[class*='status--done']"); + var cancelledStatusIcon = by.css("div[class*='status--cancelled']"); + var cancelWhileUploadingIcon = by.css("mat-icon[class*='adf-file-uploading-row__action adf-file-uploading-row__action--cancel']"); + var rowByRowName = by.xpath("ancestor::adf-file-uploading-list-row"); + var title = element(by.css("span[class*='upload-dialog__title']")); + var minimizeButton = element(by.css("mat-icon[title='Minimize']")); + var maximizeButton = element(by.css("mat-icon[title='Maximize']")); + var sizeUploaded = by.css("span[class='adf-file-uploading-row__status']"); + var canUploadConfirmationTitle = element(by.css("p[class='upload-dialog__confirmation--title']")); + var canUploadConfirmationDescription = element(by.css("p[class='upload-dialog__confirmation--text']")); + var confirmationDialogNoButton = element(by.partialButtonText("No")); + var confirmationDialogYesButton = element(by.partialButtonText("Yes")); + var cancelUploads = element(by.partialButtonText("Cancel uploads")); + + this.clickOnCloseButton = function () { + this.checkCloseButtonIsDisplayed(); + closeButton.click(); + return this; + }; + + this.checkCloseButtonIsDisplayed = function() { + Util.waitUntilElementIsVisible(closeButton); + return this; + }; + + this.dialogIsDisplayed = function () { + Util.waitUntilElementIsVisible(dialog); + return this; + }; + + this.dialogIsMinimized = function () { + Util.waitUntilElementIsVisible(minimizedDialog); + return this; + }; + + this.dialogIsNotDisplayed = function () { + Util.waitUntilElementIsNotOnPage(dialog); + return this; + }; + + this.getRowsName = function (content) { + var row = element.all(by.css("div[class*='uploading-row'] span[title='" + content +"']")).first(); + Util.waitUntilElementIsVisible(row); + return row; + }; + + this.getRowByRowName = function (content) { + return this.getRowsName(content).element(rowByRowName); + }; + + this.fileIsUploaded = function (content) { + Util.waitUntilElementIsVisible(this.getRowByRowName(content).element(uploadedStatusIcon)); + return this; + }; + + this.filesAreUploaded = function (content) { + for (i=0; i td")); + } + }, + + /** + * Provides the upload button. + * @property uploadButton + * @type protractor.Element + */ + uploadButton: { + get: function () { + return element(by.css("input[data-automation-id='upload-single-file']")); + } + }, + + /** + * Provides the mutiple upload button . + * @property uploadButton + * @type protractor.Elementx + */ + multipleUploadButton: { + get: function () { + return element(by.css("input[data-automation-id='upload-multiple-files']")); + } + }, + + /** + * Provides the mutiple upload button enabled + * @property multipleUploadEnabled + * @type protractor.Element + */ + multipleUploadEnabled: { + get: function () { + return element(by.css("alfresco-upload-button[data-automation-id='multiple-file-upload'][ng-reflect-multiple-files='true']")); + } + }, + + /** + * Provides the extensions accepted text field + * @property acceptedFilesText + * @type protractor.Element + */ + acceptedFilesText: { + get: function () { + return element(by.css("input[data-automation-id='accepted-files-type']")); + } + }, + + /** + * Provides the create folder button + * @property createFolderButton + * @type protractor.Element + */ + createFolderButton: { + get: function () { + return element(by.cssContainingText("button[id='actions'] > i", "add")); + } + }, + + /** + * Provides the create new folder button in dialog + * @property createFolderButton + * @type protractor.Element + */ + createFolderButtonDialog: { + get: function () { + return element(by.cssContainingText("span[class='mdl-menu__text']", "New Folder")); + } + }, + + /** + * Provides the longer wait required + * @property goToDocList + * @type protractor.Element + * */ + goToDocList: { + value: function () { + Util.waitUntilElementIsVisible(contentServices); + contentServices.click(); + Util.waitUntilElementIsVisible(siteList); + } + }, + + /** + * Provides the longer wait required + * @property waitForElements + * @type protractor.Element + * */ + waitForElements: { + value: function () { + Util.waitUntilElementIsVisible(this.uploadButton); + } + }, + + /** + * Creates new folder + * @property createFolder + * */ + createFolder: { + value: function (folderName) { + Util.waitUntilElementIsVisible(createFolderButton); + createFolderButton.click(); + Util.waitUntilElementIsVisible(folderText); + folderText.sendKeys(folderName); + createButtonDialog.click(); + this.checkItemInDocList(folderName); + } + }, + + /** + * Deletes content + * @property deleteContent + * */ + deleteContent: { + value: function (contentName) { + var contentName = element(by.css("div[data-automation-id*='text_"+ contentName+"']")); + Util.waitUntilElementIsVisible(contentName); + contentName.click(); + deleteContent.click(); + } + }, + + /** + * Retrieve row by row number + * + * @param rowNumber + */ + getRowByRowNumber: { + value: function (rowNumber) { + return element(by.css("div[data-automation-id='text_" + rowNumber + "']")); + } + }, + + + /** + * Go into folder + * @property goIntoFolder + * */ + goIntoFolder: { + value: function (folderName) { + this.checkItemInDocList(folderName); + browser.actions().doubleClick(element(by.css("div[data-automation-id*='text_"+ folderName+"']"))).perform(); + } + }, + + /** + * Go into folder via breadcrumb + * @property goIntoFolderViaBreadcrumbs + * */ + goIntoFolderViaBreadcrumbs: { + value: function (folderName) { + var breadcrumb = element(by.cssContainingText("a[data-automation-id='breadcrumb_"+ folderName +"']", folderName)); + + Util.waitUntilElementIsVisible(breadcrumb); + breadcrumb.click(); + this.waitForElements(); + } + }, + + currentFolderName: { + value: function () { + var deferred = protractor.promise.defer(); + Util.waitUntilElementIsVisible(currentFolder); + currentFolder.getText().then(function (result) { + deferred.fulfill(result); + }) + return deferred.promise; + } + }, + + /** + * Go into folder + * @property goIntoFolder + * */ + checkFolderInBreadcrumbs: { + value: function (folderName) { + var breadcrumb = element(by.cssContainingText("a[data-automation-id='breadcrumb_"+ folderName +"']", folderName)); + + Util.waitUntilElementIsVisible(breadcrumb); + } + }, + + /** + * Check file/fodler in document list + * @property checkItemInDocList + * */ + checkItemInDocList: { + value: function (fileName) { + Util.waitUntilElementIsVisible(element(by.cssContainingText("div[data-automation-id='text_" + fileName + "']", fileName))); + } + }, + + /** + * Check file is not in document list + * @property checkFileIsNotInDocList + * */ + checkFileIsNotInDocList: { + value: function (fileName) { + Util.waitUntilElementIsNotOnPage(element(by.cssContainingText("div[data-automation-id='text_" + fileName + "']", fileName))); + } + }, + + /** + * Check number of times file appears in document list + * @property checkNumberOfFilesInDocList + * */ + checkNumberOfFilesInDocList: { + value: function (fileName, numberOfFiles) { + this.checkItemInDocList(fileName); + + var file = element.all(by.cssContainingText("div[data-automation-id='text_" + fileName + "']", fileName)); + expect(file.count()).toEqual(numberOfFiles); + } + }, + + /** + * uploads file + * @property uploadFile + * */ + uploadFile: { + value: function (fileLocation, fileName) { + var uploadButton = element(by.css("input[data-automation-id='upload-single-file']")); + Util.waitUntilElementIsVisible(uploadButton); + Util.uploadFile(uploadButton, uploadButton, fileLocation); + this.checkItemInDocList(fileName); + } + }, + + /** + * uploads file without checking document list + * @property uploadFileWithoutCheck + * */ + uploadFileWithoutCheck: { + value: function (fileLocation) { + Util.waitUntilElementIsVisible(this.uploadButton); + Util.uploadFile(this.uploadButton, this.uploadButton, fileLocation); + } + }, + + /** + * Check file in upload dialog + * @property checkFileInUploadDialog + * */ + checkFileInUploadDialog: { + value: function (fileName) { + Util.waitUntilElementIsVisible(element(by.cssContainingText("td[data-automation-id='dialog_" + fileName + "'] > div", fileName))); + } + }, + + /** + * Check all uploads are complete + * @property checkAllUploadsComplete + * */ + checkAllUploadsComplete: { + value: function (fileName) { + var dialogUpload = element.all(by.css("td[data-automation-id*='dialog_']")); + var singleUpload = element(by.cssContainingText("div[ng-reflect-klass='file-dialog'] div[class='title'] ", "upload complete")); + var multipleUploads = element(by.cssContainingText("div[ng-reflect-klass='file-dialog'] div[class='title'] ", "uploads complete")); + + dialogUpload.count().then(function(count) { + if (count === 1) { + Util.waitUntilElementIsVisible(singleUpload); + } + else if (count > 1) { + Util.waitUntilElementIsVisible(multipleUploads); + } + }); + } + }, + + /** + * Check done icon for file + * @property checkDoneIcon + * */ + checkDoneIcon: { + value: function (fileName) { + Util.waitUntilElementIsVisible(element(by.xpath("//i[contains(@data-automation-id, 'done_icon')]/../../../td[contains(@data-automation-id, '" + fileName + "')]"))); + } + }, + + /** + * Check abort icon for file + * @property checkUploadAbortedIcon + * */ + checkAbortedIcon: { + value: function (fileName) { + Util.waitUntilElementIsVisible(element(by.xpath("//i[contains(@data-automation-id, 'upload_stopped')]/../../../td[contains(@data-automation-id, '" + fileName + "')]"))); + } + }, + + /** + * Check progress bar in dialog + * @property checkDoneIcon + * */ + checkProgressBar: { + value: function (fileName) { + Util.waitUntilElementIsVisible(element(by.css("div[data-automation-id='dialog_progress_" + fileName +"']"))); + } + }, + + /** + * check upload dialog + * @property checkUploadDialog + * */ + checkUploadDialog: { + value: function (fileName) { + var uploadDialog = element(by.css("file-uploading-dialog[class='dialog-show'] > div[class='file-dialog show']")); + + Util.waitUntilElementIsVisible(uploadDialog); + this.checkFileInUploadDialog(fileName); + this.checkAllUploadsComplete(); + this.checkDoneIcon(fileName); + this.checkProgressBar(fileName); + } + }, + + /** + * Close upload dialog + * @property closeUploadDialog + * */ + closeUploadDialog: { + value: function () { + var closeDialog = element(by.css("div[title='close upload list'] > i")); + Util.waitUntilElementIsVisible(closeDialog); + closeDialog.click(); + Util.waitUntilElementIsNotOnPage(closeDialog); + } + }, + + /** + * Minimise upload dialog + * @property minimiseUploadDialog + * */ + minimiseUploadDialog: { + value: function () { + var minimiseDialog = element(by.css("div[class='minimize-button'] > i[title='minimize upload list']")); + Util.waitUntilElementIsVisible(minimiseDialog); + minimiseDialog.click(); + Util.waitUntilElementIsNotOnPage(minimiseDialog); + } + }, + + /** + * Maximise upload dialog + * @property maximiseUploadDialog + * */ + maximiseUploadDialog: { + value: function () { + var maximiseDialog = element(by.css("div[class='minimize-button active'] > i[title='expand upload list']")); + Util.waitUntilElementIsVisible(maximiseDialog); + maximiseDialog.click(); + Util.waitUntilElementIsNotOnPage(maximiseDialog); + } + }, + + /** + * Click undo upload via message window + * @property clickUndoUploadViaWindow + * */ + clickUndoUploadViaWindow: { + value: function () { + var notificationWindow = element(by.css("div[id='undo-notification-bar']")); + var undoButton = element(by.css("alfresco-upload-button div[id='undo-notification-bar'] > button[data-automation-id='undo_upload_button']")); + + Util.waitUntilElementIsVisible(notificationWindow); + Util.waitUntilElementIsVisible(undoButton); + undoButton.click(); + } + }, + + /** + * Undo upload via window + * @property undoUploadViaWindow + * */ + undoUploadViaWindow: { + value: function (fileName) { + this.clickUndoUploadViaWindow(); + this.checkFileIsNotInDocList(fileName); + this.checkAbortedIcon(fileName); + } + }, + + /** + * Click undo upload via upload dialog + * @property clickUndoUploadViaWindow + * */ + clickUndoUploadViaDialog: { + value: function (fileName) { + var dialog = element(by.css("file-uploading-dialog[class='dialog-show']")); + var undoIcon = element(by.xpath("//i[contains(@data-automation-id, 'abort_cancel_upload')]/../../../td[contains(@data-automation-id, '" + fileName + "')]")); + + Util.waitUntilElementIsVisible(dialog); + Util.waitUntilElementIsVisible(undoIcon); + undoIcon.click(); + } + }, + + /** + * Undo upload via dialog + * @property undoUploadViaDialog + * */ + undoUploadViaDialog: { + value: function (fileName) { + this.clickUndoUploadViaDialog(fileName); + this.checkFileIsNotInDocList(fileName); + this.checkAbortedIcon(fileName); + } + }, + + /** + * Click cancel upload via upload dialog + * @property clickUndoUploadViaWindow + * */ + clickCancelUploadViaDialog: { + value: function () { + var dialog = element(by.css("file-uploading-dialog[class='dialog-show']")); + var cancelButton = element(by.css("a[data-automation-id='cancel_upload_all']")); + + Util.waitUntilElementIsVisible(dialog); + Util.waitUntilElementIsVisible(cancelButton); + cancelButton.click(); + } + }, + + /** + * cancel upload via dialog + * @property undoUploadViaDialog + * */ + cancelUploadViaDialog: { + value: function (fileName) { + this.clickCancelUploadViaDialog(); + this.checkFileIsNotInDocList(fileName); + this.checkAbortedIcon(fileName); + } + }, + + /** + * Enable multiple file upload + * @property enableMultipleFileUpload + * */ + enableMultipleFileUpload: { + value: function () { + var multiFileUploadSwitch = element(by.css("label[for='switch-multiple-file']")); + + Util.waitUntilElementIsVisible(multiFileUploadSwitch); + multiFileUploadSwitch.click(); + Util.waitUntilElementIsVisible(this.multipleUploadButton); + Util.waitUntilElementIsVisible(this.multipleUploadEnabled); + } + }, + + /** + * Disable multiple file upload + * @property diableMultipleFileUpload + * */ + disableMultipleFileUpload: { + value: function () { + var multiFileUploadSwitch = element(by.css("label[for='switch-multiple-file']")); + + Util.waitUntilElementIsVisible(multiFileUploadSwitch); + multiFileUploadSwitch.click(); + Util.waitUntilElementIsNotOnPage(this.multipleUploadButton); + Util.waitUntilElementIsNotOnPage(this.multipleUploadEnabled); + Util.waitUntilElementIsVisible(this.uploadButton); + } + }, + + /** + * upload mutiple files, 3 + * @property uploadMutipleFiles + * */ + uploadMutipleFiles: { + value: function (file1Location, file2Location) { + Util.waitUntilElementIsVisible(this.multipleUploadButton); + Util.waitUntilElementIsVisible(this.multipleUploadEnabled); + + var firstFile = Util.uploadParentFolder(file1Location); + var secondFile = Util.uploadParentFolder(file2Location); + + Util.uploadFile(this.multipleUploadButton, this.multipleUploadButton, firstFile + "\n" + secondFile); + } + }, + + /** + * Enable filter on + * @property enableFilter + * */ + enableFilter: { + value: function () { + var acceptedFileTypeSwitch = element(by.css("label[for='switch-accepted-file-type']")); + + Util.waitUntilElementIsVisible(acceptedFileTypeSwitch); + acceptedFileTypeSwitch.click(); + Util.waitUntilElementIsVisible(this.acceptedFilesText); + Util.waitUntilElementIsVisible(this.uploadButton); + } + }, + + /** + * Disable multiple file upload + * @property disableFilter + * */ + disableFilter: { + value: function () { + var acceptedFileTypeSwitch = element(by.css("label[for='switch-accepted-file-type']")); + + Util.waitUntilElementIsVisible(acceptedFileTypeSwitch); + acceptedFileTypeSwitch.click(); + Util.waitUntilElementIsNotOnPage(this.acceptedFilesText); + Util.waitUntilElementIsVisible(this.uploadButton); + } + }, + + /** + * Enter allowed file types + * @property allowedFileTypes + * */ + setAllowedFileTypes: { + value: function (allowedFileTypes) { + var uploadButtonRestricted = element(by.css("input[data-automation-id='upload-single-file'][ng-reflect-accept='" + allowedFileTypes + "']")); + + Util.waitUntilElementIsVisible(this.acceptedFilesText); + this.acceptedFilesText.clear(); + this.acceptedFilesText.sendKeys(allowedFileTypes); + Util.waitUntilElementIsVisible(uploadButtonRestricted); + } + }, + + /** + * Enable versioning + * @property enableVersioning + * */ + enableVersioning: { + value: function () { + var versioningSwitch = element(by.css("label[for='switch-versioning']")); + var versioningEnabled = element(by.css("alfresco-upload-button[data-automation-id='multiple-file-upload'][ng-reflect-versioning='true']")); + + Util.waitUntilElementIsVisible(versioningSwitch); + versioningSwitch.click(); + Util.waitUntilElementIsVisible(versioningEnabled); + Util.waitUntilElementIsVisible(this.uploadButton); + } + }, + + /** + * Disable versioning + * @property disableVersioning + * */ + disableVersioning: { + value: function () { + var versioningSwitch = element(by.css("label[for='switch-versioning']")); + var versioningEnabled = element(by.css("alfresco-upload-button[data-automation-id='multiple-file-upload'][ng-reflect-versioning='true']")); + + Util.waitUntilElementIsVisible(versioningSwitch); + versioningSwitch.click(); + Util.waitUntilElementIsNotOnPage(versioningEnabled); + Util.waitUntilElementIsVisible(this.uploadButton); + } + }, + + /** + * adds versioning additon to to filename + * @property versionedFileName + * */ + versionedFileName: { + value: function (fileName, versioningAddition) { + var fullFileName = fileName.split("."); + var nameWithoutExtension = fullFileName[0]; + var extension = fullFileName[1]; + var versionedFileName = nameWithoutExtension + versioningAddition + "." + extension; + + return versionedFileName; + } + }, + + /** + * sort document list by display name, ascending/descending + * @property sortDisplayName + * */ + sortDisplayName: { + value: function (sorting) { + var sortingIcon = element(by.css("th[class*='header--sorted-" + sorting + "'][data-automation-id='auto_id_name']")); + + Util.waitUntilElementIsVisible(sortingIcon); + sortingIcon.click(); + } + }, + + /** + * check first folder name + * @property checkFirstFolderName + * */ + checkFirstFolderName: { + value: function (folderName) { + var firstFolder = element(by.xpath("//img[(contains(@src, 'folder.svg'))]/../../../../td/div/div[(contains(@data-automation-id, 'text_" + folderName +"'))]")); + + Util.waitUntilElementIsVisible(firstFolder); + Util.waitUntilElementIsVisible(this.documentList); + expect(firstFolder.getText()).toEqual(folderName); + + } + }, + + /** + * check first file's name + * @property checkFirstFilesName + * */ + checkFirstFilesName: { + value: function (fileName) { + var firstFile = element(by.xpath("//img[not (contains(@src, 'folder.svg'))]/../../../../td/div/div[(contains(@data-automation-id, 'text_" + fileName +"'))]")); + + Util.waitUntilElementIsVisible(firstFile); + Util.waitUntilElementIsVisible(this.documentList); + expect(firstFile.getText()).toEqual(fileName); + } + }, + + /** + * click created by when no icon is displayed + * @property clickCreatedBy + * */ + clickCreatedBy: { + value: function () { + var createdBy = element(by.css("th[data-automation-id='auto_id_createdByUser.displayName']")); + + Util.waitUntilElementIsVisible(createdBy); + createdBy.click(); + } + }, + + /** + * sort document list by created by, ascending/descending + * @property sortCreatedBy + * */ + sortCreatedBy: { + value: function (sorting) { + var sortingIcon = element(by.css("th[class*='header--sorted-" + sorting + "'][data-automation-id='auto_id_createdByUser.displayName']")); + + Util.waitUntilElementIsVisible(sortingIcon); + sortingIcon.click(); + } + }, + + /** + * check first folder creator + * @property checkFirstFolderName + * */ + checkFirstFolderCreator: { + value: function (folderName, creator) { + var firstFolder = element(by.xpath("//img[(contains(@src, 'folder.svg'))]/../../../../td/div/div[(contains(@data-automation-id, 'text_" + creator +"'))]")); + + Util.waitUntilElementIsVisible(firstFolder); + Util.waitUntilElementIsVisible(this.documentList); + expect(firstFolder.getText()).toContain(creator); + } + }, + + /** + * check first file creator + * @property checkFirstFileName + * */ + checkFirstFilesCreator: { + value: function (fileName, creator) { + var firstFile = element(by.xpath("//img[not (contains(@src, 'folder.svg'))]/../../../../td/div/div[(contains(@data-automation-id, 'text_" + creator +"'))]")); + + Util.waitUntilElementIsVisible(firstFile); + Util.waitUntilElementIsVisible(this.documentList); + expect(firstFile.getText()).toContain(creator); + } + }, + + /** + * click created on when no icon is displayed + * @property clickCreatedOn + * */ + clickCreatedOn: { + value: function () { + var createdOn = element(by.css("th[data-automation-id='auto_id_createdAt']")); + + Util.waitUntilElementIsVisible(createdOn); + createdOn.click(); + } + }, + + /** + * sort document list by created on, ascending/descending + * @property sortCreatedBy + * */ + sortCreatedBy: { + value: function (sorting) { + var sortingIcon = element(by.css("th[class*='header--sorted-" + sorting + "'][data-automation-id='auto_id_createdAt']")); + + Util.waitUntilElementIsVisible(sortingIcon); + sortingIcon.click(); + } + }, + + /** + * check first folder created on date + * @property checkFirstFolderDate + * */ + checkFirstFolderDate: { + value: function () { + var firstFolder = element(by.xpath("//img[not (contains(@src, 'folder.svg'))]/../../../../td/div/div[(contains(@data-automation-id, 'date_'))]")); + + var todaysDate = Util.getCrtDateLongFormat(); + + Util.waitUntilElementIsVisible(firstFolder); + Util.waitUntilElementIsVisible(this.documentList); + expect(firstFolder.getText()).toContain(todaysDate); + } + }, + + /** + * check first files created on date + * @property checkFirstFilesDate + * */ + checkFirstFilesDate: { + value: function () { + var firstFile = element(by.xpath("//img[not (contains(@src, 'folder.svg'))]/../../../../td/div/div[(contains(@data-automation-id, 'date_'))]")); + + var todaysDate = Util.getCrtDateLongFormat(); + + Util.waitUntilElementIsVisible(firstFile); + Util.waitUntilElementIsVisible(this.documentList); + expect(firstFile.getText()).toContain(todaysDate); + } + }, + + getCurrentFolderID: { + value: function () { + return folderID.getText(); + } + }, + +}); diff --git a/e2e/pages/adf/filePreviewPage.js b/e2e/pages/adf/filePreviewPage.js new file mode 100644 index 0000000000..5791efb6fb --- /dev/null +++ b/e2e/pages/adf/filePreviewPage.js @@ -0,0 +1,475 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Page = require('astrolabe').Page; +var Util = require('../../util/util'); +var documentList = require('./documentListPage'); + +var pdfTitleFromSearch = element(by.css("span[id='adf-viewer-display-name']")); +var textLayer = element.all(by.css("div[class='textLayer']")).first(); +var closeButton = element(by.css("button[class*='adf-viewer-close-button']")); + +/** + * Provides the file preview Page. + * @module pages + * @submodule share + * @class pages.adf.filePreviewPage + */ +module.exports = Page.create({ + + /** + * Wait for elements to appear + * @property waitForElements + * @type protractor.Element + * */ + waitForElements: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("i[id='viewer-close-button']"))); + } + }, + + /** + * Click view file + * @property viewFile + * */ + viewFile: { + value: function (fileName) { + documentList.checkItemInDocList(fileName); + browser.actions().doubleClick(element(by.cssContainingText("div[data-automation-id='text_" + fileName + "']", fileName))).perform(); + this.waitForElements(); + } + }, + + /** + * get file title + * @method getPDFTitle + */ + getPDFTitleFromSearch: { + value: function () { + var deferred = protractor.promise.defer(); + Util.waitUntilElementIsVisible(pdfTitleFromSearch); + Util.waitUntilElementIsVisible(textLayer); + pdfTitleFromSearch.getText().then(function (result) { + deferred.fulfill(result); + }) + return deferred.promise; + } + }, + + /** + * Check close button is displayed + * @method checkCloseButton + */ + checkCloseButton: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("i[id='viewer-close-button']"))); + } + }, + + /** + * Check original size button + * @method checkOriginalSizeButton + */ + checkOriginalSizeButton: { + value: function () { + Util.waitUntilElementIsVisible(element(by.cssContainingText("div[id='viewer-scale-page-button'] > i ", "zoom_out_map"))); + } + }, + + /** + * Check zoom in button + * @method checkZoomInButton + */ + checkZoomInButton: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("div[id='viewer-zoom-in-button']"))); + } + }, + + /** + * Check zoom out button + * @method checkZoomOutButton + */ + checkZoomOutButton: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("div[id='viewer-zoom-out-button']"))); + } + }, + + /** + * Check previous page button + * @method checkPreviousPageButton + */ + checkPreviousPageButton: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("div[id='viewer-previous-page-button']"))); + } + }, + + /** + * Check next page button + * @method checkNextPageButton + */ + checkNextPageButton: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("div[id='viewer-next-page-button']"))); + } + }, + + /** + * Check download button on unsupported documents + * @method checkDownloadButton + */ + checkDownloadButton: { + value: function () { + Util.waitUntilElementIsVisible(element(by.css("button[id='viewer-download-button']"))); + } + }, + + /** + * Check current pageNumber + * @method checkCurrentPageNumber + */ + checkCurrentPageNumber: { + value: function (pageNumber) { + Util.waitUntilElementIsVisible(element(by.css("input[id='viewer-pagenumber-input'][ng-reflect-value='" + pageNumber + "']"))); + } + }, + + /** + * Check text in file + * @method checkText + */ + checkText: { + value: function (pageNumber, text) { + var allPages = element.all(by.css("div[class='canvasWrapper'] > canvas")).first(); + var pageLoaded = element(by.css("div[id='pageContainer" + pageNumber + "'][data-loaded='true']")); + var textLayerLoaded = element(by.css("div[id='pageContainer" + pageNumber + "'] div[class='textLayer'] > div")); + var specificText = element(by.cssContainingText("div[id='pageContainer" + pageNumber + "'] div[class='textLayer'] > div", text)); + + Util.waitUntilElementIsVisible(allPages); + Util.waitUntilElementIsVisible(pageLoaded); + Util.waitUntilElementIsVisible(textLayerLoaded); + Util.waitUntilElementIsVisible(specificText); + } + }, + + /** + * Check total amount of pages + * @method checkTitle + */ + checktotalPages: { + value: function (totalPages) { + var totalPages = element(by.cssContainingText("div[id='viewer-total-pages']", totalPages)); + Util.waitUntilElementIsVisible(totalPages); + } + }, + + /** + * Go to next page + * @method goToNextPage + */ + goToNextPage: { + value: function () { + var nextPageIcon = element(by.css("div[id='viewer-next-page-button']")); + Util.waitUntilElementIsVisible(nextPageIcon); + nextPageIcon.click(); + } + }, + + /** + * Go to previous page + * @method goToPreviousPage + */ + goToPreviousPage: { + value: function () { + var previousPageIcon = element(by.css("div[id='viewer-previous-page-button']")); + Util.waitUntilElementIsVisible(previousPageIcon); + previousPageIcon.click(); + } + }, + + /** + * Go to certain page + * @method goToPage + */ + goToPage: { + value: function (page) { + var pageInput = element(by.css("input[id='viewer-pagenumber-input']")); + + Util.waitUntilElementIsVisible(pageInput); + pageInput.clear().sendKeys(page); + pageInput.sendKeys(protractor.Key.ENTER); + } + }, + + /** + * Close preview with close option + * @method closePreviewWithButton + */ + closePreviewWithButton: { + value: function () { + Util.waitUntilElementIsVisible(closeButton); + closeButton.click(); + } + }, + + /** + * Close preview by pressing esc key + * @method closePreviewWithEsc + */ + closePreviewWithEsc: { + value: function (fileName) { + var filePreview = element.all(by.css("div[class='canvasWrapper'] > canvas")).first(); + + browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + documentList.checkItemInDocList(fileName); + Util.waitUntilElementIsNotOnPage(filePreview); + } + }, + + /** + * Close preview by pressing esc key + * @method clickDownload + */ + clickDownload: { + value: function (fileName) { + var downloadButton = element(by.css("button[id='viewer-download-button']")); + + Util.waitUntilElementIsVisible(downloadButton); + downloadButton.click(); + } + }, + + /** + * Click zoom in + * @method clickZoomIn + */ + clickZoomIn: { + value: function () { + var zoomInButton = element(by.css("div[id='viewer-zoom-in-button']")); + + Util.waitUntilElementIsVisible(zoomInButton); + zoomInButton.click(); + } + }, + + /** + * Click zoom in + * @method clickZoomIn + */ + clickZoomOut: { + value: function () { + var zoomOutButton = element(by.css("div[id='viewer-zoom-out-button']")); + + Util.waitUntilElementIsVisible(zoomOutButton); + zoomOutButton.click(); + } + }, + + /** + * Click actual size + * @method clickActualSize + */ + clickActualSize: { + value: function () { + var actualSizeButton = element(by.css("div[id='viewer-scale-page-button']")); + + Util.waitUntilElementIsVisible(actualSizeButton); + actualSizeButton.click(); + } + }, + + /** + * Check canvas width + * @method checkCanvasWidth + */ + checkCanvasWidth: { + value: function () { + return element.all(by.css("div[class='canvasWrapper'] > canvas")).first().getAttribute("width").then(function(width) { + return width; + }); + } + }, + + /** + * Check canvas height + * @method checkCanvasHeight + */ + checkCanvasHeight: { + value: function () { + return element.all(by.css("div[class='canvasWrapper'] > canvas")).first().getAttribute("height").then(function(height) { + return height; + }); + } + }, + + /** + * Zoom in and check + * @method zoomIn + */ + zoomIn: { + value: function () { + var canvasLayer = element.all(by.css("div[class='canvasWrapper'] > canvas")).first(); + var textLayer = element(by.css("div[id*='pageContainer'] div[class='textLayer'] > div")); + + Util.waitUntilElementIsVisible(canvasLayer); + Util.waitUntilElementIsVisible(textLayer); + + var actualWidth, + zoomedInWidth, + actualHeight, + zoomedInHeight; + + this.checkCanvasWidth().then(function (width) { + actualWidth = width; + if (actualWidth && zoomedInWidth) { + expect(zoomedInWidth).toBeGreaterThan(actualWidth); + } + }); + + this.checkCanvasHeight().then(function (height) { + actualHeight = height; + if (actualHeight && zoomedInHeight) { + expect(zoomedInHeight).toBeGreaterThan(actualHeight); + } + }); + + this.clickZoomIn(); + + this.checkCanvasWidth().then(function (width) { + zoomedInWidth = width; + if (actualWidth && zoomedInWidth) { + expect(zoomedInWidth).toBeGreaterThan(actualWidth); + } + }); + + this.checkCanvasHeight().then(function (height) { + zoomedInHeight = height; + if (actualHeight && zoomedInHeight) { + expect(zoomedInHeight).toBeGreaterThan(actualHeight); + } + }); + } + }, + + /** + * Check actual size of document, zoom in, actual size + * @method zoomIn + */ + actualSize: { + value: function () { + var canvasLayer = element.all(by.css("div[class='canvasWrapper'] > canvas")).first(); + var textLayer = element(by.css("div[id*='pageContainer'] div[class='textLayer'] > div")); + + Util.waitUntilElementIsVisible(canvasLayer); + Util.waitUntilElementIsVisible(textLayer); + + var actualWidth, + actualHeight, + zoomedWidth, + zoomedHeight, + newWidth, + newHeight; + + this.checkCanvasWidth().then(function (width) { + actualWidth = width; + }); + + this.checkCanvasHeight().then(function (height) { + actualHeight = height; + }); + + this.clickZoomIn(); + + this.checkCanvasWidth().then(function (width) { + zoomedWidth = width; + }); + + this.checkCanvasHeight().then(function (height) { + zoomedHeight = height; + }); + + this.clickActualSize(); + + this.checkCanvasWidth().then(function (width) { + newWidth = width; + if (actualWidth && zoomedWidth && newWidth) { + expect(newWidth).toBeLessThan(zoomedWidth); + expect(newWidth).toEqual(actualWidth); + } + }); + + this.checkCanvasHeight().then(function (height) { + newHeight = height; + if (actualHeight && zoomedHeight && newHeight) { + expect(newHeight).toBeLessThan(zoomedHeight); + expect(newHeight).toEqual(actualHeight); + } + }); + } + }, + + /** + * Zoom out and check + * @method zoomOut + */ + zoomOut: { + value: function () { + var canvasLayer = element.all(by.css("div[class='canvasWrapper'] > canvas")).first(); + var textLayer = element(by.css("div[id*='pageContainer'] div[class='textLayer'] > div")); + + Util.waitUntilElementIsVisible(canvasLayer); + Util.waitUntilElementIsVisible(textLayer); + + var actualWidth, + zoomedOutWidth, + actualHeight, + zoomedOutHeight; + + this.checkCanvasWidth().then(function (width) { + actualWidth = width; + if (actualWidth && zoomedOutWidth) { + expect(zoomedOutWidth).toBeLessThan(actualWidth); + } + }); + + this.checkCanvasHeight().then(function (height) { + actualHeight = height; + if (actualHeight && zoomedOutHeight) { + expect(zoomedOutHeight).toBeLessThan(actualHeight); + } + }); + + this.clickZoomOut(); + + this.checkCanvasWidth().then(function (width) { + zoomedOutWidth = width; + if (actualWidth && zoomedOutWidth) { + expect(zoomedOutWidth).toBeLessThan(actualWidth); + } + }); + + this.checkCanvasHeight().then(function (height) { + zoomedInHeight = height; + if (actualHeight && zoomedOutHeight) { + expect(zoomedOutHeight).toBeLessThan(actualHeight); + } + }); + } + }, +}); diff --git a/e2e/pages/adf/loginPage.js b/e2e/pages/adf/loginPage.js new file mode 100644 index 0000000000..274393b5af --- /dev/null +++ b/e2e/pages/adf/loginPage.js @@ -0,0 +1,432 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); +var TestConfig = require('../../test.config'); +var AdfSettingsPage = require('./settingsPage'); + +var LoginPage = function (){ + + var loginURL = TestConfig.adf.url + TestConfig.adf.port + "/login"; + var txtUsername = element(by.css("input[id='username']")); + var txtPassword = element(by.css("input[id='password']")); + var usernameTooltip = element(by.css("span[data-automation-id='username-error']")); + var passwordTooltip = element(by.css("span[data-automation-id='password-required']")); + var loginTooltip = element(by.css("span[class='login-error-message']")); + var usernameInactive = element(by.css("input[id='username'][aria-invalid='false']")); + var passwordInactive = element(by.css("input[id='password'][aria-invalid='false']")); + var adfLogo = element(by.css("img[class='adf-img-logo ng-star-inserted']")); + var usernameHighlighted = element(by.css("input[id='username'][aria-invalid='true']")); + var passwordHighlighted = element(by.css("input[id='password'][aria-invalid='true']")); + var signInButton = element(by.id('login-button')); + var showPassword = element(by.css("mat-icon[data-automation-id='show_password']")); + var hidePassword = element(by.css("mat-icon[data-automation-id='hide_password']")); + var rememberMe = element(by.css("mat-checkbox[id='adf-login-remember']")); + var needHelp = element(by.css("div[id='adf-login-action-left']")); + var register = element(by.css("div[id='adf-login-action-right']")); + var footerSwitch = element(by.id("switch4")); + var userPicture = element(by.id("userinfo_container")); + var cardBackground = element(by.css("mat-card[class*='adf-login-card']")); + var adfSettingsPage = new AdfSettingsPage(); + + /** + * Provides the longer wait required + * @property waitForElements + * @type protractor.Element + * */ + this.waitForElements = function (){ + var deferred = protractor.promise.defer(); + + Util.waitUntilElementIsVisible(txtUsername).then(()=>{ + Util.waitUntilElementIsVisible(txtPassword).then(()=>{ + deferred.fulfill(); + },()=>{ + deferred.rejected(); + }) + }); + + return deferred.promise; + + }; + + /** + * Fills the username input + * @method enterUsername + * @param {String} username + */ + this.enterUsername = function (username){ + Util.waitUntilElementIsVisible(txtUsername); + txtUsername.sendKeys(''); + txtUsername.clear(); + browser.driver.sleep(500); + txtUsername.sendKeys(username); + }; + + /** + * Fills the password input + * @method enterPassword + * @param {String} password + */ + this.enterPassword = function (password){ + Util.waitUntilElementIsVisible(txtPassword); + browser.driver.sleep(500); + txtPassword.clear(); + txtPassword.sendKeys(password); + }; + + /** + * clears username input + * @method clearUsername + * @param {String} username + */ + this.clearUsername = function(){ + Util.waitUntilElementIsVisible(txtUsername); + txtUsername.click().clear(); + }; + + /** + * clears password input + * @method clearPassword + * @param {String} password + */ + this.clearPassword = function (){ + Util.waitUntilElementIsVisible(txtPassword); + txtPassword.getAttribute('value').then(function (value){ + for (var i = value.length; i >= 0; i--) { + txtPassword.sendKeys(protractor.Key.BACK_SPACE); + } + }); + }; + + /** + * checks username tooltips + * @method checkUsernameTooltip + * @param {String} message + */ + this.checkUsernameTooltip = function (message){ + Util.waitUntilElementIsVisible(usernameTooltip); + }; + + /** + * checks password tooltips + * @method checkPasswordTooltip + * @param {String} message + */ + this.checkPasswordTooltip = function (message){ + Util.waitUntilElementIsVisible(passwordTooltip); + }; + + /** + * checks login error tooltips + * @method checkLoginError + * @param {String} message + */ + this.checkLoginError = function (message){ + Util.waitUntilElementIsVisible(loginTooltip); + expect(loginTooltip.getText()).toEqual(message); + }; + + /** + * checks username field is inactive + * @method checkUsernameInactive + */ + this.checkUsernameInactive = function (){ + Util.waitUntilElementIsVisible(usernameInactive); + }, + + /** + * checks password field is inactive + * @method checkPasswordInactive + */ + this.checkPasswordInactive = function (){ + Util.waitUntilElementIsVisible(passwordInactive); + }; + + /** + * checks username field is highlighted + * @method checkUsernameHighlighted + */ + this.checkUsernameHighlighted = function (){ + adfLogo.click(); + Util.waitUntilElementIsVisible(usernameHighlighted); + }; + + /** + * checks password field is highlighted + * @method checkPasswordHighlighted + */ + this.checkPasswordHighlighted = function (){ + adfLogo.click(); + Util.waitUntilElementIsVisible(passwordHighlighted); + }; + + /** + * check Username tooltip is not visible + * @method checkUsernameTooltipIsNotVisible + */ + this.checkUsernameTooltipIsNotVisible = function (){ + Util.waitUntilElementIsNotVisible(usernameTooltip); + }; + + /** + * checks password tooltip is not visible + * @method checkPasswordTooltipIsNotVisible + */ + this.checkPasswordTooltipIsNotVisible = function (){ + Util.waitUntilElementIsNotVisible(passwordTooltip); + }; + + /** + * checks sign in button is enabled + * @method checkSignInButtonIsEnabled + */ + this.checkSignInButtonIsEnabled = function (){ + Util.waitUntilElementIsVisible(signInButton); + expect(signInButton.isEnabled()).toBe(true); + }; + + /** + * Logs into adf using default host config + * @method defaultLogin + */ + this.defaultLogin = function (){ + browser.driver.get(TestConfig.adf.url + TestConfig.adf.login); + this.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + }; + + /** + * Logs into adf using userModel + * @method loginUsingUserModel + */ + this.loginUsingUserModel = function (userModel){ + browser.driver.get(TestConfig.adf.url + TestConfig.adf.login); + this.waitForElements(); + this.login(userModel.getId(), userModel.getPassword()); + }; + + /** + * Logs into ADF using userModel - only Process Services enabled + * @method loginUsingUserModel + */ + this.loginToProcessServicesUsingUserModel = function (userModel){ + adfSettingsPage.setProviderBpm(); + this.waitForElements(); + this.login(userModel.email, userModel.password); + }; + + + this.loginToProcessServicesUsingDefaultUser = function (){ + adfSettingsPage.setProviderBpm(); + this.waitForElements(); + this.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + }; + + this.loginToContentServicesUsingUserModel = function (userModel) { + adfSettingsPage.setProviderEcm(); + this.waitForElements(); + + this.login(userModel.getId(), userModel.getPassword()); + }; + + /**
 + * Go to adf login page
 + * @method goToLoginPage
 + */ + 
this.goToLoginPage = function (){
 + browser.driver.get(TestConfig.adf.url + TestConfig.adf.port+'/login'); + }; + + /** + * checks sign in button is disabled + * @method checkSignInButtonIsDisabled + */ + this.checkSignInButtonIsDisabled = function (){ + Util.waitUntilElementIsVisible(signInButton); + expect(signInButton.isEnabled()).toBe(false); + }; + + /** + * clicks the sign in button + * @method clickSignInButton + */ + this.clickSignInButton = function (){ + Util.waitUntilElementIsVisible(signInButton); + signInButton.click(); + }; + + /** + * clicks icon to show password + * @method showPassword + */ + this.showPassword = function (){ + Util.waitUntilElementIsVisible(showPassword); + showPassword.click(); + }; + + this.getShowPasswordIconColor = function (){ + var deferred = protractor.promise.defer(); + + Util.waitUntilElementIsVisible(showPassword); + showPassword.getCssValue('color').then(function (value) { + deferred.fulfill(value); + }); + + return deferred.promise; + }; + + this.getSignInButtonColor = function (){ + var deferred = protractor.promise.defer(); + + Util.waitUntilElementIsVisible(signInButton); + signInButton.getCssValue("color").then(function (value) { + deferred.fulfill(value); + }); + + return deferred.promise; + }; + + this.getBackgroundColor = function (){ + var deferred = protractor.promise.defer(); + + Util.waitUntilElementIsVisible(cardBackground); + cardBackground.getCssValue("color").then(function (value) { + deferred.fulfill(value); + }); + + return deferred.promise; + }; + + /** + * clicks icon to hide password + * @method hidePassword + */ + this.hidePassword = function (){ + Util.waitUntilElementIsVisible(hidePassword); + hidePassword.click(); + }; + + /** + * checks if password is shown + * @method checkPasswordIsShown + * @param password + */ + this.checkPasswordIsShown = function (password){ + txtPassword.getAttribute('value').then(function (text) { + expect(text).toEqual(password); + }); + }; + + /** + * checks if password is hidden + * @method checkPasswordIsHidden + */ + this.checkPasswordIsHidden = function (){ + Util.waitUntilElementIsVisible(txtPassword); + }; + + /** + * checks 'Remember me' is displayed + * @method checkRememberIsDisplayed + */ + this.checkRememberIsDisplayed = function (){ + Util.waitUntilElementIsVisible(rememberMe); + }; + + /** + * checks 'Remember me' is not displayed + * @method checkRememberIsNotDisplayed + */ + this.checkRememberIsNotDisplayed = function (){ + Util.waitUntilElementIsNotVisible(rememberMe); + }; + + /** + * checks 'Need help' is Displayed + * @method checkNeedHelpIsDisplayed + */ + this.checkNeedHelpIsDisplayed = function (){ + Util.waitUntilElementIsVisible(needHelp); + }; + + /** + * checks 'Need Help' is not displayed + * @method checkNeedHelpIsNotDisplayed + */ + this.checkNeedHelpIsNotDisplayed = function (){ + Util.waitUntilElementIsNotVisible(needHelp); + }; + + /** + * checks 'Register' is displayed + * @method checkRegisterDisplayed + */ + this.checkRegisterDisplayed = function (){ + Util.waitUntilElementIsVisible(register); + }; + + /** + * checks 'Register' is not displayed + * @method checkRegisterIsNotDisplayed + */ + this.checkRegisterIsNotDisplayed = function (){ + Util.waitUntilElementIsNotVisible(register); + }; + + /** + * enables footer switch + * @method enableFooter + */ + this.enableFooter = function (){ + Util.waitUntilElementIsVisible(footerSwitch); + footerSwitch.getAttribute('class').then(function (check) { + if (check === 'mat-slide-toggle mat-primary'){ + footerSwitch.click(); + expect(footerSwitch.getAttribute('class')).toEqual('mat-slide-toggle mat-primary mat-checked'); + } + }) + }; + + /** + * disables footer switch + * @method disableFooter + */ + this.disableFooter = function (){ + Util.waitUntilElementIsVisible(footerSwitch); + footerSwitch.getAttribute('class').then(function (check) { + if (check ==='mat-slide-toggle mat-primary mat-checked'){ + footerSwitch.click(); + expect(footerSwitch.getAttribute('class')).toEqual('mat-slide-toggle mat-primary'); + } + }) + }; + + /** + * logs in with a valid user + * @method login + * @param {String, String} username, password + */ + this.login = function (username, password) { + this.waitForElements(); + this.enterUsername(username); + this.enterPassword(password); + this.clickSignInButton(); + Util.waitUntilElementIsVisible(userPicture); + }; + +}; + +module.exports = LoginPage; diff --git a/e2e/pages/adf/navigationBarPage.js b/e2e/pages/adf/navigationBarPage.js new file mode 100644 index 0000000000..4146443ad5 --- /dev/null +++ b/e2e/pages/adf/navigationBarPage.js @@ -0,0 +1,92 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +var NavigationBarPage = function (){ + + var contentServicesButton = element(by.css("a[data-automation-id='Content Services']")); + var processServicesButton = element(by.css("a[data-automation-id='Process Services']")); + var loginButton = element(by.css("a[data-automation-id='Login']")); + var trashcanButton = element(by.css("a[data-automation-id='Trashcan']")); + var userProfileButton = element(by.css("div[data-automation-id='user-profile']")); + var themeButton = element(by.css("button[data-automation-id='theme menu']")); + var themeMenuContent = element(by.css("div[class*='mat-menu-panel']")); + var logoutButton = element(by.css("a[adf-logout]")); + + /** + * Click Content Services Button + * @method clickContentServicesButton + */ + this.clickContentServicesButton = function (){ + Util.waitUntilElementIsVisible(contentServicesButton); + contentServicesButton.click(); + }; + + /** + * Click Process Services Button + * @method clickProcessServicesButton + */ + this.clickProcessServicesButton = function (){ + Util.waitUntilElementIsVisible(processServicesButton); + processServicesButton.click(); + }; + + /** + * Click Login Button + * @method clickLoginButton + */ + this.clickLoginButton = function(){ + Util.waitUntilElementIsVisible(loginButton); + loginButton.click(); + }; + + this.clickTrashcanButton = function(){ + Util.waitUntilElementIsVisible(trashcanButton); + trashcanButton.click(); + }; + + this.clickUserProfile = function () { + Util.waitUntilElementIsVisible(userProfileButton); + userProfileButton.click(); + }; + + this.clickThemeButton = function () { + Util.waitUntilElementIsVisible(themeButton); + themeButton.click(); + Util.waitUntilElementIsVisible(themeMenuContent); + }; + + this.clickOnSpecificThemeButton = function (themeName) { + var themeElement = element(by.css("button[data-automation-id='" + themeName + "']")); + Util.waitUntilElementIsVisible(themeElement); + Util.waitUntilElementIsClickable(themeElement); + themeElement.click(); + }; + + /** + * Click Logout Button + * @method clickLogoutButton + */ + this.clickLogoutButton = function(){ + Util.waitUntilElementIsVisible(logoutButton); + logoutButton.click(); + }; + +}; + +module.exports = NavigationBarPage; diff --git a/e2e/pages/adf/paginationPage.js b/e2e/pages/adf/paginationPage.js new file mode 100644 index 0000000000..79942b708e --- /dev/null +++ b/e2e/pages/adf/paginationPage.js @@ -0,0 +1,135 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +var PaginationPage = function () { + + var itemsPerPageDropdown = element(by.css("div[class*='adf-pagination__perpage-block'] button")); + var pageSelectorDropDown = element(by.css("div[class*='adf-pagination__page-selector']")); + var itemsPerPage = element(by.css("span[class='adf-pagination__max-items']")); + var currentPage = element(by.css("span[class='adf-pagination__current-page']")); + var totalPages = element(by.css("span[class='adf-pagination__total-pages']")); + var paginationRange = element(by.css("span[class='adf-pagination__range']")); + var nextPageButton = element(by.css("button[class*='adf-pagination__next-button']")); + var previousPageButton = element(by.css("button[class*='adf-pagination__previous-button']")); + var nextButtonDisabled = element(by.css("button[class*='adf-pagination__next-button'][disabled]")); + var previousButtonDisabled = element(by.css("button[class*='adf-pagination__previous-button'][disabled]")); + var pageDropDown = element(by.css("div[class*='adf-pagination__actualinfo-block'] button")); + var pageDropDownOptions = by.css("div[class*='mat-menu-content'] button"); + var paginationSection = element(by.css("adf-pagination")); + var paginationSectionEmpty = element(by.css("adf-pagination[class*='adf-pagination__empty ng-star-inserted']")); + + this.selectItemsPerPage = function (item) { + Util.waitUntilElementIsVisible(itemsPerPageDropdown); + Util.waitUntilElementIsClickable(itemsPerPageDropdown); + browser.actions().mouseMove(itemsPerPageDropdown).perform(); + Util.waitUntilElementIsVisible(itemsPerPageDropdown); + Util.waitUntilElementIsClickable(itemsPerPageDropdown).then(()=>{ + browser.driver.sleep(2000); + itemsPerPageDropdown.click(); + }); + Util.waitUntilElementIsVisible(pageSelectorDropDown); + + var itemsPerPage = element.all(by.cssContainingText(".mat-menu-item", item)).first(); + Util.waitUntilElementIsClickable(itemsPerPage); + Util.waitUntilElementIsVisible(itemsPerPage); + itemsPerPage.click(); + return this; + }; + + this.checkPaginationIsNotDisplayed = function () { + Util.waitUntilElementIsOnPage(paginationSectionEmpty); + return this; + }; + + this.getCurrentItemsPerPage = function () { + Util.waitUntilElementIsVisible(itemsPerPage); + return itemsPerPage.getText(); + }; + + this.getCurrentPage = function () { + Util.waitUntilElementIsVisible(paginationSection); + Util.waitUntilElementIsVisible(currentPage); + return currentPage.getText(); + }; + + this.getTotalPages = function () { + Util.waitUntilElementIsVisible(totalPages); + return totalPages.getText(); + }; + + this.getPaginationRange = function () { + Util.waitUntilElementIsVisible(paginationRange); + return paginationRange.getText(); + }; + + this.clickOnNextPage = function () { + Util.waitUntilElementIsVisible(nextPageButton); + Util.waitUntilElementIsClickable(nextPageButton); + return nextPageButton.click(); + }; + + this.clickOnPageDropdown = function () { + Util.waitUntilElementIsVisible(pageDropDown); + Util.waitUntilElementIsClickable(pageDropDown); + return pageDropDown.click(); + }; + + this.clickOnPageDropdownOption = function (item) { + Util.waitUntilElementIsVisible(element.all(pageDropDownOptions).first()); + var option = element(by.cssContainingText("div[class*='mat-menu-content'] button", item)); + Util.waitUntilElementIsVisible(option); + option.click(); + return this; + }; + + this.getPageDropdownOptions = function() { + var deferred = protractor.promise.defer(); + Util.waitUntilElementIsVisible(element.all(pageDropDownOptions).first()); + var initialList = []; + element.all(pageDropDownOptions).each(function(element) { + element.getText().then(function(text) { + if(text !== '') { + initialList.push(text); + }; + }); + }).then(function () { + deferred.fulfill(initialList); + }); + return deferred.promise; + }; + + this.checkNextPageButtonIsDisabled = function() { + Util.waitUntilElementIsVisible(nextButtonDisabled); + }; + + this.checkPreviousPageButtonIsDisabled = function() { + Util.waitUntilElementIsVisible(previousButtonDisabled); + }; + + this.checkNextPageButtonIsEnabled = function() { + Util.waitUntilElementIsNotOnPage(nextButtonDisabled); + }; + + this.checkPreviousPageButtonIsEnabled = function() { + Util.waitUntilElementIsNotOnPage(previousButtonDisabled); + }; + +}; +module.exports = PaginationPage; + diff --git a/e2e/pages/adf/process_services/analyticsPage.js b/e2e/pages/adf/process_services/analyticsPage.js new file mode 100644 index 0000000000..648cdc53aa --- /dev/null +++ b/e2e/pages/adf/process_services/analyticsPage.js @@ -0,0 +1,56 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); + +var AnalyticsPage = function () { + + var toolbarTitleInput = element(by.css("input[data-automation-id='reportName']")); + var toolbarTitleContainer = element(by.css("div[class='adf-report-title ng-star-inserted']")); + var toolbarTitle = element(by.xpath("//mat-toolbar/adf-toolbar-title/div/h4")); + var reportContainer = element(by.css("div[class='adf-report-report-container']")); + var reportMessage = element(by.css("div[class='ng-star-inserted'] span")); + + this.getReport = function (title) { + var reportTitle = element(by.css("mat-icon[data-automation-id='"+ title +"_filter']")); + Util.waitUntilElementIsVisible(reportTitle); + reportTitle.click(); + }; + + this.changeReportTitle = function (title) { + Util.waitUntilElementIsVisible(reportContainer); + Util.waitUntilElementIsVisible(toolbarTitleContainer); + toolbarTitleContainer.click(); + Util.waitUntilElementIsVisible(toolbarTitleInput); + toolbarTitleInput.clear(); + toolbarTitleInput.sendKeys(title); + toolbarTitleInput.sendKeys(protractor.Key.ENTER); + }; + + this.getReportTitle = function () { + Util.waitUntilElementIsVisible(toolbarTitle); + return toolbarTitle.getText(); + }; + + this.checkNoReportMessage = function () { + Util.waitUntilElementIsVisible(reportMessage); + }; + +}; + +module.exports = AnalyticsPage; + diff --git a/e2e/pages/adf/process_services/appNavigationBarPage.js b/e2e/pages/adf/process_services/appNavigationBarPage.js new file mode 100644 index 0000000000..f1b0555894 --- /dev/null +++ b/e2e/pages/adf/process_services/appNavigationBarPage.js @@ -0,0 +1,47 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); +var TasksPage = require('./tasksPage'); + +var AppNavigationBarPage = function () { + + var tasksButton = element.all(by.cssContainingText("div[class*='mat-tab-label']", "Tasks")).first(); + var processButton = element.all(by.css('div[id*="mat-tab-label"]')); + var reportsButton = element(by.id('mat-tab-label-1-2')); + var reportsButtonSelected = element(by.css("div[id='mat-tab-label-1-2'][aria-selected='true']")) + + this.clickTasksButton = function () { + Util.waitUntilElementIsVisible(tasksButton); + tasksButton.click(); + return new TasksPage(); + }; + + this.clickProcessButton = function () { + processButton.get(1).click(); + }; + + this.clickReportsButton = function () { + Util.waitUntilElementIsVisible(reportsButton); + reportsButton.click(); + Util.waitUntilElementIsVisible(reportsButtonSelected); + }; + + +}; + +module.exports = AppNavigationBarPage; diff --git a/e2e/pages/adf/process_services/attachmentListPage.js b/e2e/pages/adf/process_services/attachmentListPage.js new file mode 100644 index 0000000000..d7a7dd5ff6 --- /dev/null +++ b/e2e/pages/adf/process_services/attachmentListPage.js @@ -0,0 +1,42 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); +var TestConfig = require('../../../test.config'); +var path = require('path'); + +var AttachmentListPage = function () { + + var attachFileButton = element(by.css("input[type='file']")); + + this.clickAttachFileButton = function (fileLocation) { + Util.waitUntilElementIsVisible(attachFileButton); + attachFileButton.sendKeys(path.resolve(path.join(TestConfig.main.rootPath, fileLocation))); + }; + + this.checkFileIsAttached = function (name) { + var fileAttached = element.all(by.css('div[filename="'+name+'"]')).first(); + Util.waitUntilElementIsVisible(fileAttached); + + }; + + this.checkAttachFileButtonIsNotDisplayed = function () { + Util.waitUntilElementIsNotVisible(attachFileButton); + }; + +}; +module.exports = AttachmentListPage; diff --git a/e2e/pages/adf/process_services/dialog/createChecklistDialog.js b/e2e/pages/adf/process_services/dialog/createChecklistDialog.js new file mode 100644 index 0000000000..c5c460fa09 --- /dev/null +++ b/e2e/pages/adf/process_services/dialog/createChecklistDialog.js @@ -0,0 +1,37 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../../util/util'); + +var ChecklistDialog = function () { + + var nameField = element(by.css("input[data-automation-id='checklist-name']")); + var checklistButton = element(by.css("button[id='add-check'] span")); + + this.addName = function (name) { + Util.waitUntilElementIsVisible(nameField); + nameField.sendKeys(name); + return this; + }; + + this.clickCreateChecklistButton = function () { + Util.waitUntilElementIsVisible(checklistButton); + checklistButton.click(); + }; + +}; +module.exports = ChecklistDialog; diff --git a/e2e/pages/adf/process_services/dialog/startTaskDialog.js b/e2e/pages/adf/process_services/dialog/startTaskDialog.js new file mode 100644 index 0000000000..06c2964948 --- /dev/null +++ b/e2e/pages/adf/process_services/dialog/startTaskDialog.js @@ -0,0 +1,100 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../../util/util'); + +var StartTaskDialog = function () { + + var name = element(by.css("input[id='name_id']")); + var description = element(by.css("textarea[id='description_id']")); + var assignee = element(by.css("input[data-automation-id='adf-people-search-input']")); + var formDropDown = element(by.css("mat-select[id='form_id']")); + var startButton = element(by.css("button[id='button-start']")); + var startButtonEnabled = element(by.css("button[id='button-start']:not(disabled)")); + var cancelButton = element(by.css("button[id='button-cancle']")); + var removeAssigneeIcon = element(by.css("button[data-automation-id='adf-people-selector-deselect']")); + + this.addName = function (userName) { + Util.waitUntilElementIsVisible(name); + name.sendKeys(userName); + return this; + }; + + this.addDescription = function (userDescription) { + Util.waitUntilElementIsVisible(description); + description.sendKeys(userDescription); + return this; + }; + + this.addAssignee = function (name) { + Util.waitUntilElementIsVisible(assignee); + assignee.sendKeys(name); + this.selectAssigneeFromList(name); + Util.waitUntilElementIsVisible(removeAssigneeIcon); + return this; + }; + + this.selectAssigneeFromList = function (name) { + var assigneeRow = element(by.cssContainingText("adf-people-list div[class*='datatable-row'] div", name)); + Util.waitUntilElementIsVisible(assigneeRow); + assigneeRow.click(); + return this; + }; + + this.getAssignee = function () { + Util.waitUntilElementIsVisible(assignee); + return assignee.getAttribute('placeholder'); + }; + + this.addForm = function (form) { + Util.waitUntilElementIsVisible(formDropDown); + formDropDown.click(); + return this.selectForm(form); + }; + + this.selectForm = function (form) { + var option = element(by.cssContainingText("span[class*='mat-option-text']", form)); + Util.waitUntilElementIsVisible(option); + Util.waitUntilElementIsClickable(option); + option.click(); + return this; + }; + + this.clickStartButton = function () { + Util.waitUntilElementIsVisible(startButton); + Util.waitUntilElementIsClickable(startButton); + return startButton.click(); + }; + + this.checkStartButtonIsEnabled = function () { + Util.waitUntilElementIsVisible(startButtonEnabled); + return this; + }; + + this.checkStartButtonIsDisabled = function () { + Util.waitUntilElementIsVisible(startButton.getAttribute("disabled")); + return this; + }; + + this.clickCancelButton = function () { + Util.waitUntilElementIsVisible(cancelButton); + Util.waitUntilElementIsClickable(cancelButton); + return cancelButton.click(); + }; +}; + +module.exports = StartTaskDialog; diff --git a/e2e/pages/adf/process_services/filtersPage.js b/e2e/pages/adf/process_services/filtersPage.js new file mode 100644 index 0000000000..fe9d8dcd23 --- /dev/null +++ b/e2e/pages/adf/process_services/filtersPage.js @@ -0,0 +1,50 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); +var ContentList = require('../dialog/contentList'); + +var FiltersPage = function () { + + var activeFilter = element(by.css("mat-list-item[class*='active']")); + var nameColumn = by.css("div[class*='adf-datatable-body'] div[class*='adf-datatable-row'] div[class*='--text'] span"); + var contentList = new ContentList(); + + this.getActiveFilter = function () { + Util.waitUntilElementIsVisible(activeFilter); + return activeFilter.getText(); + }; + + this.goToFilter = function (filterName) { + var filter = element(by.css("span[data-automation-id='" + filterName + "_filter']")); + Util.waitUntilElementIsVisible(filter); + filter.click(); + return this; + }; + + this.sortByName = function (sortOrder) { + contentList.sortByName(sortOrder); + }; + + this.getAllRowsNameColumn = function () { + return contentList.getAllRowsColumnValues(nameColumn); + }; + +}; + +module.exports = FiltersPage; + diff --git a/e2e/pages/adf/process_services/formFields.js b/e2e/pages/adf/process_services/formFields.js new file mode 100644 index 0000000000..cc3e814d95 --- /dev/null +++ b/e2e/pages/adf/process_services/formFields.js @@ -0,0 +1,87 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); + +var FormFields = function () { + + var formContent = element(by.css("adf-form")); + var refreshButton = element(by.css("div[class*='form-reload-button'] mat-icon")); + var saveButton = element(by.cssContainingText("mat-card-actions[class*='adf-form'] span", "SAVE")); + var valueLocator = by.css("input"); + var labelLocator = by.css("label"); + + this.setFieldValue = function (By, field, value) { + var fieldElement = element(By(field)); + Util.waitUntilElementIsVisible(fieldElement); + fieldElement.clear().sendKeys(value); + return this; + }; + + this.getWidget = function (fieldId) { + var widget = element(by.css("form-field div[id='field-" + fieldId + "-container']")); + Util.waitUntilElementIsVisible(widget); + return widget; + }; + + this.getFieldValue = function (fieldId, valueLocatorParam) { + var value = this.getWidget(fieldId).element(valueLocatorParam || valueLocator); + Util.waitUntilElementIsVisible(value); + return value.getAttribute('value'); + }; + + this.getFieldLabel = function (fieldId, labelLocatorParam) { + return this.getFieldText(fieldId, labelLocatorParam); + }; + + this.getFieldText = function (fieldId, labelLocatorParam) { + var label = this.getWidget(fieldId).element(labelLocatorParam || labelLocator); + Util.waitUntilElementIsVisible(label); + return label.getText(); + }; + + this.checkFieldValue = function (By, field, val) { + Util.waitUntilElementHasValue(element(By(field)), val); + return this; + }; + + this.refreshForm = function () { + Util.waitUntilElementIsVisible(refreshButton); + refreshButton.click(); + return this; + }; + + this.saveForm = function () { + Util.waitUntilElementIsVisible(saveButton); + Util.waitUntilElementIsClickable(saveButton); + saveButton.click(); + return this; + }; + + this.noFormIsDisplayed = function () { + Util.waitUntilElementIsNotOnPage(formContent); + return this; + }; + + this.checkFormIsDisplayed = function () { + Util.waitUntilElementIsVisible(formContent); + return this; + }; + +}; + +module.exports = FormFields; diff --git a/e2e/pages/adf/process_services/processDetailsPage.js b/e2e/pages/adf/process_services/processDetailsPage.js new file mode 100644 index 0000000000..cb36009bd7 --- /dev/null +++ b/e2e/pages/adf/process_services/processDetailsPage.js @@ -0,0 +1,148 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); + +var ProcessDetailsPage = function () { + + //Process Details + var processTitle = element(by.css("mat-card-title[class='mat-card-title']")); + var processStatusField = element(by.css("span[data-automation-id='card-textitem-value-status']")); + var processEndDateField = element(by.css("span[data-automation-id='card-dateitem-ended']")); + var processCategoryField = element(by.css("span[data-automation-id='card-textitem-value-category']")); + var processBusinessKeyField = element(by.css("span[data-automation-id='card-textitem-value-businessKey']")); + var processCreatedByField = element(by.css("span[data-automation-id='card-textitem-value-assignee']")); + var processCreatedField = element(by.css("span[data-automation-id='card-dateitem-created']")); + var processIdField = element(by.css("span[data-automation-id='card-textitem-value-id']")); + var processDescription = element(by.css("span[data-automation-id='card-textitem-value-description']")); + var showDiagramButtonDisabled = element(by.css('button[id="show-diagram-button"][disabled]')); + var propertiesList = element(by.css("div[class='adf-property-list']")); + //Show Diagram + var showDiagramButton = element(by.id('show-diagram-button')); + var diagramCanvas = element(by.css('svg[xmlns="http://www.w3.org/2000/svg"]')); + var backButton = element(by.css("app-show-diagram button[class='mat-mini-fab mat-accent']")); + //Comments + var commentInput = element(by.id('comment-input')); + //Audit Log + var auditLogButton = element(by.css("button[adf-process-audit]")); + //Cancel Process button + var cancelProcessButton = element(by.css('div[data-automation-id="header-status"] > button')); + //Tasks + var activeTask = element(by.css('div[data-automation-id="active-tasks"]')); + var taskTitle = element(by.css("h2[class='activiti-task-details__header']")); + + this.checkProcessTitleIsDisplayed = function () { + Util.waitUntilElementIsVisible(processTitle); + return processTitle.getText(); + }; + + this.getProcessStatus = function () { + Util.waitUntilElementIsVisible(processStatusField); + return processStatusField.getText(); + }; + + this.getEndDate = function () { + Util.waitUntilElementIsVisible(processEndDateField); + return processEndDateField.getText(); + }; + + this.getProcessCategory = function () { + Util.waitUntilElementIsVisible(processCategoryField); + return processCategoryField.getText(); + }; + + this.getBusinessKey = function () { + Util.waitUntilElementIsVisible(processBusinessKeyField); + return processBusinessKeyField.getText(); + }; + + this.getCreatedBy = function () { + Util.waitUntilElementIsVisible(processCreatedByField); + return processCreatedByField.getText(); + }; + + this.getCreated = function () { + Util.waitUntilElementIsVisible(processCreatedField); + return processCreatedField.getText(); + }; + + this.getId = function () { + Util.waitUntilElementIsVisible(processIdField); + return processIdField.getText(); + }; + + this.getProcessDescription = function () { + Util.waitUntilElementIsVisible(processDescription); + return processDescription.getText(); + }; + + //Show Diagram + this.clickShowDiagram = function () { + Util.waitUntilElementIsVisible(showDiagramButton); + Util.waitUntilElementIsClickable(showDiagramButton); + showDiagramButton.click(); + Util.waitUntilElementIsVisible(diagramCanvas); + Util.waitUntilElementIsVisible(backButton); + Util.waitUntilElementIsClickable(backButton); + backButton.click(); + }; + + this.checkShowDiagramIsDisabled = function () { + Util.waitUntilElementIsVisible(showDiagramButtonDisabled); + }; + + //Add comment + this.addComment = function (comment) { + Util.waitUntilElementIsVisible(commentInput); + commentInput.sendKeys(comment); + commentInput.sendKeys(protractor.Key.ENTER); + return this; + }; + + this.checkCommentIsDisplayed = function (comment) { + var commentInserted = element(by.cssContainingText("div[id='comment-message']", comment)); + Util.waitUntilElementIsVisible(commentInserted); + return this; + }; + + // Click Audit log + this.clickAuditLogButton = function () { + Util.waitUntilElementIsVisible(auditLogButton); + auditLogButton.click(); + }; + + this.clickCancelProcessButton = function () { + Util.waitUntilElementIsVisible(cancelProcessButton); + Util.waitUntilElementIsClickable(cancelProcessButton); + cancelProcessButton.click(); + }; + + this.clickOnActiveTask = function () { + Util.waitUntilElementIsVisible(activeTask); + activeTask.click(); + }; + + this.checkActiveTaskTitleIsDisplayed = function () { + Util.waitUntilElementIsVisible(taskTitle); + }; + + this.checkProcessDetailsCard = function () { + Util.waitUntilElementIsVisible(propertiesList); + }; +}; + +module.exports = ProcessDetailsPage; diff --git a/e2e/pages/adf/process_services/processFiltersPage.js b/e2e/pages/adf/process_services/processFiltersPage.js new file mode 100644 index 0000000000..aaff022ab1 --- /dev/null +++ b/e2e/pages/adf/process_services/processFiltersPage.js @@ -0,0 +1,116 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); +var ContentList = require('../dialog/contentList'); +var StartProcessPage = require('./startProcessPage'); + +var ProcessFiltersPage = function () { + + var runningFilter = element(by.css("span[data-automation-id='Running_filter']")); + var completedFilter = element(by.css("div[class='mat-list-text'] > span[data-automation-id='Completed_filter']")); + var allFilter = element(by.css("span[data-automation-id='All_filter']")); + var createProcessButton = element(by.css(".adf-processes-menu button[data-automation-id='create-button'] > span")); + var newProcessButton = element(by.css("div > button[data-automation-id='btn-start-process']")); + var processesPage = element(by.css("div[class='adf-grid'] > div[class='adf-grid-item adf-processes-menu']")); + var accordionMenu = element(by.css(".adf-processes-menu adf-accordion")); + var buttonWindow = element(by.css("div > button[data-automation-id='btn-start-process'] > div")); + var noContentMessage = element(by.css("p[class='adf-empty-content__title']")); + var rows = by.css("adf-process-instance-list div[class='adf-datatable-body'] div[class*='adf-datatable-row']"); + var tableBody = element.all(by.css("adf-datatable div[class='adf-datatable-body']")).first(); + var contentList = new ContentList(); + var nameColumn = by.css("div[class*='adf-datatable-body'] div[class*='adf-datatable-row'] div[class*='--text'] span"); + + this.startProcess = function () { + this.clickCreateProcessButton(); + this.clickNewProcessDropdown(); + return new StartProcessPage(); + }; + + this.clickRunningFilterButton = function () { + Util.waitUntilElementIsVisible(runningFilter); + Util.waitUntilElementIsClickable(runningFilter); + return runningFilter.click(); + }; + + this.clickCompletedFilterButton = function () { + Util.waitUntilElementIsVisible(completedFilter); + Util.waitUntilElementIsClickable(completedFilter); + completedFilter.click(); + expect(completedFilter.isEnabled()).toBe(true); + }; + + this.clickAllFilterButton = function () { + Util.waitUntilElementIsVisible(allFilter); + Util.waitUntilElementIsClickable(allFilter); + allFilter.click(); + expect(allFilter.isEnabled()).toBe(true); + }; + + this.clickCreateProcessButton = function () { + Util.waitUntilElementIsOnPage(accordionMenu); + Util.waitUntilElementIsVisible(processesPage); + Util.waitUntilElementIsPresent(createProcessButton); + createProcessButton.click(); + }; + + this.clickNewProcessDropdown = function () { + Util.waitUntilElementIsOnPage(buttonWindow); + Util.waitUntilElementIsVisible(newProcessButton); + Util.waitUntilElementIsClickable(newProcessButton); + newProcessButton.click(); + }; + + this.checkNoContentMessage = function () { + Util.waitUntilElementIsVisible(noContentMessage); + }; + + this.selectFromProcessList = function (title) { + var processName = element.all(by.css('div[data-automation-id="text_'+ title +'"]')).first(); + Util.waitUntilElementIsVisible(processName); + processName.click(); + }; + + this.checkFilterIsHighlighted = function (filterName) { + var processNameHighlighted = element(by.css("mat-list-item.active span[data-automation-id='" + filterName + "_filter']")); + Util.waitUntilElementIsVisible(processNameHighlighted); + }; + + this.numberOfProcessRows = function () { + return element.all(rows).count(); + }; + + this.waitForTableBody = function (){ + Util.waitUntilElementIsVisible(tableBody); + }; + + /** + * Sort the list by name column. + * + * @param sortOrder : 'true' to sort the list ascendant and 'false' for descendant + */ + this.sortByName = function (sortOrder) { + contentList.sortByName(sortOrder); + }; + + this.getAllRowsNameColumn = function () { + return contentList.getAllRowsColumnValues(nameColumn); + }; + +}; + +module.exports = ProcessFiltersPage; diff --git a/e2e/pages/adf/process_services/processServicesPage.js b/e2e/pages/adf/process_services/processServicesPage.js new file mode 100644 index 0000000000..cd4fbed34e --- /dev/null +++ b/e2e/pages/adf/process_services/processServicesPage.js @@ -0,0 +1,95 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); +var AppNavigationBarPage = require('./appNavigationBarPage'); + +var ProcessServicesPage = function(){ + + var apsAppsContainer = element(by.css("div[class='adf-app-listgrid ng-star-inserted']")); + var processServices = element(by.css("a[data-automation-id='Process Services']")); + var taskApp = element(by.css("mat-card[title='Task App']")); + var iconTypeLocator = by.css("mat-icon[class*='card-logo-icon']"); + var descriptionLocator = by.css("mat-card-subtitle[class*='subtitle']"); + + /** + * Check Process Page Container is displayed + * @method checkApsContainer + */ + this.checkApsContainer = function(){ + Util.waitUntilElementIsVisible(apsAppsContainer); + }; + + /** + * Go to Process Services Page + * @method goToProcessServices + * */ + this.goToProcessServices = function() { + Util.waitUntilElementIsVisible(processServices); + processServices.click(); + this.checkApsContainer(); + return this; + }; + + /** + * Go to App + * @method goToApp + * */ + this.goToApp = function(applicationName) { + var app = element(by.css("mat-card[title='" + applicationName +"']")); + Util.waitUntilElementIsVisible(app); + app.click(); + return new AppNavigationBarPage(); + }; + + /** + * Go to Task App + * @method goToTaskApp + * */ + this.goToTaskApp = function() { + Util.waitUntilElementIsVisible(taskApp); + taskApp.click(); + return new AppNavigationBarPage(); + }; + + this.getAppIconType = function (applicationName) { + var app = element(by.css("mat-card[title='" + applicationName +"']")); + Util.waitUntilElementIsVisible(app); + var iconType = app.element(iconTypeLocator); + Util.waitUntilElementIsVisible(iconType); + return iconType.getText(); + }; + + this.getBackgroundColor = function(applicationName) { + var app = element(by.css("mat-card[title='" + applicationName +"']")); + Util.waitUntilElementIsVisible(app); + return app.getCssValue("color").then(function (value) { + return value; + }); + }; + + this.getDescription = function(applicationName) { + var app = element(by.css("mat-card[title='" + applicationName +"']")); + Util.waitUntilElementIsVisible(app); + var description = app.element(descriptionLocator); + Util.waitUntilElementIsVisible(description); + return description.getText(); + }; + +}; + +module.exports = ProcessServicesPage; diff --git a/e2e/pages/adf/process_services/startProcessPage.js b/e2e/pages/adf/process_services/startProcessPage.js new file mode 100644 index 0000000000..655ce185bd --- /dev/null +++ b/e2e/pages/adf/process_services/startProcessPage.js @@ -0,0 +1,86 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); + +var StartProcessPage = function () { + + var defaultProcessName = element(by.css("input[id='processName']")); + var processNameInput = element(by.id('processName')); + var selectProcessDropdownArrow = element(by.css("div[class='mat-select-arrow-wrapper'] div")); + var cancelProcessButton = element(by.id('cancle_process')); + var formStartProcessButton = element(by.css('button[data-automation-id="adf-form-start process"]')); + var startProcessButton = element(by.css("button[data-automation-id='btn-start']")); + var noProcess = element(by.id('no-process-message')); + + this.checkNoProcessMessage = function () { + Util.waitUntilElementIsVisible(noProcess); + } + + this.getDefaultName = function () { + Util.waitUntilElementIsVisible(defaultProcessName); + return defaultProcessName.getAttribute("value"); + }; + + this.deleteDefaultName = function (value) { + Util.waitUntilElementIsVisible(processNameInput); + processNameInput.getAttribute('value').then(function (value){ + for (var i = value.length; i >= 0; i--) { + processNameInput.sendKeys(protractor.Key.BACK_SPACE); + } + }); + }; + + this.enterProcessName = function (name) { + Util.waitUntilElementIsVisible(processNameInput); + processNameInput.clear(); + processNameInput.sendKeys(name); + }; + + this.selectFromProcessDropdown = function (name) { + Util.waitUntilElementIsVisible(selectProcessDropdownArrow); + Util.waitUntilElementIsClickable(selectProcessDropdownArrow) + selectProcessDropdownArrow.click(); + var selectProcessDropdown = element(by.cssContainingText('.mat-option-text', name)); + Util.waitUntilElementIsVisible(selectProcessDropdown); + Util.waitUntilElementIsClickable(selectProcessDropdown); + selectProcessDropdown.click(); + return this; + }; + + this.clickCancelProcessButton = function () { + Util.waitUntilElementIsVisible(cancelProcessButton); + cancelProcessButton.click(); + }; + + this.clickFormStartProcessButton = function () { + Util.waitUntilElementIsVisible(formStartProcessButton); + Util.waitUntilElementIsClickable(formStartProcessButton); + return formStartProcessButton.click(); + }; + + this.checkStartProcessButtonIsEnabled = function () { + expect(startProcessButton.isEnabled()).toBe(true); + }; + + this.checkStartProcessButtonIsDisabled = function () { + expect(startProcessButton.isEnabled()).toBe(false); + }; + +}; + +module.exports = StartProcessPage; diff --git a/e2e/pages/adf/process_services/taskDetailsPage.js b/e2e/pages/adf/process_services/taskDetailsPage.js new file mode 100644 index 0000000000..b82e64e3ec --- /dev/null +++ b/e2e/pages/adf/process_services/taskDetailsPage.js @@ -0,0 +1,172 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); + +var TaskDetailsPage = function () { + + var formNameField = element(by.css("span[data-automation-id*='formName'] span")); + var assigneeField = element(by.css("span[data-automation-id*='assignee'] span")); + var statusField = element(by.css("span[data-automation-id*='status'] span")); + var categoryField = element(by.css("span[data-automation-id*='category'] span")); + var parentNameField = element(by.css("span[data-automation-id*='parentName'] span")); + var createdField = element(by.css("span[data-automation-id='card-dateitem-created'] span")); + var idField = element(by.css("span[data-automation-id*='id'] span")); + var descriptionField = element(by.css("span[data-automation-id*='description'] span")); + var dueDateField = element(by.css("span[data-automation-id*='dueDate'] span")); + var activitiesTitle = element(by.css("div[class*='adf-info-drawer-layout-header-title'] div")); + var commentField = element(by.css("input[id='comment-input']")); + var activityTab = element(by.cssContainingText("div[class*='mat-tab-label ']", "Activity")); + var detailsTab = element(by.cssContainingText("div[class*='mat-tab-label ']", "Details")); + var involvePeopleButton = element(by.css("div[class*='add-people']")); + var addPeopleField = element(by.css("input[data-automation-id='adf-people-search-input']")); + var addInvolvedUserButton = element(by.css("button[id='add-people'] span")); + var emailInvolvedUser = by.xpath("following-sibling::div[@class='people-email ng-star-inserted']"); + + this.getFormName = function () { + Util.waitUntilElementIsVisible(formNameField); + return formNameField.getText(); + }; + + this.getAssignee = function () { + Util.waitUntilElementIsVisible(assigneeField); + return assigneeField.getText(); + }; + + this.getStatus = function () { + Util.waitUntilElementIsVisible(statusField); + return statusField.getText(); + }; + + this.getCategory = function () { + Util.waitUntilElementIsVisible(categoryField); + return categoryField.getText(); + }; + + this.getParentName = function () { + Util.waitUntilElementIsVisible(parentNameField); + return parentNameField.getText(); + }; + + this.getCreated = function () { + Util.waitUntilElementIsVisible(createdField); + return createdField.getText(); + }; + + this.getId = function () { + Util.waitUntilElementIsVisible(idField); + return idField.getText(); + }; + + this.getDescription = function () { + Util.waitUntilElementIsVisible(descriptionField); + return descriptionField.getText(); + }; + + this.getDueDate = function () { + Util.waitUntilElementIsVisible(dueDateField); + return dueDateField.getText(); + }; + + this.getTitle = function () { + Util.waitUntilElementIsVisible(activitiesTitle); + return activitiesTitle.getText(); + }; + + this.selectActivityTab = function () { + Util.waitUntilElementIsVisible(activityTab); + activityTab.getAttribute('aria-selected').then(function (check) { + if (check === 'false') { + activityTab.click(); + expect(activityTab.getAttribute('aria-selected')==="true"); + } + }); + return this; + }; + + this.selectDetailsTab = function () { + Util.waitUntilElementIsVisible(detailsTab); + detailsTab.getAttribute('aria-selected').then(function (check) { + if (check === 'false') { + detailsTab.click(); + expect(detailsTab.getAttribute('aria-selected')==="true"); + } + }); + return this; + }; + + this.addComment = function (comment) { + Util.waitUntilElementIsVisible(commentField); + commentField.sendKeys(comment); + commentField.sendKeys(protractor.Key.ENTER); + return this; + }; + + this.checkCommentIsDisplayed = function (comment) { + var row = element(by.cssContainingText("div[id='comment-message']", comment)); + Util.waitUntilElementIsVisible(row); + return this; + }; + + this.clickInvolvePeopleButton = function () { + Util.waitUntilElementIsVisible(involvePeopleButton); + Util.waitUntilElementIsClickable(involvePeopleButton); + browser.actions().mouseMove(involvePeopleButton).perform(); + involvePeopleButton.click(); + return this; + }; + + this.typeUser = function (user) { + Util.waitUntilElementIsVisible(addPeopleField); + addPeopleField.sendKeys(user); + return this; + }; + + this.selectUserToInvolve = function(user) { + this.getRowsUser(user).click(); + return this; + }; + + this.checkUserIsSelected = function(user) { + var row = element(by.cssContainingText("div[class*='search-list-container'] div[class*='people-full-name']", user)); + var selectedRow = this.getRowsUser(user).element(by.css("ancestor::tr[class*='is-selected']")); + Util.waitUntilElementIsVisible(row); + return this; + }; + + this.clickAddInvolvedUserButton = function () { + Util.waitUntilElementIsVisible(addInvolvedUserButton); + Util.waitUntilElementIsClickable(addInvolvedUserButton); + addInvolvedUserButton.click(); + return this; + } + + this.getRowsUser = function (user) { + var row = element(by.cssContainingText("div[class*='people-full-name']", user)); + Util.waitUntilElementIsVisible(row); + return row; + }; + + this.getInvolvedUserEmail = function (user) { + var email = this.getRowsUser(user).element(emailInvolvedUser); + Util.waitUntilElementIsVisible(email); + return email.getText(); + }; + +}; + +module.exports = TaskDetailsPage; diff --git a/e2e/pages/adf/process_services/tasksListPage.js b/e2e/pages/adf/process_services/tasksListPage.js new file mode 100644 index 0000000000..3a570480b8 --- /dev/null +++ b/e2e/pages/adf/process_services/tasksListPage.js @@ -0,0 +1,57 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); + +var TasksListPage = function () { + + var taskList = element(by.css("adf-tasklist")); + var tableBody = element.all(by.css("adf-datatable div[class='adf-datatable-body']")).first(); + + this.checkTaskIsDisplayedInTasksList = function(taskName) { + var row = by.cssContainingText("span", taskName); + Util.waitUntilElementIsVisible(taskList.element(row)); + return this; + }; + + this.selectTaskFromTasksList = function(taskName) { + var row = by.cssContainingText("span", taskName); + Util.waitUntilElementIsVisible(taskList.element(row)); + taskList.element(row).click(); + return this; + }; + + this.checkTaskIsNotDisplayedInTasksList = function(taskName) { + var row = by.cssContainingText("span", taskName); + Util.waitUntilElementIsNotOnPage(taskList.element(row)); + return this; + }; + + this.checkTaskListIsLoaded = function () { + Util.waitUntilElementIsVisible(taskList); + return this; + }; + + this.waitForTableBody = function (){ + Util.waitUntilElementIsVisible(tableBody); + }; + +}; + +module.exports = TasksListPage; + + diff --git a/e2e/pages/adf/process_services/tasksPage.js b/e2e/pages/adf/process_services/tasksPage.js new file mode 100644 index 0000000000..6ac6968524 --- /dev/null +++ b/e2e/pages/adf/process_services/tasksPage.js @@ -0,0 +1,113 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../../util/util'); +var StartTaskDialog = require('./dialog/startTaskDialog'); +var FormFields = require('./formFields'); +var TaskDetails = require('./taskDetailsPage'); +var FiltersPage = require('./filtersPage'); +var ChecklistDialog = require('./dialog/createChecklistDialog'); +var TasksListPage = require('./tasksListPage'); + +var TasksPage = function () { + + var createButton = element(by.css("button[data-automation-id='create-button']")); + var newTaskButton = element(by.css("button[data-automation-id='btn-start-task']")); + var addChecklistButton = element(by.css("button[class*='adf-add-to-checklist-button']")); + var rowByRowName = by.xpath("ancestor::mat-chip"); + var checklistContainer = by.css("div[class*='checklist-menu']"); + var taskTitle = "h2[class='activiti-task-details__header'] span"; + var rows = by.css("div[class*='adf-datatable-body'] div[class*='adf-datatable-row'] div[class*='adf-data-table-cell']"); + + + this.createNewTask = function () { + this.createButtonIsDisplayed(); + this.clickOnCreateButton(); + this.newTaskButtonIsDisplayed(); + newTaskButton.click(); + return new StartTaskDialog(); + }; + + this.createButtonIsDisplayed = function() { + Util.waitUntilElementIsVisible(createButton); + return this; + }; + + this.newTaskButtonIsDisplayed = function() { + Util.waitUntilElementIsVisible(newTaskButton); + return this; + }; + + this.clickOnCreateButton = function() { + Util.waitUntilElementIsClickable(createButton); + createButton.click(); + return this; + }; + + this.usingFormFields = function () { + return new FormFields(); + }; + + this.usingTaskDetails = function () { + return new TaskDetails(); + }; + + this.usingFiltersPage = function () { + return new FiltersPage(); + }; + + this.usingTasksListPage = function () { + return new TasksListPage(); + }; + + this.clickOnAddChecklistButton = function () { + Util.waitUntilElementIsClickable(addChecklistButton); + addChecklistButton.click(); + return new ChecklistDialog(); + }; + + this.getRowsName = function (name) { + var row = element(checklistContainer).element(by.cssContainingText("span", name)); + Util.waitUntilElementIsVisible(row); + return row; + }; + + this.getChecklistByName = function (checklist) { + var row = this.getRowsName(checklist).element(rowByRowName); + Util.waitUntilElementIsVisible(row); + return row; + }; + + this.checkChecklistIsDisplayed = function (checklist) { + Util.waitUntilElementIsVisible(this.getChecklistByName(checklist)); + return this; + }; + + this.checkTaskTitle = function(taskName) { + Util.waitUntilElementIsVisible(element(by.css(taskTitle))); + var title = element(by.cssContainingText(taskTitle, taskName)); + Util.waitUntilElementIsVisible(title); + return this; + }; + + this.getAllDisplayedRows= function(){ + return element.all(rows).count(); + }; + +}; + +module.exports = TasksPage; diff --git a/e2e/pages/adf/process_services/widgets/AttachFile.js b/e2e/pages/adf/process_services/widgets/AttachFile.js new file mode 100644 index 0000000000..3b41d9ca6d --- /dev/null +++ b/e2e/pages/adf/process_services/widgets/AttachFile.js @@ -0,0 +1,57 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormFields = require('../formFields'); +var TestConfig = require('../../../../test.config'); +var path = require('path'); +var Util = require('../../../../util/util'); + +var AttachFile = function () { + + var formFields = new FormFields(); + var uploadLocator = by.css("button[id='attachfile']"); + var localStorageButton = element(by.css("input[id='attachfile']")); + var filesListLocator = by.css("div[id='adf-attach-widget-readonly-list']"); + + this.attachFile = function (fieldId, fileLocation) { + var widget = formFields.getWidget(fieldId); + var uploadButton = widget.element(uploadLocator); + Util.waitUntilElementIsVisible(uploadButton); + uploadButton.click(); + + Util.waitUntilElementIsVisible(localStorageButton); + localStorageButton.sendKeys(path.resolve(path.join(TestConfig.main.rootPath, fileLocation))); + return this; + }; + + this.checkFileIsAttached = function (fieldId, name) { + var widget = formFields.getWidget(fieldId); + var fileAttached = widget.element(filesListLocator).element(by.cssContainingText("mat-list-item span ", name)); + Util.waitUntilElementIsVisible(fileAttached); + return this; + }; + + this.viewFile = function (name) { + var fileView = element(filesListLocator).element(by.cssContainingText("mat-list-item span ", name)); + Util.waitUntilElementIsVisible(fileView); + fileView.click(); + browser.actions().doubleClick(fileView).perform(); + return this; + }; +}; + +module.exports = AttachFile; diff --git a/e2e/pages/adf/process_services/widgets/DisplayText.js b/e2e/pages/adf/process_services/widgets/DisplayText.js new file mode 100644 index 0000000000..19694f4fa0 --- /dev/null +++ b/e2e/pages/adf/process_services/widgets/DisplayText.js @@ -0,0 +1,33 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormFields = require('../formFields'); + +var DisplayText = function () { + + var formFields = new FormFields(); + + var labelLocator = by.css("div[class*='display-text-widget']"); + + this.getFieldLabel = function (fieldId) { + return formFields.getFieldLabel(fieldId, labelLocator); + }; + +}; + +module.exports = DisplayText; + diff --git a/e2e/pages/adf/process_services/widgets/DisplayValue.js b/e2e/pages/adf/process_services/widgets/DisplayValue.js new file mode 100644 index 0000000000..09b7711b08 --- /dev/null +++ b/e2e/pages/adf/process_services/widgets/DisplayValue.js @@ -0,0 +1,34 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormFields = require('../formFields'); + +var DisplayValue = function () { + + var formFields = new FormFields(); + + var labelLocator = by.css("span[class*='unknown-text']"); + + this.getFieldLabel = function (fieldId) { + return formFields.getFieldLabel(fieldId, labelLocator); + }; + +}; + +module.exports = DisplayValue; + + diff --git a/e2e/pages/adf/process_services/widgets/Dropdown.js b/e2e/pages/adf/process_services/widgets/Dropdown.js new file mode 100644 index 0000000000..7c3b9c0d08 --- /dev/null +++ b/e2e/pages/adf/process_services/widgets/Dropdown.js @@ -0,0 +1,32 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormFields = require('../formFields'); + +var Dropdown = function () { + + var formFields = new FormFields(); + + var selectedOptionLocator = by.css("mat-select[id='dropdown'] span span"); + + this.getSelectedOptionText = function (fieldId) { + return formFields.getFieldText(fieldId, selectedOptionLocator); + }; + +}; + +module.exports = Dropdown; diff --git a/e2e/pages/adf/process_services/widgets/DynamicTable.js b/e2e/pages/adf/process_services/widgets/DynamicTable.js new file mode 100644 index 0000000000..adede7648e --- /dev/null +++ b/e2e/pages/adf/process_services/widgets/DynamicTable.js @@ -0,0 +1,37 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormFields = require('../formFields'); + +var DynamicTable = function () { + + var formFields = new FormFields(); + + var labelLocator = by.css("dynamic-table-widget div div"); + var columnNameLocator = by.css("table[id*='dynamic-table'] th"); + + this.getFieldLabel = function (fieldId) { + return formFields.getFieldLabel(fieldId, labelLocator); + }; + + this.getColumnName = function (fieldId) { + return formFields.getFieldText(fieldId, columnNameLocator); + }; + +}; + +module.exports = DynamicTable; diff --git a/e2e/pages/adf/process_services/widgets/Header.js b/e2e/pages/adf/process_services/widgets/Header.js new file mode 100644 index 0000000000..7dabf4ed3e --- /dev/null +++ b/e2e/pages/adf/process_services/widgets/Header.js @@ -0,0 +1,32 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormFields = require('../formFields'); + +var Header = function () { + + var formFields = new FormFields(); + + var labelLocator = by.css("span[id='container-header-label']"); + + this.getFieldLabel = function (fieldId) { + return formFields.getFieldLabel(fieldId, labelLocator); + }; + +}; + +module.exports = Header; diff --git a/e2e/pages/adf/process_services/widgets/Hyperlink.js b/e2e/pages/adf/process_services/widgets/Hyperlink.js new file mode 100644 index 0000000000..880b8d9c37 --- /dev/null +++ b/e2e/pages/adf/process_services/widgets/Hyperlink.js @@ -0,0 +1,32 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormFields = require('../formFields'); + +var Hyperlink = function () { + + var formFields = new FormFields(); + + var fieldLocator = by.css("div[class='adf-hyperlink-widget '] a"); + + this.getFieldText = function (fieldId) { + return formFields.getFieldText(fieldId, fieldLocator); + }; + +}; + +module.exports = Hyperlink; diff --git a/e2e/pages/adf/process_services/widgets/MultilineText.js b/e2e/pages/adf/process_services/widgets/MultilineText.js new file mode 100644 index 0000000000..007ae8abdf --- /dev/null +++ b/e2e/pages/adf/process_services/widgets/MultilineText.js @@ -0,0 +1,33 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormFields = require('../formFields'); + +var MultilineText = function () { + + var formFields = new FormFields(); + + var valueLocator = by.css("textarea"); + + this.getFieldValue = function (fieldId) { + return formFields.getFieldValue(fieldId, valueLocator); + }; + +}; + +module.exports = MultilineText; + diff --git a/e2e/pages/adf/process_services/widgets/RadioButtons.js b/e2e/pages/adf/process_services/widgets/RadioButtons.js new file mode 100644 index 0000000000..8043e8a1de --- /dev/null +++ b/e2e/pages/adf/process_services/widgets/RadioButtons.js @@ -0,0 +1,34 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var FormFields = require('../formFields'); +var Util = require('../../../../util/util'); + +var RadioButtons = function () { + + var formFields = new FormFields(); + + this.getSpecificOptionLabel = function (fieldId, optionNumber) { + var optionLocator = by.css("label[for*='radiobuttons-option_" + optionNumber + "'] div[class*='content']"); + var option = formFields.getWidget(fieldId).element(optionLocator); + Util.waitUntilElementIsVisible(option); + return option.getText(); + }; + +}; + +module.exports = RadioButtons; diff --git a/e2e/pages/adf/process_services/widgets/usingWidget.js b/e2e/pages/adf/process_services/widgets/usingWidget.js new file mode 100644 index 0000000000..397acd957f --- /dev/null +++ b/e2e/pages/adf/process_services/widgets/usingWidget.js @@ -0,0 +1,69 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var MultilineText = require('./MultilineText'); +var Header = require('./Header'); +var DisplayText = require('./DisplayText'); +var AttachFile = require('./AttachFile'); +var DisplayValue = require('./DisplayValue'); +var RadioButtons = require('./RadioButtons'); +var Hyperlink = require('./Hyperlink'); +var Dropdown = require('./Dropdown'); +var DynamicTable = require('./DynamicTable'); + +var UsingWidget = function () { + + this.usingMultilineTextWidget = function () { + return new MultilineText(); + }; + + this.usingHeaderWidget = function () { + return new Header(); + }; + + this.usingDisplayTextWidget = function () { + return new DisplayText(); + }; + + this.usingAttachFileWidget = function () { + return new AttachFile(); + }; + + this.usingDisplayValueWidget = function () { + return new DisplayValue(); + }; + + this.usingRadioWidget = function () { + return new RadioButtons(); + }; + + this.usingHyperlink = function () { + return new Hyperlink(); + }; + + this.usingDropdown = function () { + return new Dropdown(); + }; + + this.usingDynamicTable = function () { + return new DynamicTable(); + }; + +}; + +module.exports = UsingWidget; + diff --git a/e2e/pages/adf/searchResultsPage.js b/e2e/pages/adf/searchResultsPage.js new file mode 100644 index 0000000000..7ac41bbbaf --- /dev/null +++ b/e2e/pages/adf/searchResultsPage.js @@ -0,0 +1,187 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); +var ContentList = require('./dialog/contentList'); +var DatatablePage = require('./dataTablePage'); + +var SearchResultsPage = function () { + + var noResultsMessage = element(by.css("div[class='adf-no-result-message']")); + var noResultsMessageBy = by.css("div[class='adf-no-result-message']"); + var contentList = new ContentList(); + var dataTable = new DatatablePage(); + var sortArrowLocator = by.css("adf-sorting-picker button mat-icon"); + var sortDropdownLocator = by.css("mat-option span"); + var sortingArrow = element(by.css("adf-sorting-picker div[class='mat-select-arrow']")); + + this.checkContentIsDisplayed = function (content) { + contentList.checkContentIsDisplayed(content); + return this; + }; + + this.numberOfResultsDisplayed = function () { + return contentList.getAllDisplayedRows(); + }; + + this.checkContentIsNotDisplayed = function (content) { + Util.waitUntilElementIsNotOnPage(element(by.css("span[title='" + content +"']"))); + }; + + this.checkNoResultMessageIsDisplayed = function() { + Util.waitUntilElementIsPresent(element(noResultsMessageBy)); + Util.waitUntilElementIsVisible(element(noResultsMessageBy)); + return this; + }; + + this.checkNoResultMessageIsNotDisplayed = function () { + Util.waitUntilElementIsNotOnPage(noResultsMessage); + return this; + }; + + this.navigateToFolder = function(content) { + dataTable.navigateToContent(content); + return this; + }; + + this.deleteContent = function(content) {
 + contentList.deleteContent(content); + 
}; + + this.copyContent = function(content) {
 + contentList.copyContent(content); + 
}; + + this.moveContent = function(content) {
 + contentList.moveContent(content);
 + }; + + /** + * Sort the list by name column. + * + * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant + */ + this.sortByName = function (sortOrder) { + this.sortBy(sortOrder, "Name"); + }; + + /** + * Sort the list by any option. + * + * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant + * @param option + */ + this.sortBy = function (sortOrder, option) { + + Util.waitUntilElementIsVisible(sortingArrow); + sortingArrow.click(); + + element.all(sortDropdownLocator).each(function(element) { + element.getText().then(function(text) { + if (text === option) { + element.click(); + } + }); + }); + + this.sortByOrder(sortOrder); + }; + + this.sortByOrder = function(sortOrder) { + Util.waitUntilElementIsVisible(element(sortArrowLocator)); + return element(sortArrowLocator).getText().then(function (result) { + if(sortOrder===true) { + if(result !== 'arrow_upward') { + element(sortArrowLocator).click(); + }; + } + else { + if(result === 'arrow_upward') { + element(sortArrowLocator).click(); + }; + } + + return Promise.resolve(); + }); + }; + + /** + * Sort the list by author column. + * + * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant + */ + this.sortByAuthor = function (sortOrder) { + contentList.sortByAuthor(sortOrder); + }; + + /** + * Sort the list by created column. + * + * @param sortOrder: 'true' to sort the list ascendant and 'false' for descendant + */ + this.sortByCreated = function (sortOrder) { + return contentList.sortByCreated(sortOrder); + }; + + /** + * Sort by name and check the list is sorted. + * + * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @return result : 'true' if the list is sorted as expected and 'false' if it isn't + */ + this.sortAndCheckListIsOrderedByName = function (sortOrder) { + this.sortByName(sortOrder); + dataTable.waitForTableBody(); + var deferred = protractor.promise.defer(); + contentList.checkListIsOrderedByNameColumn(sortOrder).then(function(result) { + deferred.fulfill(result); + }); + return deferred.promise; + }; + + /** + * Sort by author and check the list is sorted. + * + * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @return result : 'true' if the list is sorted as expected and 'false' if it isn't + */ + this.sortAndCheckListIsOrderedByAuthor = function (sortOrder) { + this.sortByAuthor(sortOrder); + var deferred = protractor.promise.defer(); + contentList.checkListIsOrderedByAuthorColumn(sortOrder).then(function(result) { + deferred.fulfill(result); + }); + return deferred.promise; + }; + + /** + * Sort by created and check the list is sorted. + * + * @param sortOrder: 'true' if the list is expected to be sorted ascendant and 'false' for descendant + * @return result : 'true' if the list is sorted as expected and 'false' if it isn't + */ + this.sortAndCheckListIsOrderedByCreated = function (sortOrder) { + this.sortByCreated(sortOrder); + var deferred = protractor.promise.defer(); + contentList.checkListIsOrderedByCreatedColumn(sortOrder).then(function(result) { + deferred.fulfill(result); + }); + return deferred.promise; + }; + +}; +module.exports = SearchResultsPage; diff --git a/e2e/pages/adf/settingsPage.js b/e2e/pages/adf/settingsPage.js new file mode 100644 index 0000000000..de3b1e73ce --- /dev/null +++ b/e2e/pages/adf/settingsPage.js @@ -0,0 +1,131 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var TestConfig = require('../../test.config'); +var Util = require('../../util/util'); + +var SettingsPage = function () { + + var settingsURL = TestConfig.adf.url + TestConfig.adf.port + "/settings"; + var providerDropdown = element(by.css("mat-select[aria-label='Provider'] div[class='mat-select-arrow-wrapper']")); + var ecmAndBpm = { + option: element(by.xpath("//SPAN[@class='mat-option-text'][contains(text(),'ALL')]")), + text: "ALL" + }; + var bpm = { + option: element(by.xpath("//SPAN[@class='mat-option-text'][contains(text(),'BPM') and not (contains(text(),'and'))]")), + text: "BPM" + }; + var ecm = { + option: element(by.xpath("//SPAN[@class='mat-option-text'][contains(text(),'ECM') and not (contains(text(),'and'))]")), + text: "ECM" + }; + var oauth = { + option: element(by.xpath("//SPAN[@class='mat-option-text'][contains(text(),'OAUTH')]")), + text: "OAUTH" + }; + var selectedOption = element.all(by.css("span[class*='ng-star-inserted']")).first(); + var ecmText = element(by.css("input[data-automation-id*='ecmHost']")); + var bpmText = element(by.css("input[data-automation-id*='bpmHost']")); + var authHostText = element(by.css("input[id='oauthHost']")); + var silentLoginToggle = element(by.css("mat-slide-toggle[name='silentLogin'] div[class='mat-slide-toggle-thumb']")); + var silentLoginEnabled = element(by.css("mat-slide-toggle[class*='mat-checked'][name='silentLogin'] div[class='mat-slide-toggle-thumb']")); + var backButton = element(by.cssContainingText("span[class='mat-button-wrapper']", "Back")); + var applyButton = element(by.css("button[data-automation-id*='host-button']")); + + this.goToSettingsPage = function () { + browser.driver.get(settingsURL); + Util.waitUntilElementIsVisible(providerDropdown); + return this; + }; + + /** + * Selects provider + * @method setProvider + * @param {String} option, {String} selected + */ + this.setProvider = function (option, selected) { + Util.waitUntilElementIsVisible(providerDropdown); + providerDropdown.click(); + Util.waitUntilElementIsVisible(option); + option.click(); + return expect(selectedOption.getText()).toEqual(selected); + }; + + /** + * Sets provider as ECM and BPM + * @method setProviderEcmBpm + */ + this.setProviderEcmBpm = function () { + this.goToSettingsPage(); + this.setProvider(ecmAndBpm.option, ecmAndBpm.text); + Util.waitUntilElementIsVisible(bpmText); + Util.waitUntilElementIsVisible(ecmText); + this.clickApply(); + return this; + }; + + /** + * Sets provider as BPM + * @method setProviderBpm + */ + this.setProviderBpm = function () { + this.goToSettingsPage(); + this.setProvider(bpm.option, bpm.text); + Util.waitUntilElementIsVisible(bpmText); + expect(ecmText.isPresent()).toBe(false); + this.clickApply(); + return this; + }; + + /** + * Sets provider as ECM + * @method setProviderEcm + */ + this.setProviderEcm = function () { + this.goToSettingsPage(); + this.setProvider(ecm.option, ecm.text); + Util.waitUntilElementIsVisible(ecmText); + expect(bpmText.isPresent()).toBe(false); + this.clickApply(); + return this; + }; + + /** + * Sets provider as OAUTH + * @method setProviderOauth + */ + this.setProviderOauth = function () { + this.goToSettingsPage(); + this.setProvider(oauth.option, oauth.text); + Util.waitUntilElementIsVisible(bpmText); + Util.waitUntilElementIsVisible(ecmText); + expect(authHostText.isPresent()).toBe(true); + this.clickApply(); + return this; + }; + + /** + * Clicks Apply button + * @method clickApply + */ + this.clickApply = function () { + Util.waitUntilElementIsVisible(applyButton); + applyButton.click(); + }; +}; +module.exports = SettingsPage; diff --git a/e2e/pages/adf/tagPage.js b/e2e/pages/adf/tagPage.js new file mode 100644 index 0000000000..ae58ff84bb --- /dev/null +++ b/e2e/pages/adf/tagPage.js @@ -0,0 +1,143 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var TestConfig = require('../../test.config'); +var Util = require('../../util/util'); +var ContentList = require('./dialog/contentList'); + +var TagPage = function () { + + var tagURL = TestConfig.adf.url + TestConfig.adf.port + "/tag"; + var addTagButton = element(by.css("button[id='add-tag']")); + var insertNodeId = element(by.css("input[id='nodeId']")); + var newTagInput = element(by.css("input[id='new-tag-text']")); + var tagListRow = element(by.css("adf-tag-node-actions-list mat-list-item")); + var tagListByNodeIdRow = element(by.css("adf-tag-node-list mat-chip")); + var errorMessage = element(by.css("mat-hint[data-automation-id='errorMessage']")); + var tagListRowLocator = by.css("adf-tag-node-actions-list mat-list-item div"); + var tagListByNodeIdRowLocator = by.css("adf-tag-node-list mat-chip span"); + var tagListContentServicesRowLocator = by.css("div[class='adf-list-tag']"); + + this.goToTagPage = function () { + browser.driver.get(tagURL); + Util.waitUntilElementIsVisible(addTagButton); + return this; + }; + + this.getNodeId = function () { + Util.waitUntilElementIsVisible(insertNodeId); + return insertNodeId.getAttribute('value'); + }; + + this.insertNodeId = function (nodeId) { + Util.waitUntilElementIsVisible(insertNodeId); + insertNodeId.sendKeys(nodeId); + browser.driver.sleep(200); + insertNodeId.sendKeys(' ') + browser.driver.sleep(200); + insertNodeId.sendKeys(protractor.Key.BACK_SPACE); + }; + + this.addNewTagInput = function (tag) { + Util.waitUntilElementIsVisible(newTagInput); + newTagInput.sendKeys(tag); + return this; + }; + + this.addTag = function (tag) { + this.addNewTagInput(tag); + Util.waitUntilElementIsVisible(addTagButton); + Util.waitUntilElementIsClickable(addTagButton); + Util.waitUntilElementIsPresent(addTagButton); + addTagButton.click(); + return this; + }; + + this.getNewTagInput = function () { + Util.waitUntilElementIsVisible(newTagInput); + return newTagInput.getAttribute('value'); + }; + + this.getNewTagPlaceholder = function () { + Util.waitUntilElementIsVisible(newTagInput); + return newTagInput.getAttribute("placeholder"); + }; + + this.addTagButtonIsEnabled = function () { + Util.waitUntilElementIsVisible(addTagButton); + return addTagButton.isEnabled(); + }; + + this.checkTagIsDisplayedInTagList = function (tagName) { + var tag = element(by.cssContainingText("div[id*='tag_name']", tagName)); + return Util.waitUntilElementIsVisible(tag); + }; + + this.checkTagIsNotDisplayedInTagList = function (tagName) { + var tag = element(by.cssContainingText("div[id*='tag_name']", tagName)); + return Util.waitUntilElementIsNotOnPage(tag); + }; + + this.checkTagListIsEmpty = function () { + Util.waitUntilElementIsNotOnPage(tagListRow); + }; + + this.checkTagIsDisplayedInTagListByNodeId = function (tagName) { + var tag = element(by.cssContainingText("span[id*='tag_name']", tagName)); + return Util.waitUntilElementIsVisible(tag); + }; + + this.checkTagListByNodeIdIsEmpty = function () { + return Util.waitUntilElementIsNotOnPage(tagListByNodeIdRow); + }; + + this.checkTagIsDisplayedInTagListContentServices = function (tagName) { + var tag = element(by.cssContainingText("div[class='adf-list-tag'][id*='tag_name']", tagName)); + return Util.waitUntilElementIsVisible(tag); + }; + + this.getErrorMessage = function () { + Util.waitUntilElementIsPresent(errorMessage); + return errorMessage.getText(); + }; + + this.checkTagListIsOrderedAscending = function () { + var deferred = protractor.promise.defer(); + new ContentList().checkListIsSorted(false, tagListRowLocator).then(function (result) { + deferred.fulfill(result); + }); + return deferred.promise; + }; + + this.checkTagListByNodeIdIsOrderedAscending = function () { + var deferred = protractor.promise.defer(); + new ContentList().checkListIsSorted(false, tagListByNodeIdRowLocator).then(function (result) { + deferred.fulfill(result); + }); + return deferred.promise; + }; + + this.checkTagListContentServicesIsOrderedAscending = function () { + var deferred = protractor.promise.defer(); + new ContentList().checkListIsSorted(false, tagListContentServicesRowLocator).then(function (result) { + deferred.fulfill(result); + }); + return deferred.promise; + }; + +}; +module.exports = TagPage; diff --git a/e2e/pages/adf/trashcanPage.js b/e2e/pages/adf/trashcanPage.js new file mode 100644 index 0000000000..3e256dd14e --- /dev/null +++ b/e2e/pages/adf/trashcanPage.js @@ -0,0 +1,39 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); + +var TrashcanPage = function () { + + var rows = by.css("adf-document-list div[class*='adf-datatable-body'] div[class*='adf-datatable-row']"); + var tableBody = element.all(by.css("adf-document-list div[class='adf-datatable-body']")).first(); + var pagination = element(by.css("adf-pagination")); + + this.numberOfResultsDisplayed = function () { + return element.all(rows).count(); + }; + + this.waitForTableBody = function (){ + Util.waitUntilElementIsVisible(tableBody); + }; + + this.waitForPagination = function (){ + Util.waitUntilElementIsVisible(pagination); + }; + +}; +module.exports = TrashcanPage; diff --git a/e2e/pages/adf/viewerPage.js b/e2e/pages/adf/viewerPage.js new file mode 100644 index 0000000000..0f6a4206dd --- /dev/null +++ b/e2e/pages/adf/viewerPage.js @@ -0,0 +1,202 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var Util = require('../../util/util'); +var CardViewPage = require('./cardViewPage'); + +var ViewerToolbarPage = function () { + + var closeButton = element(by.css("button[data-automation-id='toolbar-back']")); + var fileThumbnail = element(by.css("img[class='adf-viewer__mimeicon']")); + var fileName = element(by.id('adf-viewer-display-name')); + var downloadButton = element(by.css("button[data-automation-id='toolbar-download'] > span > mat-icon")); + var infoButton = element(by.css("button[data-automation-id='toolbar-sidebar']")); + var infoSideBar = element(by.css("div[class='adf-info-drawer-layout-header']")); + var previousPageButton = element(by.id('viewer-previous-page-button')); + var nextPageButton = element(by.id('viewer-next-page-button')); + var pageSelectorInput = element(by.css("div[class='adf-pdf-viewer__toolbar-page-selector'] input")); + var zoomInButton = element(by.id('viewer-zoom-in-button')); + var zoomOutButton = element(by.id('viewer-zoom-out-button')); + var scalePageButton = element(by.id('viewer-scale-page-button')); + var imgContainer = element(by.id('viewer-image')); + var pdfContainer = element(by.id('viewer-pdf-container')); + var mediaContainer = element(by.css("adf-media-player[class='adf-media-player ng-star-inserted']")); + var unsupportedFileContainer = element(by.cssContainingText('.label','Document preview could not be loaded')); + var allPages = element.all(by.css("div[class='canvasWrapper'] > canvas")).first(); + var pageCanvas = element.all(by.css("div[class='canvasWrapper']")).first(); + + this.canvasHeight = function () { + var deferred = protractor.promise.defer(); + pageCanvas.getAttribute("style").then(function (value) { + var canvasHeight = value.split("height: ")[1].split("px")[0]; + deferred.fulfill(canvasHeight); + }); + return deferred.promise; + }; + + this.canvasWidth = function () { + var deferred = protractor.promise.defer(); + pageCanvas.getAttribute("style").then(function (value) { + var canvasWidth = value.split("width: ")[1].split("px")[0]; + deferred.fulfill(canvasWidth); + }); + return deferred.promise; + }; + + this.viewFile = function (fileName) { + var fileView = element(by.xpath("//div[@class='document-list-container']//span[@title='" + fileName +"']")); + Util.waitUntilElementIsVisible(fileView); + fileView.click(); + browser.actions().sendKeys(protractor.Key.ENTER).perform(); + }; + + this.checkCloseButtonIsDisplayed = function () { + Util.waitUntilElementIsVisible(closeButton); + }; + + this.checkDownloadButtonIsDisplayed = function () { + Util.waitUntilElementIsVisible(downloadButton); + }; + + this.checkInfoButtonIsDisplayed = function () { + Util.waitUntilElementIsVisible(infoButton); + }; + + this.clickCloseButton = function () { + Util.waitUntilElementIsVisible(closeButton); + closeButton.click(); + }; + + this.checkFileThumbnailIsDisplayed = function () { + Util.waitUntilElementIsVisible(fileThumbnail); + }; + + this.checkFileNameIsDisplayed = function (file) { + Util.waitUntilElementIsVisible(fileName); + expect(fileName.getText()).toEqual(file); + }; + + this.clickDownloadButton = function () { + Util.waitUntilElementIsVisible(downloadButton); + downloadButton.click(); + }; + + this.clickInfoButton = function () { + Util.waitUntilElementIsVisible(infoButton); + infoButton.click(); + return new CardViewPage(); + }; + + this.checkInfoSideBarIsNotDisplayed = function () { + Util.waitUntilElementIsNotVisible(infoSideBar); + }; + + this.checkInfoSideBarIsDisplayed = function () { + Util.waitUntilElementIsVisible(infoSideBar); + }; + + this.checkInfoSideBarIsNotDisplayed = function () { + Util.waitUntilElementIsNotOnPage(infoSideBar); + }; + + this.checkPreviousPageButtonIsDisplayed =function () { + Util.waitUntilElementIsVisible(previousPageButton); + }; + + this.clickPreviousPageButton = function () { + Util.waitUntilElementIsVisible(previousPageButton); + previousPageButton.click(); + }; + + this.checkNextPageButtonIsDisplayed = function () { + Util.waitUntilElementIsVisible(nextPageButton); + }; + + this.clickNextPageButton = function () { + Util.waitUntilElementIsVisible(nextPageButton); + nextPageButton.click(); + }; + + this.checkZoomInButtonIsDisplayed = function () { + Util.waitUntilElementIsVisible(zoomInButton); + }; + + this.clickZoomInButton = function () { + Util.waitUntilElementIsVisible(zoomInButton); + zoomInButton.click(); + }; + + this.checkZoomOutButtonIsDisplayed = function () { + Util.waitUntilElementIsVisible(zoomOutButton); + }; + + this.clickZoomOutButton = function () { + Util.waitUntilElementIsVisible(zoomOutButton); + zoomOutButton.click(); + }; + + this.checkScalePageButtonIsDisplayed = function () { + Util.waitUntilElementIsVisible(scalePageButton); + }; + + this.clickScalePageButton = function () { + Util.waitUntilElementIsVisible(scalePageButton); + scalePageButton.click(); + }; + + this.checkPageSelectorInputIsDisplayed = function (number) { + Util.waitUntilElementIsVisible(pageSelectorInput); + pageSelectorInput.getAttribute('value').then(function (pageNumber) { + expect(pageNumber).toEqual(number); + }) + }; + + this.enterPage = function (number) { + Util.waitUntilElementIsVisible(pageSelectorInput); + pageSelectorInput.clear(); + pageSelectorInput.sendKeys(number); + pageSelectorInput.sendKeys(protractor.Key.ENTER); + }; + + this.checkImgContainerIsDisplayed = function () { + Util.waitUntilElementIsVisible(imgContainer); + }; + + this.checkPdfContainerIsDisplayed = function () { + Util.waitUntilElementIsVisible(pdfContainer); + }; + + this.checkMediaPlayerContainerIsDisplayed = function () { + Util.waitUntilElementIsVisible(mediaContainer); + }; + + this.checkUnsupportedFileContainerIsDisplayed = function () { + Util.waitUntilElementIsVisible(unsupportedFileContainer); + }; + + this.checkFileContent = function (pageNumber, text) { + var pageLoaded = element.all(by.css("div[data-page-number='" + pageNumber + "'][data-loaded='true']")).first(); + var textLayerLoaded = element.all(by.css("div[data-page-number='" + pageNumber + "'] div[class='textLayer'] > div")).first(); + var specificText = element.all(by.cssContainingText("div[data-page-number='" + pageNumber + "'] div[class='textLayer'] > div", text)).first(); + Util.waitUntilElementIsVisible(allPages); + Util.waitUntilElementIsVisible(pageLoaded); + Util.waitUntilElementIsVisible(textLayerLoaded); + Util.waitUntilElementIsVisible(specificText); + }; +}; + +module.exports = ViewerToolbarPage; diff --git a/e2e/pagination_empty_current_page.e2e.ts b/e2e/pagination_empty_current_page.e2e.ts new file mode 100644 index 0000000000..f8d3c5f136 --- /dev/null +++ b/e2e/pagination_empty_current_page.e2e.ts @@ -0,0 +1,120 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ContentServicesPage = require('./pages/adf/contentServicesPage'); +import PaginationPage = require('./pages/adf/paginationPage'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import FolderModel = require('./models/ACS/folderModel'); + +import TestConfig = require('./test.config'); +import Util = require('./util/util'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Pagination - returns to previous page when current is empty', () => { + + let loginPage = new LoginPage(); + let contentServicesPage = new ContentServicesPage(); + let paginationPage = new PaginationPage(); + + let acsUser = new AcsUserModel(); + let folderModel = new FolderModel({ 'name': 'folderOne' }); + + let fileNames = [], nrOfFiles = 6; + let lastFile = 'newFile6.txt'; + + let itemsPerPage = { + five: '5', + fiveValue: 5 + }; + + let files = { + base: 'newFile', + extension: '.txt' + }; + + beforeAll(async (done) => { + let uploadActions = new UploadActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + fileNames = Util.generateSeqeunceFiles(1, nrOfFiles, files.base, files.extension); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + let folderUploadedModel = await uploadActions.uploadFolder(this.alfrescoJsApi, folderModel.name, '-my-'); + + await uploadActions.createEmptyFiles(this.alfrescoJsApi, fileNames, folderUploadedModel.entry.id); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + contentServicesPage.goToDocumentList(); + + done(); + }); + + xit('Pagination - returns to previous page when current is empty', () => { + contentServicesPage.navigateToFolder(folderModel.name); + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + + paginationPage.selectItemsPerPage(itemsPerPage.five); + + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fiveValue); + + contentServicesPage.getAllRowsNameColumn().then((list) => { + expect(Util.arrayContainsArray(list, fileNames.slice(0, 5))).toEqual(true); + }); + + paginationPage.clickOnNextPage(); + + contentServicesPage.checkAcsContainer(); + contentServicesPage.waitForTableBody(); + + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + + contentServicesPage.getAllRowsNameColumn().then((list) => { + expect(Util.arrayContainsArray(list, fileNames.slice(5, 6))).toEqual(true); + }); + + contentServicesPage.deleteContent(lastFile); + contentServicesPage.checkContentIsNotDisplayed(lastFile); + + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(contentServicesPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fiveValue); + + contentServicesPage.getAllRowsNameColumn().then((list) => { + expect(Util.arrayContainsArray(list, fileNames.slice(0, 5))).toEqual(true); + }); + + }); + +}); diff --git a/e2e/pagination_processlist_addingProcesses.e2e.ts b/e2e/pagination_processlist_addingProcesses.e2e.ts new file mode 100644 index 0000000000..ea23e395c1 --- /dev/null +++ b/e2e/pagination_processlist_addingProcesses.e2e.ts @@ -0,0 +1,104 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import PaginationPage = require('./pages/adf/paginationPage'); +import ProcessFiltersPage = require('./pages/adf/process_services/processFiltersPage'); +import ProcessDetailsPage = require('./pages/adf/process_services/processDetailsPage'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { AppsActions } from './actions/APS/apps.actions'; +import { UsersActions } from './actions/users.actions'; + +describe('Test Process List - Pagination when adding processes', () => { + + let itemsPerPage = { + fifteen: '15', + fifteenValue: 15 + }; + + let loginPage = new LoginPage(); + let processServicesPage = new ProcessServicesPage(); + let paginationPage = new PaginationPage(); + let processFiltersPage = new ProcessFiltersPage(); + let processDetailsPage = new ProcessDetailsPage(); + + let processUserModel; + let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; + let nrOfProcesses = 25; + let page, totalPages; + + beforeAll(async (done) => { + let apps = new AppsActions(); + let users = new UsersActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + processUserModel = await users.createTenantAndUser(this.alfrescoJsApi); + + await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password); + + let resultApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + + for (let i = 0; i < nrOfProcesses; i++) { + await apps.startProcess(this.alfrescoJsApi, resultApp); + } + + loginPage.loginToProcessServicesUsingUserModel(processUserModel); + + done(); + }); + + it('[C261046] Items per page set to 15 and adding of processes', () => { + totalPages = 2; + page = 1; + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.fifteen); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue * page + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.fifteenValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + + page++; + paginationPage.clickOnNextPage(); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + nrOfProcesses + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(nrOfProcesses - itemsPerPage.fifteenValue); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsEnabled(); + }); +}); diff --git a/e2e/pagination_tasklist_addingTasks.e2e.ts b/e2e/pagination_tasklist_addingTasks.e2e.ts new file mode 100644 index 0000000000..160fb27806 --- /dev/null +++ b/e2e/pagination_tasklist_addingTasks.e2e.ts @@ -0,0 +1,95 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import TasksPage = require('./pages/adf/process_services/tasksPage'); +import PaginationPage = require('./pages/adf/paginationPage'); + +import CONSTANTS = require('./util/constants'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { AppsActions } from './actions/APS/apps.actions'; +import { UsersActions } from './actions/users.actions'; + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +describe('Items per page set to 15 and adding of tasks', () => { + + let loginPage = new LoginPage(); + let processServicesPage = new ProcessServicesPage(); + let taskPage = new TasksPage(); + let paginationPage = new PaginationPage(); + + let processUserModel; + let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; + let currentPage = 1, nrOfTasks = 25, totalPages = 2; + + let itemsPerPage = { + fifteen: '15', + fifteenValue: 15 + }; + + beforeAll(async (done) => { + let apps = new AppsActions(); + let users = new UsersActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + processUserModel = await users.createTenantAndUser(this.alfrescoJsApi); + + await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password); + + let resultApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + + for (let i = 0; i < nrOfTasks; i++) { + await apps.startProcess(this.alfrescoJsApi, resultApp); + } + + loginPage.loginToProcessServicesUsingUserModel(processUserModel); + + done(); + }); + + it('Items per page set to 15 and adding of tasks', () => { + processServicesPage.goToProcessServices().goToTaskApp(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + paginationPage.selectItemsPerPage(itemsPerPage.fifteen); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.fifteenValue); + currentPage++; + paginationPage.clickOnNextPage(); + + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + nrOfTasks + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(nrOfTasks - itemsPerPage.fifteenValue); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsEnabled(); + }); + +}); diff --git a/e2e/process_filters_component.e2e.ts b/e2e/process_filters_component.e2e.ts new file mode 100644 index 0000000000..b39f99f163 --- /dev/null +++ b/e2e/process_filters_component.e2e.ts @@ -0,0 +1,125 @@ +/*! + * @license + * Copyright 2016 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 TestConfig = require('./test.config'); +import resources = require('./util/resources'); +import LoginPage = require('./pages/adf/loginPage'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import StartProcessPage = require('./pages/adf/process_services/startProcessPage'); +import ProcessFiltersPage = require('./pages/adf/process_services/processFiltersPage'); +import AppNavigationBarPage = require('./pages/adf/process_services/appNavigationBarPage'); +import ProcessDetailsPage = require('./pages/adf/process_services/processDetailsPage'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { AppsActions } from './actions/APS/apps.actions'; +import { UsersActions } from './actions/users.actions'; + +describe('Process Filters Test', () => { + + let loginPage = new LoginPage(); + let navigationBarPage = new NavigationBarPage(); + let processServicesPage = new ProcessServicesPage(); + let startProcessPage = new StartProcessPage(); + let processFiltersPage = new ProcessFiltersPage(); + let appNavigationBarPage = new AppNavigationBarPage(); + let processDetailsPage = new ProcessDetailsPage(); + + let app = resources.Files.APP_WITH_DATE_FIELD_FORM; + + let processTitle = { + running: 'Test_running', + completed: 'Test_completed' + }; + let processFilter = { + running: 'Running', + all: 'All', + completed: 'Completed' + }; + + beforeAll(async (done) => { + let apps = new AppsActions(); + let users = new UsersActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + let user = await users.createTenantAndUser(this.alfrescoJsApi); + + await this.alfrescoJsApi.login(user.email, user.password); + + await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + + await loginPage.loginToProcessServicesUsingUserModel(user); + + done(); + }); + + it('Navigate to Running filter', () => { + navigationBarPage.clickProcessServicesButton(); + + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + + appNavigationBarPage.clickProcessButton(); + + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + + startProcessPage.enterProcessName(processTitle.completed); + startProcessPage.selectFromProcessDropdown(app.process_title); + startProcessPage.clickFormStartProcessButton(); + + processDetailsPage.clickCancelProcessButton(); + navigationBarPage.clickProcessServicesButton(); + + processServicesPage.goToApp(app.title); + + appNavigationBarPage.clickProcessButton(); + + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + + startProcessPage.enterProcessName(processTitle.running); + startProcessPage.selectFromProcessDropdown(app.process_title); + startProcessPage.clickFormStartProcessButton(); + + processFiltersPage.checkFilterIsHighlighted(processFilter.running); + processFiltersPage.selectFromProcessList(processTitle.running); + + processDetailsPage.checkProcessDetailsCard(); + }); + + it('Navigate to All filter', () => { + processFiltersPage.clickAllFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilter.all); + processFiltersPage.selectFromProcessList(processTitle.running); + processFiltersPage.selectFromProcessList(processTitle.completed); + processDetailsPage.checkProcessDetailsCard(); + }); + + it('Navigate to Completed filter', () => { + processFiltersPage.clickCompletedFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilter.completed); + processFiltersPage.selectFromProcessList(processTitle.completed); + processDetailsPage.checkProcessDetailsCard(); + }); +}); diff --git a/e2e/processlist_pagination.e2e.ts b/e2e/processlist_pagination.e2e.ts new file mode 100644 index 0000000000..70f5ad7d2f --- /dev/null +++ b/e2e/processlist_pagination.e2e.ts @@ -0,0 +1,357 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import PaginationPage = require('./pages/adf/paginationPage'); +import ProcessFiltersPage = require('./pages/adf/process_services/processFiltersPage'); +import ProcessDetailsPage = require('./pages/adf/process_services/processDetailsPage'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +import Util = require('./util/util'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { AppsActions } from './actions/APS/apps.actions'; +import { UsersActions } from './actions/users.actions'; + +describe('Test Process List - Pagination', function () { + + let itemsPerPage = { + five: '5', + fiveValue: 5, + ten: '10', + tenValue: 10, + fifteen: '15', + fifteenValue: 15, + twenty: '20', + twentyValue: 20, + default: '25' + }; + + let processFilterRunning = 'Running'; + + let loginPage = new LoginPage(); + let processServicesPage = new ProcessServicesPage(); + let paginationPage = new PaginationPage(); + let processFiltersPage = new ProcessFiltersPage(); + let processDetailsPage = new ProcessDetailsPage(); + let navigationBarPage = new NavigationBarPage(); + + let processUserModel; + let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; + let nrOfProcesses = 20; + let page, totalPages, processNameBase = 'process'; + let processNames = Util.generateSeqeunceFiles(10, nrOfProcesses + 9, processNameBase, ''); + + beforeAll(async (done) => { + let apps = new AppsActions(); + let users = new UsersActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + processUserModel = await users.createTenantAndUser(this.alfrescoJsApi); + + await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password); + + let resultApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + + for (let i = 0; i < nrOfProcesses; i++) { + await apps.startProcess(this.alfrescoJsApi, resultApp); + } + + loginPage.loginToProcessServicesUsingUserModel(processUserModel); + + done(); + }); + + xit('[C261042] Default pagination', function () { + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.checkNoContentMessage(); + paginationPage.checkPaginationIsNotDisplayed(); + + page = 1; + totalPages = 1; + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilterRunning); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfProcesses + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(nrOfProcesses); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + }); + + xit('[C261043] Items per page set to 15', function () { + page = 1; + totalPages = 2; + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilterRunning); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.fifteen); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue * page + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.fifteenValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + + page++; + paginationPage.clickOnNextPage(); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + nrOfProcesses + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(nrOfProcesses - itemsPerPage.fifteenValue); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsEnabled(); + + page = 1; + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilterRunning); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + }); + + xit('[C261044] Items per page set to 10', function () { + page = 1; + totalPages = 2; + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilterRunning); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.ten); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue * page + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.tenValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + + page++; + paginationPage.clickOnNextPage(); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + nrOfProcesses + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.tenValue); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsEnabled(); + + page = 1; + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilterRunning); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + }); + + it('[C261047] Items per page set to 20', function () { + page = 1; + totalPages = 1; + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilterRunning); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.twenty); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfProcesses + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(nrOfProcesses); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilterRunning); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); + }); + + it('[C261045] 5 Items per page', function () { + page = 1; + totalPages = 4; + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilterRunning); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.five); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.five * page + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.fiveValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + + page++; + paginationPage.clickOnNextPage(); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 6-' + itemsPerPage.five * page + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.fiveValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsEnabled(); + + page++; + paginationPage.clickOnNextPage(); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.five * page + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.fiveValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsEnabled(); + + page++; + paginationPage.clickOnNextPage(); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + itemsPerPage.five * page + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.fiveValue); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsEnabled(); + + page = 1; + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilterRunning); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + }); + + it('[C261049] Page number dropdown', function () { + page = 1; + totalPages = 2; + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.ten); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue * page + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.tenValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + + paginationPage.clickOnPageDropdown(); + expect(paginationPage.getPageDropdownOptions()).toEqual(['1', '2']); + page = 2; + paginationPage.clickOnPageDropdownOption('2'); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.tenValue * page + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.tenValue); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsEnabled(); + + paginationPage.clickOnPageDropdown(); + expect(paginationPage.getPageDropdownOptions()).toEqual(['1', '2']); + page = 1; + paginationPage.clickOnPageDropdownOption('1'); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + page); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue * page + ' of ' + nrOfProcesses); + expect(processFiltersPage.numberOfProcessRows()).toBe(itemsPerPage.tenValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + }); + + xit('[C261048] Sorting by Name', function () { + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.checkFilterIsHighlighted(processFilterRunning); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.twenty); + processDetailsPage.checkProcessTitleIsDisplayed(); + processFiltersPage.waitForTableBody(); + processFiltersPage.sortByName(true); + processFiltersPage.waitForTableBody(); + processFiltersPage.getAllRowsNameColumn().then(function (list) { + expect(JSON.stringify(list) === JSON.stringify(processNames)).toEqual(true); + }); + processFiltersPage.sortByName(false); + processFiltersPage.getAllRowsNameColumn().then(function (list) { + processNames.reverse(); + expect(JSON.stringify(list) === JSON.stringify(processNames)).toEqual(true); + }); + }); +}); diff --git a/e2e/proxy.conf.js b/e2e/proxy.conf.js new file mode 100644 index 0000000000..2cddf1714a --- /dev/null +++ b/e2e/proxy.conf.js @@ -0,0 +1,28 @@ +var PROXY_HOST_ADF = process.env.PROXY_HOST_ADF; +var HOST = process.env.URL_HOST_ADF; + +module.exports = { + "/alfresco": { + "target": "http://" + (PROXY_HOST_ADF || HOST), + "secure": false, + "pathRewrite": { + "^/alfresco/alfresco": "" + }, + "changeOrigin": true, + // workaround for REPO-2260 + onProxyRes: function (proxyRes, req, res) { + const header = proxyRes.headers['www-authenticate']; + if (header && header.startsWith('Basic')) { + proxyRes.headers['www-authenticate'] = 'x' + header; + } + } + }, + "/activiti-app": { + "target": "http://" + (PROXY_HOST_ADF || HOST), + "secure": false, + "pathRewrite": { + "^/activiti-app/activiti-app": "" + }, + "changeOrigin": true + } +}; diff --git a/e2e/resources/adf/BigFile.zip b/e2e/resources/adf/BigFile.zip new file mode 100644 index 0000000000..7f02134a82 Binary files /dev/null and b/e2e/resources/adf/BigFile.zip differ diff --git a/e2e/resources/adf/activiti_profile_pic.png b/e2e/resources/adf/activiti_profile_pic.png new file mode 100644 index 0000000000..d0b7d1b1ff Binary files /dev/null and b/e2e/resources/adf/activiti_profile_pic.png differ diff --git a/e2e/resources/adf/allFileTypes/a_excel_file.xlsx b/e2e/resources/adf/allFileTypes/a_excel_file.xlsx new file mode 100644 index 0000000000..f24000a548 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/a_excel_file.xlsx differ diff --git a/e2e/resources/adf/allFileTypes/a_file_supported.pdf b/e2e/resources/adf/allFileTypes/a_file_supported.pdf new file mode 100644 index 0000000000..7a60b2ee60 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/a_file_supported.pdf differ diff --git a/e2e/resources/adf/allFileTypes/a_file_unsupported.docx b/e2e/resources/adf/allFileTypes/a_file_unsupported.docx new file mode 100644 index 0000000000..a7d93d3f96 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/a_file_unsupported.docx differ diff --git a/e2e/resources/adf/allFileTypes/a_jpg_file.jpg b/e2e/resources/adf/allFileTypes/a_jpg_file.jpg new file mode 100644 index 0000000000..0d58782ab9 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/a_jpg_file.jpg differ diff --git a/e2e/resources/adf/allFileTypes/a_mp4_file.mp4 b/e2e/resources/adf/allFileTypes/a_mp4_file.mp4 new file mode 100644 index 0000000000..f7fd0f4ad7 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/a_mp4_file.mp4 differ diff --git a/e2e/resources/adf/allFileTypes/a_png_file.png b/e2e/resources/adf/allFileTypes/a_png_file.png new file mode 100644 index 0000000000..e50d31fca3 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/a_png_file.png differ diff --git a/e2e/resources/adf/allFileTypes/a_ppt_file.pptx b/e2e/resources/adf/allFileTypes/a_ppt_file.pptx new file mode 100644 index 0000000000..4f2e970d5c Binary files /dev/null and b/e2e/resources/adf/allFileTypes/a_ppt_file.pptx differ diff --git a/e2e/resources/adf/allFileTypes/a_txt_file.rtf b/e2e/resources/adf/allFileTypes/a_txt_file.rtf new file mode 100644 index 0000000000..6e1243b3b6 --- /dev/null +++ b/e2e/resources/adf/allFileTypes/a_txt_file.rtf @@ -0,0 +1,260 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470 +{\fonttbl\f0\fnil\fcharset0 Cambria;\f1\froman\fcharset0 Times-Roman;\f2\fnil\fcharset178 GeezaPro; +\f3\fswiss\fcharset0 Helvetica;\f4\froman\fcharset0 TimesNewRomanPSMT;} +{\colortbl;\red255\green255\blue255;\red191\green191\blue191;} +\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0 +\deftab720 +\pard\pardeftab720\ri720\partightenfactor0 + +\f0\fs24 \cf0 This is a test document, has a lot of accented/special characters.\ +\ +Special characters:\ +\'b1!@#$%^&*()_+\{\}:\'94|<>?\'a7\'99\'a3-=[];\'92\\,./\ +\ +Arabic characters:\ + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx308 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx617 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx925 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1234 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1542 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1851 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2160 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2468 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2777 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3085 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3394 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3702 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4011 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4320 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4628 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4937 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5245 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5554 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5862 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6171 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6480 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6788 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7097 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7405 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7714 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8022 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8331 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f1\fs20 \cf0 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2\fs24 \cf0 \'db +\f3 +\f2\fs20 \'d9 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d6 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d0 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ce +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cb +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ca +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d4 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d1 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'de +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d5 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'dd +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'da +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d3 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e4 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e3 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e1 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'df +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ed +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d8 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cd +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d2 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e6 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e5 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cf +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cc +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'c8 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2\fs24 \cf0 \'c7 +\f1\fs20 \cell \lastrow\row +\pard\pardeftab720\ri720\partightenfactor0 + +\f4\fs24 \cf0 \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 French characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'c0\'e2\'e6\'e7\'e9\'e8\'ea\'eb\'ef\'ee\'f4\'9c\'f9\'fb\'fc\'ff\ +\ +Greek characters: \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f3 \cf0 \uc0\u940 \u941 \u942 \u943 \u970 \u970 \u912 \u972 \u973 \u971 \u944 \u974 \u952 \u969 \u949 \u961 \u964 \u968 \u965 \u953 \u959 \u960 \u945 \u963 \u948 \u966 \u947 \u951 \u962 \u954 \u955 \u950 \u967 \u958 \u969 \u946 \u957 \u956 +\f4 \ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Polish accented characters:\ + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx960 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1920 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2880 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3840 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4800 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5760 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6720 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7680 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f1\fs20 \cf0 \uc0\u260 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u262 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u280 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u321 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u323 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \'d3\cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u346 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u377 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u379 \cell \row + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx960 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1920 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2880 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3840 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4800 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5760 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6720 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7680 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u261 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u263 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u281 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u322 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u324 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \'f3\cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u347 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u378 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u380 \cell \lastrow\row +\pard\pardeftab720\ri720\partightenfactor0 + +\f4\fs24 \cf0 \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Spanish accented characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'e1, \'e9, \'ed, \'f3, \'fa, \'f1, \'d1, \'fc, \'dc, \'bf, \'a1. \'c1, \'c9, \'cd, \'d3, \'da \ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Swedish characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'e4\'e5\'e9\'f6\ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 \'b1 +\f2 \'c7 +\f4 \'c0 +\f1\fs20 \uc0\u260 \u261 +\f4\fs24 \'e1\'e4\ +} \ No newline at end of file diff --git a/e2e/resources/adf/allFileTypes/a_zip_file.mp4.zip b/e2e/resources/adf/allFileTypes/a_zip_file.mp4.zip new file mode 100644 index 0000000000..a156c10fe0 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/a_zip_file.mp4.zip differ diff --git a/e2e/resources/adf/allFileTypes/b_excel_file.xlsx b/e2e/resources/adf/allFileTypes/b_excel_file.xlsx new file mode 100644 index 0000000000..f24000a548 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/b_excel_file.xlsx differ diff --git a/e2e/resources/adf/allFileTypes/b_file_supported.pdf b/e2e/resources/adf/allFileTypes/b_file_supported.pdf new file mode 100644 index 0000000000..7a60b2ee60 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/b_file_supported.pdf differ diff --git a/e2e/resources/adf/allFileTypes/b_file_unsupported.docx b/e2e/resources/adf/allFileTypes/b_file_unsupported.docx new file mode 100644 index 0000000000..a7d93d3f96 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/b_file_unsupported.docx differ diff --git a/e2e/resources/adf/allFileTypes/b_jpg_file.jpg b/e2e/resources/adf/allFileTypes/b_jpg_file.jpg new file mode 100644 index 0000000000..0d58782ab9 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/b_jpg_file.jpg differ diff --git a/e2e/resources/adf/allFileTypes/b_mp4_file.mp4 b/e2e/resources/adf/allFileTypes/b_mp4_file.mp4 new file mode 100644 index 0000000000..f7fd0f4ad7 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/b_mp4_file.mp4 differ diff --git a/e2e/resources/adf/allFileTypes/b_png_file.png b/e2e/resources/adf/allFileTypes/b_png_file.png new file mode 100644 index 0000000000..e50d31fca3 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/b_png_file.png differ diff --git a/e2e/resources/adf/allFileTypes/b_ppt_file.pptx b/e2e/resources/adf/allFileTypes/b_ppt_file.pptx new file mode 100644 index 0000000000..c50b11536b Binary files /dev/null and b/e2e/resources/adf/allFileTypes/b_ppt_file.pptx differ diff --git a/e2e/resources/adf/allFileTypes/b_txt_file.rtf b/e2e/resources/adf/allFileTypes/b_txt_file.rtf new file mode 100644 index 0000000000..6e1243b3b6 --- /dev/null +++ b/e2e/resources/adf/allFileTypes/b_txt_file.rtf @@ -0,0 +1,260 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470 +{\fonttbl\f0\fnil\fcharset0 Cambria;\f1\froman\fcharset0 Times-Roman;\f2\fnil\fcharset178 GeezaPro; +\f3\fswiss\fcharset0 Helvetica;\f4\froman\fcharset0 TimesNewRomanPSMT;} +{\colortbl;\red255\green255\blue255;\red191\green191\blue191;} +\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0 +\deftab720 +\pard\pardeftab720\ri720\partightenfactor0 + +\f0\fs24 \cf0 This is a test document, has a lot of accented/special characters.\ +\ +Special characters:\ +\'b1!@#$%^&*()_+\{\}:\'94|<>?\'a7\'99\'a3-=[];\'92\\,./\ +\ +Arabic characters:\ + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx308 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx617 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx925 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1234 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1542 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1851 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2160 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2468 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2777 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3085 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3394 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3702 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4011 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4320 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4628 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4937 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5245 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5554 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5862 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6171 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6480 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6788 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7097 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7405 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7714 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8022 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8331 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f1\fs20 \cf0 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2\fs24 \cf0 \'db +\f3 +\f2\fs20 \'d9 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d6 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d0 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ce +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cb +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ca +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d4 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d1 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'de +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d5 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'dd +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'da +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d3 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e4 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e3 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e1 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'df +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ed +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d8 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cd +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d2 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e6 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e5 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cf +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cc +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'c8 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2\fs24 \cf0 \'c7 +\f1\fs20 \cell \lastrow\row +\pard\pardeftab720\ri720\partightenfactor0 + +\f4\fs24 \cf0 \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 French characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'c0\'e2\'e6\'e7\'e9\'e8\'ea\'eb\'ef\'ee\'f4\'9c\'f9\'fb\'fc\'ff\ +\ +Greek characters: \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f3 \cf0 \uc0\u940 \u941 \u942 \u943 \u970 \u970 \u912 \u972 \u973 \u971 \u944 \u974 \u952 \u969 \u949 \u961 \u964 \u968 \u965 \u953 \u959 \u960 \u945 \u963 \u948 \u966 \u947 \u951 \u962 \u954 \u955 \u950 \u967 \u958 \u969 \u946 \u957 \u956 +\f4 \ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Polish accented characters:\ + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx960 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1920 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2880 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3840 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4800 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5760 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6720 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7680 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f1\fs20 \cf0 \uc0\u260 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u262 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u280 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u321 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u323 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \'d3\cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u346 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u377 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u379 \cell \row + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx960 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1920 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2880 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3840 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4800 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5760 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6720 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7680 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u261 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u263 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u281 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u322 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u324 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \'f3\cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u347 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u378 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u380 \cell \lastrow\row +\pard\pardeftab720\ri720\partightenfactor0 + +\f4\fs24 \cf0 \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Spanish accented characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'e1, \'e9, \'ed, \'f3, \'fa, \'f1, \'d1, \'fc, \'dc, \'bf, \'a1. \'c1, \'c9, \'cd, \'d3, \'da \ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Swedish characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'e4\'e5\'e9\'f6\ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 \'b1 +\f2 \'c7 +\f4 \'c0 +\f1\fs20 \uc0\u260 \u261 +\f4\fs24 \'e1\'e4\ +} \ No newline at end of file diff --git a/e2e/resources/adf/allFileTypes/b_zip_file.mp4.zip b/e2e/resources/adf/allFileTypes/b_zip_file.mp4.zip new file mode 100644 index 0000000000..a156c10fe0 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/b_zip_file.mp4.zip differ diff --git a/e2e/resources/adf/allFileTypes/c_excel_file.xlsx b/e2e/resources/adf/allFileTypes/c_excel_file.xlsx new file mode 100644 index 0000000000..f24000a548 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/c_excel_file.xlsx differ diff --git a/e2e/resources/adf/allFileTypes/c_file_supported.pdf b/e2e/resources/adf/allFileTypes/c_file_supported.pdf new file mode 100644 index 0000000000..7a60b2ee60 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/c_file_supported.pdf differ diff --git a/e2e/resources/adf/allFileTypes/c_file_unsupported.docx b/e2e/resources/adf/allFileTypes/c_file_unsupported.docx new file mode 100644 index 0000000000..a7d93d3f96 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/c_file_unsupported.docx differ diff --git a/e2e/resources/adf/allFileTypes/c_jpg_file.jpg b/e2e/resources/adf/allFileTypes/c_jpg_file.jpg new file mode 100644 index 0000000000..0d58782ab9 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/c_jpg_file.jpg differ diff --git a/e2e/resources/adf/allFileTypes/c_mp4_file.mp4 b/e2e/resources/adf/allFileTypes/c_mp4_file.mp4 new file mode 100644 index 0000000000..f7fd0f4ad7 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/c_mp4_file.mp4 differ diff --git a/e2e/resources/adf/allFileTypes/c_png_file.png b/e2e/resources/adf/allFileTypes/c_png_file.png new file mode 100644 index 0000000000..e50d31fca3 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/c_png_file.png differ diff --git a/e2e/resources/adf/allFileTypes/c_ppt_file.pptx b/e2e/resources/adf/allFileTypes/c_ppt_file.pptx new file mode 100644 index 0000000000..c50b11536b Binary files /dev/null and b/e2e/resources/adf/allFileTypes/c_ppt_file.pptx differ diff --git a/e2e/resources/adf/allFileTypes/c_txt_file.rtf b/e2e/resources/adf/allFileTypes/c_txt_file.rtf new file mode 100644 index 0000000000..6e1243b3b6 --- /dev/null +++ b/e2e/resources/adf/allFileTypes/c_txt_file.rtf @@ -0,0 +1,260 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470 +{\fonttbl\f0\fnil\fcharset0 Cambria;\f1\froman\fcharset0 Times-Roman;\f2\fnil\fcharset178 GeezaPro; +\f3\fswiss\fcharset0 Helvetica;\f4\froman\fcharset0 TimesNewRomanPSMT;} +{\colortbl;\red255\green255\blue255;\red191\green191\blue191;} +\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0 +\deftab720 +\pard\pardeftab720\ri720\partightenfactor0 + +\f0\fs24 \cf0 This is a test document, has a lot of accented/special characters.\ +\ +Special characters:\ +\'b1!@#$%^&*()_+\{\}:\'94|<>?\'a7\'99\'a3-=[];\'92\\,./\ +\ +Arabic characters:\ + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx308 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx617 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx925 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1234 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1542 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1851 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2160 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2468 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2777 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3085 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3394 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3702 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4011 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4320 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4628 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4937 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5245 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5554 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5862 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6171 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6480 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6788 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7097 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7405 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7714 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8022 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8331 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f1\fs20 \cf0 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2\fs24 \cf0 \'db +\f3 +\f2\fs20 \'d9 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d6 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d0 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ce +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cb +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ca +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d4 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d1 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'de +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d5 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'dd +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'da +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d3 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e4 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e3 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e1 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'df +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ed +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d8 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cd +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d2 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e6 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e5 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cf +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cc +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'c8 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2\fs24 \cf0 \'c7 +\f1\fs20 \cell \lastrow\row +\pard\pardeftab720\ri720\partightenfactor0 + +\f4\fs24 \cf0 \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 French characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'c0\'e2\'e6\'e7\'e9\'e8\'ea\'eb\'ef\'ee\'f4\'9c\'f9\'fb\'fc\'ff\ +\ +Greek characters: \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f3 \cf0 \uc0\u940 \u941 \u942 \u943 \u970 \u970 \u912 \u972 \u973 \u971 \u944 \u974 \u952 \u969 \u949 \u961 \u964 \u968 \u965 \u953 \u959 \u960 \u945 \u963 \u948 \u966 \u947 \u951 \u962 \u954 \u955 \u950 \u967 \u958 \u969 \u946 \u957 \u956 +\f4 \ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Polish accented characters:\ + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx960 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1920 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2880 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3840 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4800 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5760 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6720 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7680 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f1\fs20 \cf0 \uc0\u260 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u262 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u280 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u321 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u323 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \'d3\cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u346 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u377 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u379 \cell \row + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx960 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1920 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2880 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3840 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4800 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5760 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6720 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7680 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u261 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u263 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u281 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u322 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u324 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \'f3\cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u347 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u378 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u380 \cell \lastrow\row +\pard\pardeftab720\ri720\partightenfactor0 + +\f4\fs24 \cf0 \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Spanish accented characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'e1, \'e9, \'ed, \'f3, \'fa, \'f1, \'d1, \'fc, \'dc, \'bf, \'a1. \'c1, \'c9, \'cd, \'d3, \'da \ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Swedish characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'e4\'e5\'e9\'f6\ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 \'b1 +\f2 \'c7 +\f4 \'c0 +\f1\fs20 \uc0\u260 \u261 +\f4\fs24 \'e1\'e4\ +} \ No newline at end of file diff --git a/e2e/resources/adf/allFileTypes/c_zip_file.mp4.zip b/e2e/resources/adf/allFileTypes/c_zip_file.mp4.zip new file mode 100644 index 0000000000..a156c10fe0 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/c_zip_file.mp4.zip differ diff --git a/e2e/resources/adf/allFileTypes/d_excel_file.xlsx b/e2e/resources/adf/allFileTypes/d_excel_file.xlsx new file mode 100644 index 0000000000..f24000a548 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/d_excel_file.xlsx differ diff --git a/e2e/resources/adf/allFileTypes/d_file_supported.pdf b/e2e/resources/adf/allFileTypes/d_file_supported.pdf new file mode 100644 index 0000000000..7a60b2ee60 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/d_file_supported.pdf differ diff --git a/e2e/resources/adf/allFileTypes/d_file_unsupported.docx b/e2e/resources/adf/allFileTypes/d_file_unsupported.docx new file mode 100644 index 0000000000..a7d93d3f96 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/d_file_unsupported.docx differ diff --git a/e2e/resources/adf/allFileTypes/d_jpg_file.jpg b/e2e/resources/adf/allFileTypes/d_jpg_file.jpg new file mode 100644 index 0000000000..0d58782ab9 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/d_jpg_file.jpg differ diff --git a/e2e/resources/adf/allFileTypes/d_mp4_file.mp4 b/e2e/resources/adf/allFileTypes/d_mp4_file.mp4 new file mode 100644 index 0000000000..f7fd0f4ad7 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/d_mp4_file.mp4 differ diff --git a/e2e/resources/adf/allFileTypes/d_png_file.png b/e2e/resources/adf/allFileTypes/d_png_file.png new file mode 100644 index 0000000000..e50d31fca3 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/d_png_file.png differ diff --git a/e2e/resources/adf/allFileTypes/d_ppt_file.pptx b/e2e/resources/adf/allFileTypes/d_ppt_file.pptx new file mode 100644 index 0000000000..c50b11536b Binary files /dev/null and b/e2e/resources/adf/allFileTypes/d_ppt_file.pptx differ diff --git a/e2e/resources/adf/allFileTypes/d_txt_file.rtf b/e2e/resources/adf/allFileTypes/d_txt_file.rtf new file mode 100644 index 0000000000..6e1243b3b6 --- /dev/null +++ b/e2e/resources/adf/allFileTypes/d_txt_file.rtf @@ -0,0 +1,260 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470 +{\fonttbl\f0\fnil\fcharset0 Cambria;\f1\froman\fcharset0 Times-Roman;\f2\fnil\fcharset178 GeezaPro; +\f3\fswiss\fcharset0 Helvetica;\f4\froman\fcharset0 TimesNewRomanPSMT;} +{\colortbl;\red255\green255\blue255;\red191\green191\blue191;} +\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0 +\deftab720 +\pard\pardeftab720\ri720\partightenfactor0 + +\f0\fs24 \cf0 This is a test document, has a lot of accented/special characters.\ +\ +Special characters:\ +\'b1!@#$%^&*()_+\{\}:\'94|<>?\'a7\'99\'a3-=[];\'92\\,./\ +\ +Arabic characters:\ + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx308 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx617 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx925 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1234 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1542 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1851 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2160 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2468 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2777 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3085 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3394 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3702 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4011 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4320 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4628 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4937 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5245 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5554 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5862 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6171 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6480 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6788 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7097 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7405 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7714 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8022 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8331 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f1\fs20 \cf0 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2\fs24 \cf0 \'db +\f3 +\f2\fs20 \'d9 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d6 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d0 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ce +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cb +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ca +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d4 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d1 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'de +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d5 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'dd +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'da +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d3 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e4 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e3 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e1 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'df +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ed +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d8 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cd +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d2 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e6 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e5 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cf +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cc +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'c8 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2\fs24 \cf0 \'c7 +\f1\fs20 \cell \lastrow\row +\pard\pardeftab720\ri720\partightenfactor0 + +\f4\fs24 \cf0 \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 French characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'c0\'e2\'e6\'e7\'e9\'e8\'ea\'eb\'ef\'ee\'f4\'9c\'f9\'fb\'fc\'ff\ +\ +Greek characters: \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f3 \cf0 \uc0\u940 \u941 \u942 \u943 \u970 \u970 \u912 \u972 \u973 \u971 \u944 \u974 \u952 \u969 \u949 \u961 \u964 \u968 \u965 \u953 \u959 \u960 \u945 \u963 \u948 \u966 \u947 \u951 \u962 \u954 \u955 \u950 \u967 \u958 \u969 \u946 \u957 \u956 +\f4 \ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Polish accented characters:\ + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx960 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1920 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2880 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3840 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4800 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5760 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6720 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7680 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f1\fs20 \cf0 \uc0\u260 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u262 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u280 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u321 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u323 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \'d3\cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u346 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u377 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u379 \cell \row + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx960 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1920 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2880 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3840 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4800 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5760 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6720 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7680 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u261 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u263 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u281 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u322 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u324 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \'f3\cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u347 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u378 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u380 \cell \lastrow\row +\pard\pardeftab720\ri720\partightenfactor0 + +\f4\fs24 \cf0 \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Spanish accented characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'e1, \'e9, \'ed, \'f3, \'fa, \'f1, \'d1, \'fc, \'dc, \'bf, \'a1. \'c1, \'c9, \'cd, \'d3, \'da \ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Swedish characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'e4\'e5\'e9\'f6\ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 \'b1 +\f2 \'c7 +\f4 \'c0 +\f1\fs20 \uc0\u260 \u261 +\f4\fs24 \'e1\'e4\ +} \ No newline at end of file diff --git a/e2e/resources/adf/allFileTypes/d_zip_file.mp4.zip b/e2e/resources/adf/allFileTypes/d_zip_file.mp4.zip new file mode 100644 index 0000000000..a156c10fe0 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/d_zip_file.mp4.zip differ diff --git a/e2e/resources/adf/allFileTypes/e_excel_file.xlsx b/e2e/resources/adf/allFileTypes/e_excel_file.xlsx new file mode 100644 index 0000000000..f24000a548 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/e_excel_file.xlsx differ diff --git a/e2e/resources/adf/allFileTypes/e_file_supported.pdf b/e2e/resources/adf/allFileTypes/e_file_supported.pdf new file mode 100644 index 0000000000..7a60b2ee60 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/e_file_supported.pdf differ diff --git a/e2e/resources/adf/allFileTypes/e_file_unsupported.docx b/e2e/resources/adf/allFileTypes/e_file_unsupported.docx new file mode 100644 index 0000000000..a7d93d3f96 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/e_file_unsupported.docx differ diff --git a/e2e/resources/adf/allFileTypes/e_jpg_file.jpg b/e2e/resources/adf/allFileTypes/e_jpg_file.jpg new file mode 100644 index 0000000000..0d58782ab9 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/e_jpg_file.jpg differ diff --git a/e2e/resources/adf/allFileTypes/e_mp4_file.mp4 b/e2e/resources/adf/allFileTypes/e_mp4_file.mp4 new file mode 100644 index 0000000000..f7fd0f4ad7 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/e_mp4_file.mp4 differ diff --git a/e2e/resources/adf/allFileTypes/e_png_file.png b/e2e/resources/adf/allFileTypes/e_png_file.png new file mode 100644 index 0000000000..e50d31fca3 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/e_png_file.png differ diff --git a/e2e/resources/adf/allFileTypes/e_ppt_file.pptx b/e2e/resources/adf/allFileTypes/e_ppt_file.pptx new file mode 100644 index 0000000000..c50b11536b Binary files /dev/null and b/e2e/resources/adf/allFileTypes/e_ppt_file.pptx differ diff --git a/e2e/resources/adf/allFileTypes/e_txt_file.rtf b/e2e/resources/adf/allFileTypes/e_txt_file.rtf new file mode 100644 index 0000000000..6e1243b3b6 --- /dev/null +++ b/e2e/resources/adf/allFileTypes/e_txt_file.rtf @@ -0,0 +1,260 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470 +{\fonttbl\f0\fnil\fcharset0 Cambria;\f1\froman\fcharset0 Times-Roman;\f2\fnil\fcharset178 GeezaPro; +\f3\fswiss\fcharset0 Helvetica;\f4\froman\fcharset0 TimesNewRomanPSMT;} +{\colortbl;\red255\green255\blue255;\red191\green191\blue191;} +\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0 +\deftab720 +\pard\pardeftab720\ri720\partightenfactor0 + +\f0\fs24 \cf0 This is a test document, has a lot of accented/special characters.\ +\ +Special characters:\ +\'b1!@#$%^&*()_+\{\}:\'94|<>?\'a7\'99\'a3-=[];\'92\\,./\ +\ +Arabic characters:\ + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx308 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx617 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx925 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1234 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1542 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1851 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2160 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2468 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2777 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3085 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3394 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3702 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4011 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4320 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4628 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4937 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5245 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5554 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5862 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6171 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6480 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6788 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7097 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7405 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7714 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8022 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8331 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f1\fs20 \cf0 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2\fs24 \cf0 \'db +\f3 +\f2\fs20 \'d9 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d6 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d0 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ce +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cb +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ca +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d4 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d1 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'de +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d5 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'dd +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'da +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d3 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e4 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e3 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e1 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'df +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'ed +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d8 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cd +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'d2 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e6 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'e5 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cf +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'cc +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2 \cf0 \'c8 +\f1 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f2\fs24 \cf0 \'c7 +\f1\fs20 \cell \lastrow\row +\pard\pardeftab720\ri720\partightenfactor0 + +\f4\fs24 \cf0 \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 French characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'c0\'e2\'e6\'e7\'e9\'e8\'ea\'eb\'ef\'ee\'f4\'9c\'f9\'fb\'fc\'ff\ +\ +Greek characters: \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f3 \cf0 \uc0\u940 \u941 \u942 \u943 \u970 \u970 \u912 \u972 \u973 \u971 \u944 \u974 \u952 \u969 \u949 \u961 \u964 \u968 \u965 \u953 \u959 \u960 \u945 \u963 \u948 \u966 \u947 \u951 \u962 \u954 \u955 \u950 \u967 \u958 \u969 \u946 \u957 \u956 +\f4 \ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Polish accented characters:\ + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrt\brdrnil \trbrdrl\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx960 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1920 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2880 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3840 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4800 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5760 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6720 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7680 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 + +\f1\fs20 \cf0 \uc0\u260 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u262 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u280 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u321 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u323 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \'d3\cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u346 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u377 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u379 \cell \row + +\itap1\trowd \taflags1 \trgaph108\trleft-108 \trbrdrl\brdrnil \trbrdrt\brdrnil \trbrdrr\brdrnil +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx960 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx1920 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx2880 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx3840 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx4800 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx5760 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx6720 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx7680 +\clvertalc \clshdrawnil \clbrdrt\brdrs\brdrw20\brdrcf2 \clbrdrl\brdrs\brdrw20\brdrcf2 \clbrdrb\brdrs\brdrw20\brdrcf2 \clbrdrr\brdrs\brdrw20\brdrcf2 \clpadl100 \clpadr100 \gaph\cellx8640 +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u261 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u263 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u281 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u322 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u324 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \'f3\cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u347 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u378 \cell +\pard\intbl\itap1\pardeftab720\ri720\qc\partightenfactor0 +\cf0 \uc0\u380 \cell \lastrow\row +\pard\pardeftab720\ri720\partightenfactor0 + +\f4\fs24 \cf0 \ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Spanish accented characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'e1, \'e9, \'ed, \'f3, \'fa, \'f1, \'d1, \'fc, \'dc, \'bf, \'a1. \'c1, \'c9, \'cd, \'d3, \'da \ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 Swedish characters:\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f4 \cf0 \'e4\'e5\'e9\'f6\ +\ +\pard\pardeftab720\ri720\partightenfactor0 + +\f0 \cf0 \'b1 +\f2 \'c7 +\f4 \'c0 +\f1\fs20 \uc0\u260 \u261 +\f4\fs24 \'e1\'e4\ +} \ No newline at end of file diff --git a/e2e/resources/adf/allFileTypes/e_zip_file.mp4.zip b/e2e/resources/adf/allFileTypes/e_zip_file.mp4.zip new file mode 100644 index 0000000000..a156c10fe0 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/e_zip_file.mp4.zip differ diff --git a/e2e/resources/adf/allFileTypes/file400Bytes.txt b/e2e/resources/adf/allFileTypes/file400Bytes.txt new file mode 100644 index 0000000000..7a40fb1825 --- /dev/null +++ b/e2e/resources/adf/allFileTypes/file400Bytes.txt @@ -0,0 +1 @@ +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa \ No newline at end of file diff --git a/e2e/resources/adf/allFileTypes/file_unsupported.pages b/e2e/resources/adf/allFileTypes/file_unsupported.pages new file mode 100644 index 0000000000..a64a96b68e Binary files /dev/null and b/e2e/resources/adf/allFileTypes/file_unsupported.pages differ diff --git a/e2e/resources/adf/allFileTypes/pdf_all_properties.pdf b/e2e/resources/adf/allFileTypes/pdf_all_properties.pdf new file mode 100644 index 0000000000..9202d665ec Binary files /dev/null and b/e2e/resources/adf/allFileTypes/pdf_all_properties.pdf differ diff --git a/e2e/resources/adf/allFileTypes/testExtension.test b/e2e/resources/adf/allFileTypes/testExtension.test new file mode 100644 index 0000000000..b7bd1f38e1 --- /dev/null +++ b/e2e/resources/adf/allFileTypes/testExtension.test @@ -0,0 +1 @@ +test extension \ No newline at end of file diff --git a/e2e/resources/adf/allFileTypes/zeroBytesFile.txt b/e2e/resources/adf/allFileTypes/zeroBytesFile.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/e2e/resources/adf/folderOne/share_profile_pic.png b/e2e/resources/adf/folderOne/share_profile_pic.png new file mode 100644 index 0000000000..1e4aece6ef Binary files /dev/null and b/e2e/resources/adf/folderOne/share_profile_pic.png differ diff --git a/e2e/resources/adf/share_profile_pic.jpg b/e2e/resources/adf/share_profile_pic.jpg new file mode 100644 index 0000000000..c47bdb43cb Binary files /dev/null and b/e2e/resources/adf/share_profile_pic.jpg differ diff --git a/e2e/resources/adf/share_profile_pic.png b/e2e/resources/adf/share_profile_pic.png new file mode 100644 index 0000000000..1e4aece6ef Binary files /dev/null and b/e2e/resources/adf/share_profile_pic.png differ diff --git a/e2e/resources/apps/App_with_processes.zip b/e2e/resources/apps/App_with_processes.zip new file mode 100644 index 0000000000..b7e06bc565 Binary files /dev/null and b/e2e/resources/apps/App_with_processes.zip differ diff --git a/e2e/resources/apps/Simple App with User Form.zip b/e2e/resources/apps/Simple App with User Form.zip new file mode 100644 index 0000000000..377f7cf08f Binary files /dev/null and b/e2e/resources/apps/Simple App with User Form.zip differ diff --git a/e2e/resources/apps/SimpleAppWithUserForm.png b/e2e/resources/apps/SimpleAppWithUserForm.png new file mode 100644 index 0000000000..06ec8b8116 Binary files /dev/null and b/e2e/resources/apps/SimpleAppWithUserForm.png differ diff --git a/e2e/resources/apps/TestDate.zip b/e2e/resources/apps/TestDate.zip new file mode 100644 index 0000000000..9a1074d39a Binary files /dev/null and b/e2e/resources/apps/TestDate.zip differ diff --git a/e2e/resources/apps/Widgets smoke test.zip b/e2e/resources/apps/Widgets smoke test.zip new file mode 100644 index 0000000000..1bdc6cae52 Binary files /dev/null and b/e2e/resources/apps/Widgets smoke test.zip differ diff --git a/e2e/restAPI/ACS/PeopleAPI.js b/e2e/restAPI/ACS/PeopleAPI.js new file mode 100644 index 0000000000..1505920007 --- /dev/null +++ b/e2e/restAPI/ACS/PeopleAPI.js @@ -0,0 +1,134 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var exports = module.exports = {}; +var request = require('request'); +var RequestCoreAPI = require('./RequestUtil/RequestCoreAPI'); +var url = require('url-join'); +var path = require('path'); +var fs = require('fs'); +var TestConfig = require('../../test.config'); + +var peopleBaseUrl = 'people'; + + +function read(initialFile) { + return new Promise(function (resolve, reject) { + fs.readFile(initialFile, function (err, file) { + if (err) { + //console.log('read error', err); + reject(err); + } + + // console.log('read success', file); + resolve(file); + }) + }) +} + +function write(file, uri, header) { + return new Promise(function (resolve, reject) { + request.put({url: uri, headers: header, body: file}, function (err, httpResponse, body) { + if (err) { + console.error('updated failed:', err); + reject(err); + } + var json_data = JSON.parse(body); + + // console.log('write success', json_data); + resolve(body); + }); + }); +} + +/** + * Update avatar using API + * + * @param requestUserModel {User that makes the request} + * @param fileModel + * @param personId + * @method updateAvatarViaAPI + */ +exports.updateAvatarViaAPI = function (requestUserModel, fileModel, personId) { + + var absolutePath = path.resolve(path.join(TestConfig.main.rootPath, fileModel.getLocation())); + var uri = url(RequestCoreAPI.getBaseURL(), peopleBaseUrl, personId, "avatar"); + // console.debug("Update avatar via API: fileName=" + fileModel.getName() + " uri=" + uri + " auth=" + requestUserModel.id + " password: " + requestUserModel.password); + + var allHeaders = RequestCoreAPI.requestHeaders(requestUserModel); + allHeaders['Content-Type'] = 'application/octet-stream'; + + return read(absolutePath) + .then(function (file) { + return write(file, uri, allHeaders); + }); +}; + +/** + * Get avatar using API + * + * @param requestUserModel {User that makes the request} + * @param personId + * @method getAvatarViaAPIWithRetry + */ +exports.getAvatarViaAPI = function (retry, requestUserModel, personId, callback) { + var uri = url(RequestCoreAPI.getBaseURL(), peopleBaseUrl, personId, "avatar"); + + // console.debug("Get avatar via API: uri= " + uri + " auth=" + requestUserModel.id + " password: " + requestUserModel.password); + + function run() { + request.get({ + url: uri, + headers: RequestCoreAPI.requestHeaders(requestUserModel) + }, function (error, httpResponse, body) { + retry--; + var statusCode = httpResponse.statusCode; + // console.log("status code: " + statusCode); + if (statusCode != "200" && retry > 0) { + run(); + } + else if (typeof callback === 'function') { + callback.apply(null); + } + }); + } + + run(); +}; + +/** + * Delete avatar using API + * + * @param requestUserModel {User that makes the request} + * @param personId + * @param callback + */ +exports.deleteAvatarViaAPI = function (requestUserModel, personId, callback) { + + var uri = url(RequestCoreAPI.getBaseURL(), peopleBaseUrl, personId, "avatar"); + + request.del({url: uri, headers: RequestCoreAPI.requestHeaders(requestUserModel)}, function (error, response, body) { + if (error) { + return console.error('delete failed:', error); + } + // console.debug("Avatar deleted via API: " + " uri=" + uri + " auth=" + requestUserModel.id + " password: " + requestUserModel.password); + + if (typeof callback === 'function') { + callback.apply(null); + } + }); +}; diff --git a/e2e/restAPI/ACS/RequestUtil/RequestCoreAPI.js b/e2e/restAPI/ACS/RequestUtil/RequestCoreAPI.js new file mode 100644 index 0000000000..b18af45d64 --- /dev/null +++ b/e2e/restAPI/ACS/RequestUtil/RequestCoreAPI.js @@ -0,0 +1,33 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var url = require('url-join'); +var APIUtils = require('../../../restAPI/APIUtil'); +var CONSTANTS = require('../../../util/constants'); + +var ACMBaseURL = '/alfresco/versions/1'; + +exports.getBaseURL = function () { + return url(new APIUtils().getBaseURL(CONSTANTS.APPLICATION.ADF_ACS), ACMBaseURL); +}; + +exports.requestHeaders = function (auth) { + var headers = { + 'Authorization': new APIUtils().getAuthorization(auth.id, auth.password) + }; + return headers; +}; diff --git a/e2e/restAPI/APIUtil.js b/e2e/restAPI/APIUtil.js new file mode 100644 index 0000000000..3580f5fce2 --- /dev/null +++ b/e2e/restAPI/APIUtil.js @@ -0,0 +1,67 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var url = require('url-join'); +var TestConfig = require('../test.config'); +var BasicAuthorization = require('../restAPI/httpRequest/BasicAuthorization'); +var Ajv = require('ajv'); + +var APIUtils = function () { + /** + * Return Basic authorization + * + * @param user + * @param password + * @returns Basic authorization + */ + this.getAuthorization = function (user, password) { + return 'Basic ' + Buffer(user + ':' + password).toString('base64'); + }; + + /**
 + * Return any application base URL
 + * ://:/
 + * + * @param application - any application declared in config file: main or adf
 + * @param urlComponentsParam - Object with details required to define the baseURL
 + * {
 + * protocol: "http",
 + * hostname: "localhost",
 + * port: "8080"
 + * }
 + * If urlComponents empty {}, the default test configuration values are set
 + */ + this.getBaseURL = function (application, urlComponentsParam) { + var urlComponents = {}; + urlComponents.protocol = TestConfig[application].protocol; + urlComponents.hostname = TestConfig[application].host; + urlComponents.port = TestConfig[application].port; + urlComponents.path = TestConfig[application].apiContextRoot; + Object.assign(urlComponents, urlComponentsParam); + + var baseUrl = url(urlComponents.protocol + + "://" + urlComponents.hostname + + (urlComponents.port !== "" ? ":" + urlComponents.port : ""), + urlComponents.path); + + return baseUrl; + }; + +}; + +module.exports = APIUtils; + diff --git a/e2e/restAPI/httpRequest/BasicAuthorization.js b/e2e/restAPI/httpRequest/BasicAuthorization.js new file mode 100644 index 0000000000..f64f3f9c08 --- /dev/null +++ b/e2e/restAPI/httpRequest/BasicAuthorization.js @@ -0,0 +1,27 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var BasicAuthorization = function (user, password) { + this.user = user; + this.password = password; + + this.displayCredentials = function () { + // console.info("Basic Authorization: " + user + "(" + password + ")"); + } +}; + +module.exports = BasicAuthorization; diff --git a/e2e/restAPI/httpRequest/HTTPRequestBase.js b/e2e/restAPI/httpRequest/HTTPRequestBase.js new file mode 100644 index 0000000000..55d10ea14e --- /dev/null +++ b/e2e/restAPI/httpRequest/HTTPRequestBase.js @@ -0,0 +1,32 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var HTTPRequestBase = function(host, rootPath, requestMethod, uri, dataSet, port) { + this.host = host; + + if (!port) { + port = ""; + } + + this.port = port; + this.rootPath = rootPath; + this.requestMethod = requestMethod; + this.uri = uri; + this.dataSet = dataSet; +}; + +module.exports = HTTPRequestBase; diff --git a/e2e/restAPI/httpRequest/HTTPRequestPublic.js b/e2e/restAPI/httpRequest/HTTPRequestPublic.js new file mode 100644 index 0000000000..62b977f97c --- /dev/null +++ b/e2e/restAPI/httpRequest/HTTPRequestPublic.js @@ -0,0 +1,22 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var HTTPRequestPublic = function(authorization) { + this.authorization = authorization; +} + +module.exports = HTTPRequestPublic; diff --git a/e2e/search_component.e2e.ts b/e2e/search_component.e2e.ts new file mode 100644 index 0000000000..0daa3e6250 --- /dev/null +++ b/e2e/search_component.e2e.ts @@ -0,0 +1,255 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import SearchDialog = require('./pages/adf/dialog/searchDialog'); +import ContentServicesPage = require('./pages/adf/contentServicesPage'); +import filePreviewPage = require('./pages/adf/filePreviewPage'); +import SearchResultPage = require('./pages/adf/searchResultsPage'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import FileModel = require('./models/ACS/fileModel'); +import FolderModel = require('./models/ACS/folderModel'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); +import Util = require('./util/util'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Test Search component - Search Bar', () => { + + let search = { + inactive: { + firstChar: 'x', + secondChar: 'y', + thirdChar: 'z', + name: Util.generateRandomString() + }, + active: { + base: 'newFile', + extension: '.txt' + } + }; + + let loginPage = new LoginPage(); + let contentServicesPage = new ContentServicesPage(); + let searchDialog = new SearchDialog(); + let searchResultPage = new SearchResultPage(); + + let acsUser = new AcsUserModel(); + let firstFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name, + 'shortName': resources.Files.ADF_DOCUMENTS.PDF.short_file_name + }); + + let randomPrefix = Util.generateRandomString(); + + let firstFolderModel = new FolderModel({ 'name': randomPrefix + 'folderOne', 'shortName': randomPrefix }); + let secondFolder = new FolderModel({ 'name': 'nameFolderOne', 'shortName': 'name' }); + let thirdFolder = new FolderModel({ 'name': 'nameFolderTwo' }); + + beforeAll(async (done) => { + let uploadActions = new UploadActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + let firstFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, firstFileModel.location, firstFileModel.name, '-my-'); + Object.assign(firstFileModel, firstFileUploaded.entry); + + await uploadActions.uploadFolder(this.alfrescoJsApi, firstFolderModel.name, '-my-'); + await uploadActions.uploadFolder(this.alfrescoJsApi, secondFolder.name, '-my-'); + await uploadActions.uploadFolder(this.alfrescoJsApi, thirdFolder.name, '-my-'); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + contentServicesPage.goToDocumentList(); + + done(); + }); + + // afterAll((done) => { + // NodesAPI.deleteContent(acsUser, firstFileModel.id, () => { + // NodesAPI.deleteContent(acsUser, firstFolderModel.id, () => { + // done(); + // }); + // }); + // }); + + it('1. Search bar is visible', () => { + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible(); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().checkSearchIconIsVisible(); + searchDialog.clickOnSearchIcon().checkSearchBarIsNotVisible().checkSearchIconIsVisible(); + }); + + it('2. Add input and close', () => { + searchDialog.checkSearchIconIsVisible().clickOnSearchIcon().enterText(firstFolderModel.shortName); + searchDialog.clickOnSearchIcon().checkSearchBarIsNotVisible().checkSearchIconIsVisible(); + contentServicesPage.checkAcsContainer(); + }); + + it('3. Search for content that doesn\'t exist', () => { + searchDialog.checkSearchBarIsNotVisible().clickOnSearchIcon().checkNoResultMessageIsNotDisplayed() + .enterText(search.inactive.name).checkNoResultMessageIsDisplayed(); + searchDialog.clearText(); + searchDialog.checkSearchBarIsNotVisible(); + }); + + it('4. Existing folder and file are displayed in search suggestion when typing only the first 4 letters', () => { + contentServicesPage.goToDocumentList(); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterText(firstFolderModel.shortName); + + searchDialog.resultTableContainsRow(firstFolderModel.name); + + searchDialog.getSpecificRowsHighlightName(firstFolderModel.name).then((text) => { + expect(text).toEqual(firstFolderModel.shortName); + }); + searchDialog.getSpecificRowsAuthor(firstFolderModel.name).then((text) => { + expect(text).toEqual(acsUser.firstName + ' ' + acsUser.lastName); + }); + searchDialog.getSpecificRowsCompleteName(firstFolderModel.name).then((text) => { + expect(text).toEqual(firstFolderModel.name); + }); + searchDialog.clearText(); + searchDialog.checkSearchBarIsNotVisible(); + + searchDialog.clickOnSearchIcon().enterText(firstFileModel.shortName); + searchDialog.resultTableContainsRow(firstFileModel.name); + searchDialog.getSpecificRowsHighlightName(firstFileModel.name).then((text) => { + expect(text).toEqual(firstFileModel.shortName); + }); + searchDialog.getSpecificRowsAuthor(firstFileModel.name).then((text) => { + expect(text).toEqual(acsUser.firstName + ' ' + acsUser.lastName); + }); + searchDialog.getSpecificRowsCompleteName(firstFileModel.name).then((text) => { + expect(text).toEqual(firstFileModel.name); + }); + searchDialog.clearText(); + searchDialog.checkSearchBarIsNotVisible(); + }); + + it('5. Existing folder and file are displayed in search suggestion', () => { + contentServicesPage.goToDocumentList(); + searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterText(firstFolderModel.name); + searchDialog.resultTableContainsRow(firstFolderModel.name); + searchDialog.getSpecificRowsHighlightName(firstFolderModel.name).then((text) => { + expect(text).toEqual(firstFolderModel.name); + }); + searchDialog.getSpecificRowsAuthor(firstFolderModel.name).then((text) => { + expect(text).toEqual(acsUser.firstName + ' ' + acsUser.lastName); + }); + searchDialog.getSpecificRowsCompleteName(firstFolderModel.name).then((text) => { + expect(text).toEqual(firstFolderModel.name); + }); + searchDialog.clearText(); + searchDialog.checkSearchBarIsNotVisible(); + + searchDialog.clickOnSearchIcon().enterText(firstFileModel.name); + searchDialog.resultTableContainsRow(firstFileModel.name); + searchDialog.getSpecificRowsHighlightName(firstFileModel.name).then((text) => { + expect(text).toEqual(firstFileModel.name); + }); + searchDialog.getSpecificRowsAuthor(firstFileModel.name).then((text) => { + expect(text).toEqual(acsUser.firstName + ' ' + acsUser.lastName); + }); + searchDialog.getSpecificRowsCompleteName(firstFileModel.name).then((text) => { + expect(text).toEqual(firstFileModel.name); + }); + + searchDialog.clearText(); + searchDialog.checkSearchBarIsNotVisible(); + }); + + it('6. Folder content is displayed when clicking on existing folder', () => { + searchDialog.clickOnSearchIcon().enterText(firstFolderModel.shortName); + searchDialog.resultTableContainsRow(firstFolderModel.name); + searchDialog.clickOnSpecificRow(firstFolderModel.name); + contentServicesPage.checkAcsContainer().waitForTableBody(); + contentServicesPage.currentFolderName().then((result) => { + expect(result).toEqual(firstFolderModel.name); + }); + contentServicesPage.goToDocumentList(); + + searchDialog.checkSearchIconIsVisible().clickOnSearchIcon().checkSearchBarIsVisible(); + searchDialog.enterText(firstFileModel.name).resultTableContainsRow(firstFileModel.name); + searchDialog.clickOnSpecificRow(firstFileModel.name); + filePreviewPage.getPDFTitleFromSearch().then((title) => { + expect(title).toEqual(firstFileModel.name); + }); + filePreviewPage.closePreviewWithButton(); + }); + + it('7. Non-existent folder is not displayed in search page', () => { + searchDialog.checkSearchIconIsVisible().clickOnSearchIcon(); + searchDialog.enterTextAndPressEnter(search.inactive.name); + searchResultPage.checkNoResultMessageIsDisplayed(); + contentServicesPage.goToDocumentList(); + }); + + it('8. Existing folder is displayed in search page', () => { + searchDialog.clickOnSearchIcon(); + searchDialog.enterTextAndPressEnter(firstFolderModel.name); + searchResultPage.checkContentIsDisplayed(firstFolderModel.name); + }); + + it('9. Existing file is displayed in search page', () => { + contentServicesPage.goToDocumentList(); + searchDialog.clickOnSearchIcon(); + searchDialog.enterTextAndPressEnter(firstFileModel.name); + searchResultPage.checkContentIsDisplayed(firstFileModel.name); + }); + + it('10. A folder is selected from search bar using arrows', () => { + contentServicesPage.goToDocumentList(); + + searchDialog.clickOnSearchIcon().enterText(secondFolder.shortName); + searchDialog.resultTableContainsRow(secondFolder.name).resultTableContainsRow(thirdFolder.name); + + let names = []; + searchDialog.getAllRowsValues().then((array) => { + names = array; + }); + Util.pressDownArrowAndEnter(); + + contentServicesPage.checkAcsContainer(); + contentServicesPage.currentFolderName().then((result) => { + expect(result).toEqual(names[0]); + }); + }); + + xit('11. The search bar gets closed when clicking on another browser tab', () => { + contentServicesPage.goToDocumentList(); + + searchDialog.clickOnSearchIcon().enterText(secondFolder.shortName); + searchDialog.resultTableContainsRow(secondFolder.name).resultTableContainsRow(thirdFolder.name); + + Util.openNewTabInBrowser(); + Util.switchToWindowHandler(0); + + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible(); + }); +}); diff --git a/e2e/search_page_component.e2e.ts b/e2e/search_page_component.e2e.ts new file mode 100644 index 0000000000..1b86e6453c --- /dev/null +++ b/e2e/search_page_component.e2e.ts @@ -0,0 +1,286 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import SearchDialog = require('./pages/adf/dialog/searchDialog'); +import ContentServicesPage = require('./pages/adf/contentServicesPage'); +import SearchResultPage = require('./pages/adf/searchResultsPage'); +import filePreviewPage = require('./pages/adf/filePreviewPage'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import FolderModel = require('./models/ACS/folderModel'); +import FileModel = require('./models/ACS/fileModel'); + +import TestConfig = require('./test.config'); +import Util = require('./util/util'); +import resources = require('./util/resources'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Test Search component - Search Page', () => { + let search = { + active: { + base: Util.generateRandomString(3), + firstFile: Util.generateRandomString(), + secondFile: Util.generateRandomString(), + extension: '.txt' + }, + no_permission: { + noPermFile: 'Meetings', + noPermFolder: 'Meeting Notes' + } + }; + + let loginPage = new LoginPage(); + let contentServicesPage = new ContentServicesPage(); + let searchDialog = new SearchDialog(); + let searchResultPage = new SearchResultPage(); + + let acsUser = new AcsUserModel(); + let emptyFolderModel = new FolderModel({ 'name': Util.generateRandomString()}); + let firstFileModel = new FileModel({ + 'name': search.active.firstFile, + 'location': resources.Files.ADF_DOCUMENTS.TXT.file_location + }); + let newFolderModel = new FolderModel({ 'name': 'newFolder' }); + let fileNames = [], adminFileNames = [], nrOfFiles = 15, adminNrOfFiles = 5; + + beforeAll(async (done) => { + fileNames = Util.generateSeqeunceFiles(1, nrOfFiles, search.active.base, search.active.extension); + adminFileNames = Util.generateSeqeunceFiles(nrOfFiles + 1, nrOfFiles + adminNrOfFiles, search.active.base, search.active.extension); + + let uploadActions = new UploadActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + await uploadActions.uploadFolder(this.alfrescoJsApi, emptyFolderModel.name, '-my-'); + let newFolderModelUploaded = await uploadActions.uploadFolder(this.alfrescoJsApi, newFolderModel.name, '-my-'); + + await uploadActions.createEmptyFiles(this.alfrescoJsApi, fileNames, newFolderModelUploaded.entry.id); + + let firstFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, firstFileModel.location, firstFileModel.name, '-my-'); + Object.assign(firstFileModel, firstFileUploaded.entry); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await uploadActions.createEmptyFiles(this.alfrescoJsApi, adminFileNames, newFolderModelUploaded.entry.id); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + contentServicesPage.goToDocumentList(); + + done(); + }); + + it('1. \'No results found searching for\' message is displayed on Search Page', () => { + let notExistentFileName = Util.generateRandomString(); + contentServicesPage.goToDocumentList(); + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(notExistentFileName); + searchResultPage.checkNoResultMessageIsDisplayed(); + }); + + it('2. File previewer is displayed', () => { + contentServicesPage.goToDocumentList(); + + searchDialog + .checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter(firstFileModel.name); + + searchResultPage.checkContentIsDisplayed(firstFileModel.name); + searchResultPage.navigateToFolder(firstFileModel.name); + + browser.driver.sleep(200); + + filePreviewPage.closePreviewWithButton(); + }); + + it('3. Only the searched file is displayed', () => { + contentServicesPage.goToDocumentList(); + + searchDialog + .checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter(search.active.firstFile); + + searchResultPage.checkContentIsDisplayed(search.active.firstFile); + expect(searchResultPage.numberOfResultsDisplayed()).toBe(1); + }); + + it('4. Folder content is displayed', () => { + contentServicesPage.goToDocumentList(); + + searchDialog.checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter(emptyFolderModel.name); + + searchResultPage.checkNoResultMessageIsNotDisplayed(); + searchResultPage.checkContentIsDisplayed(emptyFolderModel.name); + searchResultPage.navigateToFolder(emptyFolderModel.name); + contentServicesPage.currentFolderName().then((result) => { + expect(result).toEqual(emptyFolderModel.name); + }); + }); + + it('5. Delete a file from the Search Results Page', () => { + contentServicesPage.goToDocumentList(); + + searchDialog + .checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter(search.active.firstFile); + + searchResultPage.checkContentIsDisplayed(search.active.firstFile); + + searchResultPage.deleteContent(search.active.firstFile); + + searchResultPage.checkNoResultMessageIsDisplayed(); + searchResultPage.checkContentIsNotDisplayed(search.active.firstFile); + + contentServicesPage.goToDocumentList(); + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(search.active.firstFile); + searchResultPage.checkNoResultMessageIsDisplayed(); + }); + + it('6. Delete a folder from the Search Results Page', () => { + searchDialog.checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter(emptyFolderModel.name); + + searchResultPage.checkContentIsDisplayed(emptyFolderModel.name); + searchResultPage.checkNoResultMessageIsNotDisplayed(); + searchResultPage.checkContentIsDisplayed(emptyFolderModel.name); + searchResultPage.deleteContent(emptyFolderModel.name); + searchResultPage.checkNoResultMessageIsDisplayed(); + + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(emptyFolderModel.name); + searchResultPage.checkNoResultMessageIsDisplayed(); + }); + + xit('8. Sort content ascending by name.', () => { + contentServicesPage.goToDocumentList(); + + searchDialog + .checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter(search.active.base); + + searchResultPage.checkContentIsDisplayed(search.active.secondFile); + searchResultPage.sortAndCheckListIsOrderedByName(true).then((result) => { + expect(result).toEqual(true); + }); + }); + + xit('9. Sort content descending by name.', () => { + contentServicesPage.goToDocumentList(); + + searchDialog.checkSearchBarIsNotVisible() + .checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter(search.active.base); + + searchResultPage.checkContentIsDisplayed(search.active.secondFile); + searchResultPage.sortAndCheckListIsOrderedByName(false).then((result) => { + expect(result).toEqual(true); + }); + }); + + xit('10. Sort content ascending by author.', () => { + contentServicesPage.goToDocumentList(); + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(search.active.base); + searchResultPage.checkContentIsDisplayed(search.active.secondFile); + searchResultPage.sortAndCheckListIsOrderedByAuthor(true).then((result) => { + expect(result).toEqual(true); + }); + }); + + xit('11. Sort content descending by author.', () => { + contentServicesPage.goToDocumentList(); + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(search.active.base); + searchResultPage.checkContentIsDisplayed(search.active.secondFile); + searchResultPage.sortAndCheckListIsOrderedByAuthor(false).then((result) => { + expect(result).toEqual(true); + }); + }); + + xit('12. Sort content ascending by created date.', () => { + contentServicesPage.goToDocumentList(); + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(search.active.base); + searchResultPage.checkContentIsDisplayed(search.active.secondFile); + searchResultPage.sortAndCheckListIsOrderedByCreated(true).then((result) => { + expect(result).toEqual(true); + }); + }); + + xit('13. Sort content descending by created date.', () => { + contentServicesPage.goToDocumentList(); + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(search.active.base); + searchResultPage.checkContentIsDisplayed(search.active.secondFile); + searchResultPage.sortAndCheckListIsOrderedByCreated(false).then((result) => { + expect(result).toEqual(true); + }); + }); + + xit('14. Try to delete a file without rights from the Search Results Page', () => { + contentServicesPage.goToDocumentList(); + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(search.no_permission.noPermFile); + searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFile); + searchResultPage.deleteContent(search.no_permission.noPermFile); + searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFile); + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(search.no_permission.noPermFile); + searchResultPage.checkNoResultMessageIsNotDisplayed(); + searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFile); + }); + + it('15. Try to delete a folder without rights from the Search Results Page', () => { + contentServicesPage.goToDocumentList(); + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(search.no_permission.noPermFolder); + searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFolder); + searchResultPage.deleteContent(search.no_permission.noPermFolder); + searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFolder); + searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon() + .enterTextAndPressEnter(search.no_permission.noPermFolder); + searchResultPage.checkNoResultMessageIsNotDisplayed(); + searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFolder); + }); +}); diff --git a/e2e/sort_tasklist_pagination.e2e.ts b/e2e/sort_tasklist_pagination.e2e.ts new file mode 100644 index 0000000000..19a271a763 --- /dev/null +++ b/e2e/sort_tasklist_pagination.e2e.ts @@ -0,0 +1,98 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import TasksPage = require('./pages/adf/process_services/tasksPage'); +import PaginationPage = require('./pages/adf/paginationPage'); + +import CONSTANTS = require('./util/constants'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); +import Util = require('./util/util'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { AppsActions } from './actions/APS/apps.actions'; +import { UsersActions } from './actions/users.actions'; + +describe('Task List Pagination - Sorting', () => { + + let loginPage = new LoginPage(); + let processServicesPage = new ProcessServicesPage(); + let taskPage = new TasksPage(); + let paginationPage = new PaginationPage(); + + let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; + let nrOfTasks = 20, processUserModel; + let taskNameBase = 'Task'; + let taskNames = Util.generateSeqeunceFiles(10, nrOfTasks + 9, taskNameBase, ''); + + let itemsPerPage = { + five: '5', + fiveValue: 5, + ten: '10', + tenValue: 10, + twenty: '20', + twentyValue: 20 + }; + + beforeAll(async (done) => { + let apps = new AppsActions(); + let users = new UsersActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + processUserModel = await users.createTenantAndUser(this.alfrescoJsApi); + + await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password); + + let resultApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + + for (let i = 0; i < nrOfTasks; i++) { + this.alfrescoJsApi.activiti.taskApi.createNewTask({name: taskNames[i]}); + } + + loginPage.loginToProcessServicesUsingUserModel(processUserModel); + + done(); + }); + + it('[C260308] Sorting by Name', () => { + processServicesPage.goToProcessServices().goToTaskApp(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + taskPage.usingTasksListPage().waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.twenty); + taskPage.usingTasksListPage().waitForTableBody(); + taskPage.usingFiltersPage().sortByName(true); + taskPage.usingTasksListPage().waitForTableBody(); + taskPage.usingFiltersPage().getAllRowsNameColumn().then(function (list) { + expect(JSON.stringify(list) === JSON.stringify(taskNames)).toEqual(true); + }); + taskPage.usingFiltersPage().sortByName(false); + taskPage.usingFiltersPage().getAllRowsNameColumn().then(function (list) { + taskNames.reverse(); + expect(JSON.stringify(list) === JSON.stringify(taskNames)).toEqual(true); + }); + }); + +}); diff --git a/e2e/start_process_component.e2e.ts b/e2e/start_process_component.e2e.ts new file mode 100644 index 0000000000..b094fb52e7 --- /dev/null +++ b/e2e/start_process_component.e2e.ts @@ -0,0 +1,346 @@ +/*! + * @license + * Copyright 2016 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 Util = require('./util/util'); +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); +import CONSTANTS = require('./util/constants'); +import LoginPage = require('./pages/adf/loginPage'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import StartProcessPage = require('./pages/adf/process_services/startProcessPage'); +import ProcessFiltersPage = require('./pages/adf/process_services/processFiltersPage'); +import AppNavigationBarPage = require('./pages/adf/process_services/appNavigationBarPage'); +import ProcessDetailsPage = require('./pages/adf/process_services/processDetailsPage'); +import AttachmentListPage = require('./pages/adf/process_services/attachmentListPage'); + +import User = require('./models/APS/User'); +import AppPublish = require('./models/APS/AppPublish'); +import Tenant = require('./models/APS/Tenant'); + +import FileModel = require('./models/ACS/fileModel'); +import dateFormat = require('dateformat'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import fs = require('fs'); +import path = require('path'); + +describe('Start Process Component', () => { + + let loginPage = new LoginPage(); + let navigationBarPage = new NavigationBarPage(); + let processServicesPage = new ProcessServicesPage(); + let startProcessPage = new StartProcessPage(); + let processFiltersPage = new ProcessFiltersPage(); + let appNavigationBarPage = new AppNavigationBarPage(); + let processDetailsPage = new ProcessDetailsPage(); + let attachmentListPage = new AttachmentListPage(); + let app = resources.Files.APP_WITH_PROCESSES; + let appId, procUserModel, secondProcUserModel, tenantId; + + let auditLogFile = path.join('./e2e/download/', 'Audit.pdf'); + + let jpgFile = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.JPG.file_location, + 'name': resources.Files.ADF_DOCUMENTS.JPG.file_name + }); + + beforeAll(async (done) => { + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + let newTenant = await this.alfrescoJsApi.activiti.adminTenantsApi.createTenant(new Tenant()); + + tenantId = newTenant.id; + procUserModel = new User({ tenantId: tenantId }); + secondProcUserModel = new User({ tenantId: tenantId }); + + await this.alfrescoJsApi.activiti.adminUsersApi.createNewUser(procUserModel); + await this.alfrescoJsApi.activiti.adminUsersApi.createNewUser(secondProcUserModel); + + this.alfrescoJsApiUserTwo = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApiUserTwo.login(secondProcUserModel.email, secondProcUserModel.password); + + let pathFile = path.join(TestConfig.main.rootPath + app.file_location); + let file = fs.createReadStream(pathFile); + + let appCreated = await this.alfrescoJsApiUserTwo.activiti.appsApi.importAppDefinition(file); + + appId = appCreated.id; + + let publishApp = await this.alfrescoJsApiUserTwo.activiti.appsApi.publishAppDefinition(appId, new AppPublish()); + + await this.alfrescoJsApiUserTwo.activiti.appsApi.deployAppDefinitions({ appDefinitions: [{ id: publishApp.appDefinition.id }] }); + + loginPage.loginToProcessServicesUsingUserModel(procUserModel); + navigationBarPage.clickProcessServicesButton(); + done(); + + }); + + afterAll(async (done) => { + await this.alfrescoJsApiUserTwo.activiti.modelsApi.deleteModel(appId); + + // await this.alfrescoJsApiUserTwo.activiti.modelsApi.deleteModel(secondModelId); + // + // await this.alfrescoJsApiUserTwo.activiti.modelsApi.deleteModel(modelId); + + await this.alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(tenantId); + + done(); + }); + + it('Check start a process without a process model included', () => { + processServicesPage.checkApsContainer(); + processServicesPage.goToApp('Task App'); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.checkNoProcessMessage(); + }); + + it('Check Start Process within Task App', () => { + loginPage.loginToProcessServicesUsingUserModel(secondProcUserModel); + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp('Task App'); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + expect(startProcessPage.getDefaultName()).toEqual('My Default Name'); + }); + + it('Name of the process is required', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.selectFromProcessDropdown('process_without_se'); + startProcessPage.deleteDefaultName('My Default Name'); + startProcessPage.checkStartProcessButtonIsDisabled(); + }); + + it('Process Definition is required and cancel button is clicked', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp('Task App'); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.selectFromProcessDropdown('Choose one...'); + startProcessPage.checkStartProcessButtonIsDisabled(); + startProcessPage.clickCancelProcessButton(); + processFiltersPage.checkNoContentMessage(); + }); + + it('Check Start Process within an app without a start event', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.selectFromProcessDropdown('process_without_se'); + expect(startProcessPage.getDefaultName()).toEqual('My Default Name'); + startProcessPage.checkStartProcessButtonIsEnabled(); + }); + + xit('Start a process within an app with a start event', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.enterProcessName('Test'); + startProcessPage.selectFromProcessDropdown('process_with_se'); + startProcessPage.clickFormStartProcessButton() + .then(() => { + processDetailsPage.getId() + .then(function (result) { + return this.alfrescoJsApi.activiti.processApi.getProcessInstance(result); + }) + .then(function (response) { + expect(processDetailsPage.getProcessStatus()).toEqual(CONSTANTS.PROCESSSTATUS.RUNNING); + expect(processDetailsPage.getEndDate()).toEqual(CONSTANTS.PROCESSENDDATE); + expect(processDetailsPage.getProcessCategory()).toEqual(CONSTANTS.PROCESSCATEGORY); + expect(processDetailsPage.getBusinessKey()).toEqual(CONSTANTS.PROCESSBUSINESSKEY); + expect(processDetailsPage.getCreatedBy()).toEqual(response.getStartedBy().getEntireName()); + expect(processDetailsPage.getCreated()).toEqual(dateFormat(CONSTANTS.PROCESSDATEFORMAT)); + expect(processDetailsPage.getId()).toEqual(response.getId()); + expect(processDetailsPage.getProcessDescription()).toEqual(CONSTANTS.PROCESSDESCRIPTION); + expect(processDetailsPage.checkProcessTitleIsDisplayed()).toEqual(response.getName()); + }); + }); + }); + + it('Add a comment on an active process', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.enterProcessName('Comment Process'); + startProcessPage.selectFromProcessDropdown('process_with_se'); + startProcessPage.clickFormStartProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.selectFromProcessList('Comment Process'); + processDetailsPage.addComment('comment1'); + processDetailsPage.checkCommentIsDisplayed('comment1'); + }); + + it('Click Audit Log button', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.enterProcessName('Audit Log'); + startProcessPage.selectFromProcessDropdown('process_with_se'); + startProcessPage.clickFormStartProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.selectFromProcessList('Audit Log'); + processDetailsPage.clickAuditLogButton(); + expect(Util.fileExists(auditLogFile, 10)).toBe(true); + }); + + it('Add a file in the attachment list using the button', () => { + navigationBarPage.clickProcessServicesButton(); + + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + + appNavigationBarPage.clickProcessButton(); + + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + + startProcessPage.enterProcessName('Attach File'); + startProcessPage.selectFromProcessDropdown('process_with_se'); + startProcessPage.clickFormStartProcessButton(); + + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.selectFromProcessList('Attach File'); + + attachmentListPage.clickAttachFileButton(jpgFile.location); + attachmentListPage.checkFileIsAttached(jpgFile.name); + }); + + it('Click Show Diagram', () => { + navigationBarPage.clickProcessServicesButton(); + + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + + appNavigationBarPage.clickProcessButton(); + + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + + startProcessPage.enterProcessName('Show Diagram'); + startProcessPage.selectFromProcessDropdown('process_with_se'); + startProcessPage.clickFormStartProcessButton(); + + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.selectFromProcessList('Show Diagram'); + + processDetailsPage.clickShowDiagram(); + }); + + it('Click on an active task', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.enterProcessName('Active Task'); + startProcessPage.selectFromProcessDropdown('process_with_se'); + startProcessPage.clickFormStartProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.selectFromProcessList('Active Task'); + processDetailsPage.clickOnActiveTask(); + processDetailsPage.checkActiveTaskTitleIsDisplayed(app.task_name); + }); + + it('Click Cancel process button', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.enterProcessName('Cancel Process'); + startProcessPage.selectFromProcessDropdown('process_with_se'); + startProcessPage.clickFormStartProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.selectFromProcessList('Cancel Process'); + processDetailsPage.clickCancelProcessButton(); + processFiltersPage.clickCompletedFilterButton(); + processFiltersPage.selectFromProcessList('Cancel Process'); + processDetailsPage.checkShowDiagramIsDisabled(); + }); + + it('Add a comment on a complete process', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.enterProcessName('Comment Process 2'); + startProcessPage.selectFromProcessDropdown('process_with_se'); + startProcessPage.clickFormStartProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.selectFromProcessList('Comment Process 2'); + processDetailsPage.clickCancelProcessButton(); + processFiltersPage.clickCompletedFilterButton(); + processFiltersPage.selectFromProcessList('Comment Process 2'); + processDetailsPage.addComment('goodbye'); + processDetailsPage.checkCommentIsDisplayed('goodbye'); + }); + + it('Cannot attach a file on a completed process', () => { + navigationBarPage.clickProcessServicesButton(); + processServicesPage.checkApsContainer(); + processServicesPage.goToApp(app.title); + appNavigationBarPage.clickProcessButton(); + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + startProcessPage.enterProcessName('File'); + startProcessPage.selectFromProcessDropdown('process_with_se'); + startProcessPage.clickFormStartProcessButton(); + processFiltersPage.clickRunningFilterButton(); + processFiltersPage.selectFromProcessList('File'); + processDetailsPage.clickCancelProcessButton(); + processFiltersPage.clickCompletedFilterButton(); + processFiltersPage.selectFromProcessList('File'); + attachmentListPage.checkAttachFileButtonIsNotDisplayed(); + }); +}); diff --git a/e2e/start_task_custom_app.e2e.ts b/e2e/start_task_custom_app.e2e.ts new file mode 100644 index 0000000000..ae68e4fdbb --- /dev/null +++ b/e2e/start_task_custom_app.e2e.ts @@ -0,0 +1,205 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import TasksPage = require('./pages/adf/process_services/tasksPage'); +import AttachmentListPage = require('./pages/adf/process_services/attachmentListPage'); +import CONSTANTS = require('./util/constants'); + +import Task = require('./models/APS/Task'); +import Tenant = require('./models/APS/Tenant'); + +import TaskModel = require('./models/APS/TaskModel'); +import FileModel = require('./models/ACS/fileModel'); +import FormModel = require('./models/APS/FormModel'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +import dateFormat = require('dateformat'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { AppsActions } from './actions/APS/apps.actions'; +import { UsersActions } from './actions/users.actions'; + +describe('Start Task - Custom App', () => { + + let TASKDATAFORMAT = 'mmm dd yyyy'; + let loginPage = new LoginPage(); + let processServicesPage = new ProcessServicesPage(); + let attachmentListPage = new AttachmentListPage(); + let processUserModel, assigneeUserModel; + let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; + let formTextField = app.form_fields.form_fieldId; + let formFieldValue = 'First value '; + let taskPage = new TasksPage(); + let firstComment = 'comm1', firstChecklist = 'checklist1'; + let tasks = ['Modifying task', 'Information box', 'No form', 'Not Created', 'Refreshing form', 'Assignee task', 'Attach File']; + let appModel; + let jpgFile = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.JPG.file_location, + 'name': resources.Files.ADF_DOCUMENTS.JPG.file_name + }); + + beforeAll(async (done) => { + let apps = new AppsActions(); + let users = new UsersActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + let newTenant = await this.alfrescoJsApi.activiti.adminTenantsApi.createTenant(new Tenant()); + + assigneeUserModel = await users.createApsUser(this.alfrescoJsApi, newTenant.id); + + processUserModel = await users.createApsUser(this.alfrescoJsApi, newTenant.id); + + await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password); + + appModel = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + + done(); + }); + + it('Modifying task', () => { + loginPage.loginToProcessServicesUsingUserModel(processUserModel); + processServicesPage.goToProcessServices().goToApp(appModel.name).clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(tasks[0]) + .addForm(app.formName).clickStartButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(tasks[0]); + taskPage.usingTaskDetails().clickInvolvePeopleButton() + .typeUser(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) + .selectUserToInvolve(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) + .checkUserIsSelected(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName); + taskPage.usingTaskDetails().clickAddInvolvedUserButton(); + expect(taskPage.usingTaskDetails().getInvolvedUserEmail(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName)) + .toEqual(assigneeUserModel.email); + taskPage.usingTaskDetails().selectActivityTab().addComment(firstComment) + .checkCommentIsDisplayed(firstComment); + taskPage.clickOnAddChecklistButton().addName(firstChecklist).clickCreateChecklistButton(); + taskPage.checkChecklistIsDisplayed(firstChecklist); + taskPage.usingTaskDetails().selectDetailsTab(); + }); + }); + + it('Information box', () => { + processServicesPage.goToProcessServices().goToApp(appModel.name).clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(tasks[1]).addDescription('Description') + .addForm(app.formName).clickStartButton() + .then(() => { + expect(taskPage.usingTaskDetails().getTitle()).toEqual('Activities'); + }) + .then(() => { + return this.alfrescoJsApi.activiti.taskApi.listTasks(new Task({ sort: 'created-desc' })); + }) + .then((response) => { + let taskModel = new TaskModel(response.data[0]); + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(taskModel.getName()); + + expect(taskPage.usingTaskDetails().getCreated()).toEqual(dateFormat(taskModel.getCreated(), TASKDATAFORMAT)); + expect(taskPage.usingTaskDetails().getId()).toEqual(taskModel.getId()); + expect(taskPage.usingTaskDetails().getDescription()).toEqual(taskModel.getDescription()); + expect(taskPage.usingTaskDetails().getAssignee()).toEqual(taskModel.getAssignee().getEntireName()); + expect(taskPage.usingTaskDetails().getCategory()) + .toEqual(taskModel.getCategory() === null ? CONSTANTS.TASKDETAILS.NO_CATEGORY : taskModel.getCategory()); + expect(taskPage.usingTaskDetails().getDueDate()) + .toEqual(taskModel.getDueDate() === null ? CONSTANTS.TASKDETAILS.NO_DATE : taskModel.getDueDate()); + expect(taskPage.usingTaskDetails().getParentName()) + .toEqual(taskModel.getParentTaskName() === null ? CONSTANTS.TASKDETAILS.NO_PARENT : taskModel.getParentTaskName()); + expect(taskPage.usingTaskDetails().getStatus()).toEqual(CONSTANTS.TASKSTATUS.RUNNING); + + return this.alfrescoJsApi.activiti.taskFormsApi.getTaskForm(response.data[0].id); + }) + .then((response) => { + let formModel = new FormModel(response); + expect(taskPage.usingTaskDetails().getFormName()) + .toEqual(formModel.getName() === null ? CONSTANTS.TASKDETAILS.NO_FORM : formModel.getName()); + }); + }); + + it('Start task with no form', () => { + processServicesPage.goToProcessServices().goToApp(appModel.name).clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(tasks[2]).clickStartButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(tasks[2]); + taskPage.usingFormFields().noFormIsDisplayed(); + expect(taskPage.usingTaskDetails().getFormName()).toEqual(CONSTANTS.TASKDETAILS.NO_FORM); + }); + }); + + it('Start task buttons', () => { + processServicesPage.goToProcessServices().goToApp(appModel.name).clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().checkStartButtonIsDisabled().addName(tasks[3]) + .checkStartButtonIsEnabled().clickCancelButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskIsNotDisplayedInTasksList(tasks[3]); + expect(taskPage.usingFiltersPage().getActiveFilter()).toEqual(CONSTANTS.TASKFILTERS.MY_TASKS); + }); + }); + + it('Refreshing the form', () => { + processServicesPage.goToProcessServices().goToApp(appModel.name).clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask() + .addForm(app.formName).addName(tasks[4]).clickStartButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(tasks[4]); + expect(taskPage.usingFormFields().setFieldValue(by.id, formTextField, formFieldValue) + .getFieldValue(formTextField)).toEqual(formFieldValue); + taskPage.usingFormFields().refreshForm().checkFieldValue(by.id, formTextField, ''); + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(tasks[4]); + taskPage.usingFormFields().setFieldValue(by.id, formTextField, formFieldValue) + .checkFieldValue(by.id, formTextField, formFieldValue); + taskPage.usingFormFields().saveForm().checkFieldValue(by.id, formTextField, formFieldValue); + }); + }); + + it('Assign User', () => { + processServicesPage.goToProcessServices().goToApp(appModel.name).clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(tasks[5]) + .addAssignee(assigneeUserModel.firstName).clickStartButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskListIsLoaded(); + taskPage.usingTasksListPage().waitForTableBody(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(tasks[5]).selectTaskFromTasksList(tasks[5]); + taskPage.checkTaskTitle(tasks[5]); + expect(taskPage.usingTaskDetails().getAssignee()).toEqual(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName); + }); + }); + + it('Attach a file', () => { + processServicesPage.goToProcessServices().goToApp(appModel.name).clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(tasks[6]).clickStartButton() + .then(() => { + attachmentListPage.clickAttachFileButton(jpgFile.location); + attachmentListPage.checkFileIsAttached(jpgFile.name); + }); + }); +}); diff --git a/e2e/start_task_task_app.e2e.ts b/e2e/start_task_task_app.e2e.ts new file mode 100644 index 0000000000..071954ae68 --- /dev/null +++ b/e2e/start_task_task_app.e2e.ts @@ -0,0 +1,209 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import TasksPage = require('./pages/adf/process_services/tasksPage'); +import AttachmentListPage = require('./pages/adf/process_services/attachmentListPage'); + +import CONSTANTS = require('./util/constants'); + +import Tenant = require('./models/APS/Tenant'); +import Task = require('./models/APS/Task'); +import TaskModel = require('./models/APS/TaskModel'); +import FormModel = require('./models/APS/FormModel'); +import FileModel = require('./models/ACS/fileModel'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +import dateFormat = require('dateformat'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { AppsActions } from './actions/APS/apps.actions'; +import { UsersActions } from './actions/users.actions'; +import fs = require('fs'); +import path = require('path'); + +describe('Start Task - Task App', () => { + + let TASKDATAFORMAT = 'mmm dd yyyy'; + let loginPage = new LoginPage(); + let processServicesPage = new ProcessServicesPage(); + let attachmentListPage = new AttachmentListPage(); + let processUserModel, assigneeUserModel; + let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; + let formTextField = app.form_fields.form_fieldId; + let formFieldValue = 'First value '; + let taskPage = new TasksPage(); + let formModel; + let firstComment = 'comm1', firstChecklist = 'checklist1'; + let tasks = ['Modifying task', 'Information box', 'No form', 'Not Created', 'Refreshing form', 'Assignee task', 'Attach File']; + let jpgFile = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.JPG.file_location, + 'name': resources.Files.ADF_DOCUMENTS.JPG.file_name + }); + + beforeAll(async (done) => { + let apps = new AppsActions(); + let users = new UsersActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + let newTenant = await this.alfrescoJsApi.activiti.adminTenantsApi.createTenant(new Tenant()); + + assigneeUserModel = await users.createApsUser(this.alfrescoJsApi, newTenant.id); + + processUserModel = await users.createApsUser(this.alfrescoJsApi, newTenant.id); + + let pathFile = path.join(TestConfig.main.rootPath + app.file_location); + let file = fs.createReadStream(pathFile); + + await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password); + + await this.alfrescoJsApi.activiti.appsApi.importAppDefinition(file); + + loginPage.loginToProcessServicesUsingUserModel(processUserModel); + + done(); + }); + + it('Modifying task', () => { + processServicesPage.goToProcessServices().goToTaskApp().clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(tasks[0]) + .addForm(app.formName).clickStartButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(tasks[0]); + taskPage.usingTaskDetails().clickInvolvePeopleButton() + .typeUser(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) + .selectUserToInvolve(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName) + .checkUserIsSelected(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName); + taskPage.usingTaskDetails().clickAddInvolvedUserButton(); + expect(taskPage.usingTaskDetails().getInvolvedUserEmail(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName)) + .toEqual(assigneeUserModel.email); + taskPage.usingTaskDetails().selectActivityTab().addComment(firstComment) + .checkCommentIsDisplayed(firstComment); + taskPage.clickOnAddChecklistButton().addName(firstChecklist).clickCreateChecklistButton(); + taskPage.checkChecklistIsDisplayed(firstChecklist); + taskPage.usingTaskDetails().selectDetailsTab(); + }); + }); + + it('Information box', () => { + processServicesPage.goToProcessServices().goToTaskApp().clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(tasks[1]).addDescription('Description') + .addForm(app.formName).clickStartButton() + .then(() => { + expect(taskPage.usingTaskDetails().getTitle()).toEqual('Activities'); + }) + .then(() => { + return this.alfrescoJsApi.activiti.taskApi.listTasks(new Task({ sort: 'created-desc' })); + }) + .then((response) => { + let taskModel = new TaskModel(response.data[0]); + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(taskModel.getName()); + expect(taskPage.usingTaskDetails().getCreated()).toEqual(dateFormat(taskModel.getCreated(), TASKDATAFORMAT)); + expect(taskPage.usingTaskDetails().getId()).toEqual(taskModel.getId()); + expect(taskPage.usingTaskDetails().getDescription()).toEqual(taskModel.getDescription()); + expect(taskPage.usingTaskDetails().getAssignee()).toEqual(taskModel.getAssignee().getEntireName()); + expect(taskPage.usingTaskDetails().getCategory()) + .toEqual(taskModel.getCategory() === null ? CONSTANTS.TASKDETAILS.NO_CATEGORY : taskModel.getCategory()); + expect(taskPage.usingTaskDetails().getDueDate()) + .toEqual(taskModel.getDueDate() === null ? CONSTANTS.TASKDETAILS.NO_DATE : taskModel.getDueDate()); + expect(taskPage.usingTaskDetails().getParentName()) + .toEqual(taskModel.getParentTaskName() === null ? CONSTANTS.TASKDETAILS.NO_PARENT : taskModel.getParentTaskName()); + expect(taskPage.usingTaskDetails().getStatus()).toEqual(CONSTANTS.TASKSTATUS.RUNNING); + return this.alfrescoJsApi.activiti.taskFormsApi.getTaskForm(response.data[0].id); + }) + .then(function (response) { + formModel = new FormModel(response); + expect(taskPage.usingTaskDetails().getFormName()) + .toEqual(formModel.getName() === null ? CONSTANTS.TASKDETAILS.NO_FORM : formModel.getName()); + }); + }); + + it('Start task with no form', () => { + processServicesPage.goToProcessServices().goToTaskApp().clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(tasks[2]).clickStartButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(tasks[2]); + taskPage.usingFormFields().noFormIsDisplayed(); + expect(taskPage.usingTaskDetails().getFormName()).toEqual(CONSTANTS.TASKDETAILS.NO_FORM); + }); + }); + + it('Start task buttons', () => { + processServicesPage.goToProcessServices().goToTaskApp().clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().checkStartButtonIsDisabled().addName(tasks[3]) + .checkStartButtonIsEnabled().clickCancelButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskIsNotDisplayedInTasksList(tasks[3]); + expect(taskPage.usingFiltersPage().getActiveFilter()).toEqual(CONSTANTS.TASKFILTERS.MY_TASKS); + }); + }); + + it('Refreshing the form', () => { + processServicesPage.goToProcessServices().goToTaskApp().clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask() + .addForm(app.formName).addName(tasks[4]).clickStartButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(tasks[4]); + expect(taskPage.usingFormFields().setFieldValue(by.id, formTextField, formFieldValue) + .getFieldValue(formTextField)).toEqual(formFieldValue); + taskPage.usingFormFields().refreshForm().checkFieldValue(by.id, formTextField, ''); + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(tasks[4]); + taskPage.usingFormFields().setFieldValue(by.id, formTextField, formFieldValue) + .checkFieldValue(by.id, formTextField, formFieldValue); + taskPage.usingFormFields().saveForm().checkFieldValue(by.id, formTextField, formFieldValue); + }); + }); + + it('Assign User', () => { + processServicesPage.goToProcessServices().goToTaskApp().clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(tasks[5]) + .addAssignee(assigneeUserModel.firstName).clickStartButton() + .then(() => { + taskPage.usingTasksListPage().checkTaskListIsLoaded(); + taskPage.usingTasksListPage().waitForTableBody(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + taskPage.usingTasksListPage().checkTaskIsDisplayedInTasksList(tasks[5]).selectTaskFromTasksList(tasks[5]); + taskPage.checkTaskTitle(tasks[5]); + expect(taskPage.usingTaskDetails().getAssignee()).toEqual(assigneeUserModel.firstName + ' ' + assigneeUserModel.lastName); + }); + }); + + it('Attach a file', () => { + processServicesPage.goToProcessServices().goToTaskApp().clickTasksButton(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.MY_TASKS); + taskPage.createNewTask().addName(tasks[6]).clickStartButton() + .then(() => { + attachmentListPage.clickAttachFileButton(jpgFile.location); + attachmentListPage.checkFileIsAttached(jpgFile.name); + }); + }); +}); diff --git a/e2e/tag_component.e2e.ts b/e2e/tag_component.e2e.ts new file mode 100644 index 0000000000..e991087051 --- /dev/null +++ b/e2e/tag_component.e2e.ts @@ -0,0 +1,136 @@ +/*! + * @license + * Copyright 2016 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 AcsUserModel = require('./models/ACS/acsUserModel'); +import FileModel = require('./models/ACS/fileModel'); + +import LoginPage = require('./pages/adf/loginPage'); +import TagPage = require('./pages/adf/tagPage'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); +import Util = require('./util/util'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Tag component', () => { + + let loginPage = new LoginPage(); + let tagPage = new TagPage(); + + let acsUser = new AcsUserModel(); + let pdfFileModel = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name }); + let sameTag = Util.generateRandomStringToLowerCase(); + let tagList = [Util.generateRandomStringToLowerCase(), Util.generateRandomStringToLowerCase()]; + let uppercaseTag = Util.generateRandomStringToUpperCase(); + let digitsTag = Util.generateRandomStringDigits(); + let nonLatinTag = Util.generateRandomStringNonLatin(); + + beforeAll(async (done) => { + let uploadActions = new UploadActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + let pdfUploadedFile = await uploadActions.uploadFile(this.alfrescoJsApi, pdfFileModel.location, pdfFileModel.name, '-my-'); + + Object.assign(pdfFileModel, pdfUploadedFile.entry); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + done(); + }); + + it('Tag node ID', () => { + tagPage.goToTagPage(); + expect(tagPage.getNodeId()).toEqual(''); + expect(tagPage.getNewTagPlaceholder()).toEqual('New Tag'); + expect(tagPage.addTagButtonIsEnabled()).toEqual(false); + tagPage.checkTagListIsEmpty(); + tagPage.checkTagListByNodeIdIsEmpty(); + expect(tagPage.addNewTagInput('a').addTagButtonIsEnabled()).toEqual(false); + expect(tagPage.getNewTagInput()).toEqual('a'); + }); + + xit('New tag for specific Node ID', () => { + tagPage.goToTagPage(); + tagPage.insertNodeId(pdfFileModel.id); + tagPage.addTag(tagList[0]); + + Util.refreshBrowser(); + tagPage.insertNodeId(pdfFileModel.id); + + tagPage.checkTagIsDisplayedInTagList(tagList[0]); + tagPage.checkTagIsDisplayedInTagListByNodeId(tagList[0]); + }); + + it('Tag name already exists', () => { + tagPage.goToTagPage(); + tagPage.insertNodeId(pdfFileModel.id); + tagPage.addTag(sameTag); + tagPage.checkTagIsDisplayedInTagList(sameTag); + tagPage.addTag(sameTag); + expect(tagPage.getErrorMessage()).toEqual('Tag already exists'); + }); + + it('Multiple tags', () => { + tagPage.goToTagPage(); + tagPage.insertNodeId(pdfFileModel.id); + tagPage.checkTagListIsOrderedAscending(); + tagPage.checkTagListByNodeIdIsOrderedAscending(); + tagPage.checkTagListContentServicesIsOrderedAscending(); + }); + + xit('Tag text field', () => { + tagPage.goToTagPage(); + tagPage.insertNodeId(pdfFileModel.id); + + tagPage.addTag(uppercaseTag); + Util.refreshBrowser(); + tagPage.insertNodeId(pdfFileModel.id); + + tagPage.checkTagIsDisplayedInTagList(uppercaseTag.toLowerCase()); + tagPage.checkTagIsDisplayedInTagListByNodeId(uppercaseTag.toLowerCase()); + tagPage.checkTagIsDisplayedInTagListContentServices(uppercaseTag.toLowerCase()); + tagPage.checkTagIsNotDisplayedInTagList(uppercaseTag); + + tagPage.addTag(digitsTag); + Util.refreshBrowser(); + tagPage.insertNodeId(pdfFileModel.id); + + tagPage.checkTagIsDisplayedInTagList(digitsTag); + tagPage.checkTagIsDisplayedInTagListByNodeId(digitsTag); + tagPage.checkTagIsDisplayedInTagListContentServices(digitsTag); + + tagPage.addTag(nonLatinTag); + Util.refreshBrowser(); + tagPage.insertNodeId(pdfFileModel.id); + + tagPage.checkTagIsDisplayedInTagList(nonLatinTag); + tagPage.checkTagIsDisplayedInTagListByNodeId(nonLatinTag); + tagPage.checkTagIsDisplayedInTagListContentServices(nonLatinTag); + }); +}); diff --git a/e2e/task_list_pagination.e2e.ts b/e2e/task_list_pagination.e2e.ts new file mode 100644 index 0000000000..efeaeb92a7 --- /dev/null +++ b/e2e/task_list_pagination.e2e.ts @@ -0,0 +1,208 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ProcessServicesPage = require('./pages/adf/process_services/processServicesPage'); +import TasksPage = require('./pages/adf/process_services/tasksPage'); +import PaginationPage = require('./pages/adf/paginationPage'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); + +import CONSTANTS = require('./util/constants'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { AppsActions } from './actions/APS/apps.actions'; +import { UsersActions } from './actions/users.actions'; + +describe('Task List Pagination', () => { + + let loginPage = new LoginPage(); + let processServicesPage = new ProcessServicesPage(); + let taskPage = new TasksPage(); + let paginationPage = new PaginationPage(); + let navigationBarPage = new NavigationBarPage(); + + let processUserModel, processUserModelEmpty; + let app = resources.Files.SIMPLE_APP_WITH_USER_FORM; + let currentPage = 1, nrOfTasks = 20, totalPages; + + let itemsPerPage = { + five: '5', + fiveValue: 5, + ten: '10', + tenValue: 10, + fifteen: '15', + fifteenValue: 15, + twenty: '20', + twentyValue: 20, + default: '25' + }; + + beforeAll(async (done) => { + let apps = new AppsActions(); + let users = new UsersActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + processUserModel = await users.createTenantAndUser(this.alfrescoJsApi); + processUserModelEmpty = await users.createTenantAndUser(this.alfrescoJsApi); + + await this.alfrescoJsApi.login(processUserModel.email, processUserModel.password); + + let resultApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + + for (let i = 0; i < nrOfTasks; i++) { + await apps.startProcess(this.alfrescoJsApi, resultApp); + } + + loginPage.loginToProcessServicesUsingUserModel(processUserModel); + + done(); + }); + + it('Pagination at first 20 started tasks', () => { + processServicesPage.goToProcessServices().goToTaskApp(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.default); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfTasks + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(nrOfTasks); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + paginationPage.selectItemsPerPage(itemsPerPage.twenty); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfTasks + ' of ' + nrOfTasks); + }); + + it('Items per page set to 5', () => { + processServicesPage.goToProcessServices().goToTaskApp(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + paginationPage.selectItemsPerPage(itemsPerPage.five); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fiveValue + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); + paginationPage.clickOnNextPage(); + currentPage++; + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 6-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); + paginationPage.clickOnNextPage(); + currentPage++; + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); + paginationPage.clickOnNextPage(); + currentPage++; + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + itemsPerPage.fiveValue * currentPage + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); + + processServicesPage.goToProcessServices().goToTaskApp(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + }); + + it('Items per page set to 10', () => { + processServicesPage.goToProcessServices().goToTaskApp(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + paginationPage.selectItemsPerPage(itemsPerPage.ten); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.tenValue); + paginationPage.clickOnNextPage(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.twentyValue + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.tenValue); + + processServicesPage.goToProcessServices().goToTaskApp(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + }); + + it('Items per page set to 15', () => { + processServicesPage.goToProcessServices().goToTaskApp(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + paginationPage.selectItemsPerPage(itemsPerPage.fifteen); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.fifteenValue); + paginationPage.clickOnNextPage(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 16-' + itemsPerPage.twentyValue + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.fiveValue); + + processServicesPage.goToProcessServices().goToTaskApp(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + }); + + it('[C261006] Page number dropdown', () => { + currentPage = 1; + totalPages = 2; + processServicesPage.goToProcessServices().goToTaskApp(); + taskPage.usingFiltersPage().goToFilter(CONSTANTS.TASKFILTERS.INV_TASKS); + taskPage.usingTasksListPage().waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.ten); + taskPage.usingTasksListPage().waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.tenValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + + paginationPage.clickOnPageDropdown(); + expect(paginationPage.getPageDropdownOptions()).toEqual(['1', '2']); + currentPage = 2; + paginationPage.clickOnPageDropdownOption('2'); + taskPage.usingTasksListPage().waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 11-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.tenValue); + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsEnabled(); + + paginationPage.clickOnPageDropdown(); + expect(paginationPage.getPageDropdownOptions()).toEqual(['1', '2']); + currentPage = 1; + paginationPage.clickOnPageDropdownOption('1'); + taskPage.usingTasksListPage().waitForTableBody(); + expect(paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); + expect(paginationPage.getTotalPages()).toEqual('of ' + totalPages); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue * currentPage + ' of ' + nrOfTasks); + expect(taskPage.getAllDisplayedRows()).toBe(itemsPerPage.tenValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + }); + + it('Pagination in an empty task list', () => { + loginPage.loginToProcessServicesUsingUserModel(processUserModelEmpty); + + processServicesPage.goToProcessServices().goToTaskApp(); + paginationPage.checkPaginationIsNotDisplayed(); + }); + +}); diff --git a/e2e/test.config.js b/e2e/test.config.js new file mode 100644 index 0000000000..8365daf19f --- /dev/null +++ b/e2e/test.config.js @@ -0,0 +1,103 @@ +/** + * Contains the default app deployment settings + * @class config.test.config + */ + +var HOST = process.env.URL_HOST_ADF; +var USERNAME = process.env.USERNAME_ADF; +var PASSWORD = process.env.PASSWORD_ADF; +var EMAIL = process.env.EMAIL_ADF; + +module.exports = { + + main: { + presence_timeout: 60000, + + rootPath: __dirname + }, + + adf: { + /** + * base + */ + url: "http://" + HOST, + + /** + * adf port + */ + port: "", + + /** + * adf login + */ + login: "/login", + + /** + * admin username + */ + adminUser: USERNAME, + + /** + * main admin email + */ + adminEmail: EMAIL, + + /** + * main admin password + */ + adminPassword: PASSWORD + }, + + adf_acs: { + /**
 + * The protocol where the app runs.
 + * @config main.protocol {String}
 + */ + protocol: "http", + + /**
 + * The protocol where the app runs.
 + * @config main.protocol {String}
 + */ + host: HOST, + + /**
 + * * The port where the app runs.
 + * * @config main.port {String}
 + * */ + port: "", + + /**

 + * The ECM API context required for calls

 + * @config adf.ACSAPIContextRoot {String}

 + */ + apiContextRoot: "/alfresco/api/-default-/public", + }, + + adf_aps: { + /**
 + * The protocol where the app runs.
 + * @config main.protocol {String}
 + */ + protocol: "http", + + /**
 + * The host where the app runs.
 + * @config main.host {String}
 + */ + host: HOST, + + /**
 + * * The port where the app runs.
 + * * @config main.port {String}
 + * */ + port: "", + + /**

 + * The BPM API context required for calls

 + * @config adf.APSAPIContextRoot {String}

 + */ + apiContextRoot: "/activiti-app" + } + +}; diff --git a/e2e/theming_component.e2e.ts b/e2e/theming_component.e2e.ts new file mode 100644 index 0000000000..ffc4e9d166 --- /dev/null +++ b/e2e/theming_component.e2e.ts @@ -0,0 +1,70 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); + +import TestConfig = require('./test.config'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import CONSTANTS = require('./util/constants'); + +import AlfrescoApi = require('alfresco-js-api-node'); + +describe('Test Theming component', () => { + + let navigationBarPage = new NavigationBarPage(); + let loginPage = new LoginPage(); + let acsUser = new AcsUserModel(); + + beforeAll(async (done) => { + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + loginPage.goToLoginPage(); + loginPage.waitForElements(); + + done(); + }); + + xit('Theming component', () => { + expect(loginPage.getShowPasswordIconColor()).toEqual(CONSTANTS.THEMING.DEFAULT_PASSWORD_ICON_COLOR); + expect(loginPage.getSignInButtonColor()).toEqual(CONSTANTS.THEMING.DEFAULT_LOGIN_BUTTON_COLOR); + expect(loginPage.getBackgroundColor()).toEqual(CONSTANTS.THEMING.DEFAULT_BACKGROUND_COLOR); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + navigationBarPage.clickThemeButton(); + navigationBarPage.clickOnSpecificThemeButton(CONSTANTS.THEMING.PINK_BLUE_DARK); + navigationBarPage.clickLoginButton(); + loginPage.waitForElements(); + + loginPage.enterUsername(acsUser.email); + loginPage.enterPassword(acsUser.password); + + expect(loginPage.getShowPasswordIconColor()).toEqual(CONSTANTS.THEMING.PINK_BLUE_DARK_PASSWORD_ICON_COLOR); + expect(loginPage.getSignInButtonColor()).toEqual(CONSTANTS.THEMING.PINK_BLUE_DARK_LOGIN_BUTTON_COLOR); + expect(loginPage.getBackgroundColor()).toEqual(CONSTANTS.THEMING.PINK_BLUE_DARK_BACKGROUND_COLOR); + }); + +}); diff --git a/e2e/trashcan_pagination.e2e.ts b/e2e/trashcan_pagination.e2e.ts new file mode 100644 index 0000000000..c0fb978d12 --- /dev/null +++ b/e2e/trashcan_pagination.e2e.ts @@ -0,0 +1,147 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import TrashcanPage = require('./pages/adf/trashcanPage'); +import PaginationPage = require('./pages/adf/paginationPage'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import FolderModel = require('./models/ACS/folderModel'); + +import TestConfig = require('./test.config'); +import Util = require('./util/util'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Trashcan - Pagination', () => { + let pagination = { + base: 'newFile', + extension: '.txt' + }; + + let itemsPerPage = { + five: '5', + fiveValue: 5, + ten: '10', + tenValue: 10, + fifteen: '15', + fifteenValue: 15, + twenty: '20', + twentyValue: 20, + default: '25' + }; + + let loginPage = new LoginPage(); + let trashcanPage = new TrashcanPage(); + let paginationPage = new PaginationPage(); + let navigationBarPage = new NavigationBarPage(); + + let acsUser = new AcsUserModel(); + let newFolderModel = new FolderModel({ 'name': 'newFolder' }); + let nrOfFiles = 20; + + beforeAll(async (done) => { + let uploadActions = new UploadActions(); + + let fileNames = Util.generateSeqeunceFiles(10, nrOfFiles + 9, pagination.base, pagination.extension); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + let folderUploadedModel = await uploadActions.uploadFolder(this.alfrescoJsApi, newFolderModel.name, '-my-'); + + let emptyFiles = await uploadActions.createEmptyFiles(this.alfrescoJsApi, fileNames, folderUploadedModel.entry.id); + await emptyFiles.list.entries.forEach(async (node) => { + await this.alfrescoJsApi.node.deleteNode(node.entry.id).then(() => { + }, () => { + this.alfrescoJsApi.node.deleteNode(node.entry.id); + }); + }); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + done(); + }); + + it('[C272811] 20 Items per page', () => { + navigationBarPage.clickTrashcanButton(); + + trashcanPage.waitForTableBody(); + + paginationPage.selectItemsPerPage(itemsPerPage.twenty); + + trashcanPage.waitForTableBody(); + trashcanPage.waitForPagination(); + + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.twenty); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + nrOfFiles + ' of ' + nrOfFiles); + expect(trashcanPage.numberOfResultsDisplayed()).toBe(nrOfFiles); + + paginationPage.checkNextPageButtonIsDisabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + }); + + it('[C276742] 15 Items per page', () => { + navigationBarPage.clickTrashcanButton(); + trashcanPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.fifteen); + trashcanPage.waitForTableBody(); + trashcanPage.waitForPagination(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.fifteen); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fifteenValue + ' of ' + nrOfFiles); + expect(trashcanPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fifteenValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + }); + + it('[C276743] 10 Items per page', () => { + navigationBarPage.clickTrashcanButton(); + trashcanPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.ten); + trashcanPage.waitForTableBody(); + trashcanPage.waitForPagination(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.ten); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.tenValue + ' of ' + nrOfFiles); + expect(trashcanPage.numberOfResultsDisplayed()).toBe(itemsPerPage.tenValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + }); + + it('[C276744] 5 Items per page', () => { + navigationBarPage.clickTrashcanButton(); + trashcanPage.waitForTableBody(); + paginationPage.selectItemsPerPage(itemsPerPage.five); + trashcanPage.waitForTableBody(); + trashcanPage.waitForPagination(); + expect(paginationPage.getCurrentItemsPerPage()).toEqual(itemsPerPage.five); + expect(paginationPage.getPaginationRange()).toEqual('Showing 1-' + itemsPerPage.fiveValue + ' of ' + nrOfFiles); + expect(trashcanPage.numberOfResultsDisplayed()).toBe(itemsPerPage.fiveValue); + paginationPage.checkNextPageButtonIsEnabled(); + paginationPage.checkPreviousPageButtonIsDisabled(); + }); +}) +; diff --git a/e2e/tsconfig.e2e.json b/e2e/tsconfig.e2e.json new file mode 100644 index 0000000000..1d9e5edf09 --- /dev/null +++ b/e2e/tsconfig.e2e.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/e2e/uploader_component.e2e.ts b/e2e/uploader_component.e2e.ts new file mode 100644 index 0000000000..cea00d6eae --- /dev/null +++ b/e2e/uploader_component.e2e.ts @@ -0,0 +1,343 @@ +/*! + * @license + * Copyright 2016 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 LoginPage = require('./pages/adf/loginPage'); +import ContentServicesPage = require('./pages/adf/contentServicesPage'); +import UploadDialog = require('./pages/adf/dialog/uploadDialog'); +import UploadToggles = require('./pages/adf/dialog/uploadToggles'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import FileModel = require('./models/ACS/fileModel'); +import FolderModel = require('./models/ACS/folderModel'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Test Uploader component', () => { + + let contentServicesPage = new ContentServicesPage(); + let uploadDialog = new UploadDialog(); + let uploadToggles = new UploadToggles(); + let loginPage = new LoginPage(); + let acsUser = new AcsUserModel(); + + let firstPdfFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF_B.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PDF_B.file_location + }); + let docxFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.DOCX.file_name, + 'location': resources.Files.ADF_DOCUMENTS.DOCX.file_location + }); + let pdfFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PDF.file_location + }); + let pngFileModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PNG.file_name, + 'location': resources.Files.ADF_DOCUMENTS.PNG.file_location + }); + let largeFile = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.LARGE_FILE.file_name, + 'location': resources.Files.ADF_DOCUMENTS.LARGE_FILE.file_location + }); + let fileWithSpecificSize = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.TXT_400B.file_name, + 'location': resources.Files.ADF_DOCUMENTS.TXT_400B.file_location + }); + let emptyFile = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.TXT_0B.file_name, + 'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location + }); + let folderOne = new FolderModel({ + 'name': resources.Files.ADF_DOCUMENTS.FOLDER_ONE.folder_name, + 'location': resources.Files.ADF_DOCUMENTS.FOLDER_ONE.folder_location + }); + let uploadedFileInFolder = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.FILE_INSIDE_FOLDER_ONE.file_name }); + let filesLocation = [pdfFileModel.location, docxFileModel.location, pngFileModel.location, firstPdfFileModel.location]; + let filesName = [pdfFileModel.name, docxFileModel.name, pngFileModel.name, firstPdfFileModel.name]; + + beforeAll(async (done) => { + let uploadActions = new UploadActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + contentServicesPage.goToDocumentList(); + + let pdfUploadedFile = await uploadActions.uploadFile(this.alfrescoJsApi, firstPdfFileModel.location, firstPdfFileModel.name, '-my-'); + + Object.assign(firstPdfFileModel, pdfUploadedFile.entry); + + done(); + }); + + it('1. Upload Button is visible on the page', () => { + expect(contentServicesPage.getSingleFileButtonTooltip()).toEqual('Custom tooltip'); + + contentServicesPage + .checkUploadButton() + .checkContentIsDisplayed(firstPdfFileModel.name); + + contentServicesPage + .deleteContent(firstPdfFileModel.name) + .checkContentIsNotDisplayed(pdfFileModel.name); + }); + + it('2. Upload a pdf file', () => { + contentServicesPage + .uploadFile(pdfFileModel.location) + .checkContentIsDisplayed(pdfFileModel.name); + + uploadDialog.fileIsUploaded(pdfFileModel.name); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + contentServicesPage + .deleteContent(pdfFileModel.name) + .checkContentIsNotDisplayed(pdfFileModel.name); + }); + + it('3. Upload a text file', () => { + contentServicesPage + .uploadFile(docxFileModel.location) + .checkContentIsDisplayed(docxFileModel.name); + + uploadDialog.fileIsUploaded(docxFileModel.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + contentServicesPage + .deleteContent(docxFileModel.name) + .checkContentIsNotDisplayed(docxFileModel.name); + }); + + it('4. Upload a png file', () => { + contentServicesPage + .uploadFile(pngFileModel.location) + .checkContentIsDisplayed(pngFileModel.name); + + uploadDialog.fileIsUploaded(pngFileModel.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + contentServicesPage + .deleteContent(pngFileModel.name) + .checkContentIsNotDisplayed(pngFileModel.name); + }); + + it('5. Minimize and maximize the upload dialog box', () => { + contentServicesPage + .uploadFile(docxFileModel.location) + .checkContentIsDisplayed(docxFileModel.name); + + uploadDialog.fileIsUploaded(docxFileModel.name).checkCloseButtonIsDisplayed(); + expect(uploadDialog.getTitleText()).toEqual('Uploaded 1 / 1'); + expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); + expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); + uploadDialog.minimizeUploadDialog().dialogIsMinimized(); + expect(uploadDialog.getTitleText()).toEqual('Uploaded 1 / 1'); + expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); + expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); + uploadDialog.maximizeUploadDialog().dialogIsDisplayed().fileIsUploaded(docxFileModel.name); + expect(uploadDialog.getTitleText()).toEqual('Uploaded 1 / 1'); + expect(uploadDialog.numberOfCurrentFilesUploaded()).toEqual('1'); + expect(uploadDialog.numberOfInitialFilesUploaded()).toEqual('1'); + uploadDialog.checkCloseButtonIsDisplayed().clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.deleteContent(docxFileModel.name).checkContentIsNotDisplayed(docxFileModel.name); + }); + + it('6. Cancel the uploaded file through the upload dialog icon', () => { + contentServicesPage.uploadFile(pdfFileModel.location) + .checkContentIsDisplayed(pdfFileModel.name); + uploadDialog.removeUploadedFile(pdfFileModel.name).fileIsCancelled(pdfFileModel.name); + expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.checkContentIsNotDisplayed(pdfFileModel.name); + }); + + xit('7. Cancel a big file through the upload dialog icon before the upload to be done', () => { + contentServicesPage.uploadFile(largeFile.location); + + uploadDialog.removeFileWhileUploading(largeFile.name).fileIsCancelled(largeFile.name); + + expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.checkContentIsNotDisplayed(largeFile.name); + }); + + xit('8. Cancel a big file through the cancel uploads button', () => { + contentServicesPage.uploadFile(largeFile.location); + uploadDialog.cancelUploads(); + expect(uploadDialog.getTitleText()).toEqual('Uploading 0 / 1'); + expect(uploadDialog.getConfirmationDialogTitleText()).toEqual('Cancel Upload'); + expect(uploadDialog.getConfirmationDialogDescriptionText()).toEqual('Stop uploading and remove files already uploaded.'); + uploadDialog.clickOnConfirmationDialogYesButton().fileIsCancelled(largeFile.name); + expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.checkContentIsNotDisplayed(largeFile.name); + }); + + xit('9. Cancel uploading multiple files', () => { + uploadToggles.enableMultipleFileUpload(); + contentServicesPage.uploadMultipleFile([pngFileModel.location, largeFile.location]); + uploadDialog.cancelUploads(); + expect(uploadDialog.getConfirmationDialogTitleText()).toEqual('Cancel Upload'); + expect(uploadDialog.getConfirmationDialogDescriptionText()).toEqual('Stop uploading and remove files already uploaded.'); + uploadDialog.clickOnConfirmationDialogYesButton().fileIsCancelled(pngFileModel.name).fileIsCancelled(largeFile.name); + expect(uploadDialog.getTitleText()).toEqual('Upload canceled'); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.checkContentIsNotDisplayed(pngFileModel.name).checkContentIsNotDisplayed(largeFile.name); + uploadToggles.disableMultipleFileUpload(); + }); + + it('10. Tooltip of uploading multiple files button', () => { + uploadToggles.enableMultipleFileUpload(); + expect(contentServicesPage.getMultipleFileButtonTooltip()).toEqual('Custom tooltip'); + uploadToggles.disableMultipleFileUpload(); + }); + + it('11. Enable extension filter', () => { + uploadToggles.enableExtensionFilter().addExtension('.docx'); + contentServicesPage.uploadFile(docxFileModel.location).checkContentIsDisplayed(docxFileModel.name); + uploadDialog.removeUploadedFile(docxFileModel.name).fileIsCancelled(docxFileModel.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.uploadFile(largeFile.location).checkContentIsNotDisplayed(largeFile.name); + uploadDialog.dialogIsNotDisplayed(); + uploadToggles.disableExtensionFilter(); + }); + + it('12. Upload same file twice', () => { + contentServicesPage.uploadFile(pdfFileModel.location).checkContentIsDisplayed(pdfFileModel.name); + pdfFileModel.setVersion('1'); + contentServicesPage.uploadFile(pdfFileModel.location).checkContentIsDisplayed(pdfFileModel.getVersionName()); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.deleteContent(pdfFileModel.name).checkContentIsNotDisplayed(pdfFileModel.name); + contentServicesPage.deleteContent(pdfFileModel.getVersionName()).checkContentIsNotDisplayed(pdfFileModel.getVersionName()); + pdfFileModel.setVersion(''); + }); + + it('13. Enable versioning', () => { + uploadToggles.enableVersioning(); + contentServicesPage.uploadFile(pdfFileModel.location).checkContentIsDisplayed(pdfFileModel.name); + pdfFileModel.setVersion('1'); + contentServicesPage.uploadFile(pdfFileModel.location).checkContentIsDisplayed(pdfFileModel.name); + uploadDialog.fileIsUploaded(pdfFileModel.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.checkContentIsNotDisplayed(pdfFileModel.getVersionName()); + contentServicesPage.deleteContent(pdfFileModel.name).checkContentIsNotDisplayed(pdfFileModel.name); + pdfFileModel.setVersion(''); + uploadToggles.disableVersioning(); + }); + + xit('14. Enable folder upload', () => { + uploadToggles.enableFolderUpload(); + contentServicesPage.uploadFolder(folderOne.location).checkContentIsDisplayed(folderOne.name); + expect(contentServicesPage.getFolderButtonTooltip()).toEqual('Custom tooltip'); + uploadDialog.fileIsUploaded(uploadedFileInFolder.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.doubleClickRow(folderOne.name).checkContentIsDisplayed(uploadedFileInFolder.name); + contentServicesPage.goToDocumentList(); + uploadToggles.disableFolderUpload(); + }); + + xit('16. The files uploaded before closing the upload dialog box are not displayed anymore in the upload box', () => { + contentServicesPage.uploadFile(docxFileModel.location).checkContentIsDisplayed(docxFileModel.name); + + uploadDialog.fileIsUploaded(docxFileModel.name); + + contentServicesPage.uploadFile(pngFileModel.location).checkContentIsDisplayed(pngFileModel.name); + + uploadDialog.fileIsUploaded(pngFileModel.name).fileIsUploaded(docxFileModel.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + contentServicesPage.uploadFile(pdfFileModel.location).checkContentIsDisplayed(pdfFileModel.name); + + uploadDialog.fileIsUploaded(pdfFileModel.name).fileIsNotDisplayedInDialog(pngFileModel.name).fileIsNotDisplayedInDialog(docxFileModel.name); + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + contentServicesPage.deleteContents([docxFileModel.name, pngFileModel.name, pdfFileModel.name]) + .checkContentsAreNotDisplayed([docxFileModel.name, pngFileModel.name, pdfFileModel.name]); + }); + + xit('18. Upload files on the same time', () => { + contentServicesPage.goToDocumentList(); + contentServicesPage.checkAcsContainer(); + + uploadToggles.enableMultipleFileUpload(); + + contentServicesPage.uploadMultipleFile(filesLocation).checkContentsAreDisplayed(filesName); + + uploadDialog.filesAreUploaded(filesName); + + expect(uploadDialog.getTitleText()).toEqual('Uploaded 4 / 4'); + + uploadDialog.clickOnCloseButton().dialogIsNotDisplayed(); + + contentServicesPage.deleteContents(filesName).checkContentsAreNotDisplayed(filesName); + + uploadToggles.disableMultipleFileUpload(); + }); + + xit('19. Enable max size and set it to 400', () => { + contentServicesPage.goToDocumentList(); + contentServicesPage.checkAcsContainer(); + uploadToggles.enableMaxSize().addMaxSize('400'); + contentServicesPage.uploadFile(fileWithSpecificSize.location).checkContentIsDisplayed(fileWithSpecificSize.name); + uploadDialog.fileIsUploaded(fileWithSpecificSize.name).clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.deleteContent(fileWithSpecificSize.name).checkContentIsNotDisplayed(fileWithSpecificSize.name); + uploadToggles.addMaxSize('399'); + contentServicesPage.uploadFile(fileWithSpecificSize.location).checkContentIsNotDisplayed(fileWithSpecificSize.name); + uploadDialog.fileIsNotDisplayedInDialog(fileWithSpecificSize.name); + expect(contentServicesPage.getErrorMessage()).toEqual('File ' + fileWithSpecificSize.name + ' is larger than the allowed file size'); + contentServicesPage.uploadFile(emptyFile.location).checkContentIsDisplayed(emptyFile.name); + uploadDialog.fileIsUploaded(emptyFile.name).clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.deleteContent(emptyFile.name).checkContentIsNotDisplayed(emptyFile.name); + uploadToggles.disableMaxSize(); + }); + + xit('20. Enable max size and set it to 0', () => { + contentServicesPage.goToDocumentList(); + contentServicesPage.checkAcsContainer(); + uploadToggles.enableMaxSize().addMaxSize('0'); + contentServicesPage.uploadFile(fileWithSpecificSize.location).checkContentIsNotDisplayed(fileWithSpecificSize.name); + uploadDialog.fileIsNotDisplayedInDialog(fileWithSpecificSize.name); + expect(contentServicesPage.getErrorMessage()).toEqual('File ' + fileWithSpecificSize.name + ' is larger than the allowed file size'); + contentServicesPage.uploadFile(emptyFile.location).checkContentIsDisplayed(emptyFile.name); + uploadDialog.fileIsUploaded(emptyFile.name).clickOnCloseButton().dialogIsNotDisplayed(); + contentServicesPage.deleteContent(emptyFile.name).checkContentIsNotDisplayed(emptyFile.name); + uploadToggles.disableMaxSize(); + }); + + xit('21. Set max size to 1 and disable it', () => { + uploadToggles.enableMaxSize().addMaxSize('1'); + uploadToggles.disableMaxSize(); + contentServicesPage.uploadFile(fileWithSpecificSize.location).checkContentIsDisplayed(fileWithSpecificSize.name); + uploadDialog.fileIsUploaded(fileWithSpecificSize.name).clickOnCloseButton().dialogIsNotDisplayed(); + }); +}); diff --git a/e2e/user_info_component.e2e.ts b/e2e/user_info_component.e2e.ts new file mode 100644 index 0000000000..508ff2f625 --- /dev/null +++ b/e2e/user_info_component.e2e.ts @@ -0,0 +1,188 @@ +/*! + * @license + * Copyright 2016 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 AdfSettingsPage = require('./pages/adf/settingsPage'); +import LoginPage = require('./pages/adf/loginPage'); +import UserInfoDialog = require('./pages/adf/dialog/userInfoDialog'); +import NavigationBarPage = require('./pages/adf/navigationBarPage'); + +import AcsUserModel = require('./models/ACS/acsUserModel'); +import FileModel = require('./models/ACS/fileModel'); + +import PeopleAPI = require('./restAPI/ACS/PeopleAPI'); + +import TestConfig = require('./test.config'); +import resources = require('./util/resources'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UsersActions } from './actions/users.actions'; + +describe('Test User Info component', () => { + + let adfSettingsPage = new AdfSettingsPage(); + let loginPage = new LoginPage(); + let navigationBarPage = new NavigationBarPage(); + let userInfoDialog = new UserInfoDialog(); + let processUserModel, contentUserModel; + let acsAvatarFileModel = new FileModel({ + 'name': resources.Files.PROFILE_IMAGES.ECM.file_name, + 'location': resources.Files.PROFILE_IMAGES.ECM.file_location + }); + let apsAvatarFileModel = new FileModel({ + 'name': resources.Files.PROFILE_IMAGES.BPM.file_name, + 'location': resources.Files.PROFILE_IMAGES.BPM.file_location + }); + + beforeAll(async (done) => { + let users = new UsersActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ALL', + hostEcm: TestConfig.adf.url, + hostBpm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + processUserModel = await users.createTenantAndUser(this.alfrescoJsApi); + + contentUserModel = new AcsUserModel({ + 'id': processUserModel.email, + 'password': processUserModel.password, + 'firstName': processUserModel.firstName, + 'lastName': processUserModel.lastName, + 'email': processUserModel.email + }); + + await this.alfrescoJsApi.core.peopleApi.addPerson(contentUserModel); + + loginPage.goToLoginPage(); + adfSettingsPage.setProviderEcmBpm(); + loginPage.login(contentUserModel.id, contentUserModel.password); + + done(); + }); + + it('1. Enable Process Services and Content Services ', () => { + navigationBarPage.clickUserProfile(); + userInfoDialog.dialogIsDisplayed().contentServicesTabIsDisplayed().processServicesTabIsDisplayed(); + expect(userInfoDialog.getContentHeaderTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoDialog.getContentTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoDialog.getContentEmail()).toEqual(contentUserModel.email); + expect(userInfoDialog.getContentJobTitle()).toEqual(contentUserModel.jobTitle); + userInfoDialog.checkInitialImage(); + userInfoDialog.APSProfileImageNotDisplayed(); + userInfoDialog.ACSProfileImageNotDisplayed(); + userInfoDialog.clickOnContentServicesTab(); + expect(userInfoDialog.getContentHeaderTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoDialog.getContentTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoDialog.getContentEmail()).toEqual(contentUserModel.email); + expect(userInfoDialog.getContentJobTitle()).toEqual(contentUserModel.jobTitle); + userInfoDialog.checkInitialImage(); + userInfoDialog.APSProfileImageNotDisplayed(); + userInfoDialog.ACSProfileImageNotDisplayed(); + userInfoDialog.clickOnProcessServicesTab().processServicesTabIsDisplayed(); + expect(userInfoDialog.getProcessHeaderTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); + expect(userInfoDialog.getProcessTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); + expect(userInfoDialog.getProcessEmail()).toEqual(processUserModel.email); + userInfoDialog.checkInitialImage(); + userInfoDialog.APSProfileImageNotDisplayed(); + userInfoDialog.ACSProfileImageNotDisplayed(); + userInfoDialog.closeUserProfile(); + }); + + it('2. Enable Content Services and disable Process Services ', () => { + navigationBarPage.clickLoginButton(); + adfSettingsPage.setProviderEcm(); + loginPage.login(contentUserModel.id, contentUserModel.password); + navigationBarPage.clickUserProfile(); + userInfoDialog.dialogIsDisplayed().contentServicesTabIsNotDisplayed().processServicesTabIsNotDisplayed(); + expect(userInfoDialog.getContentHeaderTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoDialog.getContentTitle()).toEqual(contentUserModel.firstName + ' ' + contentUserModel.lastName); + expect(userInfoDialog.getContentEmail()).toEqual(contentUserModel.email); + expect(userInfoDialog.getContentJobTitle()).toEqual(contentUserModel.jobTitle); + userInfoDialog.checkInitialImage(); + userInfoDialog.APSProfileImageNotDisplayed(); + userInfoDialog.ACSProfileImageNotDisplayed(); + userInfoDialog.closeUserProfile(); + }); + + it('3. Enable Process Services and disable Content Services ', () => { + navigationBarPage.clickLoginButton(); + + adfSettingsPage.setProviderBpm(); + + loginPage.login(processUserModel.email, processUserModel.password); + + navigationBarPage.clickUserProfile(); + + userInfoDialog.dialogIsDisplayed().contentServicesTabIsNotDisplayed().processServicesTabIsNotDisplayed(); + + expect(userInfoDialog.getProcessHeaderTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); + expect(userInfoDialog.getProcessTitle()).toEqual(processUserModel.firstName + ' ' + processUserModel.lastName); + expect(userInfoDialog.getProcessEmail()).toEqual(processUserModel.email); + + userInfoDialog.checkInitialImage(); + userInfoDialog.APSProfileImageNotDisplayed(); + userInfoDialog.ACSProfileImageNotDisplayed(); + userInfoDialog.closeUserProfile(); + }); + + it('4. Enable Process Services and Content Services ', () => { + let flow = protractor.promise.controlFlow(); + flow.execute(() => { + PeopleAPI.updateAvatarViaAPI(contentUserModel, acsAvatarFileModel, '-me-'); + PeopleAPI.getAvatarViaAPI(4, contentUserModel, '-me-', function (result) { + }); + }); + + navigationBarPage.clickLoginButton(); + adfSettingsPage.setProviderEcm(); + loginPage.login(contentUserModel.id, contentUserModel.password); + navigationBarPage.clickUserProfile(); + userInfoDialog.checkACSProfileImage(); + userInfoDialog.APSProfileImageNotDisplayed(); + userInfoDialog.closeUserProfile(); + }); + + it('5. The profile picture is changed from APS', async () => { + let users = new UsersActions(); + navigationBarPage.clickLoginButton(); + + await this.alfrescoJsApi.login(contentUserModel.email, contentUserModel.password); + await users.changeProfilePictureAps(this.alfrescoJsApi, apsAvatarFileModel.getLocation()); + + adfSettingsPage.setProviderBpm(); + loginPage.login(processUserModel.email, processUserModel.password); + navigationBarPage.clickUserProfile(); + userInfoDialog.checkAPSProfileImage(); + userInfoDialog.ACSProfileImageNotDisplayed(); + userInfoDialog.initialImageNotDisplayed(); + userInfoDialog.closeUserProfile(); + }); + + it('6. Delete the profile picture from ACS', () => { + navigationBarPage.clickLoginButton(); + PeopleAPI.deleteAvatarViaAPI(contentUserModel, '-me-'); + adfSettingsPage.setProviderEcm(); + loginPage.login(contentUserModel.id, contentUserModel.password); + navigationBarPage.clickUserProfile(); + userInfoDialog.checkInitialImage(); + userInfoDialog.APSProfileImageNotDisplayed(); + userInfoDialog.ACSProfileImageNotDisplayed(); + userInfoDialog.closeUserProfile(); + }); +}); diff --git a/e2e/util/constants.js b/e2e/util/constants.js new file mode 100644 index 0000000000..e30da4acfe --- /dev/null +++ b/e2e/util/constants.js @@ -0,0 +1,129 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var exports = module.exports = {}; + +/** + *Rest API Response statusCodes + */ +exports.HTTP_RESPONSE_STATUS_CODE ={ + FORBIDDEN: 403, + OK: 200, + BAD_REQUEST: 400, + INTERNAL_SERVER_ERROR: 500, + UNAUTHORIZED: 401, + NOT_FOUND: 404 +}; + +/** + *Rest API Response Messages + */ +exports.HTTP_RESPONSE_STATUS ={ + OK: { + 'CODE': 200, + 'MESSAGE': 'OK' + }, + CREATED: { + 'CODE': 201, + 'MESSAGE': 'Created' + }, + NO_CONTENT: { + 'CODE': 204, + 'MESSAGE': 'No Content' + }, + NOT_FOUND: { + 'CODE': 404, + 'MESSAGE': 'Not Found' + } +}; + +/** + *Rest API HTTP content types + */ +exports.HTTP_CONTENT_TYPE = { + JSON : 'application/json', + URLENCODED : 'application/x-www-form-urlencoded', + IMAGE_PNG: 'image/png', + TEXT: 'text/csv' +}; + +exports.APPLICATION = { + ADF_APS: 'adf_aps', + ADF_ACS: 'adf_acs', + APS: 'main' +}; + +exports.TASKFILTERS = { + MY_TASKS: 'My Tasks', + INV_TASKS: 'Involved Tasks', + QUE_TASKS: 'Queued Tasks', + COMPL_TASKS: 'Completed Tasks' +}; + +exports.TASKDETAILS = { + NO_FORM: 'No form', + NO_PARENT: 'No parent', + NO_DATE: 'No date', + NO_CATEGORY: 'No category' +}; + +exports.TASKSTATUS = { + RUNNING: 'Running' +}; + +exports.METADATA = { + DATAFORMAT: "mmm dd yyyy", + TITLE: "Details", + COMMENTS_TAB: "COMMENTS", + PROPERTY_TAB: "PROPERTIES", + VERSIONS_TAB: "VERSIONS", + DEFAULT_ASPECT: "Properties", + MORE_INFO_BUTTON: "More information", + LESS_INFO_BUTTON: "Less information", + ARROW_DOWN: "keyboard_arrow_down", + ARROW_UP: "keyboard_arrow_up", + EDIT_BUTTON_TOOLTIP: "Edit" +}; + +exports.THEMING = { + PINK_BLUE_DARK: "Pink Bluegrey Dark", + DEFAULT_PASSWORD_ICON_COLOR: "rgba(0, 0, 0, 0.87)", + DEFAULT_LOGIN_BUTTON_COLOR: "rgba(0, 0, 0, 0.38)", + DEFAULT_BACKGROUND_COLOR: "rgba(0, 0, 0, 0.87)", + PINK_BLUE_DARK_PASSWORD_ICON_COLOR: "rgba(255, 255, 255, 1)", + PINK_BLUE_DARK_LOGIN_BUTTON_COLOR: "rgba(255, 255, 255, 0.87)", + PINK_BLUE_DARK_BACKGROUND_COLOR: "rgba(255, 255, 255, 1)", +}; + +exports.APP_COLOR = { + BLUE: "rgba(0, 0, 0, 0.87)" +}; + +exports.PROCESSENDDATE = "No date"; + +exports.PROCESSCATEGORY = "http://www.activiti.org/processdef"; + +exports.PROCESSBUSINESSKEY = "None"; + +exports.PROCESSDESCRIPTION = "No description"; + +exports.PROCESSDATEFORMAT = "mmm dd yyyy"; + +exports.PROCESSSTATUS = { + RUNNING: 'Running', + COMPLETED: 'Completed' +}; diff --git a/e2e/util/resources.js b/e2e/util/resources.js new file mode 100644 index 0000000000..42df39a60d --- /dev/null +++ b/e2e/util/resources.js @@ -0,0 +1,199 @@ +/*! + * @license + * Copyright 2016 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. + */ + + +/** + * Provides resources used throughout the application + * + * @class util.Resources + */ +var exports = module.exports = {}; + +exports.Files = { + + APP_WITH_DATE_FIELD_FORM: { + file_location: "/resources/apps/TestDate.zip", + title: "TestDate", + process_title: "TestDateField", + id: -1, + form_fields: { + testdate_field: "activiti-testdate", + completed_task_date_field: "span[ng-if*='field.dateDisplayFormat']" + } + }, + + APP_WITH_PROCESSES:{ + file_location:"/resources/apps/App_with_processes.zip", + title: "App_with_processes", + description: "Description for app", + process_se_name: "process_with_se", + task_name: "Task Test 2" + }, + + SIMPLE_APP: { + file_location: "/resources/Simple App.zip", + title: "Simple App", + id: -18, + process_definitions: null, + start_form: null + }, + + SIMPLE_APP_WITH_USER_FORM: { + file_location: "/resources/apps/Simple App with User Form.zip", + title: "Simple App with User Form", + processName: "Simple Process", + processDiagramFileLocation: '/resources/apps/SimpleAppWithUserForm.png', + processThumbnail: '/resources/processes/Simple Process Thumbnail.png', + formName: "Simple form", + id: -19, + taskName: "User Task", + form_fields: { + text_field: "activiti-textfield", + form_fieldId: "textfield", + text_field_value: "Hi tester, from Rest call" + } + }, + + WIDGETS_SMOKE_TEST: { + file_location: "/resources/apps/Widgets smoke test.zip", + formName: "Widgets smoke test", + form_fields: { + text_id: "text", + header_id: "header", + number_id: "number", + amount_id: "amount", + people_id: "people", + group_id: "groupofpeople", + multiline_id: "multilinetext", + typeahead_id: "typeahead", + displaytext_id: "displaytext", + displayvalue_id: "displayvalue", + hyperlink_id: "hyperlink", + attachfolder_id: "attachfolder", + attachfile_id: "attachfile", + date_id: "date", + dateTime_id: "dateandtime", + checkbox_id: "checkbox", + dropdown_id: "dropdown", + dropdown_value: "mat-select[id='dropdown'] span span", + radiobuttons_id: "radiobuttons", + dynamictable_id: "dynamictable" + } + }, + + ADF_DOCUMENTS: { + PDF: { + file_location: "/resources/adf/allFileTypes/a_file_supported.pdf", + file_name: "a_file_supported.pdf", + short_file_name: "a_file", + first_page_text: "A Journey into Test Frameworks", + second_page_text: "After looking into Spock’s GitHub", + last_page_text: "and provide feedback. The main advantages being the readability of the te", + last_page_number: "8" + }, + PDF_B: { + file_location: "/resources/adf/allFileTypes/b_file_supported.pdf", + file_name: "b_file_supported.pdf" + }, + PDF_C: { + file_location: "/resources/adf/allFileTypes/c_file_supported.pdf", + file_name: "c_file_supported.pdf" + }, + PDF_D: { + file_location: "/resources/adf/allFileTypes/d_file_supported.pdf", + file_name: "d_file_supported.pdf" + }, + PDF_ALL: { + file_location: "/resources/adf/allFileTypes/pdf_all_properties.pdf", + file_name: "pdf_all_properties.pdf" + }, + LARGE_FILE:{ + file_location: "/resources/adf/BigFile.zip", + file_name: "BigFile.zip" + }, + EXCEL: { + file_location: "/resources/adf/allFileTypes/a_excel_file.xlsx", + file_name: "a_excel_file.xlsx" + }, + DOCX: { + file_location: "/resources/adf/allFileTypes/a_file_unsupported.docx", + file_name: "a_file_unsupported.docx" + }, + FOLDER_ONE: { + folder_location: "/resources/adf/folderOne", + folder_name: "folderOne" + }, + FILE_INSIDE_FOLDER_ONE: { + file_location: "/resources/adf/folderOne/share_profile_pic.png", + file_name: "share_profile_pic.png" + }, + JPG: { + file_location: "/resources/adf/allFileTypes/a_jpg_file.jpg", + file_name: "a_jpg_file.jpg" + }, + MP4: { + file_location: "/resources/adf/allFileTypes/a_mp4_file.mp4", + file_name: "a_mp4_file.mp4" + }, + PNG: { + file_location: "/resources/adf/allFileTypes/a_png_file.png", + file_name: "a_png_file.png" + }, + PPT: { + file_location: "/resources/adf/allFileTypes/a_ppt_file.pptx", + file_name: "a_ppt_file.pptx", + first_page_text: "PPTX test file" + }, + TEST: { + file_location: "/resources/adf/allFileTypes/testExtension.test", + file_name: "testExtension.test" + }, + TXT: { + file_location: "/resources/adf/allFileTypes/a_txt_file.rtf", + file_name: "a_txt_file.rtf" + }, + TXT_400B: { + file_location: "/resources/adf/allFileTypes/file400Bytes.txt", + file_name: "file400Bytes.txt" + }, + TXT_0B: { + file_location: "/resources/adf/allFileTypes/zeroBytesFile.txt", + file_name: "zeroBytesFile.txt" + }, + ZIP: { + file_location: "/resources/adf/allFileTypes/a_zip_file.mp4.zip", + file_name: "a_zip_file.mp4.zip" + }, + + PAGES:{ + file_location: "/resources/adf/allFileTypes/file_unsupported.pages", + file_name: "file_unsupported.pages" + }, + }, + + PROFILE_IMAGES: { + ECM: { + file_location: "/resources/adf/share_profile_pic.jpg", + file_name: "share_profile_pic.jpg" + }, + BPM: { + file_location: "/resources/adf/activiti_profile_pic.png", + file_name: "activiti_profile_pic.png" + }, + } + +}; diff --git a/e2e/util/util.js b/e2e/util/util.js new file mode 100644 index 0000000000..9cf0b550eb --- /dev/null +++ b/e2e/util/util.js @@ -0,0 +1,515 @@ +/*! + * @license + * Copyright 2016 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. + */ + +var exports = module.exports = {}; +var http = require('http'); +var https = require('https'); + +var fs = require('fs'); +var FormData = require('form-data'); +var path = require('path'); + +var until = protractor.ExpectedConditions; +var TestConfig = require('../test.config'); +var moment = require('moment'); +var CONSTANTS = require('./constants'); + + +var DEFAULT_TIMEOUT = 20000; +/** + * Provides utility methods used throughout the testing framework. + * + * @class util.Util + */ + +// Dynamically load http or https library based on protocol chosen +var apiRequest = TestConfig.main.protocol !== 'http' ? https : http; + +/** + * creates an absolute path string if multiple file uploads are required + */ +exports.uploadParentFolder = function (filePath) { + var parentFolder = path.resolve(path.join(__dirname, 'test')); + var absolutePath = path.resolve(path.join(parentFolder, filePath)); + + return absolutePath; +}; + +/** + * Sleeps the main thread for time millieconds + * @param time {int} Milliseconds to sleep + * @param callback + * @method sleep + */ +exports.sleep = function (time, callback) { + var stop = new Date().getTime(); + while (new Date().getTime() < stop + time) { + } + callback(); +}; + + +exports.refreshBrowser = function () { + browser.refresh(); +}; + +/** + * Get current date in long format: Oct 24, 2016 + * + * @return {string} + * @method getCrtDateLongFormat + */ +exports.getCrtDateLongFormat = function () { + var currentDate = new Date(); + var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' + ]; + + currentDate = months[currentDate.getMonth()] + ' ' + currentDate.getDate() + ', ' + (currentDate.getYear() + 1900); + + return currentDate; +}; + +/** + * Get current date in specified format + * + * @return {string} + * @method getCrtDateInFormat + */ +exports.getCrtDateInFormat = function (dateFormat) { + var currentDate = moment().format(dateFormat); + // console.debug("Current date formatted with: '" + dateFormat + "' format, is: '" + currentDate + "'"); + return currentDate; +}; + +/** + * Generates a random string. + * + * @param length {int} If this parameter is not provided the length is set to 8 by default. + * @return {string} + * @method generateRandomString + */ +exports.generateRandomString = function (length) { + length = typeof length !== 'undefined' ? length : 8; + var text = ''; + var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + for (var i = 0; i < length; i++) + text += possible.charAt(Math.floor(Math.random() * possible.length)); + + return text; +}; + +exports.generatePasswordString = function (length) { + length = typeof length !== 'undefined' ? length : 8; + var text = ''; + var possibleUpperCase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + var possibleLowerCase = 'abcdefghijklmnopqrstuvwxyz'; + var lowerCaseLimit = Math.floor(length / 2); + + for (var i = 0; i < lowerCaseLimit; i++) { + text += possibleLowerCase.charAt(Math.floor(Math.random() * possibleLowerCase.length)); + } + + for (var i = 0; i < length - lowerCaseLimit; i++) { + text += possibleUpperCase.charAt(Math.floor(Math.random() * possibleUpperCase.length)); + } + + return text; +}; + +/** + * Generates a random string - digits only. + * + * @param length {int} If this parameter is not provided the length is set to 8 by default. + * @return {string} + * @method generateRandomString + */ +exports.generateRandomStringDigits = function (length) { + length = typeof length !== 'undefined' ? length : 8; + var text = ''; + var possible = '0123456789'; + + for (var i = 0; i < length; i++) + text += possible.charAt(Math.floor(Math.random() * possible.length)); + + return text; +}; + +/** + * Generates a random string - non-latin characters only. + * + * @param length {int} If this parameter is not provided the length is set to 3 by default. + * @return {string} + * @method generateRandomString + */ +exports.generateRandomStringNonLatin = function (length) { + length = typeof length !== 'undefined' ? length : 3; + var text = ''; + var possible = '密码你好𠮷'; + + for (var i = 0; i < length; i++) + text += possible.charAt(Math.floor(Math.random() * possible.length)); + + return text; +}; + +/** + * Generates a random string to lowercase. + * + * @param length {int} If this parameter is not provided the length is set to 8 by default. + * @return {string} + * @method generateRandomString + */ +exports.generateRandomStringToLowerCase = function (length) { + + return this.generateRandomString().toLowerCase(); +}; + +/** + * Generates a random string to uppercase. + * + * @param length {int} If this parameter is not provided the length is set to 8 by default. + * @return {string} + * @method generateRandomString + */ +exports.generateRandomStringToUpperCase = function (length) { + + return this.generateRandomString().toUpperCase(); +}; + + +/** + * Generates a sequence of files with name: baseName + index + extension (e.g.) baseName1.txt, baseName2.txt, ... + * + * @param startIndex {int} + * @param endIndex {int} + * @param baseName{string} the base name of all files + * @param extension{string} the extension of the file + * @return fileNames + * @method generateSeqeunceFiles + */ +exports.generateSeqeunceFiles = function (startIndex, endIndex, baseName, extension) { + var fileNames = []; + for (var i = startIndex; i <= endIndex; i++) { + fileNames.push(baseName + i + extension); + } + return fileNames; +}; + +/** + * Generates a random number (as int) in the interval [min, max). + * + * @param min {int} + * @param max {int} + * @return {number} + * @method generateRandomInt + */ +exports.generateRandomInt = function (min, max) { + return Math.floor(Math.random() * (max - min) + min); +}; + +/** + * Generates a random email address following the format: abcdef@activiti.test.com + * + * @param length {int} + * @return {string} + * @method generateRandomEmail + */ +exports.generateRandomEmail = function (length) { + length = typeof length !== 'undefined' ? length : 5; + var email = ''; + var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + for (var i = 0; i < length; i++) + email += possible.charAt(Math.floor(Math.random() * possible.length)); + + email += '@activiti.test.com'; + return email.toLowerCase(); +}; + + +/** + * Generates a random date inside the interval [1990, 2100) following the format ddmmyyyy. + * + * @return {string} + * @method generateRandomDateFormat + */ +exports.generateRandomDateFormat = function () { + var day = Math.floor(Math.random() * (29 - 1) + 1); + var month = Math.floor(Math.random() * (12 - 1) + 1); + var year = Math.floor(Math.random() * (2100 - 1990) + 1990); + + return day + '.' + month + '.' + year; +}; + +/** + * Generates a random date inside the interval [1990, 2100) following the format dd-mm-yyyy. + * + * @return {string} + * @method generateRandomDate + */ +exports.generateRandomDate = function () { + var day = Math.floor(Math.random() * (29 - 1) + 1); + if (day < 10) day = '0' + day; + var month = Math.floor(Math.random() * (12 - 1) + 1); + if (month < 10) month = '0' + month; + var year = Math.floor(Math.random() * (2100 - 1990) + 1990); + + return day + '-' + month + '-' + year; +}; + +/** + * Returns TRUE if the first array contains all elements from the second one. + * + * @param {array} superset + * @param {array} subset + * + * @return {boolean} + * @method arrayContainsArray + */ +exports.arrayContainsArray = function (superset, subset) { + if (0 === subset.length) { + return false; + } + return subset.every(function (value) { + return (superset.indexOf(value) >= 0); + }); +}; + +/** + * Reads the content of the file and provides it on callback + * + * @param filePath + * @param callback + * @method readFile + */ +exports.readFile = function (filePath, callback) { + var absolutePath = path.join(TestConfig.main.rootPath + filePath); + fs.readFile(absolutePath, {encoding: 'utf8'}, function (err, data) { + if (err) throw err; + callback(data); + }); +}; + +/** + * Executes external script that simulates dragndrop + * Waits for the form to open + */ +exports.prepareFieldDndOnForm = function (script) { + // TODO + // Currently all fields are added to the second column + // Ability to add fields to first column is needed as well + // dnd simulation script may need to be modified for this to be possible + browser.driver.executeScript(script); + browser.waitForAngular(); +}; + +/** + * Wait for url + */ +exports.waitUntilUrlIsShowed = function (urlToWait, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + browser.wait(() => { + return browser.getCurrentUrl().then(function (url) { + return (url.indexOf(TestConfig.main.host + urlToWait.toString()) !== -1); + }, waitTimeout, urlToWait + 'is not showed'); + }); +}; + +exports.waitUntilElementIsVisible = function (elementToCheck, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + return browser.wait(until.visibilityOf(elementToCheck), waitTimeout, 'Element is not visible ' + elementToCheck.locator()); +}; + +exports.waitUntilElementIsPresent = function (elementToCheck, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + return browser.wait(until.presenceOf(elementToCheck), waitTimeout, 'Element is not present ' + elementToCheck.locator()); +}; + +/** + * Click element + */ +exports.clickElement = function (elementToClick, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + waitUntilElementIsVisible(elementToClick, timeout); + elementToClick.click(); +}; + +/** + * Type in element + */ +exports.typeElement = function (elementToType, valueToType, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + waitUntilElementIsVisible(elementToType, timeout); + elementToType.clear().sendKeys(valueToType); +}; + + +/* + * Wait for element to have value + */ +exports.waitUntilElementHasValue = function (elementToCheck, elementValue, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + browser.wait(until.textToBePresentInElementValue(elementToCheck, elementValue), waitTimeout, 'Element doesn\'t have a value ' + elementToCheck.locator()); +}; + +/* + * Wait for element to be clickable + */ +exports.waitUntilElementIsClickable = function (elementToCheck, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + return browser.wait(() => { + return until.elementToBeClickable(elementToCheck); + }, waitTimeout, 'Element is not Clickable' + elementToCheck.locator()); +}; + +/* + * Wait for element to not be visibile + */ +exports.waitUntilElementIsNotVisible = function (elementToCheck, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + return browser.wait(() => { + return elementToCheck.isPresent().then(function (present) { + return !present; + }) + }, waitTimeout, 'Element is not in Visible ' + elementToCheck.locator()); +}; + +exports.waitUntilElementIsNotDisplayed = function (elementToCheck, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + return browser.wait(() => { + return elementToCheck.isDisplayed().then(function (present) { + return !present; + }) + }, waitTimeout, 'Element is not in dysplayed ' + elementToCheck.locator()); +}; + +/* + * Wait for element to not be visibile + */ +exports.waitUntilElementIsStale = function (elementToCheck, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + return browser.wait(until.stalenessOf(elementToCheck), waitTimeout, 'Element is not in stale ' + elementToCheck.locator()); +}; + +/* + * Wait for element to not be visibile + */ +exports.waitUntilElementIsNotOnPage = function (elementToCheck, timeout) { + var waitTimeout = timeout || DEFAULT_TIMEOUT; + + return browser.wait(() => { + return browser.wait(until.not(until.visibilityOf(elementToCheck))); + }, waitTimeout, 'Element is not in the page ' + elementToCheck.locator()); +}; + +exports.waitUntilElementIsOnPage = function (elementToCheck, timeout) { + waitTimeout = timeout || DEFAULT_TIMEOUT; + + return browser.wait(browser.wait(until.visibilityOf(elementToCheck)), timeout); +}; + +/* + * Wait for top message 'form saved' etc to not be visible + * @param URL is url navigating to + */ +exports.waitUntilTopMessageIsNotVisible = function (URL) { + this.waitUntilUrlIsShowed(URL); + this.waitUntilElementIsNotVisible(element(by.css("div[ng-click='dismissAlert()'] > i[class='glyphicon glyphicon-ok']"))); + this.waitUntilElementIsNotOnPage(element(by.css("div[class='alert fadein ng-animate info-remove ng-hide-add ng-hide info-remove-active ng-hide-add-active']"))); + this.waitUntilElementIsNotOnPage(element(by.css("div[ng-click='dismissAlert()']"))); +}; + + +/* + * Wait for top message 'process model contains error' etc to not be visible + * @param URL is url navigating to + */ +exports.waitUntilTopErrorMessageIsNotVisible = function (URL) { + this.waitUntilUrlIsShowed(URL); + this.waitUntilElementIsNotVisible(element(by.css("div[ng-click='dismissAlert()'] > i[class='glyphicon glyphicon-remove']"))); + this.waitUntilElementIsNotOnPage(element(by.css("div[class='alert fadein ng-animate error-remove ng-hide-add ng-hide error-remove-active ng-hide-add-active']"))); + this.waitUntilElementIsNotOnPage(element(by.css("div[ng-click='dismissAlert()']"))); +}; + +/** + * @method waitForPage + */ +exports.waitForPage = function () { + browser.wait(function () { + var deferred = protractor.promise.defer(); + browser.executeScript('return document.readyState').then(function (text) { + deferred.fulfill(function (text) { + return text === 'complete'; + }); + }); + return deferred.promise; + }) +}; + +exports.openNewTabInBrowser = function () { + browser.driver.executeScript("window.open('about: blank', '_blank');"); +}; + +exports.switchToWindowHandler = function (number) { + browser.driver.getAllWindowHandles().then(function (handles) { + browser.driver.switchTo().window(handles[number]); + }); +}; + +exports.pressDownArrowAndEnter = function () { + browser.actions().sendKeys(protractor.Key.ARROW_DOWN).sendKeys(protractor.Key.ENTER).perform(); +}; + + +/** + * Verify file exists + * @param filePath - absolute path to the searched file + * @param retries - number of retries + * @returns - true if file is found, false otherwise + */ +exports.fileExists = function (filePath, retries) { + var tries = 0; + return new Promise(function (resolve, reject) { + var checkExist = setInterval(() => { + fs.stat(filePath, function (error, stats) { + tries++; + + if (error && tries === retries) { + clearInterval(checkExist); + resolve(false); + } + + if (!error) { + clearInterval(checkExist); + resolve(true); + } + }); + }, 1000); + }); +}; diff --git a/e2e/viewer_content_services_component.e2e.ts b/e2e/viewer_content_services_component.e2e.ts new file mode 100644 index 0000000000..7bdd968d34 --- /dev/null +++ b/e2e/viewer_content_services_component.e2e.ts @@ -0,0 +1,266 @@ +/*! + * @license + * Copyright 2016 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 Util = require('./util/util'); +import TestConfig = require('./test.config'); + +import LoginPage = require('./pages/adf/loginPage'); +import ContentServicesPage = require('./pages/adf/contentServicesPage'); +import ViewerPage = require('./pages/adf/viewerPage'); + +import resources = require('./util/resources'); + +import path = require('path'); +import FileModel = require('./models/ACS/fileModel'); +import AcsUserModel = require('./models/ACS/acsUserModel'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; + +describe('Test Content Services Viewer', () => { + + let acsUser = new AcsUserModel(); + let viewerPage = new ViewerPage(); + let contentServicesPage = new ContentServicesPage(); + let loginPage = new LoginPage(); + + let defaultHeight; + let defaultWidth; + let zoomedInHeight; + let zoomedInWidth; + let scaledHeight; + let scaledWidth; + let zoomedOutHeight; + let zoomedOutWidth; + + let pdfFile = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name }); + let jpgFile = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.JPG.file_location, + 'name': resources.Files.ADF_DOCUMENTS.JPG.file_name + }); + let mp4File = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.MP4.file_location, + 'name': resources.Files.ADF_DOCUMENTS.MP4.file_name + }); + let pagesFile = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.PAGES.file_location, + 'name': resources.Files.ADF_DOCUMENTS.PAGES.file_name + }); + let pptFile = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.PPT.file_location, + 'name': resources.Files.ADF_DOCUMENTS.PPT.file_name, + 'firstPageText': resources.Files.ADF_DOCUMENTS.PPT.first_page_text + }); + + let downloadDir = path.join(__dirname, '/downloads'); + + let downloadedPdfFile = path.join(downloadDir, pdfFile.name); + let downloadedJpgFile = path.join(downloadDir, jpgFile.name); + let downloadedMp4File = path.join(downloadDir, mp4File.name); + let downloadedPagesFile = path.join(downloadDir, pagesFile.name); + + beforeAll(async (done) => { + let uploadActions = new UploadActions(); + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + let pdfFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pdfFile.location, pdfFile.name, '-my-'); + Object.assign(pdfFile, pdfFileUploaded.entry); + + let jpgFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, jpgFile.location, jpgFile.name, '-my-'); + Object.assign(jpgFile, jpgFileUploaded.entry); + + let mp4FileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, mp4File.location, mp4File.name, '-my-'); + Object.assign(mp4File, mp4FileUploaded.entry); + + let pptFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pptFile.location, pptFile.name, '-my-'); + Object.assign(pptFile, pptFileUploaded.entry); + + let pagesFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pagesFile.location, pagesFile.name, '-my-'); + Object.assign(pagesFile, pagesFileUploaded.entry); + + loginPage.loginToContentServicesUsingUserModel(acsUser); + + contentServicesPage.goToDocumentList(); + + done(); + }); + + // afterAll((done) => { + // NodesAPI.deleteContent(acsUser, pdfFile.getId(), () => { + // done(); + // }); + // + // NodesAPI.deleteContent(acsUser, jpgFile.getId(), () => { + // done(); + // }); + // + // NodesAPI.deleteContent(acsUser, mp4File.getId(), () => { + // done(); + // }); + // + // NodesAPI.deleteContent(acsUser, pagesFile.getId(), () => { + // done(); + // }); + // + // NodesAPI.deleteContent(acsUser, pptFile.getId(), () => { + // done(); + // }); + // }); + + it('1. Open viewer for a .pdf file', () => { + contentServicesPage.checkAcsContainer(); + viewerPage.viewFile(pdfFile.name); + viewerPage.checkFileContent('1', pdfFile.firstPageText); + viewerPage.checkCloseButtonIsDisplayed(); + viewerPage.checkFileThumbnailIsDisplayed(); + viewerPage.checkFileNameIsDisplayed(pdfFile.name); + viewerPage.checkDownloadButtonIsDisplayed(); + viewerPage.checkInfoButtonIsDisplayed(); + viewerPage.checkPreviousPageButtonIsDisplayed(); + viewerPage.checkNextPageButtonIsDisplayed(); + viewerPage.checkPageSelectorInputIsDisplayed('1'); + viewerPage.checkZoomInButtonIsDisplayed(); + viewerPage.checkZoomOutButtonIsDisplayed(); + viewerPage.checkScalePageButtonIsDisplayed(); + }); + + it('2. Use viewer pagination', () => { + viewerPage.clickNextPageButton(); + viewerPage.checkFileContent('2', pdfFile.secondPageText); + viewerPage.checkPageSelectorInputIsDisplayed('2'); + viewerPage.clickPreviousPageButton(); + viewerPage.checkFileContent('1', pdfFile.firstPageText); + viewerPage.checkPageSelectorInputIsDisplayed('1'); + viewerPage.enterPage(pdfFile.lastPageNumber); + viewerPage.checkFileContent(pdfFile.lastPageNumber, pdfFile.lastPageText); + viewerPage.checkPageSelectorInputIsDisplayed(pdfFile.lastPageNumber); + + viewerPage.canvasHeight().then(function (value) { + defaultHeight = parseInt(value, 10); + }); + viewerPage.canvasWidth().then(function (value) { + defaultWidth = parseInt(value, 10); + }); + viewerPage.clickZoomInButton(); + viewerPage.canvasHeight().then(function (value) { + zoomedInHeight = parseInt(value, 10); + expect(zoomedInHeight).toBeGreaterThan(defaultHeight); + }); + viewerPage.canvasWidth().then(function (value) { + zoomedInWidth = parseInt(value, 10); + expect(zoomedInWidth).toBeGreaterThan(defaultWidth); + }); + viewerPage.clickScalePageButton(); + viewerPage.canvasHeight().then(function (value) { + scaledHeight = parseInt(value, 10); + expect(scaledHeight).toEqual(defaultHeight); + }); + viewerPage.canvasWidth().then(function (value) { + scaledWidth = parseInt(value, 10); + expect(scaledWidth).toEqual(defaultWidth); + }); + viewerPage.clickZoomOutButton(); + viewerPage.canvasHeight().then(function (value) { + zoomedOutHeight = parseInt(value, 10); + expect(zoomedOutHeight).toBeLessThan(defaultHeight); + }); + viewerPage.canvasWidth().then(function (value) { + zoomedOutWidth = parseInt(value, 10); + expect(zoomedOutWidth).toBeLessThan(defaultWidth); + }); + }); + + it('3. Use viewer toolbar', () => { + viewerPage.clickDownloadButton(); + viewerPage.clickInfoButton(); + viewerPage.checkInfoSideBarIsDisplayed(); + viewerPage.clickInfoButton(); + viewerPage.checkInfoSideBarIsNotDisplayed(); + expect(Util.fileExists(downloadedPdfFile, 10)).toBe(true); + viewerPage.clickCloseButton(); + }); + + it('4. Open viewer for a .jpg file', () => { + viewerPage.viewFile(jpgFile.name); + viewerPage.clickInfoButton(); + viewerPage.checkInfoSideBarIsDisplayed(); + viewerPage.clickInfoButton(); + viewerPage.checkInfoSideBarIsNotDisplayed(); + viewerPage.checkDownloadButtonIsDisplayed(); + viewerPage.clickDownloadButton(); + viewerPage.checkFileThumbnailIsDisplayed(); + viewerPage.checkFileNameIsDisplayed(jpgFile.name); + expect(Util.fileExists(downloadedJpgFile, 10)).toBe(true); + viewerPage.clickCloseButton(); + }); + + xit('5. Open viewer for a .ppt file converted to .pdf', () => { + viewerPage.viewFile(pptFile.name); + viewerPage.checkFileContent('1', pptFile.firstPageText); + viewerPage.checkCloseButtonIsDisplayed(); + viewerPage.checkFileThumbnailIsDisplayed(); + viewerPage.checkFileNameIsDisplayed(pptFile.name); + viewerPage.checkDownloadButtonIsDisplayed(); + viewerPage.checkInfoButtonIsDisplayed(); + viewerPage.checkPreviousPageButtonIsDisplayed(); + viewerPage.checkNextPageButtonIsDisplayed(); + viewerPage.checkPageSelectorInputIsDisplayed('1'); + viewerPage.checkZoomInButtonIsDisplayed(); + viewerPage.checkZoomOutButtonIsDisplayed(); + viewerPage.checkScalePageButtonIsDisplayed(); + viewerPage.clickCloseButton(); + }); + + it('6. Open viewer for an unsupported file', () => { + viewerPage.viewFile(pagesFile.name); + viewerPage.clickInfoButton(); + viewerPage.checkInfoSideBarIsDisplayed(); + viewerPage.clickInfoButton(); + viewerPage.checkInfoSideBarIsNotDisplayed(); + viewerPage.checkFileThumbnailIsDisplayed(); + viewerPage.checkDownloadButtonIsDisplayed(); + viewerPage.clickDownloadButton(); + expect(Util.fileExists(downloadedPagesFile, 10)).toBe(true); + viewerPage.checkFileNameIsDisplayed(pagesFile.name); + viewerPage.clickCloseButton(); + }); + + it('7. Open viewer for a .mp4 file', () => { + viewerPage.viewFile(mp4File.name); + viewerPage.checkMediaPlayerContainerIsDisplayed(); + viewerPage.clickDownloadButton(); + expect(Util.fileExists(downloadedMp4File, 10)).toBe(true); + viewerPage.checkFileThumbnailIsDisplayed(); + viewerPage.checkFileNameIsDisplayed(mp4File.name); + viewerPage.clickInfoButton(); + viewerPage.checkInfoSideBarIsDisplayed(); + viewerPage.clickInfoButton(); + viewerPage.checkInfoSideBarIsNotDisplayed(); + viewerPage.checkDownloadButtonIsDisplayed(); + viewerPage.clickCloseButton(); + }); +}); diff --git a/e2e/z-finish.e2e.ts b/e2e/z-finish.e2e.ts new file mode 100644 index 0000000000..9d18b66124 --- /dev/null +++ b/e2e/z-finish.e2e.ts @@ -0,0 +1,77 @@ +/*! + * @license + * Copyright 2016 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 AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from './actions/ACS/upload.actions'; +import TestConfig = require('./test.config'); + +import fs = require('fs'); +import path = require('path'); + +let buildNumber = process.env.TRAVIS_BUILD_NUMBER; +let saveScreenshot = process.env.SAVE_SCREENSHOT; + +describe('Save screenshot at the end', () => { + + beforeAll(async (done) => { + let uploadActions = new UploadActions(); + + if (saveScreenshot === 'true') { + if (!buildNumber) { + buildNumber = Date.now(); + } + + let alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + let folder = await alfrescoJsApi.nodes.addNode('-my-', { + 'name': 'Screenshot-e2e-' + buildNumber, + 'nodeType': 'cm:folder' + }, {}, {}); + + let files = fs.readdirSync(path.join(__dirname, '../e2e-output/screenshots')); + + for (const fileName of files) { + + let pathFile = path.join(__dirname, '../e2e-output/screenshots', fileName); + let file = fs.createReadStream(pathFile); + + await alfrescoJsApi.upload.uploadFile( + file, + '', + folder.entry.id, + null, + { + 'name': file.name, + 'nodeType': 'cm:content' + } + ); + + } + } + + done(); + }); + + fit('screenshot need it', () => { + expect(true).toEqual(true); + }); +}); diff --git a/package-lock.json b/package-lock.json index 6fd1fab0d9..1cb20db52f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "alfresco-components", - "version": "2.4.0", + "version": "2.5.0-beta1", "lockfileVersion": 1, "requires": true, "dependencies": { "@alfresco/adf-content-services": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@alfresco/adf-content-services/-/adf-content-services-2.4.0.tgz", - "integrity": "sha512-WHQFo1bokmc9hYi3C3zlQImvuajOJuycfjSmkyQ27sEQhsjzH7+lPXV7Loa8p5kGFIP6KBL61BxReCfJqIJDCA==", + "version": "2.5.0-beta1", + "resolved": "https://registry.npmjs.org/@alfresco/adf-content-services/-/adf-content-services-2.5.0-beta1.tgz", + "integrity": "sha512-8QG4gLxct7ciOxPnodEi96tCEAEMqF5ORwaeQFMPF0wnysqOV13jMHWe32Y21RZMvD3+VeqpA+X5Zj9BsJ/P1g==", "requires": { - "@alfresco/adf-core": "2.4.0", + "@alfresco/adf-core": "2.5.0-beta1", "@angular/animations": "5.1.1", "@angular/cdk": "5.0.1", "@angular/common": "5.1.1", @@ -24,7 +24,7 @@ "@angular/platform-browser-dynamic": "5.1.1", "@angular/router": "5.1.1", "@ngx-translate/core": "9.1.1", - "alfresco-js-api": "2.4.0", + "alfresco-js-api": "2.5.0-beta1", "chart.js": "2.5.0", "core-js": "2.4.1", "hammerjs": "2.0.8", @@ -56,9 +56,9 @@ } }, "@alfresco/adf-core": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@alfresco/adf-core/-/adf-core-2.4.0.tgz", - "integrity": "sha512-sK0C3Q9yDjqpXV3l5DQXqyRRSiZ+RaUKU81BHEY7Bq1szbBhJq9bJ3rF6PfABzGwB9DKhy+nU+fftCneLJQcnA==", + "version": "2.5.0-beta1", + "resolved": "https://registry.npmjs.org/@alfresco/adf-core/-/adf-core-2.5.0-beta1.tgz", + "integrity": "sha512-RZXkNh5B19KicXWQZnSJxlDHprT/EuIpTWpu8bGHDe57wExarfBPGqx/rk66jLQw5qdiHpJsXeCe0IOacBPKRg==", "requires": { "@angular/animations": "5.1.1", "@angular/cdk": "5.0.1", @@ -74,7 +74,7 @@ "@angular/platform-browser-dynamic": "5.1.1", "@angular/router": "5.1.1", "@ngx-translate/core": "9.1.1", - "alfresco-js-api": "2.4.0", + "alfresco-js-api": "2.5.0-beta1", "chart.js": "2.5.0", "core-js": "2.4.1", "hammerjs": "2.0.8", @@ -106,11 +106,11 @@ } }, "@alfresco/adf-insights": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@alfresco/adf-insights/-/adf-insights-2.4.0.tgz", - "integrity": "sha512-umz0DftgaYvQjFuxj4YNXSJPzFri6nkzvFzOG7jJMwrPU2Rqoya7NJxHr3hwA62tvtGY11l6+rKE/iWrN9Cjcw==", + "version": "2.5.0-beta1", + "resolved": "https://registry.npmjs.org/@alfresco/adf-insights/-/adf-insights-2.5.0-beta1.tgz", + "integrity": "sha512-zlgO8oJ1qXBQjHN3mbjT+68JZ4WFb31eVQWilpNiR1NcYGOHQcOvarVF6RugEd5rVFeR2QiLTDGYw4ZyLrFfew==", "requires": { - "@alfresco/adf-core": "2.4.0", + "@alfresco/adf-core": "2.5.0-beta1", "@angular/animations": "5.1.1", "@angular/cdk": "5.0.1", "@angular/common": "5.1.1", @@ -125,7 +125,7 @@ "@angular/platform-browser-dynamic": "5.1.1", "@angular/router": "5.1.1", "@ngx-translate/core": "9.1.1", - "alfresco-js-api": "2.4.0", + "alfresco-js-api": "2.5.0-beta1", "chart.js": "2.5.0", "core-js": "2.4.1", "hammerjs": "2.0.8", @@ -157,12 +157,12 @@ } }, "@alfresco/adf-process-services": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services/-/adf-process-services-2.4.0.tgz", - "integrity": "sha512-CooXIqKmEHQHpilEVUlx7WYg734zlgkG1LbLH8OBIHPG+DRnrOfYYiMmeUH3MlbQJ+tT74YWi0x9cHLrqdh2Rw==", + "version": "2.5.0-beta1", + "resolved": "https://registry.npmjs.org/@alfresco/adf-process-services/-/adf-process-services-2.5.0-beta1.tgz", + "integrity": "sha512-b9IIOTHAEV40zbzaktBxEiex1I7rK2CAJlpgv/6TxJEH+n5h9hAtwJrUemp+fkb+1pccB4M7w7uU1LcE4qubgw==", "requires": { - "@alfresco/adf-content-services": "2.4.0", - "@alfresco/adf-core": "2.4.0", + "@alfresco/adf-content-services": "2.5.0-beta1", + "@alfresco/adf-core": "2.5.0-beta1", "@angular/animations": "5.1.1", "@angular/cdk": "5.0.1", "@angular/common": "5.1.1", @@ -177,7 +177,7 @@ "@angular/platform-browser-dynamic": "5.1.1", "@angular/router": "5.1.1", "@ngx-translate/core": "9.1.1", - "alfresco-js-api": "2.4.0", + "alfresco-js-api": "2.5.0-beta1", "chart.js": "2.5.0", "core-js": "2.4.1", "hammerjs": "2.0.8", @@ -1214,13 +1214,13 @@ }, "@types/q": { "version": "0.0.32", - "resolved": "http://localhost:4873/@types%2fq/-/q-0.0.32.tgz", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", "dev": true }, "@types/selenium-webdriver": { "version": "2.53.43", - "resolved": "http://localhost:4873/@types%2fselenium-webdriver/-/selenium-webdriver-2.53.43.tgz", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", "dev": true }, @@ -1298,9 +1298,9 @@ "optional": true }, "adm-zip": { - "version": "0.4.11", - "resolved": "http://localhost:4873/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", + "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", "dev": true }, "after": { @@ -1367,9 +1367,19 @@ } }, "alfresco-js-api": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/alfresco-js-api/-/alfresco-js-api-2.4.0.tgz", - "integrity": "sha512-XVf/B3fE0Rl632SU3w0/m6EX/HEwOebIHjP0tluJoD174VONiTsoBzUuicliZvsfuHAeLC5YqthCV4PaKnehCg==", + "version": "2.5.0-beta1", + "resolved": "https://registry.npmjs.org/alfresco-js-api/-/alfresco-js-api-2.5.0-beta1.tgz", + "integrity": "sha512-xzvAE25CDNgEzXCARRBGnj+rLdHxswTUZsS++79thfOLl0gASQlOL0t6DdSDXlYB92+9mkgF1wI8LBLKY4DRHg==", + "requires": { + "event-emitter": "0.3.4", + "jsrsasign": "^8.0.12", + "superagent": "3.8.2" + } + }, + "alfresco-js-api-node": { + "version": "2.5.0-beta1", + "resolved": "https://registry.npmjs.org/alfresco-js-api-node/-/alfresco-js-api-node-2.5.0-beta1.tgz", + "integrity": "sha512-GpSSeN4Yyab/DpOtKV78Y+NqM631L06goCgwPKzfweX/Ri7XqpG8AMXcoAzwDhfrILbyJNg8NUmsnPuljbCLPQ==", "requires": { "event-emitter": "0.3.4", "jsrsasign": "^8.0.12", @@ -1753,6 +1763,17 @@ "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", "dev": true }, + "astrolabe": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/astrolabe/-/astrolabe-0.3.6.tgz", + "integrity": "sha1-bT8cztp4DEw88FDvMtfHRFBFewE=", + "dev": true, + "requires": { + "exceptions": "~0.1.1", + "protractor": "*", + "underscore": "*" + } + }, "async": { "version": "2.6.1", "resolved": "http://localhost:4873/async/-/async-2.6.1.tgz", @@ -2413,9 +2434,9 @@ } }, "blocking-proxy": { - "version": "0.0.5", - "resolved": "http://localhost:4873/blocking-proxy/-/blocking-proxy-0.0.5.tgz", - "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -2423,7 +2444,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "http://localhost:4873/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -3718,7 +3739,7 @@ }, "cookiejar": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "resolved": "http://localhost:4873/cookiejar/-/cookiejar-2.1.2.tgz", "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" }, "copy-concurrently": { @@ -3945,7 +3966,7 @@ }, "cross-fetch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.0.0.tgz", + "resolved": "http://localhost:4873/cross-fetch/-/cross-fetch-2.0.0.tgz", "integrity": "sha512-gnx0GnDyW73iDq6DpqceL8i4GGn55PPKDzNwZkopJ3mKPcfJ0BUIXBsnYfJBVw+jFDB+hzIp2ELNRdqoxN6M3w==", "dev": true, "requires": { @@ -3955,7 +3976,7 @@ "dependencies": { "node-fetch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.0.0.tgz", + "resolved": "http://localhost:4873/node-fetch/-/node-fetch-2.0.0.tgz", "integrity": "sha1-mCu6Q+zU8pIqKcwYamu7C7c/y6Y=", "dev": true } @@ -4359,7 +4380,7 @@ }, "d": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", + "resolved": "http://localhost:4873/d/-/d-0.1.1.tgz", "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", "requires": { "es5-ext": "~0.10.2" @@ -4672,6 +4693,12 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, + "diff_match_patch": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/diff_match_patch/-/diff_match_patch-0.1.1.tgz", + "integrity": "sha1-0/FNW3b7S1qc9EcGJh2ttb2X7bw=", + "dev": true + }, "diffie-hellman": { "version": "5.0.3", "resolved": "http://localhost:4873/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -5384,7 +5411,7 @@ }, "event-emitter": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz", + "resolved": "http://localhost:4873/event-emitter/-/event-emitter-0.3.4.tgz", "integrity": "sha1-jWPd+0z+H647MsomXExyAiIIC7U=", "requires": { "d": "~0.1.1", @@ -5436,6 +5463,15 @@ "safe-buffer": "^5.1.1" } }, + "exceptions": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/exceptions/-/exceptions-0.1.1.tgz", + "integrity": "sha1-twOQB5XCjwetadusX2h4b5RWIbI=", + "dev": true, + "requires": { + "formaterrors": "0.1.1" + } + }, "execa": { "version": "0.7.0", "resolved": "http://localhost:4873/execa/-/execa-0.7.0.tgz", @@ -5452,7 +5488,7 @@ }, "exit": { "version": "0.1.2", - "resolved": "http://localhost:4873/exit/-/exit-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, @@ -5993,9 +6029,19 @@ "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", "dev": true }, + "formaterrors": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/formaterrors/-/formaterrors-0.1.1.tgz", + "integrity": "sha1-fjZz5HTfeoOXE5KBgpNito/ODes=", + "dev": true, + "requires": { + "diff_match_patch": "0.1.1", + "stack-trace": "0.0.6" + } + }, "formidable": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "resolved": "http://localhost:4873/formidable/-/formidable-1.2.1.tgz", "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" }, "forwarded": { @@ -6991,7 +7037,7 @@ }, "graphql-request": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.6.0.tgz", + "resolved": "http://localhost:4873/graphql-request/-/graphql-request-1.6.0.tgz", "integrity": "sha512-qqAPLZuaGlwZDsMQ2FfgEyZMcXFMsPPDl6bQQlmwP/xCnk1TqxkE1S644LsHTXAHYPvmRWsIimfdcnys5+o+fQ==", "dev": true, "requires": { @@ -7789,6 +7835,12 @@ "dev": true, "optional": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, "import-lazy": { "version": "2.1.0", "resolved": "http://localhost:4873/import-lazy/-/import-lazy-2.1.0.tgz", @@ -8676,22 +8728,14 @@ } }, "jasmine": { - "version": "2.99.0", - "resolved": "http://localhost:4873/jasmine/-/jasmine-2.99.0.tgz", - "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", "dev": true, "requires": { "exit": "^0.1.2", "glob": "^7.0.6", - "jasmine-core": "~2.99.0" - }, - "dependencies": { - "jasmine-core": { - "version": "2.99.1", - "resolved": "http://localhost:4873/jasmine-core/-/jasmine-core-2.99.1.tgz", - "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", - "dev": true - } + "jasmine-core": "~2.8.0" } }, "jasmine-ajax": { @@ -8706,6 +8750,16 @@ "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", "dev": true }, + "jasmine-reporters": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.3.1.tgz", + "integrity": "sha1-9C1XjplmlhY0MdkRwxZ5cZ+0Ozs=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1", + "xmldom": "^0.1.22" + } + }, "jasmine-spec-reporter": { "version": "4.2.1", "resolved": "http://localhost:4873/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", @@ -8715,9 +8769,19 @@ "colors": "1.1.2" } }, + "jasmine2-protractor-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/jasmine2-protractor-utils/-/jasmine2-protractor-utils-1.1.3.tgz", + "integrity": "sha1-QdJ6+qSiWjNV0IIeMRPnZFX8Q7U=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1", + "q": "^1.4.1" + } + }, "jasminewd2": { "version": "2.2.0", - "resolved": "http://localhost:4873/jasminewd2/-/jasminewd2-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", "dev": true }, @@ -8902,6 +8966,59 @@ "resolved": "http://localhost:4873/jsrsasign/-/jsrsasign-8.0.12.tgz", "integrity": "sha1-Iqu5ZW00owuVMENnIINeicLlwxY=" }, + "jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "dev": true, + "requires": { + "core-js": "~2.3.0", + "es6-promise": "~3.0.2", + "lie": "~3.1.0", + "pako": "~1.0.2", + "readable-stream": "~2.0.6" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "karma": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.2.tgz", @@ -9347,6 +9464,15 @@ "ejs": "^2.5.7" } }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, "linkify-it": { "version": "2.0.3", "resolved": "http://localhost:4873/linkify-it/-/linkify-it-2.0.3.tgz", @@ -11486,7 +11612,7 @@ }, "options": { "version": "0.0.6", - "resolved": "http://localhost:4873/options/-/options-0.0.6.tgz", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", "dev": true }, @@ -14224,43 +14350,73 @@ "dev": true }, "protractor": { - "version": "5.1.2", - "resolved": "http://localhost:4873/protractor/-/protractor-5.1.2.tgz", - "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.3.2.tgz", + "integrity": "sha512-pw4uwwiy5lHZjIguxNpkEwJJa7hVz+bJsvaTI+IbXlfn2qXwzbF8eghW/RmrZwE2sGx82I8etb8lVjQ+JrjejA==", "dev": true, "requires": { "@types/node": "^6.0.46", "@types/q": "^0.0.32", "@types/selenium-webdriver": "~2.53.39", - "blocking-proxy": "0.0.5", + "blocking-proxy": "^1.0.0", "chalk": "^1.1.3", "glob": "^7.0.3", - "jasmine": "^2.5.3", + "jasmine": "2.8.0", "jasminewd2": "^2.1.0", "optimist": "~0.6.0", "q": "1.4.1", - "saucelabs": "~1.3.0", - "selenium-webdriver": "3.0.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", "source-map-support": "~0.4.0", "webdriver-js-extender": "^1.0.0", "webdriver-manager": "^12.0.6" }, "dependencies": { + "adm-zip": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", + "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, "ansi-regex": { "version": "2.1.1", - "resolved": "http://localhost:4873/ansi-regex/-/ansi-regex-2.1.1.tgz", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { "version": "2.2.1", - "resolved": "http://localhost:4873/ansi-styles/-/ansi-styles-2.2.1.tgz", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, "chalk": { "version": "1.1.3", - "resolved": "http://localhost:4873/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -14273,7 +14429,7 @@ }, "del": { "version": "2.2.2", - "resolved": "http://localhost:4873/del/-/del-2.2.2.tgz", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { @@ -14286,9 +14442,15 @@ "rimraf": "^2.2.8" } }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, "globby": { "version": "5.0.0", - "resolved": "http://localhost:4873/globby/-/globby-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { @@ -14300,27 +14462,88 @@ "pinkie-promise": "^2.0.0" } }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "minimist": { "version": "1.2.0", - "resolved": "http://localhost:4873/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "pify": { "version": "2.3.0", - "resolved": "http://localhost:4873/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "q": { "version": "1.4.1", - "resolved": "http://localhost:4873/q/-/q-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", "dev": true }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + } + }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://localhost:4873/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -14329,24 +14552,24 @@ }, "supports-color": { "version": "2.0.0", - "resolved": "http://localhost:4873/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, "webdriver-manager": { - "version": "12.0.6", - "resolved": "http://localhost:4873/webdriver-manager/-/webdriver-manager-12.0.6.tgz", - "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", + "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", "dev": true, "requires": { - "adm-zip": "^0.4.7", + "adm-zip": "^0.4.9", "chalk": "^1.1.1", "del": "^2.2.0", "glob": "^7.0.3", "ini": "^1.3.4", "minimist": "^1.2.0", "q": "^1.4.1", - "request": "^2.78.0", + "request": "^2.87.0", "rimraf": "^2.5.2", "semver": "^5.3.0", "xml2js": "^0.4.17" @@ -14460,7 +14683,7 @@ }, "qs": { "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "resolved": "http://localhost:4873/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { @@ -15844,50 +16067,12 @@ } }, "saucelabs": { - "version": "1.3.0", - "resolved": "http://localhost:4873/saucelabs/-/saucelabs-1.3.0.tgz", - "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", "dev": true, "requires": { - "https-proxy-agent": "^1.0.0" - }, - "dependencies": { - "agent-base": { - "version": "2.1.1", - "resolved": "http://localhost:4873/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", - "dev": true, - "requires": { - "extend": "~3.0.0", - "semver": "~5.0.1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "http://localhost:4873/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "https-proxy-agent": { - "version": "1.0.0", - "resolved": "http://localhost:4873/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", - "dev": true, - "requires": { - "agent-base": "2", - "debug": "2", - "extend": "3" - } - }, - "semver": { - "version": "5.0.3", - "resolved": "http://localhost:4873/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } + "https-proxy-agent": "^2.2.1" } }, "sax": { @@ -16063,12 +16248,12 @@ "dev": true }, "selenium-webdriver": { - "version": "3.0.1", - "resolved": "http://localhost:4873/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz", - "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", "dev": true, "requires": { - "adm-zip": "^0.4.7", + "jszip": "^3.1.3", "rimraf": "^2.5.4", "tmp": "0.0.30", "xml2js": "^0.4.17" @@ -16076,7 +16261,7 @@ "dependencies": { "tmp": { "version": "0.0.30", - "resolved": "http://localhost:4873/tmp/-/tmp-0.0.30.tgz", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", "dev": true, "requires": { @@ -16921,6 +17106,12 @@ "safe-buffer": "^5.1.1" } }, + "stack-trace": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.6.tgz", + "integrity": "sha1-HnGb1qJin/CcGJ4Xqe+QKpT8XbA=", + "dev": true + }, "state-toggle": { "version": "1.0.1", "resolved": "http://localhost:4873/state-toggle/-/state-toggle-1.0.1.tgz", @@ -17212,7 +17403,7 @@ }, "superagent": { "version": "3.8.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", + "resolved": "http://localhost:4873/superagent/-/superagent-3.8.2.tgz", "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", "requires": { "component-emitter": "^1.2.0", @@ -18671,6 +18862,12 @@ } } }, + "url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", + "dev": true + }, "url-loader": { "version": "0.6.2", "resolved": "http://localhost:4873/url-loader/-/url-loader-0.6.2.tgz", @@ -19319,7 +19516,7 @@ }, "webdriver-js-extender": { "version": "1.0.0", - "resolved": "http://localhost:4873/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", "dev": true, "requires": { @@ -19327,21 +19524,15 @@ "selenium-webdriver": "^2.53.2" }, "dependencies": { - "adm-zip": { - "version": "0.4.4", - "resolved": "http://localhost:4873/adm-zip/-/adm-zip-0.4.4.tgz", - "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", - "dev": true - }, "sax": { "version": "0.6.1", - "resolved": "http://localhost:4873/sax/-/sax-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", "dev": true }, "selenium-webdriver": { "version": "2.53.3", - "resolved": "http://localhost:4873/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", "dev": true, "requires": { @@ -19354,19 +19545,19 @@ }, "tmp": { "version": "0.0.24", - "resolved": "http://localhost:4873/tmp/-/tmp-0.0.24.tgz", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", "dev": true }, "ultron": { "version": "1.0.2", - "resolved": "http://localhost:4873/ultron/-/ultron-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", "dev": true }, "ws": { "version": "1.1.5", - "resolved": "http://localhost:4873/ws/-/ws-1.1.5.tgz", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", "dev": true, "requires": { @@ -19376,7 +19567,7 @@ }, "xml2js": { "version": "0.4.4", - "resolved": "http://localhost:4873/xml2js/-/xml2js-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", "dev": true, "requires": { @@ -20300,7 +20491,7 @@ }, "whatwg-fetch": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "resolved": "http://localhost:4873/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", "dev": true }, @@ -20504,7 +20695,7 @@ }, "xml2js": { "version": "0.4.19", - "resolved": "http://localhost:4873/xml2js/-/xml2js-0.4.19.tgz", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, "requires": { @@ -20514,7 +20705,7 @@ "dependencies": { "sax": { "version": "1.2.4", - "resolved": "http://localhost:4873/sax/-/sax-1.2.4.tgz", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true } @@ -20522,10 +20713,16 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "http://localhost:4873/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "http://localhost:4873/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", diff --git a/package.json b/package.json index 8252c59074..2516c04d64 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "bundlesize-check": "bundlesize", "bundlesize-map": "npm run webpack -- --config ./lib/config/webpack.bundle-check.js --progress --profile --bail", "lint-lib": "./node_modules/.bin/tslint -p ./lib/tsconfig.json -c ./lib/tslint.json", + "lint-e2e": "./node_modules/.bin/tslint --fix -p ./e2e/tsconfig.e2e.json -c ./lib/tslint.json", "test-export": "ts-node ./tools/export-check/exportCheck.ts ./lib/core/public-api.ts ./lib/process-services/public-api.ts ./lib/content-services/public-api.ts ./lib/insights/public-api.ts", "test-lib": "node ./node_modules/karma/bin/karma start ./lib/karma.conf.js --reporters mocha,coverage --single-run --component .", "test-lib-browser": "node ./node_modules/karma/bin/karma start ./lib/karma.conf.js --reporters kjhtml", @@ -26,7 +27,8 @@ "style:dev": "npm run webpack -- --config ./lib/config/webpack.style.js --progress --profile --bail", "test": "ng test --single-run", "lint": "ng lint", - "e2e": "ng e2e --app dist --deleteOutputPath=false", + "e2e": "ng e2e --app dist --deleteOutputPath=false -specs ./demo-shell/e2e/*.*", + "e2e-lib": "npm run lint-e2e && ng e2e --app dev --deleteOutputPath=false --port=4200 --proxy-config ./e2e/proxy.conf.js", "server-versions": "rimraf ./demo-shell/src/versions.json && npm list --depth=0 --json=true --prod=true > ./demo-shell/src/versions.json || exit 0", "clean": "rimraf dist ./node_modules typings", "clean-lock": "rimraf package-lock.json", @@ -77,6 +79,8 @@ "@ngx-translate/core": "9.1.1", "@nrwl/schematics": "^1.0.3", "alfresco-js-api": "2.5.0-beta1", + "alfresco-js-api-node": "2.5.0-beta1", + "browserstack-local": "^1.3.3", "chart.js": "2.5.0", "classlist.js": "1.1.20150312", "core-js": "2.4.1", @@ -104,6 +108,7 @@ "@types/node": "6.0.90", "ajv-cli": "^3.0.0", "angular2-template-loader": "0.6.2", + "astrolabe": "^0.3.6", "autoprefixer": "6.5.4", "bundlesize": "^0.15.3", "chalk": "^2.3.2", @@ -126,7 +131,9 @@ "istanbul-instrumenter-loader": "3.0.0", "jasmine-ajax": "3.2.0", "jasmine-core": "~2.8.0", + "jasmine-reporters": "^2.3.1", "jasmine-spec-reporter": "~4.2.1", + "jasmine2-protractor-utils": "1.1.3", "karma": "~2.0.0", "karma-chrome-launcher": "~2.2.0", "karma-cli": "~1.0.1", @@ -152,7 +159,7 @@ "ng-packagr": "2.4.2", "node-sass": "4.5.3", "null-loader": "0.1.1", - "protractor": "~5.1.2", + "protractor": "~5.3.2", "raw-loader": "0.5.1", "remap-istanbul": "0.6.3", "remark": "^9.0.0", @@ -179,6 +186,7 @@ "typedoc": "^0.11.1", "typescript": "2.6.1", "uglifyjs-webpack-plugin": "1.1.6", + "url-join": "^4.0.0", "webpack-bundle-analyzer": "2.9.0", "webpack-merge": "2.6.1" }, diff --git a/protractor.conf.js b/protractor.conf.js new file mode 100644 index 0000000000..4e88899db3 --- /dev/null +++ b/protractor.conf.js @@ -0,0 +1,106 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const path = require('path'); +const {SpecReporter} = require('jasmine-spec-reporter'); +const jasmineReporters = require('jasmine-reporters'); + +const projectRoot = path.resolve(__dirname); + +const width = 1366; +const height = 768; + +var HOST = process.env.URL_HOST_ADF; +var BROWSER_RUN = process.env.BROWSER_RUN; + +var args_options = []; + +if (BROWSER_RUN === 'true') { + args_options = ['--incognito', '--window-size=1366,768']; +} else { + args_options = ['--incognito', '--headless', '--window-size=1366,768']; +} + +var downloadFolder = path.join(__dirname, 'e2e/downloads'); + +exports.config = { + allScriptsTimeout: 60000, + + specs: [ + './e2e/*.e2e.ts' + ], + + capabilities: { + browserName: 'chrome', + chromeOptions: { + prefs: { + 'credentials_enable_service': false, + 'download': { + 'prompt_for_download': false, + 'default_directory': downloadFolder + } + }, + args: args_options + } + }, + + directConnect: true, + + baseUrl: "http://" + HOST, + + framework: 'jasmine2', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 90000, + print: function () { + } + }, + + plugins: [{ + package: 'jasmine2-protractor-utils', + disableHTMLReport: false, + disableScreenshot: false, + screenshotOnExpectFailure: true, + screenshotOnSpecFailure: false, + clearFoldersBeforeTest: true, + htmlReportDir: `${projectRoot}/e2e-output/html-report/`, + screenshotPath: `${projectRoot}/e2e-output/screenshots/` + }], + + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + + browser.manage().window().setSize(width, height); + + jasmine.getEnv().addReporter(new SpecReporter({spec: {displayStacktrace: true}})); + + jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({ + consolidateAll: true, + savePath: `${projectRoot}/e2e-output/junit-report`, + filePrefix: 'results.xml', + useDotNotation: false, + useFullTestName: false, + reportFailedUrl: true + })); + + return browser.driver.executeScript(disableCSSAnimation); + + function disableCSSAnimation() { + var css = '* {' + + '-webkit-transition-duration: 0s !important;' + + 'transition-duration: 0s !important;' + + '-webkit-animation-duration: 0s !important;' + + 'animation-duration: 0s !important;' + + '}', + head = document.head || document.getElementsByTagName('head')[0], + style = document.createElement('style'); + + style.type = 'text/css'; + style.appendChild(document.createTextNode(css)); + head.appendChild(style); + } + + } +}; diff --git a/scripts/README.md b/scripts/README.md index 965c6f91fb..0512a736a4 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -358,3 +358,51 @@ Internal script for update the rancher env ```sh /rancher-update.sh --access_key ACCESS_KEY --secret_key SECRET_KEY --url RANCHER_URL--environment_name adf-master --image docker:alfresco/demo-shell:master ``` + + +# test-e2e-lib.sh + +***test-e2e-lib.sh*** + +Script to run e2e test + +| Option | Description | +| --- | --- | +|-u or --username |username to use| +|-p or --password|password to use| +|-e or --email |email user to use| +|-b or --browser |browser run the test in the browsrwer (No headless mode)| +|-s or --spec |spec run a single test file| +|-host or --host | host against to run the test| +|-proxy or --proxy | proxy Back end URL to use | + +## Examples + +```sh +./scripts/test-e2e-lib.sh -host adf.domain.com -u admin -p admin -e admin +``` + +Run on browser + +```sh +./scripts/test-e2e-lib.sh -host adf.domain.com -u admin -p admin -e admin --browser +``` + + +Run a single test + +```sh +./scripts/test-e2e-lib.sh -host adf.domain.com -u admin -p admin -e admin --spec filenam.e2e.ts +``` + +if the test in a subfolder in e2e you need to add the subfolder in the path: + +```shnpm in +./scripts/test-e2e-lib.sh -host adf.domain.com -u admin -p admin -e admin --spec ./core/filenam.e2e.ts +``` + +Use a different backend + +```sh +./scripts/test-e2e-lib.sh -host localhost:42000 -proxy adf.domain.com -u admin -p admin -e admin +``` diff --git a/scripts/test-e2e-lib.sh b/scripts/test-e2e-lib.sh new file mode 100755 index 0000000000..b51cadbf6f --- /dev/null +++ b/scripts/test-e2e-lib.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +cd "$DIR/../" +BROWSER_RUN=false + +show_help() { + echo "Usage: ./scripts/test-e2e-lib.sh -host adf.domain.com -u admin -p admin -e admin" + echo "" + echo "-u or --username" + echo "-p or --password" + echo "-e or --email" + echo "-b or --browser run the test in the browsrwer (No headless mode)" + echo "-s or --spec run a single test file" + echo "-p or --proxy proxy Back end URL to use" + echo "-host or --host URL of the Front end to test" + echo "-save save the error screenshot in the remote env" + echo "-h or --help" +} + +set_username(){ + USERNAME=$1 +} +set_password(){ + PASSWORD=$1 +} +set_email(){ + EMAIL=$1 +} +set_host(){ + HOST=$1 +} + +set_test(){ + SINGLE_TEST=true + NAME_TEST=$1 +} + +set_browser(){ + echo "====== BROWSER RUN =====" + BROWSER_RUN=true +} + +set_proxy(){ + PROXY=$1 +} +set_save_screenshot(){ + SAVE_SCREENSHOT=true +} + +while [[ $1 == -* ]]; do + case "$1" in + -h|--help|-\?) show_help; exit 0;; + -u|--username) set_username $2; shift 2;; + -p|--password) set_password $2; shift 2;; + -e|--email) set_email $2; shift 2;; + -b|--browser) set_browser; shift;; + -s|--spec) set_test $2; shift 2;; + -save) set_save_screenshot; shift;; + -proxy|--proxy) set_proxy $2; shift 2;; + -host|--host) set_host $2; shift 2;; + -*) echo "invalid option: $1" 1>&2; show_help; exit 1;; + esac +done + +rm -rf ./e2e/downloads/ +rm -rf ./e2e-output/screenshots/ + +export URL_HOST_ADF=$HOST +export USERNAME_ADF=$USERNAME +export PASSWORD_ADF=$PASSWORD +export EMAIL_ADF=$EMAIL +export BROWSER_RUN=$BROWSER_RUN +export PROXY_HOST_ADF=$PROXY +export SAVE_SCREENSHOT=$SAVE_SCREENSHOT + +if [[ $SINGLE_TEST == "true" ]]; then + echo "====== Single test run $NAME_TEST =====" + npm run e2e-lib -- --specs ./e2e/$NAME_TEST +else + npm run e2e-lib +fi +