[CST-4981] fixed and finished unit testing

This commit is contained in:
Rezart Vata
2021-12-23 21:59:24 +01:00
parent e594cabe4a
commit 12ab877ae4
9 changed files with 87 additions and 53 deletions

View File

@@ -18,6 +18,8 @@ import { ActivatedRoute } from '@angular/router';
import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import createSpy = jasmine.createSpy; import createSpy = jasmine.createSpy;
import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils';
import { Item } from '../../core/shared/item.model';
describe('AdminSidebarComponent', () => { describe('AdminSidebarComponent', () => {
let comp: AdminSidebarComponent; let comp: AdminSidebarComponent;
@@ -26,6 +28,28 @@ describe('AdminSidebarComponent', () => {
let authorizationService: AuthorizationDataService; let authorizationService: AuthorizationDataService;
let scriptService; let scriptService;
const mockItem = Object.assign(new Item(), {
id: 'fake-id',
uuid: 'fake-id',
handle: 'fake/handle',
lastModified: '2018',
_links: {
self: {
href: 'https://localhost:8000/items/fake-id'
}
}
});
const routeStub = {
data: observableOf({
dso: createSuccessfulRemoteDataObject(mockItem)
}),
children: []
};
beforeEach(waitForAsync(() => { beforeEach(waitForAsync(() => {
authorizationService = jasmine.createSpyObj('authorizationService', { authorizationService = jasmine.createSpyObj('authorizationService', {
isAuthorized: observableOf(true) isAuthorized: observableOf(true)
@@ -42,6 +66,7 @@ describe('AdminSidebarComponent', () => {
{ provide: ActivatedRoute, useValue: {} }, { provide: ActivatedRoute, useValue: {} },
{ provide: AuthorizationDataService, useValue: authorizationService }, { provide: AuthorizationDataService, useValue: authorizationService },
{ provide: ScriptDataService, useValue: scriptService }, { provide: ScriptDataService, useValue: scriptService },
{ provide: ActivatedRoute, useValue: routeStub },
{ {
provide: NgbModal, useValue: { provide: NgbModal, useValue: {
open: () => {/*comment*/ open: () => {/*comment*/
@@ -229,19 +254,19 @@ describe('AdminSidebarComponent', () => {
it('should contain site admin section', () => { it('should contain site admin section', () => {
expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({
id: 'admin_search', visible: true, id: 'admin_search', visible: true,
})); }));
expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({
id: 'registries', visible: true, id: 'registries', visible: true,
})); }));
expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({
parentID: 'registries', visible: true, parentID: 'registries', visible: true,
})); }));
expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({
id: 'curation_tasks', visible: true, id: 'curation_tasks', visible: true,
})); }));
expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({
id: 'workflow', visible: true, id: 'workflow', visible: true,
})); }));
}); });
}); });
@@ -259,7 +284,7 @@ describe('AdminSidebarComponent', () => {
it('should show edit_community', () => { it('should show edit_community', () => {
expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({
id: 'edit_community', visible: true, id: 'edit_community', visible: true,
})); }));
}); });
}); });
@@ -277,7 +302,7 @@ describe('AdminSidebarComponent', () => {
it('should show edit_collection', () => { it('should show edit_collection', () => {
expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({
id: 'edit_collection', visible: true, id: 'edit_collection', visible: true,
})); }));
}); });
}); });
@@ -295,10 +320,10 @@ describe('AdminSidebarComponent', () => {
it('should show access control section', () => { it('should show access control section', () => {
expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({
id: 'access_control', visible: true, id: 'access_control', visible: true,
})); }));
expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({
parentID: 'access_control', visible: true, parentID: 'access_control', visible: true,
})); }));
}); });
}); });

View File

@@ -2,8 +2,8 @@ import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { first, map } from 'rxjs/operators'; import { first, map } from 'rxjs/operators';
import { RemoteData } from 'src/app/core/data/remote-data'; import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { DSpaceObject } from 'src/app/core/shared/dspace-object.model'; import { RemoteData } from '../../../core/data/remote-data';
@Component({ @Component({
selector: 'ds-community-authorizations', selector: 'ds-community-authorizations',

View File

@@ -13,10 +13,39 @@ import { MenuService } from '../shared/menu/menu.service';
import { MenuServiceStub } from '../shared/testing/menu-service.stub'; import { MenuServiceStub } from '../shared/testing/menu-service.stub';
import { ActivatedRoute } from '@angular/router'; import { ActivatedRoute } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { Item } from '../core/shared/item.model';
import { createSuccessfulRemoteDataObject } from '../shared/remote-data.utils';
import { By } from '@angular/platform-browser';
import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service';
let comp: NavbarComponent; let comp: NavbarComponent;
let fixture: ComponentFixture<NavbarComponent>; let fixture: ComponentFixture<NavbarComponent>;
const authorizationService = jasmine.createSpyObj('authorizationService', {
isAuthorized: observableOf(true)
});
const mockItem = Object.assign(new Item(), {
id: 'fake-id',
uuid: 'fake-id',
handle: 'fake/handle',
lastModified: '2018',
_links: {
self: {
href: 'https://localhost:8000/items/fake-id'
}
}
});
const routeStub = {
data: observableOf({
dso: createSuccessfulRemoteDataObject(mockItem)
}),
children: []
};
describe('NavbarComponent', () => { describe('NavbarComponent', () => {
const menuService = new MenuServiceStub(); const menuService = new MenuServiceStub();
@@ -33,7 +62,8 @@ describe('NavbarComponent', () => {
Injector, Injector,
{ provide: MenuService, useValue: menuService }, { provide: MenuService, useValue: menuService },
{ provide: HostWindowService, useValue: new HostWindowServiceStub(800) }, { provide: HostWindowService, useValue: new HostWindowServiceStub(800) },
{ provide: ActivatedRoute, useValue: {} } { provide: AuthorizationDataService, useValue: authorizationService },
{ provide: ActivatedRoute, useValue: routeStub },
], ],
schemas: [NO_ERRORS_SCHEMA] schemas: [NO_ERRORS_SCHEMA]
}) })
@@ -42,7 +72,6 @@ describe('NavbarComponent', () => {
// synchronous beforeEach // synchronous beforeEach
beforeEach(() => { beforeEach(() => {
spyOn(menuService, 'getMenuTopSections').and.returnValue(observableOf([]));
fixture = TestBed.createComponent(NavbarComponent); fixture = TestBed.createComponent(NavbarComponent);
@@ -53,4 +82,6 @@ describe('NavbarComponent', () => {
it('should create', () => { it('should create', () => {
expect(comp).toBeTruthy(); expect(comp).toBeTruthy();
}); });
}); });

View File

@@ -7,11 +7,8 @@ import { TextMenuItemModel } from '../shared/menu/menu-item/models/text.model';
import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model';
import { HostWindowService } from '../shared/host-window.service'; import { HostWindowService } from '../shared/host-window.service';
import { environment } from '../../environments/environment'; import { environment } from '../../environments/environment';
import { AuthorizationDataService } from 'src/app/core/data/feature-authorization/authorization-data.service'; import { ActivatedRoute } from '@angular/router';
import { Router, ActivatedRoute } from '@angular/router'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service';
import { map, take } from 'rxjs/operators';
import { RemoteData } from '../core/data/remote-data';
import { Collection } from 'src/app/core/shared/collection.model';
/** /**
* Component representing the public navbar * Component representing the public navbar

View File

@@ -10,9 +10,9 @@ import { MenuSection } from './menu.reducer';
import { Router, ActivatedRoute } from '@angular/router'; import { Router, ActivatedRoute } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing'; import { RouterTestingModule } from '@angular/router/testing';
import { MenuID } from './initial-menus-state'; import { MenuID } from './initial-menus-state';
import { AuthorizationDataService } from 'src/app/core/data/feature-authorization/authorization-data.service';
import { createSuccessfulRemoteDataObject } from 'src/app/shared/remote-data.utils';
import { Item } from '../../core/shared/item.model'; import { Item } from '../../core/shared/item.model';
import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
import { createSuccessfulRemoteDataObject } from '../remote-data.utils';
describe('MenuComponent', () => { describe('MenuComponent', () => {
let comp: MenuComponent; let comp: MenuComponent;
@@ -22,6 +22,8 @@ describe('MenuComponent', () => {
const mockMenuID = 'mock-menuID' as MenuID; const mockMenuID = 'mock-menuID' as MenuID;
const mockStatisticSection = { 'id': 'statistics_site', 'active': true, 'visible': true, 'index': 2, 'type': 'statistics', 'model': { 'type': 1, 'text': 'menu.section.statistics', 'link': 'statistics' } };
const authorizationService = jasmine.createSpyObj('authorizationService', { const authorizationService = jasmine.createSpyObj('authorizationService', {
isAuthorized: observableOf(true) isAuthorized: observableOf(true)
}); });
@@ -38,6 +40,7 @@ describe('MenuComponent', () => {
} }
}); });
const routeStub = { const routeStub = {
data: observableOf({ data: observableOf({
dso: createSuccessfulRemoteDataObject(mockItem) dso: createSuccessfulRemoteDataObject(mockItem)
@@ -125,36 +128,15 @@ describe('MenuComponent', () => {
}); });
describe('when unauthorized statistics', () => { describe('when unauthorized statistics', () => {
it('should get observable of empty object', () => {
beforeEach(() => { expect(comp.getAuthorizedStatistics(mockStatisticSection)).toBeObservable({});
comp.sections = observableOf([{ 'id': 'browse_global_communities_and_collections', 'active': false, 'visible': true, 'index': 0, 'model': { 'type': 1, 'text': 'menu.section.browse_global_communities_and_collections', 'link': '/community-list' }, 'shouldPersistOnRouteChange': true }, { 'id': 'browse_global', 'active': false, 'visible': true, 'index': 1, 'model': { 'type': 0, 'text': 'menu.section.browse_global' }, 'shouldPersistOnRouteChange': true }, { 'id': 'statistics_site', 'active': true, 'visible': true, 'index': 2, 'type': 'statistics', 'model': { 'type': 1, 'text': 'menu.section.statistics', 'link': 'statistics' } }]);
authorizationService.isAuthorized().and.returnValue(observableOf(false));
fixture.detectChanges();
}); });
it('when authorized statistics', (done => {
comp.sections.subscribe((sections) => {
expect(sections.length).toEqual(2);
done();
});
}));
}); });
describe('get authorized statistics', () => { describe('get authorized statistics', () => {
it('should get observable of empty object', () => {
beforeEach(() => { expect(comp.getAuthorizedStatistics(mockStatisticSection)).toBeObservable(mockStatisticSection);
comp.sections = observableOf([{ 'id': 'browse_global_communities_and_collections', 'active': false, 'visible': true, 'index': 0, 'model': { 'type': 1, 'text': 'menu.section.browse_global_communities_and_collections', 'link': '/community-list' }, 'shouldPersistOnRouteChange': true }, { 'id': 'browse_global', 'active': false, 'visible': true, 'index': 1, 'model': { 'type': 0, 'text': 'menu.section.browse_global' }, 'shouldPersistOnRouteChange': true }, { 'id': 'statistics_site', 'active': true, 'visible': true, 'index': 2, 'type': 'statistics', 'model': { 'type': 1, 'text': 'menu.section.statistics', 'link': 'statistics' } }]);
fixture.detectChanges();
}); });
it('get authorized statistics', (done => {
comp.sections.subscribe((sections) => {
expect(sections.length).toEqual(3);
done();
});
}));
}); });
}); });

View File

@@ -9,9 +9,9 @@ import { hasValue, isNotEmpty, hasValueOperator, isNotEmptyOperator } from '../e
import { MenuSectionComponent } from './menu-section/menu-section.component'; import { MenuSectionComponent } from './menu-section/menu-section.component';
import { getComponentForMenu } from './menu-section.decorator'; import { getComponentForMenu } from './menu-section.decorator';
import { compareArraysUsingIds } from '../../item-page/simple/item-types/shared/item-relationships-utils'; import { compareArraysUsingIds } from '../../item-page/simple/item-types/shared/item-relationships-utils';
import { AuthorizationDataService } from 'src/app/core/data/feature-authorization/authorization-data.service'; import { ActivatedRoute } from '@angular/router';
import { FeatureID } from 'src/app/core/data/feature-authorization/feature-id'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
import { Router, ActivatedRoute } from '@angular/router'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
/** /**
* A basic implementation of a MenuComponent * A basic implementation of a MenuComponent
@@ -87,7 +87,6 @@ export class MenuComponent implements OnInit, OnDestroy {
this.subs.push( this.subs.push(
this.sections.pipe( this.sections.pipe(
tap(t => console.log(t)),
// if you return an array from a switchMap it will emit each element as a separate event. // if you return an array from a switchMap it will emit each element as a separate event.
// So this switchMap is equivalent to a subscribe with a forEach inside // So this switchMap is equivalent to a subscribe with a forEach inside
switchMap((sections: MenuSection[]) => sections), switchMap((sections: MenuSection[]) => sections),

View File

@@ -32,13 +32,13 @@ import { RESOURCE_POLICY } from '../../../core/resource-policy/models/resource-p
import { EPersonMock } from '../../testing/eperson.mock'; import { EPersonMock } from '../../testing/eperson.mock';
import { isNotEmptyOperator } from '../../empty.util'; import { isNotEmptyOperator } from '../../empty.util';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { RemoteData } from 'src/app/core/data/remote-data';
import { RouterMock } from '../../mocks/router.mock'; import { RouterMock } from '../../mocks/router.mock';
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { PaginationServiceStub } from '../../testing/pagination-service.stub'; import { PaginationServiceStub } from '../../testing/pagination-service.stub';
import { PaginationService } from 'src/app/core/pagination/pagination.service';
import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { StoreMock } from '../../testing/store.mock'; import { StoreMock } from '../../testing/store.mock';
import { RemoteData } from '../../../core/data/remote-data';
import { PaginationService } from '../../../core/pagination/pagination.service';
export const mockResourcePolicyFormData = { export const mockResourcePolicyFormData = {
name: [ name: [

View File

@@ -10,7 +10,7 @@ import { ThemedCommunityStatisticsPageComponent } from './community-statistics-p
import { ThemedItemStatisticsPageComponent } from './item-statistics-page/themed-item-statistics-page.component'; import { ThemedItemStatisticsPageComponent } from './item-statistics-page/themed-item-statistics-page.component';
import { ThemedSiteStatisticsPageComponent } from './site-statistics-page/themed-site-statistics-page.component'; import { ThemedSiteStatisticsPageComponent } from './site-statistics-page/themed-site-statistics-page.component';
import { ItemResolver } from '../item-page/item.resolver'; import { ItemResolver } from '../item-page/item.resolver';
import { StatisticsAdministratorGuard } from 'src/app/core/data/feature-authorization/feature-authorization-guard/statistics-administrator.guard'; import { StatisticsAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/statistics-administrator.guard';
@NgModule({ @NgModule({
imports: [ imports: [

View File

@@ -15,6 +15,6 @@ getTestBed().initTestEnvironment(
platformBrowserDynamicTesting() platformBrowserDynamicTesting()
); );
// Then we find all the tests. // Then we find all the tests.
const context = require.context('./app/shared/menu', true, /\.spec\.ts$/); const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules. // And load the modules.
context.keys().map(context); context.keys().map(context);