[ADF-4329][ASD-5330] plus Improve e2e (#6580)

Improve e2e
Fix SSO user avatar 
Fix Priority for APS1
This commit is contained in:
Eugenio Romano 2021-02-05 15:18:30 +00:00 committed by GitHub
parent e4990f4b0c
commit f4976a1949
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
72 changed files with 649 additions and 442 deletions

View File

@ -19,7 +19,7 @@ env:
- REDIRECT_URI=/
- REDIRECT_URI_LOGOUT=/logout/
- BROWSER_RUN=true
- MAXINSTANCES=3
- MAXINSTANCES=2
branches:
only:
@ -121,6 +121,7 @@ jobs:
before_script:
- ./scripts/ci/job_hooks/before_e2e.sh || travis_terminate 1
- ./scripts/ci/check-env/check-ps-env.sh || travis_terminate 1
- ./scripts/ci/check-env/check-external-cs-env.sh || travis_terminate 1
script: ./scripts/travis/e2e/process-services-e2e.sh
after_script: ./scripts/ci/job_hooks/after_e2e.sh

View File

@ -155,7 +155,7 @@
{
"key": "score",
"label": "Relevance",
"type": "FIELD",
"type": "SCORE",
"field": "score",
"ascending": false
}

View File

@ -188,6 +188,7 @@ describe('Comment', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id);
await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true });
});

View File

@ -54,8 +54,9 @@ describe('Create library directive', () => {
});
afterAll(async () => {
await navigationBarPage.clickLogoutButton();
await apiService.loginWithProfile('admin');
await apiService.getInstance().core.sitesApi.deleteSite(createSite.entry.id, { permanent: true });
await navigationBarPage.clickLogoutButton();
});
beforeEach(async () => {

View File

@ -16,8 +16,8 @@
*/
import { ContentServicesPage } from '../../core/pages/content-services.page';
import { browser } from 'protractor';
import { NodeEntry } from '@alfresco/js-api';
import { FileModel } from '../../models/ACS/file.model';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
import { TrashcanPage } from '../../core/pages/trashcan.page';
@ -29,7 +29,8 @@ import {
StringUtil,
UploadActions,
UserModel,
UsersActions
UsersActions,
WaitActions
} from '@alfresco/adf-testing';
describe('Restore content directive', () => {
@ -42,8 +43,10 @@ describe('Restore content directive', () => {
const trashcanPage = new TrashcanPage();
const breadCrumbPage = new BreadcrumbPage();
const notificationHistoryPage = new NotificationHistoryPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
const waitActions = new WaitActions(apiService);
const pdfFileModel = new FileModel({
name: browser.params.resources.Files.ADF_DOCUMENTS.PDF.file_name,
@ -60,7 +63,7 @@ describe('Restore content directive', () => {
location: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_path
});
const folderName = StringUtil.generateRandomString(5);
let testFolder: NodeEntry;
const uploadActions = new UploadActions(apiService);
let folderWithContent, folderWithFolder, subFolder, subFile, testFile, restoreFile, publicSite, siteFolder,
@ -72,7 +75,7 @@ describe('Restore content directive', () => {
await usersActions.createUser(anotherAcsUser);
await apiService.login(acsUser.username, acsUser.password);
await uploadActions.createFolder(folderName, '-my-');
testFolder = await uploadActions.createFolder(StringUtil.generateRandomString(5), '-my-');
folderWithContent = await uploadActions.createFolder(StringUtil.generateRandomString(5), '-my-');
subFile = await uploadActions.uploadFile(testFileModel.location, testFileModel.name, folderWithContent.entry.id);
testFile = await uploadActions.uploadFile(pdfFileModel.location, pdfFileModel.name, '-my-');
@ -93,12 +96,12 @@ describe('Restore content directive', () => {
await loginPage.login(acsUser.username, acsUser.password);
await navigationBarPage.navigateToContentServices();
await contentServicesPage.waitForTableBody();
await contentServicesPage.checkContentIsDisplayed(folderName);
await contentServicesPage.deleteContent(folderName);
await contentServicesPage.checkContentIsNotDisplayed(folderName);
await contentServicesPage.checkContentIsDisplayed(testFolder.entry.name);
await contentServicesPage.deleteContent(testFolder.entry.name);
await contentServicesPage.checkContentIsNotDisplayed(testFolder.entry.name);
await navigationBarPage.clickTrashcanButton();
await trashcanPage.waitForTableBody();
await trashcanPage.getDocumentList().dataTablePage().checkRowContentIsDisplayed(folderName);
await trashcanPage.getDocumentList().dataTablePage().checkRowContentIsDisplayed(testFolder.entry.name);
});
afterEach(async () => {
@ -106,26 +109,26 @@ describe('Restore content directive', () => {
});
it('[C260227] Should validate when restoring Folders with same name', async () => {
await uploadActions.createFolder(folderName, '-my-');
await uploadActions.createFolder(testFolder.entry.name, '-my-');
await navigationBarPage.navigateToContentServices();
await contentServicesPage.waitForTableBody();
await contentServicesPage.checkContentIsDisplayed(folderName);
await contentServicesPage.deleteContent(folderName);
await contentServicesPage.checkContentIsNotDisplayed(folderName);
await contentServicesPage.checkContentIsDisplayed(testFolder.entry.name);
await contentServicesPage.deleteContent(testFolder.entry.name);
await contentServicesPage.checkContentIsNotDisplayed(testFolder.entry.name);
await navigationBarPage.clickTrashcanButton();
await trashcanPage.waitForTableBody();
await trashcanPage.getDocumentList().dataTablePage().checkRowContentIsDisplayed(folderName);
await trashcanPage.getDocumentList().dataTablePage().checkRowContentIsDisplayed(testFolder.entry.name);
await trashcanPage.getDocumentList().dataTablePage().checkAllRows();
await trashcanPage.clickRestore();
await browser.sleep(1000);
await waitActions.nodeIsPresent(testFolder.entry.id);
await navigationBarPage.navigateToContentServices();
await contentServicesPage.getDocumentList().dataTablePage().waitTillContentLoaded();
await contentServicesPage.checkContentIsDisplayed(folderName);
await contentServicesPage.checkContentIsDisplayed(testFolder.entry.name);
await notificationHistoryPage.checkNotifyContains('Can\'t restore, ' + folderName + ' item already exists');
await notificationHistoryPage.checkNotifyContains('Can\'t restore, ' + testFolder.entry.name + ' item already exists');
});
});
@ -222,26 +225,26 @@ describe('Restore content directive', () => {
});
it('[C260241] Should display restore icon both for file and folder', async () => {
await contentServicesPage.checkContentIsDisplayed(folderName);
await contentServicesPage.checkContentIsDisplayed(testFolder.entry.name);
await contentServicesPage.checkContentIsDisplayed(restoreFile.entry.name);
await contentServicesPage.deleteContent(folderName);
await contentServicesPage.deleteContent(testFolder.entry.name);
await contentServicesPage.deleteContent(restoreFile.entry.name);
await navigationBarPage.clickTrashcanButton();
await trashcanPage.waitForTableBody();
await trashcanPage.checkRestoreButtonIsNotDisplayed();
await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(folderName);
await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(folderName);
await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(testFolder.entry.name);
await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(testFolder.entry.name);
await trashcanPage.checkRestoreButtonIsDisplayed();
await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(folderName);
await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsNotSelected(folderName);
await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(testFolder.entry.name);
await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsNotSelected(testFolder.entry.name);
await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(restoreFile.entry.name);
await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(restoreFile.entry.name);
await trashcanPage.checkRestoreButtonIsDisplayed();
await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(folderName);
await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(folderName);
await trashcanPage.getDocumentList().dataTablePage().clickRowByContentCheckbox(testFolder.entry.name);
await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(testFolder.entry.name);
await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(restoreFile.entry.name);
await trashcanPage.checkRestoreButtonIsDisplayed();
});
@ -285,10 +288,11 @@ describe('Restore content directive', () => {
await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(publicSite.entry.id);
await trashcanPage.clickRestore();
await browser.sleep(browser.params.testConfig.timeouts.index_search);
await waitActions.nodeIsPresent(publicSite.entry.guid);
await navigationBarPage.goToSite(publicSite);
await contentServicesPage.waitForTableBody();
await contentServicesPage.checkContentIsDisplayed(siteFolder.entry.name);
await contentServicesPage.openFolder(siteFolder.entry.name);
await contentServicesPage.checkContentIsDisplayed(siteFile.entry.name);
@ -301,7 +305,7 @@ describe('Restore content directive', () => {
beforeAll(async () => {
await apiService.login(anotherAcsUser.username, anotherAcsUser.password);
await uploadActions.createFolder(folderName, '-my-');
await uploadActions.createFolder(testFolder.entry.name, '-my-');
parentFolder = await uploadActions.createFolder(StringUtil.generateRandomString(5), '-my-');
folderWithin = await uploadActions.createFolder(StringUtil.generateRandomString(5), parentFolder.entry.id);
pdfFile = await uploadActions.uploadFile(pdfFileModel.location, pdfFileModel.name, folderWithin.entry.id);
@ -356,4 +360,5 @@ describe('Restore content directive', () => {
await contentServicesPage.checkContentIsDisplayed(pngFile.entry.name);
});
});
});

View File

@ -338,6 +338,7 @@ describe('Document List Component', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
for (let i = 0; i < folderCreated.length; i++) {
await uploadActions.deleteFileOrFolder(folderCreated[i].entry.id);
}

View File

@ -47,6 +47,7 @@ describe('Document List Component', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await navigationBarPage.clickLogoutButton();
await apiService.getInstance().core.sitesApi.deleteSite(privateSite.entry.id, { permanent: true });
});

View File

@ -15,12 +15,21 @@
* limitations under the License.
*/
import { ApiService, LoginPage, StringUtil, UploadActions, UserModel, UsersActions } from '@alfresco/adf-testing';
import {
ApiService,
LoginPage,
StringUtil,
UploadActions,
UserModel,
UsersActions,
WaitActions
} from '@alfresco/adf-testing';
import { NavigationBarPage } from '../core/pages/navigation-bar.page';
import { ContentServicesPage } from '../core/pages/content-services.page';
import { LockFilePage } from '../content-services/pages/lock-file.page';
import { FileModel } from '../models/ACS/file.model';
import { browser } from 'protractor';
import { NodeEntry } from '@alfresco/js-api';
import CONSTANTS = require('../util/constants');
describe('Lock File', () => {
@ -29,12 +38,13 @@ describe('Lock File', () => {
const navigationBarPage = new NavigationBarPage();
const lockFilePage = new LockFilePage();
const contentServices = new ContentServicesPage();
const adminUser = new UserModel();
const managerUser = new UserModel();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
const uploadActions = new UploadActions(apiService);
const waitActions = new WaitActions(apiService);
const pngFileModel = new FileModel({
name: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_name,
@ -46,7 +56,7 @@ describe('Lock File', () => {
location: browser.params.resources.Files.ADF_DOCUMENTS.PNG_B.file_path
});
let nodeId, site, documentLibrary, lockedFileNodeId;
let site, documentLibrary;
beforeAll(async () => {
await apiService.loginWithProfile('admin');
@ -72,35 +82,54 @@ describe('Lock File', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
try {
await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true });
} catch (e) {
}
});
describe('Lock file interaction with the UI', () => {
let pngLockedUploadedFile: NodeEntry;
let pngUploadedFile: NodeEntry;
beforeAll(async () => {
const pngLockedUploadedFile = await uploadActions.uploadFile(pngFileToLock.location, pngFileToLock.name, documentLibrary);
pngLockedUploadedFile = await uploadActions.uploadFile(pngFileToLock.location, pngFileToLock.name, documentLibrary);
lockedFileNodeId = pngLockedUploadedFile.entry.id;
});
beforeEach(async () => {
const pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary);
nodeId = pngUploadedFile.entry.id;
await loginPage.login(adminUser.username, adminUser.password);
await navigationBarPage.openContentServicesFolder(documentLibrary);
pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary);
await navigationBarPage.openContentServicesFolder(documentLibrary);
await contentServices.waitForTableBody();
});
afterEach(async () => {
await apiService.login(adminUser.username, adminUser.password);
await uploadActions.deleteFileOrFolder(nodeId);
await navigationBarPage.clickLogoutButton();
try {
await apiService.getInstance().core.nodesApi.unlockNode(pngUploadedFile.entry.id);
await waitActions.nodeIsUnlock(pngUploadedFile.entry.id);
} catch (e) {
}
});
afterAll(async () => {
await apiService.login(adminUser.username, adminUser.password);
await apiService.getInstance().core.nodesApi.unlockNode(lockedFileNodeId);
await uploadActions.deleteFileOrFolder(lockedFileNodeId);
await apiService.loginWithProfile('admin');
try {
await apiService.getInstance().core.nodesApi.unlockNode(pngLockedUploadedFile.entry.id);
} catch (e) {
}
try {
await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id);
} catch (e) {
}
try {
await uploadActions.deleteFileOrFolder(pngLockedUploadedFile.entry.id);
} catch (e) {
}
await navigationBarPage.clickLogoutButton();
});
it('[C286604] Should be able to open Lock file option by clicking the lock image', async () => {
@ -113,7 +142,6 @@ describe('Lock File', () => {
it('[C286625] Should be able to click Cancel to cancel lock file operation', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.cancelButton.click();
@ -149,11 +177,11 @@ describe('Lock File', () => {
describe('Locked file without owner permissions', () => {
let pngUploadedFile: NodeEntry;
beforeEach(async () => {
await apiService.login(adminUser.username, adminUser.password);
const pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary);
nodeId = pngUploadedFile.entry.id;
pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary);
await loginPage.login(managerUser.username, managerUser.password);
@ -164,8 +192,8 @@ describe('Lock File', () => {
await apiService.login(adminUser.username, adminUser.password);
try {
await apiService.getInstance().core.nodesApi.unlockNode(nodeId);
await uploadActions.deleteFileOrFolder(nodeId);
await apiService.getInstance().core.nodesApi.unlockNode(pngUploadedFile.entry.id);
await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id);
} catch (error) {
}
await navigationBarPage.clickLogoutButton();
@ -179,7 +207,7 @@ describe('Lock File', () => {
await lockFilePage.saveButton.click();
try {
await apiService.getInstance().core.nodesApi.deleteNode(nodeId);
await apiService.getInstance().core.nodesApi.deleteNode(pngUploadedFile.entry.id);
} catch (error) {
await expect(error.status).toEqual(409);
}
@ -193,7 +221,7 @@ describe('Lock File', () => {
await lockFilePage.saveButton.click();
try {
await apiService.getInstance().core.nodesApi.updateNode(nodeId, { name: 'My new name' });
await apiService.getInstance().core.nodesApi.updateNode(pngUploadedFile.entry.id, { name: 'My new name' });
} catch (error) {
await expect(error.status).toEqual(409);
@ -208,7 +236,7 @@ describe('Lock File', () => {
await lockFilePage.saveButton.click();
try {
await apiService.getInstance().core.nodesApi.moveNode(nodeId, { targetParentId: '-my-' });
await apiService.getInstance().core.nodesApi.moveNode(pngUploadedFile.entry.id, { targetParentId: '-my-' });
} catch (error) {
await expect(error.status).toEqual(409);
@ -223,8 +251,7 @@ describe('Lock File', () => {
await lockFilePage.saveButton.click();
try {
await apiService.getInstance().core.nodesApi.updateNodeContent(nodeId, 'NEW FILE CONTENT');
await apiService.getInstance().core.nodesApi.updateNodeContent(pngUploadedFile.entry.id, 'NEW FILE CONTENT');
} catch (error) {
await expect(error.status).toEqual(409);
}
@ -232,39 +259,26 @@ describe('Lock File', () => {
});
describe('Locked file with owner permissions', () => {
let pngFileToBeLocked;
beforeAll(async () => {
pngFileToBeLocked = await uploadActions.uploadFile(pngFileToLock.location, pngFileToLock.name, documentLibrary);
lockedFileNodeId = pngFileToBeLocked.entry.id;
});
let pngFileToBeLocked: NodeEntry;
let pngUploadedFile: NodeEntry;
beforeEach(async () => {
const pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary);
nodeId = pngUploadedFile.entry.id;
await apiService.login(adminUser.username, adminUser.password);
pngFileToBeLocked = await uploadActions.uploadFile(pngFileToLock.location, pngFileToLock.name, documentLibrary);
pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, documentLibrary);
await loginPage.login(adminUser.username, adminUser.password);
await navigationBarPage.openContentServicesFolder(documentLibrary);
await contentServices.getDocumentList().dataTable.waitTillContentLoaded();
});
afterEach(async () => {
await apiService.login(adminUser.username, adminUser.password);
await uploadActions.deleteFileOrFolder(nodeId);
await navigationBarPage.clickLogoutButton();
});
it('[C286614] Owner of the locked file should be able to rename if Allow owner to modify is checked', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.allowOwnerCheckbox.click();
await lockFilePage.saveButton.click();
try {
const response = await apiService.getInstance().core.nodesApi.updateNode(nodeId, { name: 'My new name' });
await expect(response.entry.name).toEqual('My new name');
} catch (error) {
await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id);
await uploadActions.deleteFileOrFolder(pngFileToBeLocked.entry.id);
} catch (e) {
}
await navigationBarPage.clickLogoutButton();
});
it('[C286615] Owner of the locked file should be able to update a new version if Allow owner to modify is checked', async () => {
@ -276,7 +290,9 @@ describe('Lock File', () => {
await lockFilePage.saveButton.click();
try {
const response = await apiService.getInstance().core.nodesApi.updateNodeContent(nodeId, 'NEW FILE CONTENT');
await apiService.login(adminUser.username, adminUser.password);
const response = await apiService.getInstance().core.nodesApi.updateNodeContent(pngUploadedFile.entry.id, 'NEW FILE CONTENT');
await expect(response.entry.modifiedAt.getTime()).toBeGreaterThan(response.entry.createdAt.getTime());
} catch (error) {
}
@ -291,9 +307,10 @@ describe('Lock File', () => {
await lockFilePage.saveButton.click();
try {
await apiService.getInstance().core.nodesApi.moveNode(nodeId, { targetParentId: '-my-' });
await apiService.login(adminUser.username, adminUser.password);
await apiService.getInstance().core.nodesApi.moveNode(pngUploadedFile.entry.id, { targetParentId: '-my-' });
const movedFile = await apiService.getInstance().core.nodesApi.getNode(nodeId);
const movedFile = await apiService.getInstance().core.nodesApi.getNode(pngUploadedFile.entry.id);
await expect(movedFile.entry.parentId).not.toEqual(documentLibrary);
} catch (error) {
@ -311,5 +328,20 @@ describe('Lock File', () => {
await contentServices.deleteContent(pngFileToBeLocked.entry.name);
await contentServices.checkContentIsNotDisplayed(pngFileToBeLocked.entry.name);
});
it('[C286614] Owner of the locked file should be able to rename if Allow owner to modify is checked', async () => {
await contentServices.lockContent(pngFileModel.name);
await lockFilePage.lockFileCheckboxText.waitVisible();
await lockFilePage.lockFileCheckbox.click();
await lockFilePage.allowOwnerCheckbox.click();
await lockFilePage.saveButton.click();
try {
const response = await apiService.getInstance().core.nodesApi.updateNode(pngUploadedFile.entry.id, { name: 'My new name' });
await expect(response.entry.name).toEqual('My new name');
} catch (error) {
}
});
});
});

View File

@ -95,6 +95,7 @@ describe('permissions', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true });
});

View File

@ -228,9 +228,10 @@ describe('Metadata component', () => {
describe('Folder metadata', () => {
beforeAll(async () => {
await uploadActions.createFolder(folderName, '-my-');
await apiService.login(acsUser.username, acsUser.password);
await loginPage.login(acsUser.username, acsUser.password);
await uploadActions.createFolder(folderName, '-my-');
await navigationBarPage.navigateToContentServices();
await contentServicesPage.waitForTableBody();
});

View File

@ -65,12 +65,28 @@ export class TagPage {
return this.addTagButton.isEnabled();
}
checkTagIsDisplayedInTagList(tagName: string): Promise<void> {
return TestElement.byText('div[id*="tag_name"]', tagName).waitVisible();
async checkTagIsDisplayedInTagList(tagName: string): Promise<boolean> {
try {
await TestElement.byText('div[id*="tag_name"]', tagName).waitVisible();
return true;
} catch (error) {
if (await this.showMoreButton.isDisplayed()) {
await this.showMoreButton.click();
await this.checkTagIsDisplayedInTagList(tagName);
return true;
} else {
throw new Error('Error');
}
}
}
checkTagIsNotDisplayedInTagList(tagName: string): Promise<void> {
return TestElement.byText('div[id*="tag_name"]', tagName).waitNotVisible();
async checkTagIsNotDisplayedInTagList(tagName: string): Promise<boolean> {
try {
await TestElement.byText('div[id*="tag_name"]', tagName).waitNotVisible();
return true;
} catch (error) {
return false;
}
}
checkTagIsNotDisplayedInTagListByNodeId(tagName: string): Promise<void> {

View File

@ -95,7 +95,7 @@ describe('Permissions Component', () => {
await usersActions.createUser(managerUser);
await apiService.login(folderOwnerUser.username, folderOwnerUser.password);
await browser.sleep(15000);
await browser.sleep(browser.params.testConfig.timeouts.index_search);
const publicSiteName = `PUBLIC_TEST_SITE_${StringUtil.generateRandomString(5)}`;

View File

@ -174,6 +174,7 @@ describe('Share file', () => {
});
afterEach(async () => {
await BrowserActions.getUrl('/');
await navigationBarPage.clickLogoutButton();
});

View File

@ -27,6 +27,7 @@ import {
UserModel,
UsersActions
} from '@alfresco/adf-testing';
import { NodeEntry } from '@alfresco/js-api';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
import { ContentServicesPage } from '../../core/pages/content-services.page';
import { ShareDialogPage } from '../../core/pages/dialog/share-dialog.page';
@ -35,23 +36,23 @@ import { browser } from 'protractor';
describe('Unshare file', () => {
const apiService = new ApiService();
const loginPage = new LoginPage();
const contentServicesPage = new ContentServicesPage();
const contentListPage = contentServicesPage.getDocumentList();
const navBar = new NavigationBarPage();
const errorPage = new ErrorPage();
const notificationHistoryPage = new NotificationHistoryPage();
const navigationBarPage = new NavigationBarPage();
const shareDialog = new ShareDialogPage();
const apiService = new ApiService();
const uploadActions = new UploadActions(apiService);
const usersActions = new UsersActions(apiService);
const siteName = `PRIVATE-TEST-SITE-${StringUtil.generateRandomString(5)}`;
let acsUser: UserModel;
let nodeBody, nodeId, testSite;
let nodeBody, shareFilesSite;
let pngUploadedFile: NodeEntry;
const pngFileModel = new FileModel({
name: browser.params.resources.Files.ADF_DOCUMENTS.PNG.file_name,
@ -76,7 +77,7 @@ describe('Unshare file', () => {
}
};
testSite = await apiService.getInstance().core.sitesApi.createSite(site);
shareFilesSite = await apiService.getInstance().core.sitesApi.createSite(site);
const docLibId = (await apiService.getInstance().core.sitesApi.getSiteContainers(siteName)).list.entries[0].entry.id;
const testFile1Id = (await apiService.getInstance().core.nodesApi.addNode(docLibId, nodeBody)).entry.id;
@ -97,38 +98,33 @@ describe('Unshare file', () => {
}
});
await apiService.getInstance().core.sharedlinksApi.addSharedLink({ nodeId: testFile1Id });
});
afterAll(async () => {
await navigationBarPage.clickLogoutButton();
await apiService.getInstance().core.sitesApi.deleteSite(shareFilesSite.entry.id, { permanent: true });
});
describe('with permission', () => {
afterEach(async () => {
await apiService.loginWithProfile('admin');
await navigationBarPage.clickLogoutButton();
await uploadActions.deleteFileOrFolder(pngUploadedFile.entry.id);
});
beforeEach(async () => {
await apiService.login(acsUser.username, acsUser.password);
const pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, '-my-');
nodeId = pngUploadedFile.entry.id;
pngUploadedFile = await uploadActions.uploadFile(pngFileModel.location, pngFileModel.name, '-my-');
await loginPage.login(acsUser.username, acsUser.password);
await navBar.navigateToContentServices();
await contentServicesPage.waitForTableBody();
});
afterAll(async () => {
await navigationBarPage.clickLogoutButton();
await apiService.getInstance().core.sitesApi.deleteSite(testSite.entry.id, { permanent: true });
});
describe('with permission', () => {
afterAll(async () => {
await apiService.loginWithProfile('admin');
await uploadActions.deleteFileOrFolder(nodeId);
});
it('[C286550] Should display unshare confirmation dialog', async () => {
await contentListPage.selectRow(pngFileModel.name);
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await browser.sleep(2000);
await shareDialog.clickUnShareFile();
await shareDialog.confirmationDialogIsDisplayed();
});
it('[C286551] Should be able to cancel unshare action', async () => {
await contentListPage.selectRow(pngFileModel.name);
await contentServicesPage.getDocumentList().selectRow(pngFileModel.name);
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.clickUnShareFile();
@ -137,8 +133,17 @@ describe('Unshare file', () => {
await shareDialog.shareToggleButtonIsChecked();
});
it('[C286550] Should display unshare confirmation dialog', async () => {
await contentServicesPage.getDocumentList().selectRow(pngFileModel.name);
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await browser.sleep(2000);
await shareDialog.clickUnShareFile();
await shareDialog.confirmationDialogIsDisplayed();
});
it('[C286552] Should be able to confirm unshare action', async () => {
await contentListPage.selectRow(pngFileModel.name);
await contentServicesPage.getDocumentList().selectRow(pngFileModel.name);
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await shareDialog.clickUnShareFile();
@ -148,7 +153,7 @@ describe('Unshare file', () => {
});
it('[C280556] Should redirect to 404 when trying to access an unshared file', async () => {
await contentListPage.selectRow(pngFileModel.name);
await contentServicesPage.getDocumentList().selectRow(pngFileModel.name);
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();
await browser.sleep(2000);
@ -165,15 +170,14 @@ describe('Unshare file', () => {
describe('without permission', () => {
afterAll(async () => {
await apiService.loginWithProfile('admin');
await apiService.getInstance().core.sitesApi.deleteSite(siteName, { permanent: true });
beforeEach(async () => {
await loginPage.login(acsUser.username, acsUser.password);
});
it('[C286555] Should NOT be able to unshare file without permission', async () => {
await navBar.goToSite(testSite);
await navBar.goToSite(shareFilesSite);
await contentServicesPage.openFolder('documentLibrary');
await contentListPage.selectRow(nodeBody.name);
await contentServicesPage.getDocumentList().selectRow(nodeBody.name);
await contentServicesPage.clickShareButton();
await shareDialog.checkDialogIsDisplayed();

View File

@ -128,21 +128,6 @@ describe('Social component', () => {
await navigationBarPage.clickLogoutButton();
});
it('[C260324] Should be able to like and unlike a component', async () => {
await socialPage.writeCustomNodeId(emptyFile.entry.id);
await expect(await socialPage.getNodeIdFieldValue()).toEqual(emptyFile.entry.id);
await likePage.checkLikeCounter(0);
await expect(await likePage.getUnLikedIconColor()).toBe(greyLikeColor);
await likePage.clickLike();
await likePage.checkLikeCounter(1);
await likePage.removeHoverFromLikeButton();
await expect(await likePage.getLikedIconColor()).toBe(blueLikeColor);
await likePage.clickUnlike();
await likePage.checkLikeCounter(0);
await likePage.removeHoverFromLikeButton();
await expect(await likePage.getUnLikedIconColor()).toBe(greyLikeColor);
});
it('[C310198] Should be able to rate and unRate a component', async () => {
await socialPage.writeCustomNodeId(emptyFile.entry.id);
await expect(await socialPage.getNodeIdFieldValue()).toEqual(emptyFile.entry.id);

View File

@ -58,7 +58,6 @@ describe('SSO in ADF using ACS and AIS, Download Directive, Viewer, DocumentList
let pdfUploadedFile, pngUploadedFile, folder, acsUser;
const folderName = StringUtil.generateRandomString(5);
describe('SSO in ADF using ACS and AIS, implicit flow set', () => {
beforeAll(async () => {
await apiService.login(browser.params.testConfig.users.admin.username, browser.params.testConfig.users.admin.password);
@ -95,6 +94,8 @@ describe('SSO in ADF using ACS and AIS, Download Directive, Viewer, DocumentList
await browser.executeScript('window.localStorage.clear();');
});
describe('SSO in ADF using ACS and AIS, implicit flow set', () => {
afterEach(async () => {
await browser.refresh();
await contentListPage.waitForTableBody();

View File

@ -125,14 +125,13 @@ describe('Upload - User permission', () => {
describe('full permissions', () => {
beforeEach(async () => {
await apiService.loginWithProfile('admin');
await navigationBarPage.openContentServicesFolder(managerSite.entry.guid);
await contentServicesPage.goToDocumentList();
});
it('[C279917] Should be allowed to upload a file in a folder with manager permissions', async () => {
await contentServicesPage.uploadFile(emptyFile.location);
await uploadDialog.fileIsUploaded(emptyFile.name);
});
});

View File

@ -144,6 +144,7 @@ describe('Version component permissions', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await apiService.getInstance().nodes.deleteNode(sameCreatorFile.id);
await navigationBarPage.clickLogoutButton();
});
@ -215,6 +216,7 @@ describe('Version component permissions', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await apiService.getInstance().nodes.deleteNode(sameCreatorFile.id);
await navigationBarPage.clickLogoutButton();
});
@ -269,6 +271,7 @@ describe('Version component permissions', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await apiService.getInstance().nodes.deleteNode(sameCreatorFile.id);
await navigationBarPage.clickLogoutButton();
});

View File

@ -640,10 +640,6 @@ export class ContentServicesPage {
await this.siteListDropdown.checkOptionIsSelected(siteName);
}
async selectSite(siteName: string): Promise<void> {
await this.siteListDropdown.selectDropdownOption(siteName);
}
async clickDownloadButton(): Promise<void> {
await BrowserActions.closeMenuAndDialogs();
await BrowserActions.click(this.downloadButton);

View File

@ -112,6 +112,7 @@ describe('Viewer', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await uploadActions.deleteFileOrFolder(otherFolderUploaded.entry.id);
});

View File

@ -121,6 +121,7 @@ describe('Content Services Viewer', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await uploadActions.deleteFileOrFolder(pdfFile.getId());
await uploadActions.deleteFileOrFolder(protectedFile.getId());
await uploadActions.deleteFileOrFolder(docxFile.getId());

View File

@ -59,6 +59,7 @@ describe('Viewer', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await uploadActions.deleteFileOrFolder(txtFileUploaded.entry.id);
await navigationBarPage.clickLogoutButton();
});

View File

@ -70,6 +70,7 @@ describe('Viewer', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await uploadActions.deleteFileOrFolder(pngFile.getId());
await navigationBarPage.clickLogoutButton();
});

View File

@ -87,6 +87,7 @@ describe('Viewer', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true });
await apiService.login(acsUser.username, acsUser.password);
await uploadActions.deleteFileOrFolder(wordFileUploaded.entry.id);

View File

@ -44,6 +44,7 @@ describe('Analytics Smoke Test', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await apiService.getInstance().activiti.adminTenantsApi.deleteTenant(procUserModel.tenantId);
});

View File

@ -144,25 +144,7 @@ describe('Attach File - Content service', () => {
await widget.attachFileWidget().clickUploadButton(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id);
});
it('[C299040] Should display the login screen right, when user has access to 2 alfresco repositiories', async () => {
const name = 'Attach file';
await taskPage.createTask({ name, formName: app.UPLOAD_FILE_FORM_CS.formName });
await widget.attachFileWidget().clickUploadButton(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id);
await widget.attachFileWidget().selectUploadSource(csIntegrations[1]);
await externalNodeSelector.waitForLogInDialog();
await expect(await externalNodeSelector.getTitle()).toEqual(`Sign into '${browser.params.testConfig.adf_external_acs.host}'`);
await externalNodeSelector.login(user.username, user.password);
await externalNodeSelector.checkDialogIsDisplayed();
await searchService.isSearchable(externalFile);
await externalNodeSelector.searchAndSelectResult(externalFile, externalFile);
await externalNodeSelector.clickMoveCopyButton();
await widget.attachFileWidget().checkFileIsAttached(app.UPLOAD_FILE_FORM_CS.FIELD.widget_id, externalFile);
});
it('[C286516] Able to upload a file when user has more than two alfresco repositories', async () => {
it('[C286516][C299040] Able to upload a file when user has more than two alfresco repositories', async () => {
const name = 'Attach file - multiple repo';
await taskPage.createTask({ name, formName: app.UPLOAD_FILE_FORM_CS.formName });

View File

@ -37,7 +37,7 @@ describe('Comment component for Processes', () => {
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
let user, appId, secondUser, newTaskId;
let user, appId, secondUser;
const taskName = {
completed_task: 'Test Completed',
@ -82,15 +82,13 @@ describe('Comment component for Processes', () => {
it('[C212864] Should be able to add multiple comments on a single task using different users', async () => {
const newTask = await apiService.getInstance().activiti.taskApi.createNewTask(new TaskRepresentation({ name: taskName.multiple_users }));
newTaskId = newTask.id;
await apiService.getInstance().activiti.taskApi.involveUser(newTaskId, { email: secondUser.email });
await apiService.getInstance().activiti.taskApi.involveUser(newTask.id, { email: secondUser.email });
const taskComment = { message: 'Task Comment' };
const secondTaskComment = { message: 'Second Task Comment' };
await apiService.getInstance().activiti.taskApi.addTaskComment(taskComment, newTaskId);
await apiService.getInstance().activiti.taskApi.addTaskComment(secondTaskComment, newTaskId);
await apiService.getInstance().activiti.taskApi.addTaskComment(taskComment, newTask.id);
await apiService.getInstance().activiti.taskApi.addTaskComment(secondTaskComment, newTask.id);
await (await (await navigationBarPage.navigateToProcessServicesPage()).goToTaskApp()).clickTasksButton();
@ -98,7 +96,7 @@ describe('Comment component for Processes', () => {
await taskPage.tasksListPage().selectRow(taskName.multiple_users);
await taskPage.taskDetails().selectActivityTab();
const totalCommentsLatest = await apiService.getInstance().activiti.taskApi.getTaskComments(newTaskId, { 'latestFirst': true });
const totalCommentsLatest = await apiService.getInstance().activiti.taskApi.getTaskComments(newTask.id, { 'latestFirst': true });
const thirdTaskComment = { message: 'Third Task Comment' };
@ -119,7 +117,7 @@ describe('Comment component for Processes', () => {
await navigationBarPage.clickLogoutButton();
await loginPage.login(secondUser.username, secondUser.password);
await apiService.getInstance().activiti.taskApi.addTaskComment(thirdTaskComment, newTaskId);
await apiService.getInstance().activiti.taskApi.addTaskComment(thirdTaskComment, newTask.id);
await (await (await navigationBarPage.navigateToProcessServicesPage()).goToTaskApp()).clickTasksButton();
@ -127,7 +125,7 @@ describe('Comment component for Processes', () => {
await taskPage.tasksListPage().selectRow(taskName.multiple_users);
await taskPage.taskDetails().selectActivityTab();
const totalComments = await apiService.getInstance().activiti.taskApi.getTaskComments(newTaskId, { 'latestFirst': true });
const totalComments = await apiService.getInstance().activiti.taskApi.getTaskComments(newTask.id, { 'latestFirst': true });
await commentsPage.checkUserIconIsDisplayed();
await commentsPage.checkUserIconIsDisplayed();

View File

@ -65,11 +65,12 @@ describe('Sorting for process filters', () => {
});
afterEach(async () => {
try {
await apiService.getInstance().activiti.modelsApi.deleteModel(appId);
await apiService.loginWithProfile('admin');
await apiService.getInstance().activiti.adminTenantsApi.deleteTenant(tenantId);
} catch (e) {
}
await navigationBarPage.clickLogoutButton();
});

View File

@ -139,7 +139,7 @@ describe('Info Drawer', () => {
await expect(await taskPage.taskDetails().getPriority()).toEqual('40');
await taskPage.taskDetails().updatePriority();
await taskPage.taskDetails().checkTaskDetailsDisplayed();
await expect(await taskPage.taskDetails().getPriority()).toEqual('0');
await expect(await taskPage.taskDetails().getPriority()).toEqual('');
await taskPage.taskDetails().clickCompleteFormTask();
});

View File

@ -17,8 +17,9 @@
import { ProcessServiceTabBarPage } from './process-service-tab-bar.page';
import { Locator, element, by } from 'protractor';
import { Locator, element, by, browser } from 'protractor';
import { BrowserVisibility, BrowserActions } from '@alfresco/adf-testing';
import { TasksPage } from './tasks.page';
export class ProcessServicesPage {
@ -34,6 +35,8 @@ export class ProcessServicesPage {
async goToApp(applicationName: string): Promise<ProcessServiceTabBarPage> {
const app = element(by.css('mat-card[title="' + applicationName + '"]'));
await BrowserActions.click(app);
const taskPage = new TasksPage();
await taskPage.tasksListPage().checkTaskListIsLoaded();
return new ProcessServiceTabBarPage();
}
@ -42,6 +45,13 @@ export class ProcessServicesPage {
return new ProcessServiceTabBarPage();
}
async goToAppByAppId(appId: string): Promise<void> {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${appId}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
const taskPage = new TasksPage();
await taskPage.tasksListPage().checkTaskListIsLoaded();
}
async getAppIconType(applicationName: string): Promise<string> {
const app = element(by.css('mat-card[title="' + applicationName + '"]'));
await BrowserVisibility.waitUntilElementIsVisible(app);

View File

@ -220,7 +220,7 @@ export class TaskDetailsPage {
async updatePriority(priority?: string): Promise<void> {
await BrowserActions.click(this.priority);
await BrowserActions.clearWithBackSpace(this.priority);
await BrowserActions.clearSendKeys(element(by.css('input[data-automation-id="card-textitem-value-priority"]')), priority ? priority : ' ', 500);
await BrowserActions.clearSendKeys(element(by.css('input[data-automation-id="card-textitem-value-priority"]')), priority, 500);
await this.priority.sendKeys(Key.TAB);
await browser.sleep(1000);
}

View File

@ -57,6 +57,7 @@ describe('Start Task - Task App', () => {
});
beforeEach(async () => {
await browser.refresh();
await (await (await navigationBarPage.navigateToProcessServicesPage()).goToTaskApp()).clickTasksButton();
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
});
@ -108,6 +109,7 @@ describe('Start Task - Task App', () => {
await taskPage.formFields().checkFormIsDisplayed();
await taskPage.taskDetails().checkCompleteFormButtonIsDisplayed();
await taskPage.taskDetails().waitFormNameEqual(app.formName);
});

View File

@ -98,6 +98,7 @@ describe('Start Process Component', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await apiServiceUserTwo.getInstance().activiti.modelsApi.deleteModel(appCreated.id);
await apiServiceUserTwo.getInstance().activiti.modelsApi.deleteModel(simpleAppCreated.id);
await apiServiceUserTwo.getInstance().activiti.modelsApi.deleteModel(dateFormAppCreated.id);

View File

@ -36,6 +36,7 @@ import { TaskRepresentation } from '@alfresco/js-api';
import CONSTANTS = require('../util/constants');
describe('Task Details - Form', () => {
const loginPage = new LoginPage();
const tasksListPage = new TasksListPage();
const taskDetailsPage = new TaskDetailsPage();
@ -187,6 +188,7 @@ describe('Task Details - Form', () => {
const form = await formActions.getFormByName(app.visibilityProcess.formName);
await apiService.getInstance().activiti.taskApi.attachForm(newTask.id, { 'formId': form.id });
await browser.refresh();
await (await new NavigationBarPage().navigateToProcessServicesPage()).goToTaskApp();
await tasksListPage.checkTaskListIsLoaded();
await filtersPage.goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS);

View File

@ -56,6 +56,8 @@ describe('Amount Widget', () => {
beforeEach(async() => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await taskPage.tasksListPage().checkTaskListIsLoaded();
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('Attach Folder widget', () => {
@ -35,6 +36,7 @@ describe('Attach Folder widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
let appModel;
let deployedApp, process;
@ -62,8 +64,9 @@ describe('Attach Folder widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,7 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
describe('Checkbox Widget', () => {
@ -61,8 +61,7 @@ describe('Checkbox Widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('Date and time widget', () => {
@ -35,6 +36,7 @@ describe('Date and time widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -61,8 +63,9 @@ describe('Date and time widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -30,6 +30,8 @@ import { browser } from 'protractor';
import { FormDemoPage } from '.././pages/form-demo.page';
import { customDateFormAPS1 } from '../../resources/forms/custom-date-form';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('Date widget', () => {
@ -38,6 +40,7 @@ describe('Date widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const dateWidget = widget.dateWidget();
let appModel;
@ -72,8 +75,9 @@ describe('Date widget', () => {
describe('Simple App', () => {
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('Document Template widget', () => {
@ -35,6 +36,7 @@ describe('Document Template widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -61,8 +63,9 @@ describe('Document Template widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('Dropdown widget', () => {
const app = browser.params.resources.Files.WIDGET_CHECK_APP.DROPDOWN;
@ -34,6 +35,7 @@ describe('Dropdown widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -60,8 +62,9 @@ describe('Dropdown widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -28,6 +27,7 @@ import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
describe('Dynamic Table widget ', () => {
@ -62,8 +62,9 @@ describe('Dynamic Table widget ', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});
@ -118,8 +119,9 @@ describe('Dynamic Table widget ', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.tasksListPage().checkTaskListIsLoaded();
await taskPage.formFields().checkFormIsDisplayed();
@ -172,8 +174,10 @@ describe('Dynamic Table widget ', () => {
beforeEach(async () => {
await loginPage.login(processUserModel.username, processUserModel.password);
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.tasksListPage().checkTaskListIsLoaded();
await taskPage.formFields().checkFormIsDisplayed();

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('Header widget', async () => {
@ -35,6 +36,7 @@ describe('Header widget', async () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -61,8 +63,9 @@ describe('Header widget', async () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('Hyperlink widget', () => {
@ -35,6 +36,7 @@ describe('Hyperlink widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -61,8 +63,9 @@ describe('Hyperlink widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('Multi-line Widget', () => {
const app = browser.params.resources.Files.WIDGET_CHECK_APP.MULTILINE_TEXT;
@ -34,6 +35,7 @@ describe('Multi-line Widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -60,8 +62,9 @@ describe('Multi-line Widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('Number widget', () => {
@ -35,6 +36,7 @@ describe('Number widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -61,8 +63,9 @@ describe('Number widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('People widget', () => {
@ -35,6 +36,7 @@ describe('People widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -61,8 +63,9 @@ describe('People widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
import { ProcessServicesPage } from '../pages/process-services.page';
describe('Radio Buttons Widget', () => {
@ -35,6 +36,7 @@ describe('Radio Buttons Widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -62,8 +64,9 @@ describe('Radio Buttons Widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { TasksPage } from '../pages/tasks.page';
import { browser } from 'protractor';
import CONSTANTS = require('../../util/constants');
import { ProcessServicesPage } from '../pages/process-services.page';
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
describe('Text widget', () => {
@ -35,6 +36,7 @@ describe('Text widget', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -61,8 +63,9 @@ describe('Text widget', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});
@ -84,12 +87,15 @@ describe('Text widget', () => {
});
it('[C268170] Min-max length properties', async () => {
await widget.textWidget().setValue(app.FIELD.simpleText, 'TEST');
await widget.textWidget().setValue(app.FIELD.textMinMax, 'A');
await expect(await widget.textWidget().getErrorMessage(app.FIELD.textMinMax)).toContain('Enter at least 4 characters');
await expect(await taskPage.formFields().isCompleteFormButtonEnabled()).toEqual(false);
await widget.textWidget().setValue(app.FIELD.textMinMax, 'AAAAAAAAAAA');
await widget.textWidget().setValue(app.FIELD.textMinMax, '01234567890');
await expect(await widget.textWidget().getErrorMessage(app.FIELD.textMinMax)).toContain('Enter no more than 10 characters');
await expect(await taskPage.formFields().isCompleteFormButtonEnabled()).toEqual(false);
await widget.textWidget().setValue(app.FIELD.textMinMax, '123456789');
await expect(await taskPage.formFields().isCompleteFormButtonEnabled()).toEqual(true);
});
it('[C268171] Input mask reversed checkbox properties', async () => {

View File

@ -18,7 +18,6 @@
import {
ApiService,
ApplicationsUtil,
BrowserActions,
LoginPage,
ProcessUtil,
UsersActions,
@ -27,6 +26,8 @@ import {
import { browser } from 'protractor';
import { TasksPage } from '../pages/tasks.page';
import CONSTANTS = require('../../util/constants');
import { NavigationBarPage } from '../../core/pages/navigation-bar.page';
import { ProcessServicesPage } from '../pages/process-services.page';
const widgets = {
textOneId: 'text1',
@ -57,6 +58,7 @@ describe('Process-Services - Visibility conditions', () => {
const loginPage = new LoginPage();
const taskPage = new TasksPage();
const widget = new Widget();
const navigationBarPage = new NavigationBarPage();
const apiService = new ApiService();
const usersActions = new UsersActions(apiService);
@ -83,8 +85,8 @@ describe('Process-Services - Visibility conditions', () => {
});
beforeEach(async () => {
const urlToNavigateTo = `${browser.baseUrl}/activiti/apps/${deployedApp.id}/tasks/`;
await BrowserActions.getUrl(urlToNavigateTo);
await navigationBarPage.clickHomeButton();
await (new ProcessServicesPage()).goToAppByAppId(deployedApp.id);
await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS);
await taskPage.formFields().checkFormIsDisplayed();
});
@ -113,17 +115,6 @@ describe('Process-Services - Visibility conditions', () => {
await widget.checkboxWidget().isCheckboxHidden(checkbox.checkboxVariableField);
});
it('[C309649] Should be able to see Checkbox widget when visibility condition refers to a field and a form variable', async () => {
await widget.textWidget().isWidgetVisible(widgets.textOneId);
await widget.checkboxWidget().isCheckboxHidden(checkbox.checkboxFieldVariable);
await widget.textWidget().setValue(widgets.textOneId, value.displayFieldVariableCheckbox);
await widget.checkboxWidget().isCheckboxDisplayed(checkbox.checkboxFieldVariable);
await widget.textWidget().setValue(widgets.textOneId, value.notDisplayCheckbox);
await widget.checkboxWidget().isCheckboxHidden(checkbox.checkboxFieldVariable);
});
it('[C311425] Should be able to see Checkbox widget when visibility condition refers to a field and another field', async () => {
await widget.textWidget().isWidgetVisible(widgets.textOneId);
await widget.checkboxWidget().isCheckboxDisplayed(checkbox.checkboxFieldField);
@ -135,6 +126,17 @@ describe('Process-Services - Visibility conditions', () => {
await widget.checkboxWidget().isCheckboxDisplayed(checkbox.checkboxFieldField);
});
it('[C309649] Should be able to see Checkbox widget when visibility condition refers to a field and a form variable', async () => {
await widget.textWidget().isWidgetVisible(widgets.textOneId);
await widget.checkboxWidget().isCheckboxHidden(checkbox.checkboxFieldVariable);
await widget.textWidget().setValue(widgets.textOneId, value.displayFieldVariableCheckbox);
await widget.checkboxWidget().isCheckboxDisplayed(checkbox.checkboxFieldVariable);
await widget.textWidget().setValue(widgets.textOneId, value.notDisplayCheckbox);
await widget.checkboxWidget().isCheckboxHidden(checkbox.checkboxFieldVariable);
});
it('[C311424] Should be able to see Checkbox widget when visibility condition refers to a variable with specific value', async () => {
await widget.checkboxWidget().isCheckboxDisplayed(checkbox.checkboxVariableValue);
});

View File

@ -34,15 +34,16 @@ const LOG = !!process.env.LOG;
let arraySpecs = [];
console.log('Parallel e2e : ' + MAXINSTANCES);
console.log('Max fail Retry: ', MAX_RETRIES);
if (LOG) {
console.log('======= PROTRACTOR CONFIGURATION ====== ');
console.log('HOST: ', HOST);
console.log('BROWSER_RUN : ' + BROWSER_RUN);
console.log('SAVE_SCREENSHOT : ' + SAVE_SCREENSHOT);
console.log('FOLDER : ' + FOLDER);
console.log('MAXINSTANCES : ' + MAXINSTANCES);
console.log('LIST_SPECS : ' + LIST_SPECS);
console.log('MAX_RETRIES: ', MAX_RETRIES);
console.log('SELENIUM_SERVER : ' + SELENIUM_SERVER);
}
@ -191,7 +192,9 @@ exports.config = {
}],
onCleanUp(results) {
if (process.env.CI) {
retry.onCleanUp(results);
}
},
async onPrepare() {

View File

@ -70,7 +70,7 @@ describe('Search Sorting Picker', () => {
pngA = await uploadActions.uploadFile(pngAModel.location, pngAModel.name, '-my-');
pngD = await uploadActions.uploadFile(pngDModel.location, pngDModel.name, '-my-');
await browser.sleep(12000);
await browser.sleep(browser.params.testConfig.timeouts.index_search);
await loginPage.login(acsUser.username, acsUser.password);
});

View File

@ -87,6 +87,8 @@ describe('Search Component - Multi-Select Facet', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await Promise.all([
uploadActions.deleteFileOrFolder(jpgFile.entry.id),
uploadActions.deleteFileOrFolder(jpgFileSite.entry.id),
@ -228,6 +230,7 @@ describe('Search Component - Multi-Select Facet', () => {
});
afterAll(async () => {
await apiService.loginWithProfile('admin');
await uploadActions.deleteFileOrFolder(txtFile.entry.id);
await apiService.getInstance().core.sitesApi.deleteSite(site.entry.id, { permanent: true });
});

View File

@ -79,7 +79,7 @@ function main(args) {
.requiredOption('--dockerRepo [type]', 'docker repo')
.requiredOption('--dockerTags [type]', ' tags')
.requiredOption('--buildArgs [type]', ' buildArgs')
.requiredOption('--pathProject [type]', 'path ptojrct')
.requiredOption('--pathProject [type]', 'path project')
.parse(process.argv);
if (process.argv.includes('-h') || process.argv.includes('--help')) {

View File

@ -259,6 +259,7 @@ export abstract class BaseQueryBuilderService {
}
if (query) {
const result: QueryBody = <QueryBody> {
query: {
query: query,
@ -336,13 +337,11 @@ export abstract class BaseQueryBuilderService {
* @returns True if defined, false otherwise
*/
get hasFacetIntervals(): boolean {
if (this.config
return this.config
&& this.config.facetIntervals
&& this.config.facetIntervals.intervals
&& this.config.facetIntervals.intervals.length > 0) {
return true;
}
return false;
&& this.config.facetIntervals.intervals.length > 0;
}
get hasFacetHighlight(): boolean {

View File

@ -99,8 +99,15 @@ export class SearchHeaderQueryBuilderService extends BaseQueryBuilderService {
dataSorting.forEach((columnSorting: DataSorting) => {
const fieldValue = this.getSortingFieldFromColumnName(columnSorting.key);
if (fieldValue) {
const optionAscending = columnSorting.direction.toLocaleLowerCase() === 'asc' ? true : false;
const currentSort: SearchSortingDefinition = { key: columnSorting.key, label: 'current', type: 'FIELD', field: fieldValue, ascending: optionAscending };
const optionAscending = columnSorting.direction.toLocaleLowerCase() === 'asc';
const type = fieldValue === 'score' ? 'SCORE' : 'FIELD';
const currentSort: SearchSortingDefinition = {
key: columnSorting.key,
label: 'current',
type: type,
field: fieldValue,
ascending: optionAscending
};
this.sorting.push(currentSort);
}
});

View File

@ -28,6 +28,7 @@ export abstract class CardViewBaseItemModel {
icon?: string;
validators?: CardViewItemValidator[];
data?: any;
type?: string;
constructor(cardViewItemProperties: CardViewItemProperties) {
this.label = cardViewItemProperties.label || '';

View File

@ -20,7 +20,7 @@ import { Subject } from 'rxjs';
import { CardViewBaseItemModel } from '../models/card-view-baseitem.model';
export interface UpdateNotification {
target: any;
target: CardViewBaseItemModel;
changed: any;
}
@ -60,7 +60,7 @@ export class CardViewUpdateService {
/**
* Updates the cardview items property
* @param CardViewBaseItemModel
* @param notification
*/
updateElement(notification: CardViewBaseItemModel) {
this.updateItem$.next(notification);

View File

@ -327,7 +327,7 @@ export class FormFieldModel extends FormWidgetModel {
}
if (this.isCheckboxField(json)) {
value = json.value === 'true' || json.value === true ? true : false;
value = json.value === 'true' || json.value === true;
}
return value;

View File

@ -19,7 +19,15 @@
data-automation-id="adf-user-profile">
<div class="adf-userinfo-button-profile" id="user-profile">
<div *ngIf="identityUser$ | async as identityUser; else showBpmAndEcmUserImage" id="identity-user-image">
<div *ngIf="ecmUser$ | async as ecmUser">
<div *ngIf="ecmUser.avatarId; else initialTemplate" class="adf-userinfo-profile-container">
<img id="logged-user-img" [src]="getEcmAvatar(ecmUser.avatarId)" alt="user-info-profile-button"
class="adf-userinfo-profile-image"/>
</div>
</div>
<ng-template #initialTemplate>
<div [outerHTML]="identityUser | usernameInitials:'adf-userinfo-pic'"></div>
</ng-template>
</div>
<ng-template #showBpmAndEcmUserImage>
<div *ngIf="ecmUser$ | async as ecmUser; else showBpmUserImage" id="ecm-user-image">
@ -76,7 +84,8 @@
<div class="adf-userinfo-detail">
<span class="adf-userinfo__secondary-info" id="ecm-job-title-label">
{{ 'USER_PROFILE.LABELS.ECM.JOB_TITLE' | translate }}
<span id="ecm-job-title" class="adf-userinfo__detail-profile"> {{ ecmUser.jobTitle ? ecmUser.jobTitle : 'N/A' }} </span>
<span id="ecm-job-title"
class="adf-userinfo__detail-profile"> {{ ecmUser.jobTitle ? ecmUser.jobTitle : 'N/A' }} </span>
</span>
</div>
</div>
@ -107,7 +116,8 @@
<div class="adf-userinfo-detail">
<span id="bpm-tenant" class="adf-userinfo__secondary-info">
{{ 'USER_PROFILE.LABELS.BPM.TENANT' | translate }}
<span class="adf-userinfo__detail-profile">{{ bpmUser.tenantName ? bpmUser.tenantName : '' }}</span>
<span
class="adf-userinfo__detail-profile">{{ bpmUser.tenantName ? bpmUser.tenantName : '' }}</span>
</span>
</div>
</div>
@ -118,15 +128,24 @@
<mat-card class="adf-userinfo-card" *ngIf="identityUser$ | async as identityUser">
<mat-card-header class="adf-userinfo-card-header"
[style.background-image]="'url(' + bpmBackgroundImage + ')'">
<div
[outerHTML]="identityUser | usernameInitials:'adf-userinfo-profile-initials adf-hide-small'">
<div *ngIf="ecmUser$ | async as ecmUser">
<div *ngIf="ecmUser.avatarId; else initialTemplate"
class="adf-userinfo-profile-container adf-hide-small">
<img class="adf-userinfo-profile-picture" id="ecm-user-detail-image"
alt="ecm-profile-image" [src]="getEcmAvatar(ecmUser.avatarId)"/>
</div>
</div>
<ng-template #initialTemplate>
<div
[outerHTML]="identityUser | usernameInitials:'adf-userinfo-profile-initials adf-hide-small'"></div>
</ng-template>
<div class="adf-userinfo-title" id="identity-username">{{identityUser | fullName}}</div>
</mat-card-header>
<mat-card-content>
<div class="adf-userinfo-supporting-text">
<div class="adf-userinfo-detail">
<span id="identity-full-name" class="adf-userinfo__detail-title">{{identityUser | fullName}}</span>
<span id="identity-full-name"
class="adf-userinfo__detail-title">{{identityUser | fullName}}</span>
<span class="adf-userinfo__detail-profile"
id="identity-email"> {{identityUser.email}} </span>
</div>

View File

@ -83,6 +83,11 @@ export class UserInfoComponent implements OnInit {
if (this.authService.isOauth()) {
this.loadIdentityUserInfo();
this.mode = 'SSO';
if (this.authService.isEcmLoggedIn()) {
this.loadEcmUserInfo();
}
} else if (this.authService.isEcmLoggedIn() && this.authService.isBpmLoggedIn()) {
this.loadEcmUserInfo();
this.loadBpmUserInfo();

View File

@ -267,7 +267,6 @@ export class TaskDetailsComponent implements OnInit, OnChanges, OnDestroy {
*/
private loadDetails(taskId: string) {
this.taskPeople = [];
this.taskFormName = null;
if (taskId) {
this.taskListService.getTaskDetails(taskId).subscribe(
@ -339,6 +338,7 @@ export class TaskDetailsComponent implements OnInit, OnChanges, OnDestroy {
}
onCompleteAttachForm() {
this.taskFormName = null;
this.showAttachForm = false;
this.taskFormComponent.loadTask(this.taskId);
this.loadDetails(this.taskId);

View File

@ -15,16 +15,17 @@
* limitations under the License.
*/
import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core';
import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';
import {
BpmUserService,
CardViewDateItemModel,
CardViewItem,
CardViewMapItemModel,
CardViewTextItemModel,
CardViewBaseItemModel,
TranslationService,
AppConfigService
AppConfigService,
CardViewIntItemModel,
CardViewItemLengthValidator
} from '@alfresco/adf-core';
import { TaskDetailsModel } from '../models/task-details.model';
import { TaskDescriptionValidator } from '../validators/task-description.validator';
@ -52,13 +53,13 @@ export class TaskHeaderComponent implements OnChanges, OnInit {
@Output()
claim: EventEmitter<any> = new EventEmitter<any>();
/** Emitted when the task is unclaimed (ie, requeued). */
/** Emitted when the task is unclaimed (ie, requeue). */
@Output()
unclaim: EventEmitter<any> = new EventEmitter<any>();
private currentUserId: number;
properties: CardViewItem [];
properties: any [] = [];
inEdit: boolean = false;
displayDateClearAction = false;
dateFormat: string;
@ -73,13 +74,19 @@ export class TaskHeaderComponent implements OnChanges, OnInit {
ngOnInit() {
this.loadCurrentBpmUserId();
this.initData();
}
ngOnChanges() {
ngOnChanges(changes: SimpleChanges) {
const taskDetailsChange = changes['taskDetails'];
if (taskDetailsChange?.currentValue?.id !== taskDetailsChange?.previousValue?.id) {
this.initData();
} else {
this.refreshData();
}
}
private initDefaultProperties(parentInfoMap) {
private initDefaultProperties(parentInfoMap): any[] {
return [
new CardViewTextItemModel(
{
@ -98,12 +105,13 @@ export class TaskHeaderComponent implements OnChanges, OnInit {
key: 'status'
}
),
new CardViewTextItemModel(
new CardViewIntItemModel(
{
label: 'ADF_TASK_LIST.PROPERTIES.PRIORITY',
value: this.taskDetails.priority,
key: 'priority',
editable: true
editable: true,
validators: [new CardViewItemLengthValidator(1, 10)]
}
),
new CardViewDateItemModel(
@ -200,7 +208,7 @@ export class TaskHeaderComponent implements OnChanges, OnInit {
/**
* Refresh the card data
*/
refreshData() {
initData() {
if (this.taskDetails) {
const parentInfoMap = this.getParentInfo();
const defaultProperties = this.initDefaultProperties(parentInfoMap);
@ -209,6 +217,26 @@ export class TaskHeaderComponent implements OnChanges, OnInit {
}
}
/**
* Refresh the card data
*/
refreshData() {
this.properties = this.properties.map((cardItem) => {
if (cardItem.key === 'formName' && cardItem.value !== this.formName) {
return new CardViewTextItemModel({
label: 'ADF_TASK_LIST.PROPERTIES.FORM_NAME',
value: this.formName,
key: 'formName',
default: this.translationService.instant('ADF_TASK_LIST.PROPERTIES.FORM_NAME_DEFAULT'),
clickable: this.isFormClickable(),
icon: 'create'
});
} else {
return cardItem;
}
});
}
private isValidSelection(filteredProperties: string[], cardItem: CardViewBaseItemModel): boolean {
return filteredProperties ? filteredProperties.indexOf(cardItem.key) >= 0 : true;
}
@ -236,7 +264,7 @@ export class TaskHeaderComponent implements OnChanges, OnInit {
* Does the task have an assignee
*/
public hasAssignee(): boolean {
return !!this.taskDetails.assignee ? true : false;
return !!this.taskDetails.assignee;
}
/**

View File

@ -15,14 +15,6 @@
* limitations under the License.
*/
/*
* Copyright 2005-2019 Alfresco Software, Ltd. All rights reserved.
*
* License rights for this program may be obtained from Alfresco Software, Ltd.
* pursuant to a written agreement and any use of this program without such an
* agreement is prohibited.
*/
export type ApiResultPredicate<T> = (result: T) => boolean;
export type ApiCall<T> = () => Promise<T>;

View File

@ -94,7 +94,7 @@ export class LoginPage {
await this.enterPassword(password);
await this.clickLoginButton();
await browser.actions().sendKeys(protractor.Key.ENTER).perform();
await BrowserVisibility.waitUntilElementIsVisible(this.header);
await BrowserVisibility.waitUntilElementIsVisible(this.header, BrowserVisibility.DEFAULT_TIMEOUT * 2);
}
async loginBasicAuth(username: string, password: string): Promise<void> {

View File

@ -43,7 +43,7 @@ export class BrowserActions {
}
};
return ApiUtil.waitForApi(apiCall, predicate, 5, 2000);
return ApiUtil.waitForApi(apiCall, predicate, 10, 2000);
}
static async click(elementToClick: ElementFinder): Promise<void> {

View File

@ -24,4 +24,5 @@ export * from './local-storage.util';
export * from './file-browser.util';
export * from './form.util';
export * from './date-util';
export * from './wait-actions';
export * from './logger';

View File

@ -0,0 +1,70 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { NodeEntry } from '@alfresco/js-api';
import { ApiService } from '../actions/api.service';
import { ApiUtil } from '../actions/api.util';
import { Logger } from './logger';
export class WaitActions {
DELAY_API_CALL = 5000;
apiService: ApiService;
constructor(apiService: ApiService) {
this.apiService = apiService;
}
async nodeIsPresent(nodeId: string): Promise<NodeEntry | null> {
const predicate = (result) => {
return result.entry.id === nodeId;
};
const apiCall = async () => {
try {
return this.apiService.getInstance().core.nodesApi.getNode(nodeId);
} catch (error) {
Logger.error('Node not present');
return null;
}
};
return ApiUtil.waitForApi(apiCall, predicate, this.DELAY_API_CALL);
}
async nodeIsUnlock(nodeId: string): Promise<NodeEntry | null> {
const predicate = (result) => {
return result.entry.isLocked === false;
};
const apiCall = async () => {
try {
return this.apiService.getInstance().core.nodesApi.getNode(nodeId);
} catch (error) {
Logger.error('Node not present');
return null;
}
};
return ApiUtil.waitForApi(apiCall, predicate, this.DELAY_API_CALL);
}
}

186
package-lock.json generated
View File

@ -5,9 +5,9 @@
"requires": true,
"dependencies": {
"@alfresco/js-api": {
"version": "4.3.0-2e84309af123ae96cc85bd9683cb1ab9a7119c33",
"resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-4.3.0-2e84309af123ae96cc85bd9683cb1ab9a7119c33.tgz",
"integrity": "sha512-D655f7pIzecQ+dN2hN8g/MrI0ToRuqO2EddOSs5g6d1fRwA4I32rpH62R2+5oXsdvgkLCuPJ8xoLamz3QVcajQ==",
"version": "4.3.0-386fb73751610a15094a0d0938ab19456325d7c8",
"resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-4.3.0-386fb73751610a15094a0d0938ab19456325d7c8.tgz",
"integrity": "sha512-vzrIiXxWkaFOhRgXrtbmnVSwwuDXxr3bVcZto3z1u2EAjs2Sg3DxtQmG73NdIYoUqemfDc6DDVdT5zxin6A4sw==",
"requires": {
"event-emitter": "^0.3.5",
"minimatch": "3.0.4",
@ -7796,18 +7796,18 @@
}
},
"browserstack": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz",
"integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==",
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz",
"integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==",
"dev": true,
"requires": {
"https-proxy-agent": "^2.2.1"
},
"dependencies": {
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
@ -11823,9 +11823,9 @@
},
"dependencies": {
"flatted": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
"integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
"integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
"dev": true
}
}
@ -16567,14 +16567,13 @@
"dev": true
},
"meow": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
"integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz",
"integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==",
"dev": true,
"requires": {
"@types/minimist": "^1.2.0",
"camelcase-keys": "^6.2.2",
"decamelize": "^1.2.0",
"decamelize-keys": "^1.1.0",
"hard-rejection": "^2.1.0",
"minimist-options": "4.1.0",
@ -16645,9 +16644,9 @@
}
},
"parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
"integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
@ -20463,9 +20462,9 @@
}
},
"webdriver-manager": {
"version": "12.1.7",
"resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz",
"integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==",
"version": "12.1.8",
"resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz",
"integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==",
"dev": true,
"requires": {
"adm-zip": "^0.4.9",
@ -20499,12 +20498,11 @@
"dev": true
},
"ansi-styles": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
"@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
@ -20520,9 +20518,9 @@
}
},
"y18n": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
"integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
"dev": true
},
"yargs": {
@ -22128,9 +22126,9 @@
},
"dependencies": {
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": {
"ms": "^2.1.1"
@ -24690,9 +24688,9 @@
}
},
"stylelint": {
"version": "13.9.0",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.9.0.tgz",
"integrity": "sha512-VVWH2oixOAxpWL1vH+V42ReCzBjW2AeqskSAbi8+3OjV1Xg3VZkmTcAqBZfRRvJeF4BvYuDLXebW3tIHxgZDEg==",
"version": "13.8.0",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.8.0.tgz",
"integrity": "sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==",
"dev": true,
"requires": {
"@stylelint/postcss-css-in-js": "^0.37.2",
@ -24701,14 +24699,14 @@
"balanced-match": "^1.0.0",
"chalk": "^4.1.0",
"cosmiconfig": "^7.0.0",
"debug": "^4.3.1",
"debug": "^4.2.0",
"execall": "^2.0.0",
"fast-glob": "^3.2.5",
"fast-glob": "^3.2.4",
"fastest-levenshtein": "^1.0.12",
"file-entry-cache": "^6.0.0",
"get-stdin": "^8.0.0",
"global-modules": "^2.0.0",
"globby": "^11.0.2",
"globby": "^11.0.1",
"globjoin": "^0.1.4",
"html-tags": "^3.1.0",
"ignore": "^5.1.8",
@ -24718,7 +24716,7 @@
"lodash": "^4.17.20",
"log-symbols": "^4.0.0",
"mathml-tag-names": "^2.1.3",
"meow": "^9.0.0",
"meow": "^8.0.0",
"micromatch": "^4.0.2",
"normalize-selector": "^0.2.0",
"postcss": "^7.0.35",
@ -24740,7 +24738,7 @@
"style-search": "^0.1.0",
"sugarss": "^2.0.0",
"svg-tags": "^1.0.0",
"table": "^6.0.7",
"table": "^6.0.3",
"v8-compile-cache": "^2.2.0",
"write-file-atomic": "^3.0.3"
},
@ -24831,9 +24829,9 @@
"dev": true
},
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
"integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
"dev": true,
"requires": {
"ms": "2.1.2"
@ -24845,38 +24843,10 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"fast-glob": {
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
"integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.0",
"merge2": "^1.3.0",
"micromatch": "^4.0.2",
"picomatch": "^2.2.1"
}
},
"globby": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz",
"integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.1.1",
"ignore": "^5.1.4",
"merge2": "^1.3.0",
"slash": "^3.0.0"
}
},
"import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz",
"integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==",
"dev": true,
"requires": {
"parent-module": "^1.0.0",
@ -24904,9 +24874,9 @@
"dev": true
},
"parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
"integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
@ -25188,26 +25158,26 @@
"dev": true
},
"table": {
"version": "6.0.7",
"resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
"integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/table/-/table-6.0.3.tgz",
"integrity": "sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==",
"dev": true,
"requires": {
"ajv": "^7.0.2",
"ajv": "^6.12.4",
"lodash": "^4.17.20",
"slice-ansi": "^4.0.0",
"string-width": "^4.2.0"
},
"dependencies": {
"ajv": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz",
"integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==",
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
}
},
@ -25247,12 +25217,6 @@
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
"slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
@ -26338,9 +26302,9 @@
}
},
"typedoc": {
"version": "0.20.18",
"resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.18.tgz",
"integrity": "sha512-AX4WgbVI7k3IoFmUFcAGhNBSjAHbQ8lE/EVVFkYDWIUAcxtLHlpF761Bbasniv5F9bwwxBuyAlLpJRJW/zIy4Q==",
"version": "0.20.14",
"resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.14.tgz",
"integrity": "sha512-9bsZp5/qkl+gDSv9DRvHbfbY8Sr0tD8fKx7hNIvcluxeAFzBCEo9o0qDCdLUZw+/axbfd9TaqHvSuCVRu+YH6Q==",
"dev": true,
"requires": {
"colors": "^1.4.0",
@ -26353,19 +26317,19 @@
"progress": "^2.0.3",
"shelljs": "^0.8.4",
"shiki": "^0.2.7",
"typedoc-default-themes": "^0.12.5"
"typedoc-default-themes": "0.12.1"
},
"dependencies": {
"fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
"integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
"dev": true,
"requires": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
"universalify": "^1.0.0"
}
},
"jsonfile": {
@ -26376,8 +26340,8 @@
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
}
},
"dependencies": {
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
@ -26386,10 +26350,18 @@
}
}
},
"universalify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
"integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
"dev": true
}
}
},
"typedoc-default-themes": {
"version": "0.12.5",
"resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.5.tgz",
"integrity": "sha512-JQ2O9laZ/EhfWUWYp/8EyuShYhtXLhIa6DU8eZNUfaurMhEgKdffbadKNv6HMmTfOxAcgiePg06OCxNX8EyP3g==",
"version": "0.12.1",
"resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.1.tgz",
"integrity": "sha512-6PEvV+/kWAJeUwEtrKgIsZQSbybW5DGCr6s2mMjHsDplpgN8iBHI52UbA+2C+c2TMCxBNMK9TMS6pdeIdwsLSw==",
"dev": true
},
"typescript": {
@ -26411,9 +26383,9 @@
"dev": true
},
"uglify-js": {
"version": "3.12.5",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.5.tgz",
"integrity": "sha512-SgpgScL4T7Hj/w/GexjnBHi3Ien9WS1Rpfg5y91WXMj9SY997ZCQU76mH4TpLwwfmMvoOU8wiaRkIf6NaH3mtg==",
"version": "3.12.4",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.4.tgz",
"integrity": "sha512-L5i5jg/SHkEqzN18gQMTWsZk3KelRsfD1wUVNqtq0kzqWQqcJjyL8yc1o8hJgRrWqrAl2mUFbhfznEIoi7zi2A==",
"dev": true,
"optional": true
},

View File

@ -71,7 +71,7 @@
"process services-cloud"
],
"dependencies": {
"@alfresco/js-api": "4.3.0-2e84309af123ae96cc85bd9683cb1ab9a7119c33",
"@alfresco/js-api": "^4.3.0-386fb73751610a15094a0d0938ab19456325d7c8",
"@angular/animations": "^10.0.4",
"@angular/cdk": "10.1.3",
"@angular/common": "^10.0.4",
@ -166,11 +166,11 @@
"sass-loader": "10.1.1",
"scss-bundle": "2.3.2",
"selenium-webdriver": "4.0.0-alpha.7",
"stylelint": "^13.9.0",
"stylelint": "^13.8.0",
"ts-node": "^9.0.0",
"tsconfig-paths": "^3.9.0",
"tslint": "6.1.3",
"typedoc": "^0.20.18",
"typedoc": "^0.20.14",
"typescript": "3.9.7",
"unist-util-select": "^3.0.2",
"webpack-cli": "^3.3.12"

View File

@ -0,0 +1,9 @@
#!/usr/bin/env bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $DIR/../../../
echo "====== Check External ACS is UP ====="
./node_modules/@alfresco/adf-cli/bin/adf-cli check-cs-env --host "$EXTERNAL_ACS_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1

View File

@ -20,7 +20,7 @@ if [ "${TRAVIS_EVENT_TYPE}" == "pull_request" ]; then
fi;
#-b is needed to run the Folder upload test that are not workin in Headless chrome
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" --use-dist || exit 1)
RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" --use-dist -m 4 || exit 1)
if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || "${TRAVIS_EVENT_TYPE}" == "push" || "${TRAVIS_EVENT_TYPE}" == "api" ]]; then
echo "Run all e2e $CONTEXT_ENV"
$RUN_CHECK