68405: test fixes

This commit is contained in:
Marie Verdonck
2020-02-13 18:55:06 +01:00
committed by Art Lowel
parent ab0f2c89e6
commit 884e94a08b
20 changed files with 379 additions and 308 deletions

View File

@@ -1,23 +1,23 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { Item } from '../../../core/shared/item.model';
import { RouterStub } from '../../../shared/testing/router-stub';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { RouterTestingModule } from '@angular/router/testing';
import { TranslateModule } from '@ngx-translate/core';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { ActivatedRoute, Router } from '@angular/router';
import { ItemMoveComponent } from './item-move.component';
import { NotificationsServiceStub } from '../../../shared/testing/notifications-service-stub';
import { NotificationsService } from '../../../shared/notifications/notifications.service';
import { of as observableOf } from 'rxjs';
import { FormsModule } from '@angular/forms';
import { ItemDataService } from '../../../core/data/item-data.service';
import { RemoteData } from '../../../core/data/remote-data';
import { PaginatedList } from '../../../core/data/paginated-list';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FormsModule } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { TranslateModule } from '@ngx-translate/core';
import { of as observableOf } from 'rxjs';
import { RestResponse } from '../../../core/cache/response.models'; import { RestResponse } from '../../../core/cache/response.models';
import { ItemDataService } from '../../../core/data/item-data.service';
import { PaginatedList } from '../../../core/data/paginated-list';
import { RemoteData } from '../../../core/data/remote-data';
import { Collection } from '../../../core/shared/collection.model'; import { Collection } from '../../../core/shared/collection.model';
import { Item } from '../../../core/shared/item.model';
import { SearchService } from '../../../core/shared/search/search.service'; import { SearchService } from '../../../core/shared/search/search.service';
import { NotificationsService } from '../../../shared/notifications/notifications.service';
import { NotificationsServiceStub } from '../../../shared/testing/notifications-service-stub';
import { RouterStub } from '../../../shared/testing/router-stub';
import { ItemMoveComponent } from './item-move.component';
describe('ItemMoveComponent', () => { describe('ItemMoveComponent', () => {
let comp: ItemMoveComponent; let comp: ItemMoveComponent;
@@ -50,16 +50,14 @@ describe('ItemMoveComponent', () => {
}) })
}; };
const collection1 = Object.assign(new Collection(),{ const collection1 = Object.assign(new Collection(), {
uuid: 'collection-uuid-1', uuid: 'collection-uuid-1',
name: 'Test collection 1', name: 'Test collection 1'
self: 'self-link-1',
}); });
const collection2 = Object.assign(new Collection(),{ const collection2 = Object.assign(new Collection(), {
uuid: 'collection-uuid-2', uuid: 'collection-uuid-2',
name: 'Test collection 2', name: 'Test collection 2'
self: 'self-link-2',
}); });
const mockSearchService = { const mockSearchService = {
@@ -80,23 +78,20 @@ describe('ItemMoveComponent', () => {
const notificationsServiceStub = new NotificationsServiceStub(); const notificationsServiceStub = new NotificationsServiceStub();
describe('ItemMoveComponent success', () => { describe('ItemMoveComponent success', () => {
beforeEach(async(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [CommonModule, FormsModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule.forRoot()], imports: [CommonModule, FormsModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule.forRoot()],
declarations: [ItemMoveComponent], declarations: [ItemMoveComponent],
providers: [ providers: [
{provide: ActivatedRoute, useValue: routeStub}, { provide: ActivatedRoute, useValue: routeStub },
{provide: Router, useValue: routerStub}, { provide: Router, useValue: routerStub },
{provide: ItemDataService, useValue: mockItemDataService}, { provide: ItemDataService, useValue: mockItemDataService },
{provide: NotificationsService, useValue: notificationsServiceStub}, { provide: NotificationsService, useValue: notificationsServiceStub },
{provide: SearchService, useValue: mockSearchService}, { provide: SearchService, useValue: mockSearchService },
], schemas: [ ], schemas: [
CUSTOM_ELEMENTS_SCHEMA CUSTOM_ELEMENTS_SCHEMA
] ]
}).compileComponents(); }).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ItemMoveComponent); fixture = TestBed.createComponent(ItemMoveComponent);
comp = fixture.componentInstance; comp = fixture.componentInstance;
fixture.detectChanges(); fixture.detectChanges();
@@ -141,23 +136,20 @@ describe('ItemMoveComponent', () => {
}); });
describe('ItemMoveComponent fail', () => { describe('ItemMoveComponent fail', () => {
beforeEach(async(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [CommonModule, FormsModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule.forRoot()], imports: [CommonModule, FormsModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule.forRoot()],
declarations: [ItemMoveComponent], declarations: [ItemMoveComponent],
providers: [ providers: [
{provide: ActivatedRoute, useValue: routeStub}, { provide: ActivatedRoute, useValue: routeStub },
{provide: Router, useValue: routerStub}, { provide: Router, useValue: routerStub },
{provide: ItemDataService, useValue: mockItemDataServiceFail}, { provide: ItemDataService, useValue: mockItemDataServiceFail },
{provide: NotificationsService, useValue: notificationsServiceStub}, { provide: NotificationsService, useValue: notificationsServiceStub },
{provide: SearchService, useValue: mockSearchService}, { provide: SearchService, useValue: mockSearchService },
], schemas: [ ], schemas: [
CUSTOM_ELEMENTS_SCHEMA CUSTOM_ELEMENTS_SCHEMA
] ]
}).compileComponents(); }).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ItemMoveComponent); fixture = TestBed.createComponent(ItemMoveComponent);
comp = fixture.componentInstance; comp = fixture.componentInstance;
fixture.detectChanges(); fixture.detectChanges();

View File

@@ -1,19 +1,19 @@
import {EditRelationshipListComponent} from './edit-relationship-list.component'; import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
import {async, ComponentFixture, TestBed} from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import {RelationshipType} from '../../../../core/shared/item-relationships/relationship-type.model'; import { By } from '@angular/platform-browser';
import {Relationship} from '../../../../core/shared/item-relationships/relationship.model'; import { TranslateModule } from '@ngx-translate/core';
import {of as observableOf} from 'rxjs/internal/observable/of'; import { of as observableOf } from 'rxjs/internal/observable/of';
import {RemoteData} from '../../../../core/data/remote-data'; import { FieldChangeType } from '../../../../core/data/object-updates/object-updates.actions';
import {Item} from '../../../../core/shared/item.model'; import { ObjectUpdatesService } from '../../../../core/data/object-updates/object-updates.service';
import {PaginatedList} from '../../../../core/data/paginated-list'; import { PaginatedList } from '../../../../core/data/paginated-list';
import {PageInfo} from '../../../../core/shared/page-info.model'; import { RemoteData } from '../../../../core/data/remote-data';
import {FieldChangeType} from '../../../../core/data/object-updates/object-updates.actions'; import { ItemType } from '../../../../core/shared/item-relationships/item-type.model';
import {SharedModule} from '../../../../shared/shared.module'; import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model';
import {TranslateModule} from '@ngx-translate/core'; import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
import {ObjectUpdatesService} from '../../../../core/data/object-updates/object-updates.service'; import { Item } from '../../../../core/shared/item.model';
import {DebugElement, NO_ERRORS_SCHEMA} from '@angular/core'; import { PageInfo } from '../../../../core/shared/page-info.model';
import {By} from '@angular/platform-browser'; import { SharedModule } from '../../../../shared/shared.module';
import {ItemType} from '../../../../core/shared/item-relationships/item-type.model'; import { EditRelationshipListComponent } from './edit-relationship-list.component';
let comp: EditRelationshipListComponent; let comp: EditRelationshipListComponent;
let fixture: ComponentFixture<EditRelationshipListComponent>; let fixture: ComponentFixture<EditRelationshipListComponent>;
@@ -57,7 +57,11 @@ describe('EditRelationshipListComponent', () => {
}); });
relationship1 = Object.assign(new Relationship(), { relationship1 = Object.assign(new Relationship(), {
self: url + '/2', _links: {
self: {
href: url + '/2'
}
},
id: '2', id: '2',
uuid: '2', uuid: '2',
leftId: 'author1', leftId: 'author1',
@@ -68,7 +72,11 @@ describe('EditRelationshipListComponent', () => {
}); });
relationship2 = Object.assign(new Relationship(), { relationship2 = Object.assign(new Relationship(), {
self: url + '/3', _links: {
self: {
href: url + '/3'
}
},
id: '3', id: '3',
uuid: '3', uuid: '3',
leftId: 'author2', leftId: 'author2',
@@ -79,7 +87,9 @@ describe('EditRelationshipListComponent', () => {
}); });
item = Object.assign(new Item(), { item = Object.assign(new Item(), {
self: 'fake-item-url/publication', _links: {
self: { href: 'fake-item-url/publication' }
},
id: 'publication', id: 'publication',
uuid: 'publication', uuid: 'publication',
relationships: observableOf(new RemoteData( relationships: observableOf(new RemoteData(

View File

@@ -1,16 +1,16 @@
import { async, TestBed } from '@angular/core/testing';
import { of as observableOf } from 'rxjs/internal/observable/of';
import { TranslateModule } from '@ngx-translate/core';
import { ObjectUpdatesService } from '../../../../core/data/object-updates/object-updates.service';
import { NO_ERRORS_SCHEMA } from '@angular/core'; import { NO_ERRORS_SCHEMA } from '@angular/core';
import { EditRelationshipComponent } from './edit-relationship.component'; import { async, TestBed } from '@angular/core/testing';
import { TranslateModule } from '@ngx-translate/core';
import { of as observableOf } from 'rxjs/internal/observable/of';
import { FieldChangeType } from '../../../../core/data/object-updates/object-updates.actions';
import { ObjectUpdatesService } from '../../../../core/data/object-updates/object-updates.service';
import { PaginatedList } from '../../../../core/data/paginated-list';
import { RemoteData } from '../../../../core/data/remote-data';
import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model'; import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model';
import { Relationship } from '../../../../core/shared/item-relationships/relationship.model'; import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
import { RemoteData } from '../../../../core/data/remote-data';
import { Item } from '../../../../core/shared/item.model'; import { Item } from '../../../../core/shared/item.model';
import { PaginatedList } from '../../../../core/data/paginated-list';
import { PageInfo } from '../../../../core/shared/page-info.model'; import { PageInfo } from '../../../../core/shared/page-info.model';
import { FieldChangeType } from '../../../../core/data/object-updates/object-updates.actions'; import { EditRelationshipComponent } from './edit-relationship.component';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
let objectUpdatesService; let objectUpdatesService;
@@ -42,7 +42,11 @@ describe('EditRelationshipComponent', () => {
}); });
item = Object.assign(new Item(), { item = Object.assign(new Item(), {
self: 'fake-item-url/publication', _links: {
self: {
href: 'fake-item-url/publication'
}
},
id: 'publication', id: 'publication',
uuid: 'publication', uuid: 'publication',
relationships: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(new PageInfo(), relationships))) relationships: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(new PageInfo(), relationships)))
@@ -54,7 +58,9 @@ describe('EditRelationshipComponent', () => {
relationships = [ relationships = [
Object.assign(new Relationship(), { Object.assign(new Relationship(), {
self: url + '/2', _links: {
self: { href: url + '/2' }
},
id: '2', id: '2',
uuid: '2', uuid: '2',
leftId: 'author1', leftId: 'author1',
@@ -64,7 +70,9 @@ describe('EditRelationshipComponent', () => {
rightItem: observableOf(new RemoteData(false, false, true, undefined, item)), rightItem: observableOf(new RemoteData(false, false, true, undefined, item)),
}), }),
Object.assign(new Relationship(), { Object.assign(new Relationship(), {
self: url + '/3', _links: {
self: { href: url + '/3' }
},
id: '3', id: '3',
uuid: '3', uuid: '3',
leftId: 'author2', leftId: 'author2',

View File

@@ -1,32 +1,32 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ItemRelationshipsComponent } from './item-relationships.component';
import { ChangeDetectorRef, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; import { ChangeDetectorRef, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
import { INotification, Notification } from '../../../shared/notifications/models/notification.model'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { NotificationType } from '../../../shared/notifications/models/notification-type';
import { RouterStub } from '../../../shared/testing/router-stub';
import { TestScheduler } from 'rxjs/testing';
import { SharedModule } from '../../../shared/shared.module';
import { TranslateModule } from '@ngx-translate/core';
import { ItemDataService } from '../../../core/data/item-data.service';
import { ObjectUpdatesService } from '../../../core/data/object-updates/object-updates.service';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { TranslateModule } from '@ngx-translate/core';
import { getTestScheduler } from 'jasmine-marbles';
import { combineLatest as observableCombineLatest, of as observableOf } from 'rxjs';
import { TestScheduler } from 'rxjs/testing';
import { GLOBAL_CONFIG } from '../../../../config'; import { GLOBAL_CONFIG } from '../../../../config';
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
import { RestResponse } from '../../../core/cache/response.models';
import { EntityTypeService } from '../../../core/data/entity-type.service';
import { ItemDataService } from '../../../core/data/item-data.service';
import { FieldChangeType } from '../../../core/data/object-updates/object-updates.actions';
import { ObjectUpdatesService } from '../../../core/data/object-updates/object-updates.service';
import { PaginatedList } from '../../../core/data/paginated-list';
import { RelationshipService } from '../../../core/data/relationship.service';
import { RemoteData } from '../../../core/data/remote-data';
import { RequestService } from '../../../core/data/request.service';
import { ItemType } from '../../../core/shared/item-relationships/item-type.model';
import { RelationshipType } from '../../../core/shared/item-relationships/relationship-type.model'; import { RelationshipType } from '../../../core/shared/item-relationships/relationship-type.model';
import { Relationship } from '../../../core/shared/item-relationships/relationship.model'; import { Relationship } from '../../../core/shared/item-relationships/relationship.model';
import { combineLatest as observableCombineLatest, of as observableOf } from 'rxjs';
import { RemoteData } from '../../../core/data/remote-data';
import { Item } from '../../../core/shared/item.model'; import { Item } from '../../../core/shared/item.model';
import { PaginatedList } from '../../../core/data/paginated-list';
import { PageInfo } from '../../../core/shared/page-info.model'; import { PageInfo } from '../../../core/shared/page-info.model';
import { FieldChangeType } from '../../../core/data/object-updates/object-updates.actions'; import { NotificationType } from '../../../shared/notifications/models/notification-type';
import { RelationshipService } from '../../../core/data/relationship.service'; import {
import { ObjectCacheService } from '../../../core/cache/object-cache.service'; INotification,
import { getTestScheduler } from 'jasmine-marbles'; Notification
import { RestResponse } from '../../../core/cache/response.models'; } from '../../../shared/notifications/models/notification.model';
import { RequestService } from '../../../core/data/request.service'; import { ItemRelationshipsComponent } from './item-relationships.component';
import { EntityTypeService } from '../../../core/data/entity-type.service';
import { ItemType } from '../../../core/shared/item-relationships/item-type.model';
let comp: any; let comp: any;
let fixture: ComponentFixture<ItemRelationshipsComponent>; let fixture: ComponentFixture<ItemRelationshipsComponent>;
@@ -77,13 +77,17 @@ describe('ItemRelationshipsComponent', () => {
relationships = [ relationships = [
Object.assign(new Relationship(), { Object.assign(new Relationship(), {
self: url + '/2', _links: {
self: { href: url + '/2' }
},
id: '2', id: '2',
uuid: '2', uuid: '2',
relationshipType: observableOf(new RemoteData(false, false, true, undefined, relationshipType)) relationshipType: observableOf(new RemoteData(false, false, true, undefined, relationshipType))
}), }),
Object.assign(new Relationship(), { Object.assign(new Relationship(), {
self: url + '/3', _links: {
self: { href: url + '/3' }
},
id: '3', id: '3',
uuid: '3', uuid: '3',
relationshipType: observableOf(new RemoteData(false, false, true, undefined, relationshipType)) relationshipType: observableOf(new RemoteData(false, false, true, undefined, relationshipType))
@@ -91,7 +95,9 @@ describe('ItemRelationshipsComponent', () => {
]; ];
item = Object.assign(new Item(), { item = Object.assign(new Item(), {
self: 'fake-item-url/publication', _links: {
self: { href: 'fake-item-url/publication' }
},
id: 'publication', id: 'publication',
uuid: 'publication', uuid: 'publication',
relationships: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(new PageInfo(), relationships))), relationships: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(new PageInfo(), relationships))),

View File

@@ -27,7 +27,6 @@ describe('ObjectCacheService', () => {
const timestamp = new Date().getTime(); const timestamp = new Date().getTime();
const msToLive = 900000; const msToLive = 900000;
let objectToCache = { let objectToCache = {
self: selfLink,
type: Item.type, type: Item.type,
_links: { _links: {
self: { href: selfLink } self: { href: selfLink }
@@ -39,7 +38,6 @@ describe('ObjectCacheService', () => {
function init() { function init() {
objectToCache = { objectToCache = {
self: selfLink,
type: Item.type, type: Item.type,
_links: { _links: {
self: { href: selfLink } self: { href: selfLink }
@@ -115,12 +113,13 @@ describe('ObjectCacheService', () => {
describe('getList', () => { describe('getList', () => {
it('should return an observable of the array of cached objects with the specified self link and type', () => { it('should return an observable of the array of cached objects with the specified self link and type', () => {
const item = new Item(); const item = Object.assign(new Item(), {
item._links.self = { href: selfLink }; _links: { self: { href: selfLink } }
});
spyOn(service, 'getObjectBySelfLink').and.returnValue(observableOf(item)); spyOn(service, 'getObjectBySelfLink').and.returnValue(observableOf(item));
service.getList([selfLink, selfLink]).pipe(first()).subscribe((arr) => { service.getList([selfLink, selfLink]).pipe(first()).subscribe((arr) => {
expect(arr[0].self).toBe(selfLink); expect(arr[0]._links.self.href).toBe(selfLink);
expect(arr[0] instanceof Item).toBeTruthy(); expect(arr[0] instanceof Item).toBeTruthy();
}); });
}); });

View File

@@ -1,22 +1,22 @@
import { TestBed } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing';
import { Observable, of as observableOf } from 'rxjs';
import { provideMockActions } from '@ngrx/effects/testing'; import { provideMockActions } from '@ngrx/effects/testing';
import { Store, StoreModule } from '@ngrx/store';
import { cold, hot } from 'jasmine-marbles'; import { cold, hot } from 'jasmine-marbles';
import { ServerSyncBufferEffects } from './server-sync-buffer.effects'; import { Observable, of as observableOf } from 'rxjs';
import { GLOBAL_CONFIG } from '../../../config';
import { CommitSSBAction, EmptySSBAction, ServerSyncBufferActionTypes } from './server-sync-buffer.actions';
import { RestRequestMethod } from '../data/rest-request-method';
import { Store, StoreModule } from '@ngrx/store';
import { RequestService } from '../data/request.service';
import { ObjectCacheService } from './object-cache.service';
import { MockStore } from '../../shared/testing/mock-store';
import * as operators from 'rxjs/operators'; import * as operators from 'rxjs/operators';
import { spyOnOperator } from '../../shared/testing/utils'; import { GLOBAL_CONFIG } from '../../../config';
import { DSpaceObject } from '../shared/dspace-object.model';
import { getMockRequestService } from '../../shared/mocks/mock-request.service'; import { getMockRequestService } from '../../shared/mocks/mock-request.service';
import { MockStore } from '../../shared/testing/mock-store';
import { spyOnOperator } from '../../shared/testing/utils';
import { RequestService } from '../data/request.service';
import { RestRequestMethod } from '../data/rest-request-method';
import { DSpaceObject } from '../shared/dspace-object.model';
import { ApplyPatchObjectCacheAction } from './object-cache.actions'; import { ApplyPatchObjectCacheAction } from './object-cache.actions';
import { ObjectCacheService } from './object-cache.service';
import { CommitSSBAction, EmptySSBAction, ServerSyncBufferActionTypes } from './server-sync-buffer.actions';
import { ServerSyncBufferEffects } from './server-sync-buffer.effects';
describe('ServerSyncBufferEffects', () => { describe('ServerSyncBufferEffects', () => {
let ssbEffects: ServerSyncBufferEffects; let ssbEffects: ServerSyncBufferEffects;
@@ -47,8 +47,9 @@ describe('ServerSyncBufferEffects', () => {
{ {
provide: ObjectCacheService, useValue: { provide: ObjectCacheService, useValue: {
getObjectBySelfLink: (link) => { getObjectBySelfLink: (link) => {
const object = new DSpaceObject(); const object = Object.assign(new DSpaceObject(), {
object._links.self = { href: link }; _links: { self: { href: link } }
});
return observableOf(object); return observableOf(object);
} }
} }

View File

@@ -1,9 +1,9 @@
import { autoserialize, deserialize } from 'cerialize'; import { autoserialize, deserialize } from 'cerialize';
import { SectionsType } from '../../../submission/sections/sections-type';
import { resourceType } from '../../cache/builders/build-decorators'; import { resourceType } from '../../cache/builders/build-decorators';
import { HALLink } from '../../shared/hal-link.model'; import { HALLink } from '../../shared/hal-link.model';
import { ConfigObject } from './config.model';
import { SectionsType } from '../../../submission/sections/sections-type';
import { ResourceType } from '../../shared/resource-type'; import { ResourceType } from '../../shared/resource-type';
import { ConfigObject } from './config.model';
/** /**
* An interface that define section visibility and its properties. * An interface that define section visibility and its properties.
@@ -47,6 +47,7 @@ export class SubmissionSectionModel extends ConfigObject {
@deserialize @deserialize
_links: { _links: {
self: HALLink; self: HALLink;
config: HALLink;
} }
} }

View File

@@ -31,7 +31,6 @@ describe('BrowseResponseParsingService', () => {
metadata: 'dc.date.issued' metadata: 'dc.date.issued'
}, { name: 'dateaccessioned', metadata: 'dc.date.accessioned' }], }, { name: 'dateaccessioned', metadata: 'dc.date.accessioned' }],
order: 'ASC', order: 'ASC',
type: 'browse',
metadata: ['dc.date.issued'], metadata: ['dc.date.issued'],
_links: { _links: {
self: { href: 'https://rest.api/discover/browses/dateissued' }, self: { href: 'https://rest.api/discover/browses/dateissued' },
@@ -44,7 +43,6 @@ describe('BrowseResponseParsingService', () => {
metadata: 'dc.date.issued' metadata: 'dc.date.issued'
}, { name: 'dateaccessioned', metadata: 'dc.date.accessioned' }], }, { name: 'dateaccessioned', metadata: 'dc.date.accessioned' }],
order: 'ASC', order: 'ASC',
type: 'browse',
metadata: ['dc.contributor.*', 'dc.creator'], metadata: ['dc.contributor.*', 'dc.creator'],
_links: { _links: {
self: { href: 'https://rest.api/discover/browses/author' }, self: { href: 'https://rest.api/discover/browses/author' },
@@ -68,7 +66,6 @@ describe('BrowseResponseParsingService', () => {
metadata: 'dc.date.issued' metadata: 'dc.date.issued'
}, { name: 'dateaccessioned', metadata: 'dc.date.accessioned' }], }, { name: 'dateaccessioned', metadata: 'dc.date.accessioned' }],
order: 'ASC', order: 'ASC',
type: 'browse',
metadata: ['dc.date.issued'], metadata: ['dc.date.issued'],
_links: { _links: {
self: { href: 'https://rest.api/discover/browses/dateissued' }, self: { href: 'https://rest.api/discover/browses/dateissued' },

View File

@@ -1,23 +1,23 @@
import { DataService } from './data.service'; import { HttpClient } from '@angular/common/http';
import { NormalizedObject } from '../cache/models/normalized-object.model';
import { RequestService } from './request.service';
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
import { CoreState } from '../core.reducers';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { HALEndpointService } from '../shared/hal-endpoint.service'; import { compare, Operation } from 'fast-json-patch';
import { Observable, of as observableOf } from 'rxjs'; import { Observable, of as observableOf } from 'rxjs';
import { FindListOptions } from './request.models'; import * as uuidv4 from 'uuid/v4';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
import { NormalizedObject } from '../cache/models/normalized-object.model';
import { SortDirection, SortOptions } from '../cache/models/sort-options.model'; import { SortDirection, SortOptions } from '../cache/models/sort-options.model';
import { ObjectCacheService } from '../cache/object-cache.service'; import { ObjectCacheService } from '../cache/object-cache.service';
import { compare, Operation } from 'fast-json-patch'; import { CoreState } from '../core.reducers';
import { DSpaceObject } from '../shared/dspace-object.model'; import { DSpaceObject } from '../shared/dspace-object.model';
import { ChangeAnalyzer } from './change-analyzer'; import { HALEndpointService } from '../shared/hal-endpoint.service';
import { HttpClient } from '@angular/common/http';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { Item } from '../shared/item.model'; import { Item } from '../shared/item.model';
import * as uuidv4 from 'uuid/v4'; import { ChangeAnalyzer } from './change-analyzer';
import { createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; import { DataService } from './data.service';
import { FindListOptions } from './request.models';
import { RequestService } from './request.service';
const endpoint = 'https://rest.api/core'; const endpoint = 'https://rest.api/core';
@@ -184,13 +184,15 @@ describe('DataService', () => {
operations = [{ op: 'replace', path: '/0/value', value: name2 } as Operation]; operations = [{ op: 'replace', path: '/0/value', value: name2 } as Operation];
selfLink = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; selfLink = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7';
dso = new DSpaceObject(); dso = Object.assign(new DSpaceObject(), {
dso._links.self = { href: selfLink }; _links: { self: { href: selfLink } },
dso.metadata = [{ key: 'dc.title', value: name1 }]; metadata: [{ key: 'dc.title', value: name1 }]
});
dso2 = new DSpaceObject(); dso2 = Object.assign(new DSpaceObject(), {
dso2._link.self = { href: selfLink }; _links: { self: { href: selfLink } },
dso2.metadata = [{ key: 'dc.title', value: name2 }]; metadata: [{ key: 'dc.title', value: name2 }]
});
spyOn(service, 'findByHref').and.returnValue(createSuccessfulRemoteDataObject$(dso)); spyOn(service, 'findByHref').and.returnValue(createSuccessfulRemoteDataObject$(dso));
spyOn(objectCache, 'addPatch'); spyOn(objectCache, 'addPatch');

View File

@@ -1,21 +1,21 @@
import { HttpClient } from '@angular/common/http';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { cold, getTestScheduler } from 'jasmine-marbles'; import { cold, getTestScheduler } from 'jasmine-marbles';
import { TestScheduler } from 'rxjs/testing';
import { BrowseService } from '../browse/browse.service';
import { CoreState } from '../core.reducers';
import { ItemDataService } from './item-data.service';
import { RequestService } from './request.service';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { DeleteRequest, FindListOptions, PostRequest, RestRequest } from './request.models';
import { ObjectCacheService } from '../cache/object-cache.service';
import { Observable, of as observableOf } from 'rxjs'; import { Observable, of as observableOf } from 'rxjs';
import { RestResponse } from '../cache/response.models'; import { TestScheduler } from 'rxjs/testing';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { HttpClient } from '@angular/common/http';
import { RequestEntry } from './request.reducer';
import { getMockRequestService } from '../../shared/mocks/mock-request.service'; import { getMockRequestService } from '../../shared/mocks/mock-request.service';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { BrowseService } from '../browse/browse.service';
import { NormalizedObjectBuildService } from '../cache/builders/normalized-object-build.service';
import { ObjectCacheService } from '../cache/object-cache.service';
import { RestResponse } from '../cache/response.models';
import { CoreState } from '../core.reducers';
import { ExternalSourceEntry } from '../shared/external-source-entry.model'; import { ExternalSourceEntry } from '../shared/external-source-entry.model';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { ItemDataService } from './item-data.service';
import { DeleteRequest, FindListOptions, PostRequest, RestRequest } from './request.models';
import { RequestEntry } from './request.reducer';
import { RequestService } from './request.service';
describe('ItemDataService', () => { describe('ItemDataService', () => {
let scheduler: TestScheduler; let scheduler: TestScheduler;
@@ -45,7 +45,7 @@ describe('ItemDataService', () => {
const objectCache = {} as ObjectCacheService; const objectCache = {} as ObjectCacheService;
const halEndpointService = { const halEndpointService = {
getEndpoint(linkPath: string): Observable<string> { getEndpoint(linkPath: string): Observable<string> {
return cold('a', {a: itemEndpoint}); return cold('a', { a: itemEndpoint });
} }
} as HALEndpointService; } as HALEndpointService;
@@ -132,7 +132,7 @@ describe('ItemDataService', () => {
it('should return the endpoint to withdraw and reinstate items', () => { it('should return the endpoint to withdraw and reinstate items', () => {
const result = service.getItemWithdrawEndpoint(scopeID); const result = service.getItemWithdrawEndpoint(scopeID);
const expected = cold('a', {a: ScopedItemEndpoint}); const expected = cold('a', { a: ScopedItemEndpoint });
expect(result).toBeObservable(expected); expect(result).toBeObservable(expected);
}); });
@@ -154,7 +154,7 @@ describe('ItemDataService', () => {
it('should return the endpoint to make an item private or public', () => { it('should return the endpoint to make an item private or public', () => {
const result = service.getItemDiscoverableEndpoint(scopeID); const result = service.getItemDiscoverableEndpoint(scopeID);
const expected = cold('a', {a: ScopedItemEndpoint}); const expected = cold('a', { a: ScopedItemEndpoint });
expect(result).toBeObservable(expected); expect(result).toBeObservable(expected);
}); });
@@ -201,7 +201,7 @@ describe('ItemDataService', () => {
const externalSourceEntry = Object.assign(new ExternalSourceEntry(), { const externalSourceEntry = Object.assign(new ExternalSourceEntry(), {
display: 'John, Doe', display: 'John, Doe',
value: 'John, Doe', value: 'John, Doe',
self: 'http://test-rest.com/server/api/integration/externalSources/orcidV2/entryValues/0000-0003-4851-8004' _links: { self: { href: 'http://test-rest.com/server/api/integration/externalSources/orcidV2/entryValues/0000-0003-4851-8004' } }
}); });
beforeEach(() => { beforeEach(() => {

View File

@@ -2,7 +2,7 @@ import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { distinctUntilChanged, filter, find, map, switchMap } from 'rxjs/operators'; import { distinctUntilChanged, filter, find, map, switchMap, tap } from 'rxjs/operators';
import { hasValue, isNotEmpty, isNotEmptyOperator } from '../../shared/empty.util'; import { hasValue, isNotEmpty, isNotEmptyOperator } from '../../shared/empty.util';
import { NotificationsService } from '../../shared/notifications/notifications.service'; import { NotificationsService } from '../../shared/notifications/notifications.service';
import { BrowseService } from '../browse/browse.service'; import { BrowseService } from '../browse/browse.service';
@@ -243,7 +243,7 @@ export class ItemDataService extends DataService<Item> {
hrefObs.pipe( hrefObs.pipe(
find((href: string) => hasValue(href)), find((href: string) => hasValue(href)),
map((href: string) => { map((href: string) => {
const request = new PutRequest(requestId, href, collection.self, options); const request = new PutRequest(requestId, href, collection._links.self.href, options);
this.requestService.configure(request); this.requestService.configure(request);
}) })
).subscribe(); ).subscribe();

View File

@@ -34,13 +34,17 @@ describe('RelationshipService', () => {
}); });
const relationship1 = Object.assign(new Relationship(), { const relationship1 = Object.assign(new Relationship(), {
self: relationshipsEndpointURL + '/2', _links: {
self: { href: relationshipsEndpointURL + '/2' }
},
id: '2', id: '2',
uuid: '2', uuid: '2',
relationshipType: observableOf(new RemoteData(false, false, true, undefined, relationshipType)) relationshipType: observableOf(new RemoteData(false, false, true, undefined, relationshipType))
}); });
const relationship2 = Object.assign(new Relationship(), { const relationship2 = Object.assign(new Relationship(), {
self: relationshipsEndpointURL + '/3', _links: {
self: { href: relationshipsEndpointURL + '/3' }
},
id: '3', id: '3',
uuid: '3', uuid: '3',
relationshipType: observableOf(new RemoteData(false, false, true, undefined, relationshipType)) relationshipType: observableOf(new RemoteData(false, false, true, undefined, relationshipType))
@@ -49,24 +53,28 @@ describe('RelationshipService', () => {
const relationships = [relationship1, relationship2]; const relationships = [relationship1, relationship2];
const item = Object.assign(new Item(), { const item = Object.assign(new Item(), {
self: restEndpointURL + '/publication',
id: 'publication', id: 'publication',
uuid: 'publication', uuid: 'publication',
relationships: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(new PageInfo(), relationships))), relationships: observableOf(new RemoteData(false, false, true, undefined, new PaginatedList(new PageInfo(), relationships))),
_links: { _links: {
relationships: { href: restEndpointURL + '/publication/relationships' } relationships: { href: restEndpointURL + '/publication/relationships' },
self: { href: restEndpointURL + '/publication' }
} }
}); });
const relatedItem1 = Object.assign(new Item(), { const relatedItem1 = Object.assign(new Item(), {
self: 'fake-item-url/author1',
id: 'author1', id: 'author1',
uuid: 'author1' uuid: 'author1',
_links: {
self: { href: restEndpointURL + '/author1' }
}
}); });
const relatedItem2 = Object.assign(new Item(), { const relatedItem2 = Object.assign(new Item(), {
self: 'fake-item-url/author2',
id: 'author2', id: 'author2',
uuid: 'author2' uuid: 'author2',
_links: {
self: { href: restEndpointURL + '/author2' }
}
}); });
relationship1.leftItem = getRemotedataObservable(relatedItem1); relationship1.leftItem = getRemotedataObservable(relatedItem1);
relationship1.rightItem = getRemotedataObservable(item); relationship1.rightItem = getRemotedataObservable(item);
@@ -130,8 +138,8 @@ describe('RelationshipService', () => {
}); });
it('should clear the cache of the related items', () => { it('should clear the cache of the related items', () => {
expect(objectCache.remove).toHaveBeenCalledWith(relatedItem1.self); expect(objectCache.remove).toHaveBeenCalledWith(relatedItem1._links.self.href);
expect(objectCache.remove).toHaveBeenCalledWith(item.self); expect(objectCache.remove).toHaveBeenCalledWith(item._links.self.href);
expect(requestService.removeByHrefSubstring).toHaveBeenCalledWith(relatedItem1.self); expect(requestService.removeByHrefSubstring).toHaveBeenCalledWith(relatedItem1.self);
expect(requestService.removeByHrefSubstring).toHaveBeenCalledWith(item.self); expect(requestService.removeByHrefSubstring).toHaveBeenCalledWith(item.self);
}); });

View File

@@ -32,8 +32,16 @@ describe('IntegrationResponseParsingService', () => {
let definitions; let definitions;
function initVars() { function initVars() {
pageInfo = Object.assign(new PageInfo(), { elementsPerPage: 5, totalElements: 5, totalPages: 1, currentPage: 1, self: 'https://rest.api/integration/authorities/type/entries'}); pageInfo = Object.assign(new PageInfo(), {
definitions = new PaginatedList(pageInfo,[ elementsPerPage: 5,
totalElements: 5,
totalPages: 1,
currentPage: 1,
_links: {
self: { href: 'https://rest.api/integration/authorities/type/entries' }
}
});
definitions = new PaginatedList(pageInfo, [
Object.assign(new AuthorityValue(), { Object.assign(new AuthorityValue(), {
type: 'authority', type: 'authority',
display: 'One', display: 'One',

View File

@@ -1,30 +1,10 @@
import { TestBed } from '@angular/core/testing';
import { RegistryService } from './registry.service';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { RequestService } from '../data/request.service';
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs';
import { RequestEntry } from '../data/request.reducer';
import { RemoteData } from '../data/remote-data';
import { PageInfo } from '../shared/page-info.model';
import { getMockRequestService } from '../../shared/mocks/mock-request.service';
import {
RegistryMetadatafieldsSuccessResponse,
RegistryMetadataschemasSuccessResponse,
RestResponse
} from '../cache/response.models';
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { RegistryMetadataschemasResponse } from './registry-metadataschemas-response.model'; import { TestBed } from '@angular/core/testing';
import { RegistryMetadatafieldsResponse } from './registry-metadatafields-response.model';
import { map } from 'rxjs/operators';
import { Store, StoreModule } from '@ngrx/store'; import { Store, StoreModule } from '@ngrx/store';
import { MockStore } from '../../shared/testing/mock-store';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { NotificationsServiceStub } from '../../shared/testing/notifications-service-stub';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs';
import { map } from 'rxjs/operators';
import { import {
MetadataRegistryCancelFieldAction, MetadataRegistryCancelFieldAction,
MetadataRegistryCancelSchemaAction, MetadataRegistryCancelSchemaAction,
@@ -37,12 +17,31 @@ import {
MetadataRegistrySelectFieldAction, MetadataRegistrySelectFieldAction,
MetadataRegistrySelectSchemaAction MetadataRegistrySelectSchemaAction
} from '../../+admin/admin-registries/metadata-registry/metadata-registry.actions'; } from '../../+admin/admin-registries/metadata-registry/metadata-registry.actions';
import { ResourceType } from '../shared/resource-type'; import { getMockRequestService } from '../../shared/mocks/mock-request.service';
import { MetadataSchema } from '../metadata/metadata-schema.model'; import { NotificationsService } from '../../shared/notifications/notifications.service';
import { MetadataField } from '../metadata/metadata-field.model'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
import { MockStore } from '../../shared/testing/mock-store';
import { NotificationsServiceStub } from '../../shared/testing/notifications-service-stub';
import { createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils'; import { createSuccessfulRemoteDataObject$ } from '../../shared/testing/utils';
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
@Component({template: ''}) import {
RegistryMetadatafieldsSuccessResponse,
RegistryMetadataschemasSuccessResponse,
RestResponse
} from '../cache/response.models';
import { RemoteData } from '../data/remote-data';
import { RequestEntry } from '../data/request.reducer';
import { RequestService } from '../data/request.service';
import { MetadataField } from '../metadata/metadata-field.model';
import { MetadataSchema } from '../metadata/metadata-schema.model';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { PageInfo } from '../shared/page-info.model';
import { RegistryMetadatafieldsResponse } from './registry-metadatafields-response.model';
import { RegistryMetadataschemasResponse } from './registry-metadataschemas-response.model';
import { RegistryService } from './registry.service';
@Component({ template: '' })
class DummyComponent { class DummyComponent {
} }
@@ -57,15 +56,18 @@ describe('RegistryService', () => {
const mockSchemasList = [ const mockSchemasList = [
Object.assign(new MetadataSchema(), { Object.assign(new MetadataSchema(), {
id: 1, id: 1,
self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadataschemas/1', _links: {
self: { href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadataschemas/1' }
},
prefix: 'dc', prefix: 'dc',
namespace: 'http://dublincore.org/documents/dcmi-terms/', namespace: 'http://dublincore.org/documents/dcmi-terms/',
type: MetadataSchema.type type: MetadataSchema.type
}), }),
Object.assign(new MetadataSchema(), { Object.assign(new MetadataSchema(), {
id: 2, id: 2,
self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadataschemas/2', _links: {
self: { href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadataschemas/2' }
},
prefix: 'mock', prefix: 'mock',
namespace: 'http://dspace.org/mockschema', namespace: 'http://dspace.org/mockschema',
type: MetadataSchema.type type: MetadataSchema.type
@@ -73,45 +75,53 @@ describe('RegistryService', () => {
]; ];
const mockFieldsList = [ const mockFieldsList = [
Object.assign(new MetadataField(), Object.assign(new MetadataField(),
{ {
id: 1, id: 1,
self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadatafields/8', _links: {
element: 'contributor', self: { href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadatafields/8' }
qualifier: 'advisor', },
scopeNote: null, element: 'contributor',
schema: mockSchemasList[0], qualifier: 'advisor',
type: MetadataField.type scopeNote: null,
}), schema: mockSchemasList[0],
type: MetadataField.type
}),
Object.assign(new MetadataField(), Object.assign(new MetadataField(),
{ {
id: 2, id: 2,
self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadatafields/9', _links: {
element: 'contributor', self: { href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadatafields/9' }
qualifier: 'author', },
scopeNote: null, element: 'contributor',
schema: mockSchemasList[0], qualifier: 'author',
type: MetadataField.type scopeNote: null,
}), schema: mockSchemasList[0],
type: MetadataField.type
}),
Object.assign(new MetadataField(), Object.assign(new MetadataField(),
{ {
id: 3, id: 3,
self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadatafields/10', _links: {
element: 'contributor', self: { href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadatafields/10' }
qualifier: 'editor', },
scopeNote: 'test scope note', element: 'contributor',
schema: mockSchemasList[1], qualifier: 'editor',
type: MetadataField.type scopeNote: 'test scope note',
}), schema: mockSchemasList[1],
type: MetadataField.type
}),
Object.assign(new MetadataField(), Object.assign(new MetadataField(),
{ {
id: 4, id: 4,
self: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadatafields/11', _links: {
element: 'contributor', self: { href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/metadatafields/11' }
qualifier: 'illustrator', },
scopeNote: null, element: 'contributor',
schema: mockSchemasList[1], qualifier: 'illustrator',
type: MetadataField.type scopeNote: null,
}) schema: mockSchemasList[1],
type: MetadataField.type
})
]; ];
const pageInfo = new PageInfo(); const pageInfo = new PageInfo();
@@ -130,7 +140,7 @@ describe('RegistryService', () => {
toRemoteDataObservable: (requestEntryObs: Observable<RequestEntry>, payloadObs: Observable<any>) => { toRemoteDataObservable: (requestEntryObs: Observable<RequestEntry>, payloadObs: Observable<any>) => {
return observableCombineLatest(requestEntryObs, return observableCombineLatest(requestEntryObs,
payloadObs).pipe(map(([req, pay]) => { payloadObs).pipe(map(([req, pay]) => {
return {req, pay}; return { req, pay };
}) })
); );
}, },
@@ -146,11 +156,11 @@ describe('RegistryService', () => {
DummyComponent DummyComponent
], ],
providers: [ providers: [
{provide: RequestService, useValue: getMockRequestService()}, { provide: RequestService, useValue: getMockRequestService() },
{provide: RemoteDataBuildService, useValue: rdbStub}, { provide: RemoteDataBuildService, useValue: rdbStub },
{provide: HALEndpointService, useValue: halServiceStub}, { provide: HALEndpointService, useValue: halServiceStub },
{provide: Store, useClass: MockStore}, { provide: Store, useClass: MockStore },
{provide: NotificationsService, useValue: new NotificationsServiceStub()}, { provide: NotificationsService, useValue: new NotificationsServiceStub() },
RegistryService RegistryService
] ]
}); });
@@ -165,7 +175,7 @@ describe('RegistryService', () => {
page: pageInfo page: pageInfo
}); });
const response = new RegistryMetadataschemasSuccessResponse(queryResponse, 200, 'OK', pageInfo); const response = new RegistryMetadataschemasSuccessResponse(queryResponse, 200, 'OK', pageInfo);
const responseEntry = Object.assign(new RequestEntry(), {response: response}); const responseEntry = Object.assign(new RequestEntry(), { response: response });
beforeEach(() => { beforeEach(() => {
(registryService as any).requestService.getByHref.and.returnValue(observableOf(responseEntry)); (registryService as any).requestService.getByHref.and.returnValue(observableOf(responseEntry));
@@ -194,7 +204,7 @@ describe('RegistryService', () => {
page: pageInfo page: pageInfo
}); });
const response = new RegistryMetadataschemasSuccessResponse(queryResponse, 200, 'OK', pageInfo); const response = new RegistryMetadataschemasSuccessResponse(queryResponse, 200, 'OK', pageInfo);
const responseEntry = Object.assign(new RequestEntry(), {response: response}); const responseEntry = Object.assign(new RequestEntry(), { response: response });
beforeEach(() => { beforeEach(() => {
(registryService as any).requestService.getByHref.and.returnValue(observableOf(responseEntry)); (registryService as any).requestService.getByHref.and.returnValue(observableOf(responseEntry));
@@ -223,7 +233,7 @@ describe('RegistryService', () => {
page: pageInfo page: pageInfo
}); });
const response = new RegistryMetadatafieldsSuccessResponse(queryResponse, 200, 'OK', pageInfo); const response = new RegistryMetadatafieldsSuccessResponse(queryResponse, 200, 'OK', pageInfo);
const responseEntry = Object.assign(new RequestEntry(), {response: response}); const responseEntry = Object.assign(new RequestEntry(), { response: response });
beforeEach(() => { beforeEach(() => {
(registryService as any).requestService.getByHref.and.returnValue(observableOf(responseEntry)); (registryService as any).requestService.getByHref.and.returnValue(observableOf(responseEntry));

View File

@@ -1,27 +1,27 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { TranslateModule } from '@ngx-translate/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { RouterTestingModule } from '@angular/router/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core'; import { NO_ERRORS_SCHEMA } from '@angular/core';
import { DynamicFormControlModel, DynamicFormService, DynamicInputModel } from '@ng-dynamic-forms/core'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FormControl, FormGroup } from '@angular/forms'; import { FormControl, FormGroup } from '@angular/forms';
import { Community } from '../../../core/shared/community.model'; import { By } from '@angular/platform-browser';
import { ComColFormComponent } from './comcol-form.component'; import { RouterTestingModule } from '@angular/router/testing';
import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { DynamicFormControlModel, DynamicFormService, DynamicInputModel } from '@ng-dynamic-forms/core';
import { hasValue } from '../../empty.util'; import { TranslateModule } from '@ngx-translate/core';
import { VarDirective } from '../../utils/var.directive';
import { NotificationsService } from '../../notifications/notifications.service';
import { NotificationsServiceStub } from '../../testing/notifications-service-stub';
import { AuthService } from '../../../core/auth/auth.service';
import { AuthServiceMock } from '../../mocks/mock-auth.service';
import { of as observableOf } from 'rxjs'; import { of as observableOf } from 'rxjs';
import { RemoteData } from '../../../core/data/remote-data'; import { AuthService } from '../../../core/auth/auth.service';
import { RestRequestMethod } from '../../../core/data/rest-request-method'; import { ObjectCacheService } from '../../../core/cache/object-cache.service';
import { ErrorResponse, RestResponse } from '../../../core/cache/response.models'; import { ErrorResponse, RestResponse } from '../../../core/cache/response.models';
import { RemoteData } from '../../../core/data/remote-data';
import { RequestError } from '../../../core/data/request.models'; import { RequestError } from '../../../core/data/request.models';
import { RequestService } from '../../../core/data/request.service'; import { RequestService } from '../../../core/data/request.service';
import { ObjectCacheService } from '../../../core/cache/object-cache.service'; import { RestRequestMethod } from '../../../core/data/rest-request-method';
import { By } from '@angular/platform-browser'; import { Community } from '../../../core/shared/community.model';
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { hasValue } from '../../empty.util';
import { AuthServiceMock } from '../../mocks/mock-auth.service';
import { NotificationsService } from '../../notifications/notifications.service';
import { NotificationsServiceStub } from '../../testing/notifications-service-stub';
import { VarDirective } from '../../utils/var.directive';
import { ComColFormComponent } from './comcol-form.component';
describe('ComColFormComponent', () => { describe('ComColFormComponent', () => {
let comp: ComColFormComponent<DSpaceObject>; let comp: ComColFormComponent<DSpaceObject>;
@@ -43,10 +43,10 @@ describe('ComColFormComponent', () => {
const dcRandom = 'dc.random'; const dcRandom = 'dc.random';
const dcAbstract = 'dc.description.abstract'; const dcAbstract = 'dc.description.abstract';
const titleMD = { [dcTitle]: [ { value: 'Community Title', language: null } ] }; const titleMD = { [dcTitle]: [{ value: 'Community Title', language: null }] };
const randomMD = { [dcRandom]: [ { value: 'Random metadata excluded from form', language: null } ] }; const randomMD = { [dcRandom]: [{ value: 'Random metadata excluded from form', language: null }] };
const abstractMD = { [dcAbstract]: [ { value: 'Community description', language: null } ] }; const abstractMD = { [dcAbstract]: [{ value: 'Community description', language: null }] };
const newTitleMD = { [dcTitle]: [ { value: 'New Community Title', language: null } ] }; const newTitleMD = { [dcTitle]: [{ value: 'New Community Title', language: null }] };
const formModel = [ const formModel = [
new DynamicInputModel({ new DynamicInputModel({
id: 'title', id: 'title',
@@ -96,7 +96,9 @@ describe('ComColFormComponent', () => {
describe('when the dso doesn\'t contain an ID (newly created)', () => { describe('when the dso doesn\'t contain an ID (newly created)', () => {
beforeEach(() => { beforeEach(() => {
initComponent(new Community()); initComponent(Object.assign(new Community(), {
_links: { self: { href: 'community-self' } }
}));
}); });
it('should initialize the uploadFilesOptions with a placeholder url', () => { it('should initialize the uploadFilesOptions with a placeholder url', () => {
@@ -191,7 +193,8 @@ describe('ComColFormComponent', () => {
beforeEach(() => { beforeEach(() => {
initComponent(Object.assign(new Community(), { initComponent(Object.assign(new Community(), {
id: 'community-id', id: 'community-id',
logo: observableOf(new RemoteData(false, false, true, null, undefined)) logo: observableOf(new RemoteData(false, false, true, null, undefined)),
_links: { self: { href: 'community-self' } }
})); }));
}); });
@@ -208,7 +211,8 @@ describe('ComColFormComponent', () => {
beforeEach(() => { beforeEach(() => {
initComponent(Object.assign(new Community(), { initComponent(Object.assign(new Community(), {
id: 'community-id', id: 'community-id',
logo: observableOf(new RemoteData(false, false, true, null, {})) logo: observableOf(new RemoteData(false, false, true, null, {})),
_links: { self: { href: 'community-self' } }
})); }));
}); });

View File

@@ -1,34 +1,30 @@
import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';
import { Location } from '@angular/common'; import { Location } from '@angular/common';
import { import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';
DynamicFormControlModel,
DynamicFormService,
DynamicInputModel
} from '@ng-dynamic-forms/core';
import { FormGroup } from '@angular/forms'; import { FormGroup } from '@angular/forms';
import { DynamicFormControlModel, DynamicFormService, DynamicInputModel } from '@ng-dynamic-forms/core';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { FileUploader } from 'ng2-file-upload';
import { combineLatest as observableCombineLatest } from 'rxjs';
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
import { Subscription } from 'rxjs/internal/Subscription';
import { AuthService } from '../../../core/auth/auth.service';
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
import { ErrorResponse, RestResponse } from '../../../core/cache/response.models';
import { ComColDataService } from '../../../core/data/comcol-data.service';
import { RemoteData } from '../../../core/data/remote-data';
import { RequestService } from '../../../core/data/request.service';
import { RestRequestMethod } from '../../../core/data/rest-request-method';
import { Bitstream } from '../../../core/shared/bitstream.model';
import { Collection } from '../../../core/shared/collection.model';
import { Community } from '../../../core/shared/community.model';
import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { MetadataMap, MetadataValue } from '../../../core/shared/metadata.models'; import { MetadataMap, MetadataValue } from '../../../core/shared/metadata.models';
import { ResourceType } from '../../../core/shared/resource-type'; import { ResourceType } from '../../../core/shared/resource-type';
import { hasValue, isNotEmpty } from '../../empty.util'; import { hasValue, isNotEmpty } from '../../empty.util';
import { UploaderOptions } from '../../uploader/uploader-options.model';
import { NotificationsService } from '../../notifications/notifications.service'; import { NotificationsService } from '../../notifications/notifications.service';
import { ComColDataService } from '../../../core/data/comcol-data.service'; import { UploaderOptions } from '../../uploader/uploader-options.model';
import { Subscription } from 'rxjs/internal/Subscription';
import { AuthService } from '../../../core/auth/auth.service';
import { Community } from '../../../core/shared/community.model';
import { Collection } from '../../../core/shared/collection.model';
import { UploaderComponent } from '../../uploader/uploader.component'; import { UploaderComponent } from '../../uploader/uploader.component';
import { FileUploader } from 'ng2-file-upload';
import { ErrorResponse, RestResponse } from '../../../core/cache/response.models';
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
import { RemoteData } from '../../../core/data/remote-data';
import { Bitstream } from '../../../core/shared/bitstream.model';
import { combineLatest as observableCombineLatest } from 'rxjs';
import { RestRequestMethod } from '../../../core/data/rest-request-method';
import { RequestService } from '../../../core/data/request.service';
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
/** /**
* A form for creating and editing Communities or Collections * A form for creating and editing Communities or Collections
@@ -253,8 +249,8 @@ export class ComColFormComponent<T extends DSpaceObject> implements OnInit, OnDe
* Refresh the object's cache to ensure the latest version * Refresh the object's cache to ensure the latest version
*/ */
private refreshCache() { private refreshCache() {
this.requestService.removeByHrefSubstring(this.dso.self); this.requestService.removeByHrefSubstring(this.dso._links.self.href);
this.objectCache.remove(this.dso.self); this.objectCache.remove(this.dso._links.self.href);
} }
/** /**

View File

@@ -1,19 +1,18 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Community } from '../../../core/shared/community.model'; import { Router } from '@angular/router';
import { CommunityDataService } from '../../../core/data/community-data.service';
import { Observable } from 'rxjs';
import { RouteService } from '../../../core/services/route.service';
import { ActivatedRoute, Router } from '@angular/router';
import { RemoteData } from '../../../core/data/remote-data';
import { hasValue, isNotEmpty, isNotUndefined } from '../../empty.util';
import { take } from 'rxjs/operators';
import { getSucceededRemoteData } from '../../../core/shared/operators';
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { DataService } from '../../../core/data/data.service';
import { ComColDataService } from '../../../core/data/comcol-data.service';
import { NotificationsService } from '../../notifications/notifications.service';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { Observable } from 'rxjs';
import { take } from 'rxjs/operators';
import { ComColDataService } from '../../../core/data/comcol-data.service';
import { CommunityDataService } from '../../../core/data/community-data.service';
import { RemoteData } from '../../../core/data/remote-data';
import { RouteService } from '../../../core/services/route.service';
import { Community } from '../../../core/shared/community.model';
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { getSucceededRemoteData } from '../../../core/shared/operators';
import { ResourceType } from '../../../core/shared/resource-type'; import { ResourceType } from '../../../core/shared/resource-type';
import { hasValue, isNotEmpty, isNotUndefined } from '../../empty.util';
import { NotificationsService } from '../../notifications/notifications.service';
/** /**
* Component representing the create page for communities and collections * Component representing the create page for communities and collections

View File

@@ -0,0 +1,9 @@
import { LinkService } from '../../core/cache/builders/link.service';
export function getMockLinkService(): LinkService {
return jasmine.createSpyObj('linkService', {
resolveLinks: jasmine.createSpy('resolveLinks'),
resolveLink: jasmine.createSpy('resolveLink'),
removeResolvedLinks: jasmine.createSpy('removeResolvedLinks')
});
}

View File

@@ -1,16 +1,19 @@
import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { cold } from 'jasmine-marbles';
import { of as observableOf } from 'rxjs'; import { of as observableOf } from 'rxjs';
import { LinkService } from '../../../../core/cache/builders/link.service';
import { ItemDataService } from '../../../../core/data/item-data.service';
import { Item } from '../../../../core/shared/item.model'; import { Item } from '../../../../core/shared/item.model';
import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
import { WorkflowItemSearchResultListElementComponent } from './workflow-item-search-result-list-element.component';
import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflow-item-search-result.model'; import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflow-item-search-result.model';
import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
import { TruncatableService } from '../../../truncatable/truncatable.service'; import { TruncatableService } from '../../../truncatable/truncatable.service';
import { WorkflowItemSearchResultListElementComponent } from './workflow-item-search-result-list-element.component';
let component: WorkflowItemSearchResultListElementComponent; let component: WorkflowItemSearchResultListElementComponent;
let fixture: ComponentFixture<WorkflowItemSearchResultListElementComponent>; let fixture: ComponentFixture<WorkflowItemSearchResultListElementComponent>;
@@ -52,13 +55,22 @@ const item = Object.assign(new Item(), {
const rd = createSuccessfulRemoteDataObject(item); const rd = createSuccessfulRemoteDataObject(item);
mockResultObject.indexableObject = Object.assign(new WorkflowItem(), { item: observableOf(rd) }); mockResultObject.indexableObject = Object.assign(new WorkflowItem(), { item: observableOf(rd) });
let linkService;
describe('WorkflowItemSearchResultListElementComponent', () => { describe('WorkflowItemSearchResultListElementComponent', () => {
beforeEach(async(() => { beforeEach(async(() => {
linkService = {
resolveLink() {
// mock
},
};
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [NoopAnimationsModule], imports: [NoopAnimationsModule],
declarations: [WorkflowItemSearchResultListElementComponent], declarations: [WorkflowItemSearchResultListElementComponent],
providers: [ providers: [
{ provide: TruncatableService, useValue: {} }, { provide: TruncatableService, useValue: {} },
{ provide: ItemDataService, useValue: {} },
{ provide: LinkService, useValue: linkService },
], ],
schemas: [NO_ERRORS_SCHEMA] schemas: [NO_ERRORS_SCHEMA]
}).overrideComponent(WorkflowItemSearchResultListElementComponent, { }).overrideComponent(WorkflowItemSearchResultListElementComponent, {
@@ -77,7 +89,7 @@ describe('WorkflowItemSearchResultListElementComponent', () => {
}); });
it('should init item properly', () => { it('should init item properly', () => {
expect(component.item).toEqual(item); expect(component.item$).toBeObservable(cold('a',{a: item}));
}); });
it('should have properly status', () => { it('should have properly status', () => {

View File

@@ -3,14 +3,17 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { of as observableOf } from 'rxjs'; import { of as observableOf } from 'rxjs';
import { LinkService } from '../../../../core/cache/builders/link.service';
import { ItemDataService } from '../../../../core/data/item-data.service';
import { Item } from '../../../../core/shared/item.model'; import { Item } from '../../../../core/shared/item.model';
import { WorkspaceItemSearchResultListElementComponent } from './workspace-item-search-result-list-element.component';
import { WorkspaceItem } from '../../../../core/submission/models/workspaceitem.model'; import { WorkspaceItem } from '../../../../core/submission/models/workspaceitem.model';
import { getMockLinkService } from '../../../mocks/mock-link-service';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflow-item-search-result.model'; import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflow-item-search-result.model';
import { createSuccessfulRemoteDataObject } from '../../../testing/utils';
import { TruncatableService } from '../../../truncatable/truncatable.service'; import { TruncatableService } from '../../../truncatable/truncatable.service';
import { WorkspaceItemSearchResultListElementComponent } from './workspace-item-search-result-list-element.component';
let component: WorkspaceItemSearchResultListElementComponent; let component: WorkspaceItemSearchResultListElementComponent;
let fixture: ComponentFixture<WorkspaceItemSearchResultListElementComponent>; let fixture: ComponentFixture<WorkspaceItemSearchResultListElementComponent>;
@@ -51,14 +54,18 @@ const item = Object.assign(new Item(), {
}); });
const rd = createSuccessfulRemoteDataObject(item); const rd = createSuccessfulRemoteDataObject(item);
mockResultObject.indexableObject = Object.assign(new WorkspaceItem(), { item: observableOf(rd) }); mockResultObject.indexableObject = Object.assign(new WorkspaceItem(), { item: observableOf(rd) });
let linkService;
describe('WorkspaceItemSearchResultListElementComponent', () => { describe('WorkspaceItemSearchResultListElementComponent', () => {
beforeEach(async(() => { beforeEach(async(() => {
linkService = getMockLinkService;
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [NoopAnimationsModule], imports: [NoopAnimationsModule],
declarations: [WorkspaceItemSearchResultListElementComponent], declarations: [WorkspaceItemSearchResultListElementComponent],
providers: [ providers: [
{ provide: TruncatableService, useValue: {} }, { provide: TruncatableService, useValue: {} },
{ provide: ItemDataService, useValue: {} },
{ provide: LinkService, useValue: linkService },
], ],
schemas: [NO_ERRORS_SCHEMA] schemas: [NO_ERRORS_SCHEMA]
}).overrideComponent(WorkspaceItemSearchResultListElementComponent, { }).overrideComponent(WorkspaceItemSearchResultListElementComponent, {
@@ -77,10 +84,12 @@ describe('WorkspaceItemSearchResultListElementComponent', () => {
}); });
it('should init item properly', () => { it('should init item properly', () => {
expect(component.item).toEqual(item); expect(linkService.resolveLink).toHaveBeenCalled();
expect(component.item$).toEqual(observableOf(item));
}); });
it('should have properly status', () => { it('should have properly status', () => {
expect(linkService.resolveLink).toHaveBeenCalled();
expect(component.status).toEqual(MyDspaceItemStatusType.WORKSPACE); expect(component.status).toEqual(MyDspaceItemStatusType.WORKSPACE);
}); });
}); });