diff --git a/e2e/pages/adf/viewerPage.js b/e2e/pages/adf/viewerPage.js index 31ccae04de..9e86ae775b 100644 --- a/e2e/pages/adf/viewerPage.js +++ b/e2e/pages/adf/viewerPage.js @@ -15,20 +15,21 @@ * limitations under the License. */ -var Util = require('../../util/util'); +var Util = require("../../util/util"); +var CardViewPage = require("./cardViewPage"); var ViewerToolbarPage = function () { var closeButton = element(by.css("button[data-automation-id='adf-toolbar-back']")); - var fileName = element(by.id('adf-viewer-display-name')); + var fileName = element(by.id("adf-viewer-display-name")); var downloadButton = element(by.css("button[data-automation-id='adf-toolbar-download'] > span > mat-icon")); var infoButton = element(by.css("button[data-automation-id='adf-toolbar-sidebar']")); - var previousPageButton = element(by.id('viewer-previous-page-button')); - var nextPageButton = element(by.id('viewer-next-page-button')); - var zoomInButton = element(by.id('viewer-zoom-in-button')); - var zoomOutButton = element(by.id('viewer-zoom-out-button')); - var scalePageButton = element(by.id('viewer-scale-page-button')); - var pdfContainer = element(by.id('viewer-pdf-container')); + var previousPageButton = element(by.id("viewer-previous-page-button")); + var nextPageButton = element(by.id("viewer-next-page-button")); + var zoomInButton = element(by.id("viewer-zoom-in-button")); + var zoomOutButton = element(by.id("viewer-zoom-out-button")); + var scalePageButton = element(by.id("viewer-scale-page-button")); + var pdfContainer = element(by.id("viewer-pdf-container")); var fullScreenButton = element(by.css("button[data-automation-id='adf-toolbar-fullscreen']")); var rotateLeft = element(by.css("button[id='viewer-rotate-left-button']")); var rotateRight = element(by.css("button[id='viewer-rotate-right-button']")); @@ -40,6 +41,37 @@ var ViewerToolbarPage = function () { var mediaContainer = element(by.css("adf-media-player[class='adf-media-player ng-star-inserted']")); var allPages = element.all(by.css("div[class='canvasWrapper'] > canvas")).first(); var percentage = element(by.css("div[data-automation-id='adf-page-scale'")); + var thumbnailsBtn = element(by.css("button[data-automation-id='adf-thumbnails-button']")); + var thumbnailsContent = element(by.css("div[data-automation-id='adf-thumbnails-content']")); + var thumbnailsClose = element(by.css("button[data-automation-id='adf-thumbnails-close']")); + var secondThumbnail = element(by.css("adf-pdf-thumb > img[title='Page 2'")); + var lastThumbnailDisplayed = element.all(by.css("adf-pdf-thumb")).last(); + var passwordDialog = element(by.css("adf-pdf-viewer-password-dialog")); + var passwordSubmit = element(by.css("button[data-automation-id='adf-password-dialog-submit']")); + var passwordSubmitDisabled = element(by.css("button[data-automation-id='adf-password-dialog-submit'][disabled]")); + var passwordInput = element(by.css("input[data-automation-id='adf-password-dialog-input']")); + var passwordError = element(by.css("mat-error[data-automation-id='adf-password-dialog-error']")); + var infoSideBar = element(by.css("div[class='adf-info-drawer-layout-header']")); + var unsupportedFileContainer = element(by.cssContainingText(".label","Document preview could not be loaded")); + var pageCanvas = element.all(by.css("div[class='canvasWrapper']")).first(); + + this.canvasHeight = function () { + var deferred = protractor.promise.defer(); + pageCanvas.getAttribute("style").then(function (value) { + var canvasHeight = value.split("height: ")[1].split("px")[0]; + deferred.fulfill(canvasHeight); + }); + return deferred.promise; + }; + + this.canvasWidth = function () { + var deferred = protractor.promise.defer(); + pageCanvas.getAttribute("style").then(function (value) { + var canvasWidth = value.split("width: ")[1].split("px")[0]; + deferred.fulfill(canvasWidth); + }); + return deferred.promise; + }; this.viewFile = function (fileName) { var fileView = element(by.xpath("//div[@class='document-list-container']//span[@title='" + fileName +"']")); @@ -65,6 +97,63 @@ var ViewerToolbarPage = function () { browser.executeScript(jsCode); }; + this.enterPassword = function (password) + { + Util.waitUntilElementIsVisible(passwordInput); + passwordInput.clear(); + passwordInput.sendKeys(password); + }; + + this.checkPasswordErrorIsDisplayed = function () + { + Util.waitUntilElementIsVisible(passwordError); + }; + + this.checkPasswordInputIsDisplayed = function () + { + Util.waitUntilElementIsVisible(passwordInput); + }; + + this.checkPasswordSubmitDisabledIsDisplayed = function () + { + Util.waitUntilElementIsVisible(passwordSubmitDisabled); + }; + + this.checkPasswordDialogIsDisplayed = function () + { + Util.waitUntilElementIsVisible(passwordDialog); + }; + + this.checkAllThumbnailsDisplayed = function (nbPages) + { + var defaultThumbnailHeight = 143; + expect(thumbnailsContent.getAttribute("style")).toEqual("height: " + nbPages*defaultThumbnailHeight + "px; transform: translate(-50%, 0px);"); + }; + + this.checkCurrentThumbnailIsSelected = function () + { + var selectedThumbnail = element(by.css("adf-pdf-thumb[class='pdf-thumbnails__thumb ng-star-inserted pdf-thumbnails__thumb--selected'] > img")); + pageSelectorInput.getAttribute("value").then(function (pageNumber) { + expect("Page " + pageNumber).toEqual(selectedThumbnail.getAttribute("title")); + }); + }; + + this.checkThumbnailsCloseIsDisplayed = function () { + Util.waitUntilElementIsVisible(thumbnailsClose); + }; + + this.checkThumbnailsBtnIsDisplayed = function () { + Util.waitUntilElementIsVisible(thumbnailsBtn); + }; + + this.checkThumbnailsContentIsDisplayed = function () { + Util.waitUntilElementIsVisible(thumbnailsContent); + }; + + this.checkThumbnailsContentIsNotDisplayed = function () { + Util.waitUntilElementIsNotVisible(thumbnailsContent); + }; + this.checkCloseButtonIsDisplayed = function () { Util.waitUntilElementIsVisible(closeButton); }; @@ -112,9 +201,9 @@ var ViewerToolbarPage = function () { this.checkPageSelectorInputIsDisplayed = function (number) { Util.waitUntilElementIsVisible(pageSelectorInput); - pageSelectorInput.getAttribute('value').then(function (pageNumber) { + pageSelectorInput.getAttribute("value").then(function (pageNumber) { expect(pageNumber).toEqual(number); - }) + }); }; this.checkImgContainerIsDisplayed = function () { @@ -154,13 +243,11 @@ var ViewerToolbarPage = function () { this.checkZoomedIn = function (zoom) { expect(percentage.getText()).toBeGreaterThan(zoom); - }; this.checkZoomedOut = function (zoom) { expect(percentage.getText()).toBeLessThan(zoom); - }; this.checkRotateLeftButtonIsDisplayed = function () { @@ -182,7 +269,7 @@ var ViewerToolbarPage = function () { this.checkRotation = function (text) { - rotation = imgContainer.getAttribute('style'); + var rotation = imgContainer.getAttribute("style"); expect(rotation).toEqual(text); }; @@ -191,6 +278,61 @@ var ViewerToolbarPage = function () { Util.waitUntilElementIsVisible(customBtn); }; + this.checkUnsupportedFileContainerIsDisplayed = function () + { + Util.waitUntilElementIsVisible(unsupportedFileContainer); + }; + + this.checkInfoSideBarIsNotDisplayed = function () + { + Util.waitUntilElementIsNotVisible(infoSideBar); + }; + + this.checkInfoSideBarIsDisplayed = function () + { + Util.waitUntilElementIsVisible(infoSideBar); + }; + + this.checkInfoSideBarIsNotDisplayed = function () + { + Util.waitUntilElementIsNotOnPage(infoSideBar); + }; + + this.clickInfoButton = function () + { + Util.waitUntilElementIsVisible(infoButton); + infoButton.click(); + return new CardViewPage(); + }; + + this.clickPasswordSubmit = function () + { + Util.waitUntilElementIsVisible(passwordSubmit); + passwordSubmit.click(); + }; + + this.clickSecondThumbnail = function () + { + Util.waitUntilElementIsClickable(secondThumbnail); + secondThumbnail.click(); + }; + + this.clickLastThumbnailDisplayed = function () + { + Util.waitUntilElementIsClickable(lastThumbnailDisplayed); + lastThumbnailDisplayed.click(); + }; + + this.clickThumbnailsClose = function () { + Util.waitUntilElementIsClickable(thumbnailsClose); + thumbnailsClose.click(); + }; + + this.clickThumbnailsBtn = function () { + Util.waitUntilElementIsClickable(thumbnailsBtn); + thumbnailsBtn.click(); + }; + this.clickScaleImgButton = function () { Util.waitUntilElementIsClickable(scaleImg); diff --git a/e2e/resources/adf/allFileTypes/a_file_protected.pdf b/e2e/resources/adf/allFileTypes/a_file_protected.pdf new file mode 100644 index 0000000000..1051ea6ee0 Binary files /dev/null and b/e2e/resources/adf/allFileTypes/a_file_protected.pdf differ diff --git a/e2e/resources/adf/allFileTypes/file_unsupported.3DS b/e2e/resources/adf/allFileTypes/file_unsupported.3DS new file mode 100755 index 0000000000..be21d11425 --- /dev/null +++ b/e2e/resources/adf/allFileTypes/file_unsupported.3DS @@ -0,0 +1 @@ +™™ \ No newline at end of file diff --git a/e2e/util/resources.js b/e2e/util/resources.js index a34318dca5..d07564d740 100644 --- a/e2e/util/resources.js +++ b/e2e/util/resources.js @@ -62,7 +62,7 @@ exports.Files = { id: -19, taskName: "User Task", form_fields: { - text_field: "activiti-textfield", + text_field: "activiti-textfield", form_fieldId: "textfield", text_field_value: "Hi tester, from Rest call" } @@ -121,6 +121,15 @@ exports.Files = { file_location: "/resources/adf/allFileTypes/pdf_all_properties.pdf", file_name: "pdf_all_properties.pdf" }, + PDF_PROTECTED: { + file_location: "/resources/adf/allFileTypes/a_file_protected.pdf", + file_name: "a_file_protected.pdf", + first_page_text: "A Journey into Test Frameworks", + second_page_text: "After looking into Spock’s GitHub", + last_page_text: "and provide feedback. The main advantages being the readability of the te", + last_page_number: "8", + password: "1q2w3e4r" + }, LARGE_FILE:{ file_location: "/resources/adf/BigFile.zip", file_name: "BigFile.zip" @@ -202,6 +211,10 @@ exports.Files = { file_location: "/resources/adf/allFileTypes/file_unsupported.pages", file_name: "file_unsupported.pages" }, + UNSUPPORTED:{ + file_location: "/resources/adf/allFileTypes/file_unsupported.3DS", + file_name: "file_unsupported.3DS" + }, INI:{ file_location: "/resources/adf/allFileTypes/desktop.ini", file_name: "desktop.ini" diff --git a/e2e/viewer_content_services_component.e2e.ts b/e2e/viewer_content_services_component.e2e.ts index f65f1db829..09c881caa2 100644 --- a/e2e/viewer_content_services_component.e2e.ts +++ b/e2e/viewer_content_services_component.e2e.ts @@ -37,7 +37,20 @@ describe('Content Services Viewer', () => { let loginPage = new LoginPage(); let zoom; - let pdfFile = new FileModel({ 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name }); + let pdfFile = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF.file_name, + 'firstPageText': resources.Files.ADF_DOCUMENTS.PDF.first_page_text, + 'secondPageText': resources.Files.ADF_DOCUMENTS.PDF.second_page_text, + 'lastPageNumber': resources.Files.ADF_DOCUMENTS.PDF.last_page_number + }); + let protectedFile = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.file_name, + 'firstPageText': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.first_page_text, + 'secondPageText': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.second_page_text, + 'lastPageNumber': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.last_page_number, + 'password': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.password, + 'location': resources.Files.ADF_DOCUMENTS.PDF_PROTECTED.file_location + }); let docxFile = new FileModel({ 'location': resources.Files.ADF_DOCUMENTS.DOCX_SUPPORTED.file_location, 'name': resources.Files.ADF_DOCUMENTS.DOCX_SUPPORTED.file_name, @@ -51,9 +64,9 @@ describe('Content Services Viewer', () => { 'location': resources.Files.ADF_DOCUMENTS.MP4.file_location, 'name': resources.Files.ADF_DOCUMENTS.MP4.file_name }); - let pagesFile = new FileModel({ - 'location': resources.Files.ADF_DOCUMENTS.PAGES.file_location, - 'name': resources.Files.ADF_DOCUMENTS.PAGES.file_name + let unsupportedFile = new FileModel({ + 'location': resources.Files.ADF_DOCUMENTS.UNSUPPORTED.file_location, + 'name': resources.Files.ADF_DOCUMENTS.UNSUPPORTED.file_name }); let pptFile = new FileModel({ 'location': resources.Files.ADF_DOCUMENTS.PPT.file_location, @@ -78,6 +91,9 @@ describe('Content Services Viewer', () => { let pdfFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pdfFile.location, pdfFile.name, '-my-'); Object.assign(pdfFile, pdfFileUploaded.entry); + let protectedFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, protectedFile.location, protectedFile.name, '-my-'); + Object.assign(protectedFile, protectedFileUploaded.entry); + let docxFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, docxFile.location, docxFile.name, '-my-'); Object.assign(docxFile, docxFileUploaded.entry); @@ -90,8 +106,8 @@ describe('Content Services Viewer', () => { let pptFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pptFile.location, pptFile.name, '-my-'); Object.assign(pptFile, pptFileUploaded.entry); - let pagesFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, pagesFile.location, pagesFile.name, '-my-'); - Object.assign(pagesFile, pagesFileUploaded.entry); + let unsupportedFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, unsupportedFile.location, unsupportedFile.name, '-my-'); + Object.assign(unsupportedFile, unsupportedFileUploaded.entry); loginPage.loginToContentServicesUsingUserModel(acsUser); @@ -104,19 +120,15 @@ describe('Content Services Viewer', () => { NodesAPI.deleteContent(acsUser, pdfFile.getId(), () => { done(); }); - NodesAPI.deleteContent(acsUser, jpgFile.getId(), () => { done(); }); - NodesAPI.deleteContent(acsUser, mp4File.getId(), () => { done(); }); - NodesAPI.deleteContent(acsUser, pagesFile.getId(), () => { done(); }); - NodesAPI.deleteContent(acsUser, pptFile.getId(), () => { done(); }); @@ -155,14 +167,16 @@ describe('Content Services Viewer', () => { viewerPage.clearPageNumber(); viewerPage.checkPageSelectorInputIsDisplayed(''); - zoom = viewerPage.getZoom(); - viewerPage.clickZoomInButton(); - viewerPage.checkZoomedIn(zoom); + viewerPage.clickZoomOutButton(); zoom = viewerPage.getZoom(); viewerPage.clickZoomOutButton(); viewerPage.checkZoomedOut(zoom); + zoom = viewerPage.getZoom(); + viewerPage.clickZoomInButton(); + viewerPage.checkZoomedIn(zoom); + viewerPage.clickCloseButton(); }); @@ -238,8 +252,6 @@ describe('Content Services Viewer', () => { }); it('[C260053] Should display first page, toolbar and pagination when opening a .docx file', () => { - contentServicesPage.checkAcsContainer(); - viewerPage.viewFile(docxFile.name); viewerPage.checkFileContent('1', docxFile.firstPageText); @@ -258,10 +270,10 @@ describe('Content Services Viewer', () => { }); it('[C260054] Should display "Preview couldn\'t be loaded" and viewer toolbar when opening an unsupported file', () => { - viewerPage.viewFile(pagesFile.name); + viewerPage.viewFile(unsupportedFile.name); viewerPage.checkCloseButtonIsDisplayed(); - viewerPage.checkFileNameIsDisplayed(pagesFile.name); + viewerPage.checkFileNameIsDisplayed(unsupportedFile.name); viewerPage.checkFileThumbnailIsDisplayed(); viewerPage.checkDownloadButtonIsDisplayed(); viewerPage.checkInfoButtonIsDisplayed(); @@ -286,4 +298,68 @@ describe('Content Services Viewer', () => { viewerPage.clickCloseButton(); }); + + it('[C261123] Should be able to preview all pages and navigate to a page when using thumbnails', () => { + viewerPage.viewFile(pdfFile.name); + + viewerPage.checkFileContent('1', pdfFile.firstPageText); + viewerPage.checkThumbnailsBtnIsDisplayed(); + viewerPage.clickThumbnailsBtn(); + + viewerPage.checkThumbnailsContentIsDisplayed(); + viewerPage.checkThumbnailsCloseIsDisplayed(); + viewerPage.checkAllThumbnailsDisplayed(pdfFile.lastPageNumber); + + viewerPage.clickSecondThumbnail(); + viewerPage.checkFileContent('2', pdfFile.secondPageText); + viewerPage.checkCurrentThumbnailIsSelected(); + + viewerPage.checkPreviousPageButtonIsDisplayed(); + viewerPage.clickPreviousPageButton(); + viewerPage.checkFileContent('1', pdfFile.firstPageText); + viewerPage.checkCurrentThumbnailIsSelected(); + + viewerPage.clickThumbnailsBtn(); + viewerPage.checkThumbnailsContentIsNotDisplayed(); + viewerPage.clickThumbnailsBtn(); + viewerPage.checkThumbnailsCloseIsDisplayed(); + viewerPage.clickThumbnailsClose(); + }); + + it('[C268105] Should display current thumbnail when getting to the page following the last visible thumbnail', () => { + viewerPage.checkThumbnailsBtnIsDisplayed(); + viewerPage.clickThumbnailsBtn(); + viewerPage.clickLastThumbnailDisplayed(); + viewerPage.checkCurrentThumbnailIsSelected(); + + viewerPage.checkNextPageButtonIsDisplayed(); + viewerPage.clickNextPageButton(); + viewerPage.checkCurrentThumbnailIsSelected(); + + viewerPage.clickCloseButton(); + }); + + it('[C269109] Should not be able to open thumbnail pane before the pdf is loaded', () => { + viewerPage.viewFile(pdfFile.name); + viewerPage.clickThumbnailsBtn(); + viewerPage.checkThumbnailsContentIsNotDisplayed(); + + viewerPage.clickCloseButton(); + }); + + it('[C268901] Should need a password when opening a protected file', () => { + viewerPage.viewFile(protectedFile.name); + + viewerPage.checkPasswordDialogIsDisplayed(); + viewerPage.checkPasswordSubmitDisabledIsDisplayed(); + + viewerPage.enterPassword('random password'); + viewerPage.clickPasswordSubmit(); + viewerPage.checkPasswordErrorIsDisplayed(); + viewerPage.checkPasswordInputIsDisplayed(); + + viewerPage.enterPassword(protectedFile.password); + viewerPage.clickPasswordSubmit(); + viewerPage.checkFileContent('1', protectedFile.firstPageText); + }); }); diff --git a/lib/core/viewer/components/pdfViewer-password-dialog.html b/lib/core/viewer/components/pdfViewer-password-dialog.html index 684d4521dc..c7328e855a 100644 --- a/lib/core/viewer/components/pdfViewer-password-dialog.html +++ b/lib/core/viewer/components/pdfViewer-password-dialog.html @@ -5,13 +5,14 @@
- + - {{ 'ADF_VIEWER.PDF_DIALOG.ERROR' | translate }} + {{ 'ADF_VIEWER.PDF_DIALOG.ERROR' | translate }}
@@ -21,9 +22,10 @@ - \ No newline at end of file + diff --git a/lib/core/viewer/components/pdfViewer-thumbnails.component.html b/lib/core/viewer/components/pdfViewer-thumbnails.component.html index 95965c0c0b..136ef94b0a 100644 --- a/lib/core/viewer/components/pdfViewer-thumbnails.component.html +++ b/lib/core/viewer/components/pdfViewer-thumbnails.component.html @@ -1,4 +1,5 @@
-
@@ -37,8 +37,9 @@ @@ -65,11 +66,11 @@
{{ 'ADF_VIEWER.PAGE_LABEL.SHOWING' | translate }} + pattern="-?[0-9]*(\.[0-9]+)?" + value="{{ displayPage }}" + (keyup.enter)="inputPage(page.value)"> {{ 'ADF_VIEWER.PAGE_LABEL.OF' | translate }} {{ totalPages }}