From dcb80b7c9c950f49de7815fc65732769263f2bb6 Mon Sep 17 00:00:00 2001 From: Bruno Roemers Date: Wed, 1 Dec 2021 15:56:49 +0100 Subject: [PATCH] 85192: Write test for themed browse entries --- .../browse-by/browse-by.component.spec.ts | 90 ++++++++++++++++++- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/src/app/shared/browse-by/browse-by.component.spec.ts b/src/app/shared/browse-by/browse-by.component.spec.ts index 806f4bdb6f..31c4feb8bd 100644 --- a/src/app/shared/browse-by/browse-by.component.spec.ts +++ b/src/app/shared/browse-by/browse-by.component.spec.ts @@ -2,7 +2,7 @@ import { BrowseByComponent } from './browse-by.component'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { By } from '@angular/platform-browser'; -import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; import { of as observableOf } from 'rxjs'; import { SharedModule } from '../shared.module'; import { CommonModule } from '@angular/common'; @@ -18,9 +18,24 @@ import { PaginationComponentOptions } from '../pagination/pagination-component-o import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; import { storeModuleConfig } from '../../app.reducer'; -import { FindListOptions } from '../../core/data/request.models'; import { PaginationService } from '../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../testing/pagination-service.stub'; +import { ListableObjectComponentLoaderComponent } from '../object-collection/shared/listable-object/listable-object-component-loader.component'; +import { ViewMode } from '../../core/shared/view-mode.model'; +import { BrowseEntryListElementComponent } from '../object-list/browse-entry-list-element/browse-entry-list-element.component'; +import { listableObjectComponent } from '../object-collection/shared/listable-object/listable-object.decorator'; +import { BrowseEntry } from '../../core/shared/browse-entry.model'; +import { ITEM } from '../../core/shared/item.resource-type'; +import { DEFAULT_CONTEXT } from '../metadata-representation/metadata-representation.decorator'; +import { ThemeService } from '../theme-support/theme.service'; +import SpyObj = jasmine.SpyObj; + +@listableObjectComponent(BrowseEntry, ViewMode.ListElement, DEFAULT_CONTEXT, 'custom') +@Component({ + selector: 'ds-browse-entry-list-element', + template: '' +}) +class MockThemedBrowseEntryListElementComponent {} describe('BrowseByComponent', () => { let comp: BrowseByComponent; @@ -56,7 +71,11 @@ describe('BrowseByComponent', () => { }); const paginationService = new PaginationServiceStub(paginationConfig); + let themeService: SpyObj; + beforeEach(waitForAsync(() => { + themeService = jasmine.createSpyObj('ThemeService', ['getThemeName', 'getThemeName$']); + TestBed.configureTestingModule({ imports: [ CommonModule, @@ -75,7 +94,9 @@ describe('BrowseByComponent', () => { ], declarations: [], providers: [ - {provide: PaginationService, useValue: paginationService} + {provide: PaginationService, useValue: paginationService}, + {provide: MockThemedBrowseEntryListElementComponent}, + {provide: ThemeService, useValue: themeService}, ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); @@ -163,4 +184,67 @@ describe('BrowseByComponent', () => { }); }); + describe('when enableArrows is true and browseEntries are provided', () => { + let browseEntries; + + beforeEach(() => { + browseEntries = [ + Object.assign(new BrowseEntry(), { + type: ITEM, + authority: 'authority key 1', + value: 'browse entry 1', + language: null, + count: 1, + }), + Object.assign(new BrowseEntry(), { + type: ITEM, + authority: null, + value: 'browse entry 2', + language: null, + count: 4, + }), + ]; + + comp.enableArrows = true; + comp.objects$ = createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), browseEntries)); + comp.paginationConfig = paginationConfig; + comp.sortConfig = Object.assign(new SortOptions('dc.title', SortDirection.ASC)); + // NOTE: do NOT trigger change detection until the theme is set, such that the theme can be picked up as well + }); + + describe('when theme is base', () => { + beforeEach(() => { + themeService.getThemeName.and.returnValue('base'); + themeService.getThemeName$.and.returnValue(observableOf('base')); + fixture.detectChanges(); + }); + + it('should use the base component to render browse entries', () => { + const componentLoaders = fixture.debugElement.queryAll(By.directive(ListableObjectComponentLoaderComponent)); + expect(componentLoaders.length).toEqual(browseEntries.length); + componentLoaders.forEach((componentLoader) => { + const browseEntry = componentLoader.query(By.css('ds-browse-entry-list-element')); + expect(browseEntry.componentInstance).toBeInstanceOf(BrowseEntryListElementComponent); + }); + }); + }); + + describe('when theme is custom', () => { + beforeEach(() => { + themeService.getThemeName.and.returnValue('custom'); + themeService.getThemeName$.and.returnValue(observableOf('custom')); + fixture.detectChanges(); + }); + + it('should use the themed component to render browse entries', () => { + const componentLoaders = fixture.debugElement.queryAll(By.directive(ListableObjectComponentLoaderComponent)); + expect(componentLoaders.length).toEqual(browseEntries.length); + componentLoaders.forEach((componentLoader) => { + const browseEntry = componentLoader.query(By.css('ds-browse-entry-list-element')); + expect(browseEntry.componentInstance).toBeInstanceOf(MockThemedBrowseEntryListElementComponent); + }); + }); + }); + }); + });