diff --git a/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.html b/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.html
index 2fc914d5f9..067e1c8d94 100644
--- a/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.html
+++ b/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.html
@@ -27,8 +27,8 @@
[ngModel]="fileObject" (ngModelChange)="setFile($event)"/>
-
-
diff --git a/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.spec.ts b/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.spec.ts
new file mode 100644
index 0000000000..bc3e0ebade
--- /dev/null
+++ b/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.spec.ts
@@ -0,0 +1,151 @@
+import { Location } from '@angular/common';
+import { NO_ERRORS_SCHEMA } from '@angular/core';
+import { async, ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing';
+import { FormsModule } from '@angular/forms';
+import { By } from '@angular/platform-browser';
+import { Router } from '@angular/router';
+import { RouterTestingModule } from '@angular/router/testing';
+import { TranslateModule } from '@ngx-translate/core';
+import { of as observableOf } from 'rxjs/internal/observable/of';
+import { AuthService } from '../../core/auth/auth.service';
+import {
+ METADATA_IMPORT_SCRIPT_NAME,
+ ScriptDataService
+} from '../../core/data/processes/script-data.service';
+import { EPerson } from '../../core/eperson/models/eperson.model';
+import { ProcessParameter } from '../../process-page/processes/process-parameter.model';
+import { NotificationsService } from '../../shared/notifications/notifications.service';
+import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub';
+import { FileValueAccessorDirective } from '../../shared/utils/file-value-accessor.directive';
+import { FileValidator } from '../../shared/utils/require-file.validator';
+import { MetadataImportPageComponent } from './metadata-import-page.component';
+
+describe('MetadataImportPageComponent', () => {
+ let comp: MetadataImportPageComponent;
+ let fixture: ComponentFixture;
+
+ let user;
+
+ let notificationService: NotificationsServiceStub;
+ let scriptService: any;
+ let router;
+ let authService;
+ let locationStub;
+
+ function init() {
+ notificationService = new NotificationsServiceStub();
+ scriptService = jasmine.createSpyObj('scriptService',
+ {
+ invoke: observableOf({
+ response:
+ {
+ isSuccessful: true,
+ resourceSelfLinks: ['https://localhost:8080/api/core/processes/45']
+ }
+ })
+ }
+ );
+ user = Object.assign(new EPerson(), {
+ id: 'userId',
+ email: 'user@test.com'
+ });
+ authService = jasmine.createSpyObj('authService', {
+ getAuthenticatedUserFromStore: observableOf(user)
+ });
+ router = jasmine.createSpyObj('router', {
+ navigateByUrl: jasmine.createSpy('navigateByUrl')
+ });
+ locationStub = jasmine.createSpyObj('location', {
+ back: jasmine.createSpy('back')
+ });
+ }
+
+ beforeEach(async(() => {
+ init();
+ TestBed.configureTestingModule({
+ imports: [
+ FormsModule,
+ TranslateModule.forRoot(),
+ RouterTestingModule.withRoutes([])
+ ],
+ declarations: [MetadataImportPageComponent, FileValueAccessorDirective, FileValidator],
+ providers: [
+ { provide: NotificationsService, useValue: notificationService },
+ { provide: ScriptDataService, useValue: scriptService },
+ { provide: Router, useValue: router },
+ { provide: AuthService, useValue: authService },
+ { provide: Location, useValue: locationStub },
+ ],
+ schemas: [NO_ERRORS_SCHEMA]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(MetadataImportPageComponent);
+ comp = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(comp).toBeTruthy();
+ });
+
+ describe('if back button is pressed', () => {
+ beforeEach(fakeAsync(() => {
+ const proceed = fixture.debugElement.query(By.css('#backButton')).nativeElement;
+ proceed.click();
+ fixture.detectChanges();
+ }));
+ it('should do location.back', () => {
+ expect(locationStub.back).toHaveBeenCalled();
+ });
+ });
+
+ describe('if file is set', () => {
+ let fileMock: File;
+
+ beforeEach(() => {
+ fileMock = new File([''], 'filename.txt', { type: 'text/plain' });
+ comp.setFile([fileMock]);
+ });
+
+ describe('if proceed button is pressed', () => {
+ beforeEach(fakeAsync(() => {
+ const proceed = fixture.debugElement.query(By.css('#proceedButton')).nativeElement;
+ proceed.click();
+ fixture.detectChanges();
+ }));
+ it('metadata-import script is invoked with its -e currentUserEmail, -f fileName and the mockFile', () => {
+ const parameterValues: ProcessParameter[] = [
+ Object.assign(new ProcessParameter(), { name: '-e', value: user.email }),
+ Object.assign(new ProcessParameter(), { name: '-f', value: 'filename.txt' }),
+ ];
+ expect(scriptService.invoke).toHaveBeenCalledWith(METADATA_IMPORT_SCRIPT_NAME, parameterValues, [fileMock]);
+ });
+ it('success notification is shown', () => {
+ expect(notificationService.success).toHaveBeenCalled();
+ });
+ it('redirected to process page', () => {
+ expect(router.navigateByUrl).toHaveBeenCalledWith('/processes/45');
+ });
+ });
+
+ describe('if proceed is pressed; but script invoke fails', () => {
+ beforeEach(fakeAsync(() => {
+ jasmine.getEnv().allowRespy(true);
+ spyOn(scriptService, 'invoke').and.returnValue(observableOf({
+ response:
+ {
+ isSuccessful: false,
+ }
+ }));
+ const proceed = fixture.debugElement.query(By.css('#proceedButton')).nativeElement;
+ proceed.click();
+ fixture.detectChanges();
+ }));
+ it('error notification is shown', () => {
+ expect(notificationService.error).toHaveBeenCalled();
+ });
+ });
+ });
+});
diff --git a/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.ts b/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.ts
index 060ad42059..96dc8dde97 100644
--- a/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.ts
+++ b/src/app/+admin/admin-import-metadata-page/metadata-import-page.component.ts
@@ -5,7 +5,7 @@ import { TranslateService } from '@ngx-translate/core';
import { uniqueId } from 'lodash';
import { FileUploader } from 'ng2-file-upload';
import { Observable } from 'rxjs/internal/Observable';
-import { filter, map, take, tap } from 'rxjs/operators';
+import { filter, map, take } from 'rxjs/operators';
import { AuthService } from '../../core/auth/auth.service';
import { METADATA_IMPORT_SCRIPT_NAME, ScriptDataService } from '../../core/data/processes/script-data.service';
import { RequestEntry } from '../../core/data/request.reducer';
@@ -99,7 +99,6 @@ export class MetadataImportPageComponent implements OnInit {
* @param files
*/
setFile(files) {
- console.log('setfiles', files)
this.fileObject = files.length > 0 ? files[0] : undefined;
}