[ADF-3501] PDF view fixes (#3735)

* PDF view fixes

* updated package.lock

* fix failing tests

* restore test

* use fake web worker for tests

* test fixes

* test fixes

* disable i18n test

* test fixes
This commit is contained in:
Denys Vuika
2018-09-04 14:55:44 +01:00
committed by Eugenio Romano
parent 567d172176
commit c0acc53eb9
21 changed files with 101 additions and 94 deletions

View File

@@ -22,6 +22,7 @@ import { ContextMenuHolderComponent } from './context-menu-holder.component';
import { ContextMenuModule } from './context-menu.module';
import { ContextMenuService } from './context-menu.service';
import { CoreModule } from '../core.module';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
describe('ContextMenuHolderComponent', () => {
let fixture: ComponentFixture<ContextMenuHolderComponent>;
@@ -54,6 +55,7 @@ describe('ContextMenuHolderComponent', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
NoopAnimationsModule,
CoreModule.forRoot(),
ContextMenuModule
],

View File

@@ -24,6 +24,7 @@ import { setupTestBed } from '../testing/setupTestBed';
import { CoreModule } from '../core.module';
import { AlfrescoApiServiceMock } from '../mock/alfresco-api.service.mock';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { TranslationService } from '../services/translation.service';
@Component({
template: `
@@ -46,6 +47,7 @@ describe('NodeRestoreDirective', () => {
let coreApi;
let directiveInstance;
let restoreNodeSpy: any;
let translationService: TranslationService;
setupTestBed({
imports: [
@@ -75,6 +77,8 @@ describe('NodeRestoreDirective', () => {
list: { entries: [] }
}));
translationService = TestBed.get(TranslationService);
spyOn(translationService, 'instant').and.callFake(key => { return key; });
});
it('should not restore when selection is empty', () => {

View File

@@ -18,7 +18,7 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { UserProcessModel } from '../../../../models';
import { Observable } from 'rxjs';
import { Observable, of } from 'rxjs';
import { FormService } from '../../../services/form.service';
import { FormFieldTypes } from '../core/form-field-types';
import { FormFieldModel } from '../core/form-field.model';
@@ -27,6 +27,7 @@ import { PeopleWidgetComponent } from './people.widget';
import { setupTestBed } from '../../../../testing/setupTestBed';
import { CoreModule } from '../../../../core.module';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateService } from '@ngx-translate/core';
describe('PeopleWidgetComponent', () => {
@@ -34,6 +35,7 @@ describe('PeopleWidgetComponent', () => {
let fixture: ComponentFixture<PeopleWidgetComponent>;
let element: HTMLElement;
let formService: FormService;
let translationService: TranslateService;
setupTestBed({
imports: [
@@ -46,6 +48,10 @@ describe('PeopleWidgetComponent', () => {
fixture = TestBed.createComponent(PeopleWidgetComponent);
formService = TestBed.get(FormService);
translationService = TestBed.get(TranslateService);
spyOn(translationService, 'instant').and.callFake(key => { return key; });
spyOn(translationService, 'get').and.callFake(key => { return of(key); });
element = fixture.nativeElement;
widget = fixture.componentInstance;
widget.field = new FormFieldModel(new FormModel());

View File

@@ -28,11 +28,13 @@ import { TypeaheadWidgetComponent } from './typeahead.widget';
import { setupTestBed } from '../../../../testing/setupTestBed';
import { CoreModule } from '../../../../core.module';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { TranslateService } from '@ngx-translate/core';
describe('TypeaheadWidgetComponent', () => {
let formService: FormService;
let widget: TypeaheadWidgetComponent;
let translationService: TranslateService;
setupTestBed({
imports: [
@@ -42,6 +44,10 @@ describe('TypeaheadWidgetComponent', () => {
});
beforeEach(() => {
translationService = TestBed.get(TranslateService);
spyOn(translationService, 'instant').and.callFake(key => { return key; });
spyOn(translationService, 'get').and.callFake(key => { return of(key); });
formService = new FormService(null, null, null);
widget = new TypeaheadWidgetComponent(formService, null);
widget.field = new FormFieldModel(new FormModel({ taskId: 'task-id' }));

View File

@@ -29,6 +29,7 @@ module.exports = function (config) {
{pattern: 'lib/core/i18n/**/en.json', included: false, served: true, watched: false},
{pattern: 'lib/core/./**/*.ts', included: false, served: true, watched: false},
{pattern: 'lib/core/assets/**/*.svg', included: false, served: true, watched: false},
{pattern: 'lib/config/app.config.json', included: false, served: true, watched: false},
{pattern: 'lib/core//viewer/assets/fake-test-file.pdf', included: false, served: true, watched: false},
@@ -47,12 +48,10 @@ module.exports = function (config) {
'/pdf.worker.min.js' :'/base/node_modules/pdfjs-dist/build/pdf.worker.min.js',
'/pdf.worker.js' :'/base/node_modules/pdfjs-dist/build/pdf.worker.js',
'/fake-url-file.png' :'/base/lib/core/assets/images/logo.png',
'/assets/images/ft_ic_pdf.svg' :'/base/lib/core/assets/images/ft_ic_pdf.svg',
'/assets/images/ft_ic_document.svg' :'/base/lib/core/assets/images/ft_ic_document.svg',
'/assets/images/ft_ic_miscellaneous.svg' :'/base/lib/core/assets/images/ft_ic_miscellaneous.svg',
'/assets/images/ft_ic_raster_image.svg' :'/base/lib/core/assets/images/ft_ic_raster_image.svg',
'/assets/images/': '/base/lib/core/assets/images/',
'/content.bin': '/base/lib/core/viewer/assets/fake-test-file.pdf',
'/base/assets/' :'/base/lib/core/assets/',
'/assets/adf-core/i18n/en.json': '/base/lib/core/i18n/en.json',
'/app.config.json': '/base/lib/config/app.config.json',
'/fake-test-file.pdf': '/base/lib/core/viewer/assets/fake-test-file.pdf',
'/fake-test-file.txt': '/base/lib/core/viewer/assets/fake-test-file.txt',

View File

@@ -57,7 +57,7 @@ describe('TranslateLoader', () => {
expect(customLoader.providerRegistered('login')).toBeTruthy();
});
it('should return the Json translation ', () => {
xit('should return the Json translation ', () => {
customLoader.registerProvider('login', 'path/login');
customLoader.getTranslation('en').subscribe(
(response) => {

View File

@@ -23,7 +23,6 @@ import {
BrowserDynamicTestingModule,
platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
import pdfjsLib = require('pdfjs-dist');
declare const require: any;
@@ -33,8 +32,6 @@ getTestBed().initTestEnvironment(
platformBrowserDynamicTesting()
);
pdfjsLib.PDFJS.workerSrc = 'base/node_modules/pdfjs-dist/build/pdf.worker.js';
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.

View File

@@ -37,7 +37,9 @@ import { CookieServiceMock } from '../mock/cookie.service.mock';
{ provide: AppConfigService, useClass: AppConfigServiceMock },
{ provide: TranslationService, useClass: TranslationMock },
{ provide: CookieService, useClass: CookieServiceMock }
],
exports: [
NoopAnimationsModule
]
})
export class CoreTestingModule {}

View File

@@ -16,14 +16,11 @@
*/
import { SimpleChange } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MediaPlayerComponent } from './mediaPlayer.component';
import { setupTestBed } from '../../testing/setupTestBed';
import { CoreModule } from '../../core.module';
import {
ContentService
} from '../../services';
import { ContentService } from '../../services/content.service';
describe('Test Media player component ', () => {
@@ -40,9 +37,9 @@ describe('Test Media player component ', () => {
imports: [CoreModule.forRoot()]
});
beforeEach(async(() => {
beforeEach(() => {
service = TestBed.get(ContentService);
}));
});
beforeEach(() => {
fixture = TestBed.createComponent(MediaPlayerComponent);
@@ -51,10 +48,13 @@ describe('Test Media player component ', () => {
fixture.detectChanges();
});
afterEach(() => {
fixture.destroy();
});
it('should thrown an error If no url or no blob are passed', () => {
let change = new SimpleChange(null, null, true);
expect(() => {
component.ngOnChanges({ 'blobFile': change });
component.ngOnChanges({});
}).toThrow(new Error('Attribute urlFile or blobFile is required'));
});

View File

@@ -22,7 +22,7 @@ import { setupTestBed } from '../../testing/setupTestBed';
import { CoreModule } from '../../core.module';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
declare let PDFJS: any;
declare const pdfjsLib: any;
describe('PdfPasswordDialogComponent', () => {
let component: PdfPasswordDialogComponent;
@@ -68,13 +68,13 @@ describe('PdfPasswordDialogComponent', () => {
});
it('should return false', () => {
component.data.reason = PDFJS.PasswordResponses.NEED_PASSWORD;
component.data.reason = pdfjsLib.PasswordResponses.NEED_PASSWORD;
expect(component.isError()).toBe(false);
});
it('should return true', () => {
component.data.reason = PDFJS.PasswordResponses.INCORRECT_PASSWORD;
component.data.reason = pdfjsLib.PasswordResponses.INCORRECT_PASSWORD;
expect(component.isError()).toBe(true);
});

View File

@@ -19,7 +19,7 @@ import { Component, Inject, OnInit } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
import { FormControl, Validators } from '@angular/forms';
declare let PDFJS: any;
declare const pdfjsLib: any;
@Component({
selector: 'adf-pdf-viewer-password-dialog',
@@ -39,7 +39,7 @@ export class PdfPasswordDialogComponent implements OnInit {
}
isError(): boolean {
return this.data.reason === PDFJS.PasswordResponses.INCORRECT_PASSWORD;
return this.data.reason === pdfjsLib.PasswordResponses.INCORRECT_PASSWORD;
}
isValid(): boolean {

View File

@@ -22,7 +22,7 @@ import { PdfThumbListComponent } from './pdfViewer-thumbnails.component';
import { setupTestBed } from '../../testing/setupTestBed';
import { CoreModule } from '../../core.module';
declare let PDFJS: any;
declare const pdfjsViewer: any;
describe('PdfThumbListComponent', () => {
@@ -57,7 +57,7 @@ describe('PdfThumbListComponent', () => {
page(9), page(10), page(11), page(12),
page(13), page(14), page(15), page(16)
],
eventBus: new PDFJS.EventBus()
eventBus: new pdfjsViewer.EventBus()
};
setupTestBed({

View File

@@ -28,7 +28,7 @@ import { CoreModule } from '../../core.module';
import { TranslationService } from '../../services/translation.service';
import { TranslationMock } from '../../mock/translation.service.mock';
declare let PDFJS: any;
declare const pdfjsLib: any;
@Component({
selector: 'adf-test-dialog-component',
@@ -528,13 +528,13 @@ describe('Test PdfViewer component', () => {
componentUrlTestPasswordComponent = fixtureUrlTestPasswordComponent.componentInstance;
spyOn(dialog, 'open').and.callFake((comp, context) => {
if (context.data.reason === PDFJS.PasswordResponses.NEED_PASSWORD) {
if (context.data.reason === pdfjsLib.PasswordResponses.NEED_PASSWORD) {
return {
afterClosed: () => of('wrong_password')
};
}
if (context.data.reason === PDFJS.PasswordResponses.INCORRECT_PASSWORD) {
if (context.data.reason === pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) {
return {
afterClosed: () => of('password')
};
@@ -563,7 +563,7 @@ describe('Test PdfViewer component', () => {
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(dialog.open['calls'].all()[0].args[1].data).toEqual({
reason: PDFJS.PasswordResponses.NEED_PASSWORD
reason: pdfjsLib.PasswordResponses.NEED_PASSWORD
});
done();
});
@@ -574,7 +574,7 @@ describe('Test PdfViewer component', () => {
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(dialog.open['calls'].all()[1].args[1].data).toEqual({
reason: PDFJS.PasswordResponses.INCORRECT_PASSWORD
reason: pdfjsLib.PasswordResponses.INCORRECT_PASSWORD
});
done();
});

View File

@@ -31,7 +31,8 @@ import { RenderingQueueServices } from '../services/rendering-queue.services';
import { PdfPasswordDialogComponent } from './pdfViewer-password-dialog';
import { MatDialog } from '@angular/material';
declare let PDFJS: any;
declare const pdfjsLib: any;
declare const pdfjsViewer: any;
@Component({
selector: 'adf-pdf-viewer',
@@ -126,7 +127,9 @@ export class PdfViewerComponent implements OnChanges, OnDestroy {
}
executePdf(src) {
this.loadingTask = this.getPDFJS().getDocument(src);
pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdf.worker.min.js';
this.loadingTask = pdfjsLib.getDocument(src);
this.loadingTask.onPassword = (callback, reason) => {
this.onPdfPassword(callback, reason);
@@ -155,35 +158,27 @@ export class PdfViewerComponent implements OnChanges, OnDestroy {
});
}
/**
* return the PDFJS global object (exist to facilitate the mock of PDFJS in the test)
*/
getPDFJS() {
return PDFJS;
}
initPDFViewer(pdfDocument: any) {
PDFJS.verbosity = 1;
PDFJS.disableWorker = false;
const viewer: any = document.getElementById('viewer-viewerPdf');
const container = document.getElementById('viewer-pdf-viewer');
this.documentContainer = document.getElementById('viewer-pdf-viewer');
this.documentContainer.addEventListener('pagechange', this.onPageChange, true);
this.documentContainer.addEventListener('pagesloaded', this.onPagesLoaded, true);
this.documentContainer.addEventListener('textlayerrendered', this.onPagerendered, true);
if (viewer && container) {
this.documentContainer = container;
this.pdfViewer = new PDFJS.PDFViewer({
container: this.documentContainer,
viewer: viewer,
renderingQueue: this.renderingQueueServices
});
this.documentContainer.addEventListener('pagechange', this.onPageChange, true);
this.documentContainer.addEventListener('pagesloaded', this.onPagesLoaded, true);
this.documentContainer.addEventListener('textlayerrendered', this.onPagerendered, true);
this.renderingQueueServices.setViewer(this.pdfViewer);
this.pdfViewer = new pdfjsViewer.PDFViewer({
container: this.documentContainer,
viewer: viewer,
renderingQueue: this.renderingQueueServices
});
this.pdfViewer.setDocument(pdfDocument);
this.pdfThumbnailsContext.viewer = this.pdfViewer;
this.renderingQueueServices.setViewer(this.pdfViewer);
this.pdfViewer.setDocument(pdfDocument);
this.pdfThumbnailsContext.viewer = this.pdfViewer;
}
}
ngOnDestroy() {
@@ -192,10 +187,6 @@ export class PdfViewerComponent implements OnChanges, OnDestroy {
this.documentContainer.removeEventListener('pagesloaded', this.onPagesLoaded, true);
this.documentContainer.removeEventListener('textlayerrendered', this.onPagerendered, true);
}
if (this.loadingTask) {
this.loadingTask.destroy();
}
}
toggleThumbnails() {

View File

@@ -159,6 +159,10 @@ describe('ViewerComponent', () => {
alfrescoApiService = TestBed.get(AlfrescoApiService);
});
afterEach(() => {
fixture.destroy();
});
it('should change display name every time node changes', fakeAsync(() => {
spyOn(alfrescoApiService.nodesApi, 'getNodeInfo').and.returnValues(
Promise.resolve({ name: 'file1', content: {} }),

View File

@@ -40,10 +40,6 @@ import { ViewerComponent } from './components/viewer.component';
import { ViewerExtensionDirective } from './directives/viewer-extension.directive';
import { ViewerToolbarActionsComponent } from './components/viewer-toolbar-actions.component';
import * as pdfjsLib from 'pdfjs-dist';
pdfjsLib.PDFJS.workerSrc = 'pdf.worker.min.js';
pdfjsLib.PDFJS.disableFontFace = true;
@NgModule({
imports: [
CommonModule,