mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
test fixes
This commit is contained in:
@@ -51,7 +51,7 @@ module.exports = function (config) {
|
||||
*/
|
||||
files: [{
|
||||
pattern: './spec-bundle.js',
|
||||
watched: false
|
||||
watched: false,
|
||||
}],
|
||||
|
||||
/*
|
||||
|
@@ -10,17 +10,21 @@ import { ViewMode } from '../../+search-page/search-options.model';
|
||||
import { RouteService } from '../../shared/route.service';
|
||||
import { GLOBAL_CONFIG } from '../../../config';
|
||||
import { RemoteDataBuildService } from '../../core/cache/builders/remote-data-build.service';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { RequestService } from '../../core/data/request.service';
|
||||
import { ResponseCacheService } from '../../core/cache/response-cache.service';
|
||||
import { ActivatedRouteStub } from '../../shared/testing/active-router-stub';
|
||||
import { RouterStub } from '../../shared/testing/router-stub';
|
||||
|
||||
@Component({ template: '' })
|
||||
class DummyComponent { }
|
||||
class DummyComponent {
|
||||
}
|
||||
|
||||
describe('SearchService', () => {
|
||||
describe('By default', () => {
|
||||
let searchService: SearchService;
|
||||
|
||||
const router = new RouterStub();
|
||||
const route = new ActivatedRouteStub();
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [
|
||||
@@ -37,32 +41,80 @@ describe('SearchService', () => {
|
||||
{ provide: RouteService, useValue: {} },
|
||||
{ provide: ResponseCacheService, useValue: {} },
|
||||
{ provide: RequestService, useValue: {} },
|
||||
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
|
||||
{ provide: ActivatedRoute, useValue: route },
|
||||
{ provide: RemoteDataBuildService, useValue: {} },
|
||||
{ provide: GLOBAL_CONFIG, useValue: {} },
|
||||
{ provide: Router, useValue: router },
|
||||
SearchService
|
||||
],
|
||||
});
|
||||
searchService = TestBed.get(SearchService);
|
||||
});
|
||||
|
||||
it('should return list view mode by default', () => {
|
||||
it('should return list view mode', () => {
|
||||
searchService.getViewMode().subscribe((viewMode) => {
|
||||
expect(viewMode).toBe(ViewMode.List);
|
||||
});
|
||||
});
|
||||
|
||||
it('should return the view mode set through setViewMode', fakeAsync(() => {
|
||||
searchService.setViewMode(ViewMode.Grid)
|
||||
tick();
|
||||
let viewMode = ViewMode.List;
|
||||
searchService.getViewMode().subscribe((mode) => viewMode = mode);
|
||||
expect(viewMode).toBe(ViewMode.Grid);
|
||||
|
||||
searchService.setViewMode(ViewMode.List)
|
||||
tick();
|
||||
searchService.getViewMode().subscribe((mode) => viewMode = mode);
|
||||
expect(viewMode).toBe(ViewMode.List);
|
||||
}));
|
||||
|
||||
});
|
||||
describe('', () => {
|
||||
let searchService: SearchService;
|
||||
const router = new RouterStub();
|
||||
const route = new ActivatedRouteStub();
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
RouterTestingModule.withRoutes([
|
||||
{ path: 'search', component: DummyComponent, pathMatch: 'full' },
|
||||
])
|
||||
],
|
||||
declarations: [
|
||||
DummyComponent
|
||||
],
|
||||
providers: [
|
||||
{ provide: ItemDataService, useValue: {} },
|
||||
{ provide: RouteService, useValue: {} },
|
||||
{ provide: ResponseCacheService, useValue: {} },
|
||||
{ provide: RequestService, useValue: {} },
|
||||
{ provide: ActivatedRoute, useValue: route },
|
||||
{ provide: RemoteDataBuildService, useValue: {} },
|
||||
{ provide: GLOBAL_CONFIG, useValue: {} },
|
||||
{ provide: Router, useValue: router },
|
||||
SearchService
|
||||
],
|
||||
});
|
||||
searchService = TestBed.get(SearchService);
|
||||
});
|
||||
|
||||
it('should call the navigate method on the Router with view mode list parameter as a parameter when setViewMode is called', () => {
|
||||
searchService.setViewMode(ViewMode.List);
|
||||
expect(router.navigate).toHaveBeenCalledWith(['/search'], {
|
||||
queryParams: { view: ViewMode.List },
|
||||
queryParamsHandling: 'merge'
|
||||
});
|
||||
});
|
||||
|
||||
it('should call the navigate method on the Router with view mode grid parameter as a parameter when setViewMode is called', () => {
|
||||
searchService.setViewMode(ViewMode.Grid);
|
||||
expect(router.navigate).toHaveBeenCalledWith(['/search'], {
|
||||
queryParams: { view: ViewMode.Grid },
|
||||
queryParamsHandling: 'merge'
|
||||
});
|
||||
});
|
||||
|
||||
it('should return ViewMode.List when the viewMode is set to ViewMode.List in the ActivatedRoute', () => {
|
||||
let viewMode = ViewMode.Grid;
|
||||
route.testParams = { view: ViewMode.List };
|
||||
searchService.getViewMode().subscribe((mode) => viewMode = mode);
|
||||
expect(viewMode).toEqual(ViewMode.List);
|
||||
});
|
||||
|
||||
it('should return ViewMode.Grid when the viewMode is set to ViewMode.Grid in the ActivatedRoute', () => {
|
||||
let viewMode = ViewMode.List;
|
||||
route.testParams = { view: ViewMode.Grid };
|
||||
searchService.getViewMode().subscribe((mode) => viewMode = mode);
|
||||
expect(viewMode).toEqual(ViewMode.Grid);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@@ -88,13 +88,13 @@ export class SearchService extends HALEndpointService implements OnDestroy {
|
||||
// searchOptions: BehaviorSubject<SearchOptions>;
|
||||
searchOptions: SearchOptions;
|
||||
|
||||
constructor(protected responseCache: ResponseCacheService,
|
||||
constructor(private router: Router,
|
||||
private route: ActivatedRoute,
|
||||
protected responseCache: ResponseCacheService,
|
||||
protected requestService: RequestService,
|
||||
@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
|
||||
private routeService: RouteService,
|
||||
private route: ActivatedRoute,
|
||||
private rdb: RemoteDataBuildService,
|
||||
private router: Router) {
|
||||
private rdb: RemoteDataBuildService,) {
|
||||
super();
|
||||
const pagination: PaginationComponentOptions = new PaginationComponentOptions();
|
||||
pagination.id = 'search-results-pagination';
|
||||
@@ -230,7 +230,8 @@ export class SearchService extends HALEndpointService implements OnDestroy {
|
||||
payload.push({
|
||||
value: value,
|
||||
count: Math.floor(Math.random() * 20) + 20 * (totalFilters - i), // make sure first results have the highest (random) count
|
||||
search: (decodeURI(this.router.url) + (this.router.url.includes('?') ? '&' : '?') + filterConfig.paramName + '=' + value)}
|
||||
search: (decodeURI(this.router.url) + (this.router.url.includes('?') ? '&' : '?') + filterConfig.paramName + '=' + value)
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -271,12 +272,12 @@ export class SearchService extends HALEndpointService implements OnDestroy {
|
||||
getClearFiltersQueryParams(): any {
|
||||
const params = {};
|
||||
this.sub = this.route.queryParamMap
|
||||
.subscribe((map) => {
|
||||
map.keys
|
||||
.subscribe((pmap) => {
|
||||
pmap.keys
|
||||
.filter((key) => this.config
|
||||
.findIndex((conf: SearchFilterConfig) => conf.paramName === key) < 0)
|
||||
.forEach((key) => {
|
||||
params[key] = map.get(key);
|
||||
params[key] = pmap.get(key);
|
||||
})
|
||||
});
|
||||
return params;
|
||||
|
@@ -154,13 +154,6 @@ export class EndpointMapRequest extends GetRequest {
|
||||
}
|
||||
}
|
||||
|
||||
export class RootEndpointRequest extends EndpointMapRequest {
|
||||
constructor(uuid: string, EnvConfig: GlobalConfig) {
|
||||
const href = new RESTURLCombiner(EnvConfig, '/').toString();
|
||||
super(uuid, href);
|
||||
}
|
||||
}
|
||||
|
||||
export class BrowseEndpointRequest extends GetRequest {
|
||||
constructor(uuid: string, href: string) {
|
||||
super(uuid, href);
|
||||
|
@@ -2,9 +2,9 @@ import { cold, hot } from 'jasmine-marbles';
|
||||
import { GlobalConfig } from '../../../config/global-config.interface';
|
||||
import { getMockRequestService } from '../../shared/mocks/mock-request.service';
|
||||
import { ResponseCacheService } from '../cache/response-cache.service';
|
||||
import { RootEndpointRequest } from '../data/request.models';
|
||||
import { RequestService } from '../data/request.service';
|
||||
import { HALEndpointService } from './hal-endpoint.service';
|
||||
import { EndpointMapRequest } from '../data/request.models';
|
||||
|
||||
describe('HALEndpointService', () => {
|
||||
let service: HALEndpointService;
|
||||
@@ -32,7 +32,7 @@ describe('HALEndpointService', () => {
|
||||
describe('getRootEndpointMap', () => {
|
||||
beforeEach(() => {
|
||||
responseCache = jasmine.createSpyObj('responseCache', {
|
||||
get: hot('--a-', {
|
||||
get: hot('a-', {
|
||||
a: {
|
||||
response: { endpointMap: endpointMap }
|
||||
}
|
||||
@@ -52,45 +52,51 @@ describe('HALEndpointService', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('should configure a new RootEndpointRequest', () => {
|
||||
it('should configure a new EndpointMapRequest', () => {
|
||||
(service as any).getRootEndpointMap();
|
||||
const expected = new RootEndpointRequest(requestService.generateRequestId(), envConfig);
|
||||
const expected = new EndpointMapRequest(requestService.generateRequestId(), envConfig.rest.baseUrl);
|
||||
expect(requestService.configure).toHaveBeenCalledWith(expected);
|
||||
});
|
||||
|
||||
it('should return an Observable of the endpoint map', () => {
|
||||
const result = (service as any).getRootEndpointMap();
|
||||
const expected = cold('--b-', { b: endpointMap });
|
||||
const expected = cold('b-', { b: endpointMap });
|
||||
expect(result).toBeObservable(expected);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('getEndpoint', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
envConfig = {
|
||||
rest: { baseUrl: 'https://rest.api/' }
|
||||
} as any;
|
||||
|
||||
service = new TestService(
|
||||
responseCache,
|
||||
requestService,
|
||||
envConfig
|
||||
);
|
||||
|
||||
spyOn(service as any, 'getRootEndpointMap').and
|
||||
.returnValue(hot('--a-', { a: endpointMap }));
|
||||
});
|
||||
|
||||
it('should return the endpoint URL for the service\'s linkPath', () => {
|
||||
spyOn(service as any, 'getEndpointAt').and
|
||||
.returnValue(hot('a-', { a: 'https://rest.api/test' }));
|
||||
const result = service.getEndpoint();
|
||||
const expected = cold('--b-', { b: endpointMap.test });
|
||||
|
||||
const expected = cold('b-', { b: endpointMap.test });
|
||||
expect(result).toBeObservable(expected);
|
||||
});
|
||||
|
||||
it('should return undefined for a linkPath that isn\'t in the endpoint map', () => {
|
||||
(service as any).linkPath = 'unknown';
|
||||
spyOn(service as any, 'getEndpointAt').and
|
||||
.returnValue(hot('a-', { a: undefined }));
|
||||
const result = service.getEndpoint();
|
||||
const expected = cold('--b-', { b: undefined });
|
||||
const expected = cold('b-', { b: undefined });
|
||||
expect(result).toBeObservable(expected);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
describe('isEnabledOnRestApi', () => {
|
||||
|
@@ -4,7 +4,7 @@ import { RequestService } from '../data/request.service';
|
||||
import { ResponseCacheService } from '../cache/response-cache.service';
|
||||
import { GlobalConfig } from '../../../config/global-config.interface';
|
||||
import { EndpointMap, EndpointMapSuccessResponse } from '../cache/response-cache.models';
|
||||
import { EndpointMapRequest, RootEndpointRequest } from '../data/request.models';
|
||||
import { EndpointMapRequest } from '../data/request.models';
|
||||
import { ResponseCacheEntry } from '../cache/response-cache.reducer';
|
||||
import { isEmpty, isNotEmpty } from '../../shared/empty.util';
|
||||
import { RESTURLCombiner } from '../url-combiner/rest-url-combiner';
|
||||
|
@@ -1,8 +1,6 @@
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
import { renderElementsFor} from '../../../object-collection/shared/dso-element-decorator';
|
||||
|
||||
|
||||
import { SearchResultGridElementComponent } from '../search-result-grid-element.component';
|
||||
import { Collection } from '../../../../core/shared/collection.model';
|
||||
import { ViewMode } from '../../../../+search-page/search-options.model';
|
||||
|
@@ -1,6 +1,4 @@
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
|
||||
import { Community } from '../../../../core/shared/community.model';
|
||||
import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
|
||||
import { SearchResultGridElementComponent } from '../search-result-grid-element.component';
|
||||
|
@@ -1,16 +1,16 @@
|
||||
import { Params } from '@angular/router';
|
||||
import { convertToParamMap, ParamMap, Params } from '@angular/router';
|
||||
|
||||
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
||||
|
||||
export class ActivatedRouteStub {
|
||||
|
||||
private _testParams?: any;
|
||||
|
||||
// ActivatedRoute.params is Observable
|
||||
private subject?: BehaviorSubject<any> = new BehaviorSubject(this.testParams);
|
||||
|
||||
params = this.subject.asObservable();
|
||||
queryParams = this.subject.asObservable();
|
||||
queryParamMap = this.subject.asObservable().map((params: Params) => convertToParamMap(params));
|
||||
|
||||
constructor(params?: Params) {
|
||||
if (params) {
|
||||
|
32
src/app/shared/testing/search-service-stub.ts
Normal file
32
src/app/shared/testing/search-service-stub.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import { Observable } from 'rxjs/Observable';
|
||||
import { ViewMode } from '../../+search-page/search-options.model';
|
||||
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
|
||||
|
||||
export class SearchServiceStub {
|
||||
|
||||
private _viewMode: ViewMode;
|
||||
private subject?: BehaviorSubject<any> = new BehaviorSubject(this.testViewMode);
|
||||
|
||||
viewMode = this.subject.asObservable();
|
||||
|
||||
constructor() {
|
||||
this.setViewMode(ViewMode.List);
|
||||
}
|
||||
|
||||
getViewMode(): Observable<ViewMode> {
|
||||
return this.viewMode;
|
||||
}
|
||||
|
||||
setViewMode(viewMode: ViewMode) {
|
||||
this.testViewMode = viewMode;
|
||||
}
|
||||
|
||||
get testViewMode(): ViewMode {
|
||||
return this._viewMode;
|
||||
}
|
||||
|
||||
set testViewMode(viewMode: ViewMode) {
|
||||
this._viewMode = viewMode;
|
||||
this.subject.next(viewMode);
|
||||
}
|
||||
}
|
@@ -4,19 +4,12 @@ import { By } from '@angular/platform-browser';
|
||||
import { MockTranslateLoader } from '../mocks/mock-translate-loader';
|
||||
import { RouterTestingModule } from '@angular/router/testing';
|
||||
|
||||
import { Component } from '@angular/core';
|
||||
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
||||
|
||||
import { SearchService } from '../../+search-page/search-service/search.service';
|
||||
import { ItemDataService } from './../../core/data/item-data.service';
|
||||
import { ViewModeSwitchComponent } from './view-mode-switch.component';
|
||||
import { ViewMode } from '../../+search-page/search-options.model';
|
||||
import { RouteService } from '../route.service';
|
||||
import { ResponseCacheService } from '../../core/cache/response-cache.service';
|
||||
import { RequestService } from '../../core/data/request.service';
|
||||
import { RemoteDataBuildService } from '../../core/cache/builders/remote-data-build.service';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { GLOBAL_CONFIG } from '../../../config';
|
||||
import { ActivatedRouteStub } from '../testing/active-router-stub';
|
||||
import { SearchServiceStub } from '../testing/search-service-stub';
|
||||
|
||||
@Component({ template: '' })
|
||||
class DummyComponent { }
|
||||
@@ -24,10 +17,9 @@ class DummyComponent { }
|
||||
describe('ViewModeSwitchComponent', () => {
|
||||
let comp: ViewModeSwitchComponent;
|
||||
let fixture: ComponentFixture<ViewModeSwitchComponent>;
|
||||
let searchService: SearchService;
|
||||
const searchService = new SearchServiceStub();
|
||||
let listButton: HTMLElement;
|
||||
let gridButton: HTMLElement;
|
||||
let route = new ActivatedRouteStub();
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [
|
||||
@@ -46,15 +38,10 @@ describe('ViewModeSwitchComponent', () => {
|
||||
DummyComponent
|
||||
],
|
||||
providers: [
|
||||
{ provide: ItemDataService, useValue: {} },
|
||||
{ provide: RouteService, useValue: {} },
|
||||
{ provide: ResponseCacheService, useValue: {} },
|
||||
{ provide: RequestService, useValue: {} },
|
||||
{ provide: ActivatedRoute, useValue: route },
|
||||
{ provide: RemoteDataBuildService, useValue: {} },
|
||||
{ provide: GLOBAL_CONFIG, useValue: {} },
|
||||
SearchService
|
||||
{ provide: SearchService, useValue: searchService },
|
||||
],
|
||||
}).overrideComponent(ViewModeSwitchComponent, {
|
||||
set: { changeDetection: ChangeDetectionStrategy.Default }
|
||||
}).compileComponents();
|
||||
}));
|
||||
|
||||
@@ -65,12 +52,10 @@ describe('ViewModeSwitchComponent', () => {
|
||||
const debugElements = fixture.debugElement.queryAll(By.css('a'));
|
||||
listButton = debugElements[0].nativeElement;
|
||||
gridButton = debugElements[1].nativeElement;
|
||||
searchService = fixture.debugElement.injector.get(SearchService);
|
||||
});
|
||||
|
||||
it('should set list button as active when on list mode', fakeAsync(() => {
|
||||
searchService.setViewMode(ViewMode.List);
|
||||
route = new ActivatedRouteStub([{view: ViewMode.List}])
|
||||
tick();
|
||||
fixture.detectChanges();
|
||||
expect(comp.currentMode).toBe(ViewMode.List);
|
||||
@@ -80,7 +65,6 @@ describe('ViewModeSwitchComponent', () => {
|
||||
|
||||
it('should set grid button as active when on grid mode', fakeAsync(() => {
|
||||
searchService.setViewMode(ViewMode.Grid);
|
||||
route = new ActivatedRouteStub([{view: ViewMode.Grid}])
|
||||
tick();
|
||||
fixture.detectChanges();
|
||||
expect(comp.currentMode).toBe(ViewMode.Grid);
|
||||
|
Reference in New Issue
Block a user