mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
237 lines
9.3 KiB
TypeScript
237 lines
9.3 KiB
TypeScript
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
|
|
import { ContentSource } from '../../../../core/shared/content-source.model';
|
|
import { Collection } from '../../../../core/shared/collection.model';
|
|
import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils';
|
|
import { TranslateModule } from '@ngx-translate/core';
|
|
import { RouterTestingModule } from '@angular/router/testing';
|
|
import { NotificationsService } from '../../../../shared/notifications/notifications.service';
|
|
import { CollectionDataService } from '../../../../core/data/collection-data.service';
|
|
import { RequestService } from '../../../../core/data/request.service';
|
|
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
|
import { ProcessDataService } from '../../../../core/data/processes/process-data.service';
|
|
import { ScriptDataService } from '../../../../core/data/processes/script-data.service';
|
|
import { HttpClient } from '@angular/common/http';
|
|
import { BitstreamDataService } from '../../../../core/data/bitstream-data.service';
|
|
import { NotificationsServiceStub } from '../../../../shared/testing/notifications-service.stub';
|
|
import { Process } from '../../../../process-page/processes/process.model';
|
|
import { of as observableOf } from 'rxjs';
|
|
import { CollectionSourceControlsComponent } from './collection-source-controls.component';
|
|
import { Bitstream } from '../../../../core/shared/bitstream.model';
|
|
import { getTestScheduler } from 'jasmine-marbles';
|
|
import { TestScheduler } from 'rxjs/testing';
|
|
import { By } from '@angular/platform-browser';
|
|
import { VarDirective } from '../../../../shared/utils/var.directive';
|
|
import { ContentSourceSetSerializer } from '../../../../core/shared/content-source-set-serializer';
|
|
import {DisabledDirective} from '../../../../shared/disabled-directive';
|
|
|
|
describe('CollectionSourceControlsComponent', () => {
|
|
let comp: CollectionSourceControlsComponent;
|
|
let fixture: ComponentFixture<CollectionSourceControlsComponent>;
|
|
|
|
const uuid = '29481ed7-ae6b-409a-8c51-34dd347a0ce4';
|
|
let contentSource: ContentSource;
|
|
let collection: Collection;
|
|
let process: Process;
|
|
let bitstream: Bitstream;
|
|
|
|
let scriptDataService: ScriptDataService;
|
|
let processDataService: ProcessDataService;
|
|
let requestService: RequestService;
|
|
let notificationsService;
|
|
let collectionService: CollectionDataService;
|
|
let httpClient: HttpClient;
|
|
let bitstreamService: BitstreamDataService;
|
|
let scheduler: TestScheduler;
|
|
|
|
|
|
beforeEach(waitForAsync(() => {
|
|
scheduler = getTestScheduler();
|
|
contentSource = Object.assign(new ContentSource(), {
|
|
uuid: uuid,
|
|
metadataConfigs: [
|
|
{
|
|
id: 'dc',
|
|
label: 'Simple Dublin Core',
|
|
nameSpace: 'http://www.openarchives.org/OAI/2.0/oai_dc/'
|
|
},
|
|
{
|
|
id: 'qdc',
|
|
label: 'Qualified Dublin Core',
|
|
nameSpace: 'http://purl.org/dc/terms/'
|
|
},
|
|
{
|
|
id: 'dim',
|
|
label: 'DSpace Intermediate Metadata',
|
|
nameSpace: 'http://www.dspace.org/xmlns/dspace/dim'
|
|
}
|
|
],
|
|
oaiSource: 'oai-harvest-source',
|
|
oaiSetId: 'oai-set-id',
|
|
_links: {self: {href: 'contentsource-selflink'}}
|
|
});
|
|
process = Object.assign(new Process(), {
|
|
processId: 'process-id', processStatus: 'COMPLETED',
|
|
_links: {output: {href: 'output-href'}}
|
|
});
|
|
|
|
bitstream = Object.assign(new Bitstream(), {_links: {content: {href: 'content-href'}}});
|
|
|
|
collection = Object.assign(new Collection(), {
|
|
uuid: 'fake-collection-id',
|
|
_links: {self: {href: 'collection-selflink'}}
|
|
});
|
|
notificationsService = new NotificationsServiceStub();
|
|
collectionService = jasmine.createSpyObj('collectionService', {
|
|
getContentSource: createSuccessfulRemoteDataObject$(contentSource),
|
|
findByHref: createSuccessfulRemoteDataObject$(collection)
|
|
});
|
|
scriptDataService = jasmine.createSpyObj('scriptDataService', {
|
|
invoke: createSuccessfulRemoteDataObject$(process),
|
|
});
|
|
processDataService = jasmine.createSpyObj('processDataService', {
|
|
findById: createSuccessfulRemoteDataObject$(process),
|
|
});
|
|
bitstreamService = jasmine.createSpyObj('bitstreamService', {
|
|
findByHref: createSuccessfulRemoteDataObject$(bitstream),
|
|
});
|
|
httpClient = jasmine.createSpyObj('httpClient', {
|
|
get: observableOf('Script text'),
|
|
});
|
|
requestService = jasmine.createSpyObj('requestService', ['removeByHrefSubstring', 'setStaleByHrefSubstring']);
|
|
|
|
TestBed.configureTestingModule({
|
|
imports: [TranslateModule.forRoot(), RouterTestingModule],
|
|
declarations: [CollectionSourceControlsComponent, VarDirective, DisabledDirective],
|
|
providers: [
|
|
{provide: ScriptDataService, useValue: scriptDataService},
|
|
{provide: ProcessDataService, useValue: processDataService},
|
|
{provide: RequestService, useValue: requestService},
|
|
{provide: NotificationsService, useValue: notificationsService},
|
|
{provide: CollectionDataService, useValue: collectionService},
|
|
{provide: HttpClient, useValue: httpClient},
|
|
{provide: BitstreamDataService, useValue: bitstreamService}
|
|
],
|
|
schemas: [NO_ERRORS_SCHEMA]
|
|
}).compileComponents();
|
|
}));
|
|
beforeEach(() => {
|
|
fixture = TestBed.createComponent(CollectionSourceControlsComponent);
|
|
comp = fixture.componentInstance;
|
|
comp.isEnabled = true;
|
|
comp.collection = collection;
|
|
comp.shouldShow = true;
|
|
fixture.detectChanges();
|
|
});
|
|
describe('init', () => {
|
|
it('should', () => {
|
|
expect(comp).toBeTruthy();
|
|
});
|
|
});
|
|
describe('testConfiguration', () => {
|
|
it('should invoke a script and ping the resulting process until completed and show the resulting info', () => {
|
|
comp.testConfiguration(contentSource);
|
|
scheduler.flush();
|
|
|
|
expect(scriptDataService.invoke).toHaveBeenCalledWith('harvest', [
|
|
{name: '-g', value: null},
|
|
{name: '-a', value: contentSource.oaiSource},
|
|
{name: '-i', value: new ContentSourceSetSerializer().Serialize(contentSource.oaiSetId)},
|
|
], []);
|
|
|
|
expect(processDataService.findById).toHaveBeenCalledWith(process.processId, false);
|
|
expect(bitstreamService.findByHref).toHaveBeenCalledWith(process._links.output.href);
|
|
expect(notificationsService.info).toHaveBeenCalledWith(jasmine.anything() as any, 'Script text');
|
|
});
|
|
});
|
|
describe('importNow', () => {
|
|
it('should invoke a script that will start the harvest', () => {
|
|
comp.importNow();
|
|
scheduler.flush();
|
|
|
|
expect(scriptDataService.invoke).toHaveBeenCalledWith('harvest', [
|
|
{name: '-r', value: null},
|
|
{name: '-c', value: collection.uuid},
|
|
], []);
|
|
expect(processDataService.findById).toHaveBeenCalledWith(process.processId, false);
|
|
expect(notificationsService.success).toHaveBeenCalled();
|
|
});
|
|
});
|
|
describe('resetAndReimport', () => {
|
|
it('should invoke a script that will start the harvest', () => {
|
|
comp.resetAndReimport();
|
|
scheduler.flush();
|
|
|
|
expect(scriptDataService.invoke).toHaveBeenCalledWith('harvest', [
|
|
{name: '-o', value: null},
|
|
{name: '-c', value: collection.uuid},
|
|
], []);
|
|
expect(processDataService.findById).toHaveBeenCalledWith(process.processId, false);
|
|
expect(notificationsService.success).toHaveBeenCalled();
|
|
});
|
|
});
|
|
describe('the controls', () => {
|
|
it('should be shown when shouldShow is true', () => {
|
|
comp.shouldShow = true;
|
|
fixture.detectChanges();
|
|
const buttons = fixture.debugElement.queryAll(By.css('button'));
|
|
expect(buttons.length).toEqual(3);
|
|
});
|
|
it('should be shown when shouldShow is false', () => {
|
|
comp.shouldShow = false;
|
|
fixture.detectChanges();
|
|
const buttons = fixture.debugElement.queryAll(By.css('button'));
|
|
expect(buttons.length).toEqual(0);
|
|
});
|
|
it('should be disabled when isEnabled is false', () => {
|
|
comp.shouldShow = true;
|
|
comp.isEnabled = false;
|
|
|
|
fixture.detectChanges();
|
|
|
|
const buttons = fixture.debugElement.queryAll(By.css('button'));
|
|
|
|
buttons.forEach(button => {
|
|
console.log(button.nativeElement);
|
|
expect(button.nativeElement.getAttribute('aria-disabled')).toBe('true');
|
|
expect(button.nativeElement.classList.contains('disabled')).toBeTrue();
|
|
});
|
|
});
|
|
it('should be enabled when isEnabled is true', () => {
|
|
comp.shouldShow = true;
|
|
comp.isEnabled = true;
|
|
|
|
fixture.detectChanges();
|
|
|
|
const buttons = fixture.debugElement.queryAll(By.css('button'));
|
|
|
|
buttons.forEach(button => {
|
|
expect(button.nativeElement.getAttribute('aria-disabled')).toBe('false');
|
|
expect(button.nativeElement.classList.contains('disabled')).toBeFalse();
|
|
});
|
|
});
|
|
it('should call the corresponding button when clicked', () => {
|
|
spyOn(comp, 'testConfiguration');
|
|
spyOn(comp, 'importNow');
|
|
spyOn(comp, 'resetAndReimport');
|
|
|
|
comp.shouldShow = true;
|
|
comp.isEnabled = true;
|
|
|
|
fixture.detectChanges();
|
|
|
|
const buttons = fixture.debugElement.queryAll(By.css('button'));
|
|
|
|
buttons[0].triggerEventHandler('click', null);
|
|
expect(comp.testConfiguration).toHaveBeenCalled();
|
|
|
|
buttons[1].triggerEventHandler('click', null);
|
|
expect(comp.importNow).toHaveBeenCalled();
|
|
|
|
buttons[2].triggerEventHandler('click', null);
|
|
expect(comp.resetAndReimport).toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
|
|
});
|