From f29e70d8a468645344b2f91ae259a4c593815661 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 15 Mar 2024 09:00:09 +0100 Subject: [PATCH 1/4] [DURACOM-191] Remove duplicated route path definition --- src/app/app-routes.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/app/app-routes.ts b/src/app/app-routes.ts index b3d5291cf2..ba322eef45 100644 --- a/src/app/app-routes.ts +++ b/src/app/app-routes.ts @@ -157,13 +157,6 @@ export const APP_ROUTES: Route[] = [ .then((m) => m.ROUTES), canActivate: [EndUserAgreementCurrentUserGuard], }, - { - path: NOTIFICATIONS_MODULE_PATH, - loadChildren: () => import('./admin/admin-notifications/admin-notifications-routes') - .then((m) => m.ROUTES), - providers: [provideSuggestionNotificationsState()], - canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard], - }, { path: NOTIFICATIONS_MODULE_PATH, loadChildren: () => import('./quality-assurance-notifications-pages/notifications-pages-routes') From f52781054564e5226ab6c53f789670b183d8d237 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 15 Mar 2024 19:46:14 +0100 Subject: [PATCH 2/4] [DURACOM-191] Fix tests --- ...s-publication-claim-page.component.spec.ts | 23 ++-- .../admin-notify-dashboard.component.spec.ts | 7 + ...-search-result-list-element.component.html | 2 +- ...arch-result-list-element.component.spec.ts | 17 ++- .../browse-by-page.component.spec.ts | 19 ++- .../core/cache/builders/link.service.spec.ts | 123 +++++++++++------- src/app/core/cache/builders/link.service.ts | 3 +- .../journal/journal.component.spec.ts | 26 +++- .../process-overview-table.component.spec.ts | 8 ++ ...-suggestion-targets-page.component.spec.ts | 6 +- .../comcol-browse-by.component.spec.ts | 24 +++- .../item/item-grid-element.component.spec.ts | 4 + 12 files changed, 186 insertions(+), 76 deletions(-) diff --git a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.spec.ts index ca39996188..ce8e846900 100644 --- a/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.spec.ts +++ b/src/app/admin/admin-notifications/admin-notifications-publication-claim-page/admin-notifications-publication-claim-page.component.spec.ts @@ -1,35 +1,40 @@ import { CommonModule } from '@angular/common'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { - async, ComponentFixture, TestBed, + waitForAsync, } from '@angular/core/testing'; import { TranslateModule } from '@ngx-translate/core'; -import { NotificationsSuggestionTargetsPageComponent } from '../../../quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component'; +import { PublicationClaimComponent } from '../../../notifications/suggestion-targets/publication-claim/publication-claim.component'; +import { AdminNotificationsPublicationClaimPageComponent } from './admin-notifications-publication-claim-page.component'; -describe('NotificationsSuggestionTargetsPageComponent', () => { - let component: NotificationsSuggestionTargetsPageComponent; - let fixture: ComponentFixture; +describe('AdminNotificationsPublicationClaimPageComponent', () => { + let component: AdminNotificationsPublicationClaimPageComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ CommonModule, TranslateModule.forRoot(), - NotificationsSuggestionTargetsPageComponent, + AdminNotificationsPublicationClaimPageComponent, ], providers: [ - NotificationsSuggestionTargetsPageComponent, + AdminNotificationsPublicationClaimPageComponent, ], schemas: [NO_ERRORS_SCHEMA], + }).overrideComponent(AdminNotificationsPublicationClaimPageComponent, { + remove: { + imports: [PublicationClaimComponent], + }, }) .compileComponents(); })); beforeEach(() => { - fixture = TestBed.createComponent(NotificationsSuggestionTargetsPageComponent); + fixture = TestBed.createComponent(AdminNotificationsPublicationClaimPageComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.spec.ts b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.spec.ts index 7d2e3204ed..a8bc2eea8e 100644 --- a/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.spec.ts +++ b/src/app/admin/admin-notify-dashboard/admin-notify-dashboard.component.spec.ts @@ -1,3 +1,4 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, @@ -11,6 +12,7 @@ import { SearchService } from '../../core/shared/search/search.service'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; import { AdminNotifyDashboardComponent } from './admin-notify-dashboard.component'; +import { AdminNotifyMetricsComponent } from './admin-notify-metrics/admin-notify-metrics.component'; import { AdminNotifyMessage } from './models/admin-notify-message.model'; import { AdminNotifySearchResult } from './models/admin-notify-message-search-result.model'; @@ -46,6 +48,11 @@ describe('AdminNotifyDashboardComponent', () => { { provide: SearchService, useValue: { search: () => createSuccessfulRemoteDataObject$(results) } }, { provide: ActivatedRoute, useValue: new ActivatedRouteStub() }, ], + schemas: [NO_ERRORS_SCHEMA], + }).overrideComponent(AdminNotifyDashboardComponent, { + remove: { + imports: [AdminNotifyMetricsComponent], + }, }) .compileComponents(); diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.html b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.html index e51e207bbe..6c8342d2e6 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.html +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.html @@ -3,7 +3,7 @@ [linkType]="linkType" [listID]="listID">
- + {{"admin.search.collection.edit" | translate}}
diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.spec.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.spec.ts index cb2f1af9b7..7a4e2da68d 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.spec.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.spec.ts @@ -19,6 +19,7 @@ import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucata import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock'; import { CollectionElementLinkType } from '../../../../../shared/object-collection/collection-element-link.type'; import { CollectionSearchResult } from '../../../../../shared/object-collection/shared/collection-search-result.model'; +import { CollectionSearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component'; import { ThemeService } from '../../../../../shared/theme-support/theme.service'; import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; import { CollectionAdminSearchResultListElementComponent } from './collection-admin-search-result-list-element.component'; @@ -51,8 +52,13 @@ describe('CollectionAdminSearchResultListElementComponent', () => { { provide: ThemeService, useValue: getMockThemeService() }, ], schemas: [NO_ERRORS_SCHEMA], - }) - .compileComponents(); + }).overrideComponent(CollectionAdminSearchResultListElementComponent, { + remove: { + imports: [ + CollectionSearchResultListElementComponent, + ], + }, + }).compileComponents(); })); beforeEach(() => { @@ -62,7 +68,7 @@ describe('CollectionAdminSearchResultListElementComponent', () => { component.linkTypes = CollectionElementLinkType; component.index = 0; component.viewModes = ViewMode; - + fixture.detectChanges(); }); it('should create', () => { @@ -70,10 +76,7 @@ describe('CollectionAdminSearchResultListElementComponent', () => { }); it('should render an edit button with the correct link', () => { - component.ngOnInit(); - fixture.detectChanges(); - - const a = fixture.debugElement.query(By.css('a')); + const a = fixture.debugElement.query(By.css('a[data-test="coll-link"]')); const link = a.nativeElement.href; expect(link).toContain(getCollectionEditRoute(id)); }); diff --git a/src/app/browse-by/browse-by-page/browse-by-page.component.spec.ts b/src/app/browse-by/browse-by-page/browse-by-page.component.spec.ts index 1b6390c541..db39793cae 100644 --- a/src/app/browse-by/browse-by-page/browse-by-page.component.spec.ts +++ b/src/app/browse-by/browse-by-page/browse-by-page.component.spec.ts @@ -8,6 +8,7 @@ import { By } from '@angular/platform-browser'; import { ActivatedRoute } from '@angular/router'; import { BrowseDefinition } from '../../core/shared/browse-definition.model'; +import { GenericConstructor } from '../../core/shared/generic-constructor'; import { DynamicComponentLoaderDirective } from '../../shared/abstract-component-loader/dynamic-component-loader.directive'; import { getMockThemeService } from '../../shared/mocks/theme-service.mock'; import { ActivatedRouteStub } from '../../shared/testing/active-router.stub'; @@ -24,6 +25,19 @@ import { BrowseByPageComponent } from './browse-by-page.component'; class BrowseByTestComponent { } +@Component({ + // eslint-disable-next-line @angular-eslint/component-selector + selector: 'ds-browse-by-switcher', + template: ``, + standalone: true, + imports: [DynamicComponentLoaderDirective], +}) +class TestBrowseBySwitcherComponent extends BrowseBySwitcherComponent { + getComponent(): GenericConstructor { + return BrowseByTestComponent; + } +} + class TestBrowseByPageBrowseDefinition extends BrowseDefinition { getRenderType(): BrowseByDataType { return 'BrowseByPageComponent' as BrowseByDataType; @@ -42,7 +56,7 @@ describe('BrowseByPageComponent', () => { themeService = getMockThemeService(); await TestBed.configureTestingModule({ - imports: [BrowseBySwitcherComponent, BrowseByPageComponent, DynamicComponentLoaderDirective], + imports: [TestBrowseBySwitcherComponent, BrowseByPageComponent, DynamicComponentLoaderDirective], providers: [ BrowseByTestComponent, { provide: ActivatedRoute, useValue: activatedRoute }, @@ -53,6 +67,9 @@ describe('BrowseByPageComponent', () => { remove: { imports: [BrowseBySwitcherComponent], }, + add: { + imports: [TestBrowseBySwitcherComponent], + }, }) .compileComponents(); diff --git a/src/app/core/cache/builders/link.service.spec.ts b/src/app/core/cache/builders/link.service.spec.ts index a6e5b24e50..a09adea8f7 100644 --- a/src/app/core/cache/builders/link.service.spec.ts +++ b/src/app/core/cache/builders/link.service.spec.ts @@ -1,14 +1,17 @@ /* eslint-disable max-classes-per-file */ import { Injectable } from '@angular/core'; import { TestBed } from '@angular/core/testing'; -import { isEmpty } from 'rxjs/operators'; +import { of } from 'rxjs'; +import { + isEmpty, + take, +} from 'rxjs/operators'; import { APP_DATA_SERVICES_MAP } from '../../../../config/app-config.interface'; import { followLink, FollowLinkConfig, } from '../../../shared/utils/follow-link-config.model'; -import { DATA_SERVICE_FACTORY } from '../../data/base/data-service.decorator'; import { FindListOptions } from '../../data/find-list-options.model'; import { HALLink } from '../../shared/hal-link.model'; import { HALResource } from '../../shared/hal-resource.model'; @@ -40,16 +43,20 @@ class TestModel implements HALResource { } @Injectable() -class TestDataService { +export class TestDataService { findListByHref(href: string, findListOptions: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]) { - return 'findListByHref'; + return of('findListByHref'); } findByHref(href: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]) { - return 'findByHref'; + return of('findByHref'); } } +const mockDataServiceMap: any = { + [TEST_MODEL.value]: () => import('./link.service.spec').then(m => m.TestDataService), +}; + let testDataService: TestDataService; let testModel: TestModel; @@ -76,35 +83,39 @@ describe('LinkService', () => { spyOn(testDataService, 'findListByHref').and.callThrough(); spyOn(testDataService, 'findByHref').and.callThrough(); TestBed.configureTestingModule({ - providers: [LinkService, { - provide: TestDataService, - useValue: testDataService, - }, { - provide: DATA_SERVICE_FACTORY, - useValue: jasmine.createSpy('getDataServiceFor').and.returnValue(TestDataService), - }, { - provide: LINK_DEFINITION_FACTORY, - useValue: jasmine.createSpy('getLinkDefinition').and.returnValue({ - resourceType: TEST_MODEL, - linkName: 'predecessor', - propertyName: 'predecessor', - }), - }, { - provide: LINK_DEFINITION_MAP_FACTORY, - useValue: jasmine.createSpy('getLinkDefinitions').and.returnValue([ - { + providers: [ + LinkService, + { + provide: TestDataService, + useValue: testDataService, + }, + { + provide: APP_DATA_SERVICES_MAP, + useValue: mockDataServiceMap, + }, + { + provide: LINK_DEFINITION_FACTORY, + useValue: jasmine.createSpy('getLinkDefinition').and.returnValue({ resourceType: TEST_MODEL, linkName: 'predecessor', propertyName: 'predecessor', - }, - { - resourceType: TEST_MODEL, - linkName: 'successor', - propertyName: 'successor', - }, - ]), - }, - { provide: APP_DATA_SERVICES_MAP, useValue: {} }, + }), + }, + { + provide: LINK_DEFINITION_MAP_FACTORY, + useValue: jasmine.createSpy('getLinkDefinitions').and.returnValue([ + { + resourceType: TEST_MODEL, + linkName: 'predecessor', + propertyName: 'predecessor', + }, + { + resourceType: TEST_MODEL, + linkName: 'successor', + propertyName: 'successor', + }, + ]), + }, ], }); service = TestBed.inject(LinkService); @@ -113,10 +124,13 @@ describe('LinkService', () => { describe('resolveLink', () => { describe(`when the linkdefinition concerns a single object`, () => { beforeEach(() => { - service.resolveLink(testModel, followLink('predecessor', {}, followLink('successor'))); + result = service.resolveLink(testModel, followLink('predecessor', {}, followLink('successor'))); }); - it('should call dataservice.findByHref with the correct href and nested links', () => { - expect(testDataService.findByHref).toHaveBeenCalledWith(testModel._links.predecessor.href, true, true, followLink('successor')); + it('should call dataservice.findByHref with the correct href and nested links', (done) => { + result.predecessor.pipe(take(1)).subscribe(() => { + expect(testDataService.findByHref).toHaveBeenCalledWith(testModel._links.predecessor.href, true, true, followLink('successor')); + done(); + }); }); }); describe(`when the linkdefinition concerns a list`, () => { @@ -127,10 +141,13 @@ describe('LinkService', () => { propertyName: 'predecessor', isList: true, }); - service.resolveLink(testModel, followLink('predecessor', { findListOptions: { some: 'options ' } as any }, followLink('successor'))); + result = service.resolveLink(testModel, followLink('predecessor', { findListOptions: { some: 'options ' } as any }, followLink('successor'))); }); - it('should call dataservice.findListByHref with the correct href, findListOptions, and nested links', () => { - expect(testDataService.findListByHref).toHaveBeenCalledWith(testModel._links.predecessor.href, { some: 'options ' } as any, true, true, followLink('successor')); + it('should call dataservice.findListByHref with the correct href, findListOptions, and nested links', (done) => { + result.predecessor.pipe(take(1)).subscribe((res) => { + expect(testDataService.findListByHref).toHaveBeenCalledWith(testModel._links.predecessor.href, { some: 'options ' } as any, true, true, followLink('successor')); + done(); + }); }); }); describe('either way', () => { @@ -142,15 +159,14 @@ describe('LinkService', () => { expect((service as any).getLinkDefinition).toHaveBeenCalledWith(testModel.constructor as any, 'predecessor'); }); - it('should call getDataServiceFor with the correct resource type', () => { - expect((service as any).getDataServiceFor).toHaveBeenCalledWith(TEST_MODEL); - }); - - it('should return the model with the resolved link', () => { + it('should return the model with the resolved link', (done) => { expect(result.type).toBe(TEST_MODEL); expect(result.value).toBe('a test value'); expect(result._links.self.href).toBe('http://self.link'); - expect(result.predecessor).toBe('findByHref'); + result.predecessor.subscribe((res) => { + expect(res).toBe('findByHref'); + done(); + }); }); }); @@ -167,12 +183,16 @@ describe('LinkService', () => { describe(`when there is no dataservice for the resourcetype in the link`, () => { beforeEach(() => { - ((service as any).getDataServiceFor as jasmine.Spy).and.returnValue(undefined); + (service as any).map = {}; }); - it('should throw an error', () => { - expect(() => { - service.resolveLink(testModel, followLink('predecessor', {}, followLink('successor'))); - }).toThrow(); + it('should throw an error', (done) => { + result = service.resolveLink(testModel, followLink('predecessor', {}, followLink('successor'))); + result.predecessor.subscribe({ + error: (error: unknown) => { + expect(error).toBeDefined(); + done(); + }, + }); }); }); }); @@ -237,8 +257,11 @@ describe('LinkService', () => { result = service.resolveLinks(testModel, followLink('predecessor')); }); - it('should return the model with the resolved link', () => { - expect(result.predecessor).toBe('findByHref'); + it('should return the model with the resolved link', (done) => { + result.predecessor.subscribe((res) => { + expect(res).toBe('findByHref'); + done(); + }); }); }); diff --git a/src/app/core/cache/builders/link.service.ts b/src/app/core/cache/builders/link.service.ts index b72e722976..b1ced76bb8 100644 --- a/src/app/core/cache/builders/link.service.ts +++ b/src/app/core/cache/builders/link.service.ts @@ -7,7 +7,6 @@ import { import { EMPTY, Observable, - of, } from 'rxjs'; import { catchError, @@ -93,7 +92,7 @@ export class LinkService { } } - return of(null); + return EMPTY; }), catchError((err: unknown) => { throw new Error(`The @link() for ${String(linkToFollow.name)} on ${model.constructor.name} models uses the resource type ${matchingLinkDef.resourceType.value.toUpperCase()}, but there is no service with an @dataService(${matchingLinkDef.resourceType.value.toUpperCase()}) annotation in order to retrieve it`); diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts index f26de22b65..1ae584455a 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts @@ -18,7 +18,10 @@ import { } from '@ngx-translate/core'; import { Observable } from 'rxjs'; -import { APP_CONFIG } from '../../../../../config/app-config.interface'; +import { + APP_CONFIG, + APP_DATA_SERVICES_MAP, +} from '../../../../../config/app-config.interface'; import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service'; import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; @@ -42,15 +45,23 @@ import { UUIDService } from '../../../../core/shared/uuid.service'; import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service'; import { MetadataValuesComponent } from '../../../../item-page/field-components/metadata-values/metadata-values.component'; import { GenericItemPageFieldComponent } from '../../../../item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; +import { ThemedItemPageTitleFieldComponent } from '../../../../item-page/simple/field-components/specific-field/title/themed-item-page-field.component'; import { mockRouteService } from '../../../../item-page/simple/item-types/shared/item.component.spec'; +import { ThemedMetadataRepresentationListComponent } from '../../../../item-page/simple/metadata-representation-list/themed-metadata-representation-list.component'; +import { TabbedRelatedEntitiesSearchComponent } from '../../../../item-page/simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component'; +import { RelatedItemsComponent } from '../../../../item-page/simple/related-items/related-items-component'; +import { DsoEditMenuComponent } from '../../../../shared/dso-page/dso-edit-menu/dso-edit-menu.component'; import { isNotEmpty } from '../../../../shared/empty.util'; +import { MetadataFieldWrapperComponent } from '../../../../shared/metadata-field-wrapper/metadata-field-wrapper.component'; import { mockTruncatableService } from '../../../../shared/mocks/mock-trucatable.service'; import { TranslateLoaderMock } from '../../../../shared/mocks/translate-loader.mock'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils'; +import { ThemedResultsBackButtonComponent } from '../../../../shared/results-back-button/themed-results-back-button.component'; import { BrowseDefinitionDataServiceStub } from '../../../../shared/testing/browse-definition-data-service.stub'; import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; +import { ThemedThumbnailComponent } from '../../../../thumbnail/themed-thumbnail.component'; import { JournalComponent } from './journal.component'; let comp: JournalComponent; @@ -121,9 +132,22 @@ describe('JournalComponent', () => { { provide: RouteService, useValue: mockRouteService }, { provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }, { provide: APP_CONFIG, useValue: {} }, + { provide: APP_DATA_SERVICES_MAP, useValue: {} }, ], schemas: [NO_ERRORS_SCHEMA], }).overrideComponent(JournalComponent, { + remove: { + imports: [ + ThemedResultsBackButtonComponent, + ThemedItemPageTitleFieldComponent, + DsoEditMenuComponent, + MetadataFieldWrapperComponent, + ThemedThumbnailComponent, + RelatedItemsComponent, + TabbedRelatedEntitiesSearchComponent, + ThemedMetadataRepresentationListComponent, + ], + }, add: { changeDetection: ChangeDetectionStrategy.Default }, }) .overrideComponent(GenericItemPageFieldComponent, { diff --git a/src/app/process-page/overview/table/process-overview-table.component.spec.ts b/src/app/process-page/overview/table/process-overview-table.component.spec.ts index f161b77ead..9684e22ce2 100644 --- a/src/app/process-page/overview/table/process-overview-table.component.spec.ts +++ b/src/app/process-page/overview/table/process-overview-table.component.spec.ts @@ -1,3 +1,4 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, @@ -19,7 +20,9 @@ import { EPersonDataService } from '../../../core/eperson/eperson-data.service'; import { EPerson } from '../../../core/eperson/models/eperson.model'; import { PaginationService } from '../../../core/pagination/pagination.service'; import { RouteService } from '../../../core/services/route.service'; +import { ThemedLoadingComponent } from '../../../shared/loading/themed-loading.component'; import { AuthServiceMock } from '../../../shared/mocks/auth.service.mock'; +import { PaginationComponent } from '../../../shared/pagination/pagination.component'; import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; import { routeServiceStub } from '../../../shared/testing/route-service.stub'; @@ -143,6 +146,11 @@ describe('ProcessOverviewTableComponent', () => { { provide: AuthService, useValue: authService }, { provide: RouteService, useValue: routeService }, ], + schemas: [NO_ERRORS_SCHEMA], + }).overrideComponent(ProcessOverviewTableComponent, { + remove: { + imports: [ PaginationComponent, ThemedLoadingComponent ], + }, }).compileComponents(); })); diff --git a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts index e744498e7f..4fa9ad9917 100644 --- a/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts +++ b/src/app/quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page.component.spec.ts @@ -1,9 +1,9 @@ import { CommonModule } from '@angular/common'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { - async, ComponentFixture, TestBed, + waitForAsync, } from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; @@ -17,7 +17,7 @@ describe('NotificationsSuggestionTargetsPageComponent', () => { let component: NotificationsSuggestionTargetsPageComponent; let fixture: ComponentFixture; - beforeEach(async(() => { + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ CommonModule, @@ -32,7 +32,7 @@ describe('NotificationsSuggestionTargetsPageComponent', () => { }) .overrideComponent(NotificationsSuggestionTargetsPageComponent, { remove: { - providers: [PublicationClaimComponent], + imports: [PublicationClaimComponent], }, }) .compileComponents(); diff --git a/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.spec.ts b/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.spec.ts index eb8a75980d..ae19914f39 100644 --- a/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.spec.ts +++ b/src/app/shared/comcol/sections/comcol-browse-by/comcol-browse-by.component.spec.ts @@ -1,5 +1,8 @@ // eslint-disable-next-line max-classes-per-file -import { Component } from '@angular/core'; +import { + Component, + NO_ERRORS_SCHEMA, +} from '@angular/core'; import { ComponentFixture, TestBed, @@ -10,6 +13,7 @@ import { ActivatedRoute } from '@angular/router'; import { BrowseByDataType } from '../../../../browse-by/browse-by-switcher/browse-by-data-type'; import { BrowseBySwitcherComponent } from '../../../../browse-by/browse-by-switcher/browse-by-switcher.component'; import { BrowseDefinition } from '../../../../core/shared/browse-definition.model'; +import { GenericConstructor } from '../../../../core/shared/generic-constructor'; import { DynamicComponentLoaderDirective } from '../../../abstract-component-loader/dynamic-component-loader.directive'; import { getMockThemeService } from '../../../mocks/theme-service.mock'; import { ActivatedRouteStub } from '../../../testing/active-router.stub'; @@ -24,6 +28,18 @@ import { ComcolBrowseByComponent } from './comcol-browse-by.component'; class BrowseByTestComponent { } +@Component({ + // eslint-disable-next-line @angular-eslint/component-selector + selector: 'ds-browse-by-switcher', + template: ``, + standalone: true, + imports: [DynamicComponentLoaderDirective], +}) +class TestBrowseBySwitcherComponent extends BrowseBySwitcherComponent { + getComponent(): GenericConstructor { + return BrowseByTestComponent; + } +} class TestBrowseByPageBrowseDefinition extends BrowseDefinition { getRenderType(): BrowseByDataType { return 'ComcolBrowseByComponent' as BrowseByDataType; @@ -42,17 +58,21 @@ describe('ComcolBrowseByComponent', () => { themeService = getMockThemeService(); await TestBed.configureTestingModule({ - imports: [BrowseBySwitcherComponent, ComcolBrowseByComponent, DynamicComponentLoaderDirective], + imports: [TestBrowseBySwitcherComponent, ComcolBrowseByComponent, DynamicComponentLoaderDirective], providers: [ BrowseByTestComponent, { provide: ActivatedRoute, useValue: activatedRoute }, { provide: ThemeService, useValue: themeService }, ], + schemas: [NO_ERRORS_SCHEMA], }) .overrideComponent(ComcolBrowseByComponent, { remove: { imports: [BrowseBySwitcherComponent], }, + add: { + imports: [TestBrowseBySwitcherComponent], + }, }) .compileComponents(); diff --git a/src/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.spec.ts b/src/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.spec.ts index 65447b428a..d1521c1989 100644 --- a/src/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.spec.ts +++ b/src/app/shared/object-grid/item-grid-element/item-types/item/item-grid-element.component.spec.ts @@ -18,6 +18,7 @@ import { DSONameServiceMock } from '../../../../mocks/dso-name.service.mock'; import { createSuccessfulRemoteDataObject$ } from '../../../../remote-data.utils'; import { TruncatableService } from '../../../../truncatable/truncatable.service'; import { TruncatePipe } from '../../../../utils/truncate.pipe'; +import { ItemSearchResultGridElementComponent } from '../../../search-result-grid-element/item-search-result/item/item-search-result-grid-element.component'; import { ItemGridElementComponent } from './item-grid-element.component'; @@ -69,6 +70,9 @@ describe('ItemGridElementComponent', () => { ], schemas: [NO_ERRORS_SCHEMA], }).overrideComponent(ItemGridElementComponent, { + remove: { + imports: [ItemSearchResultGridElementComponent], + }, add: { changeDetection: ChangeDetectionStrategy.Default }, }).compileComponents(); })); From 788e44a770d47137f0fa0df45d65dbfdbf894a9c Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Sun, 17 Mar 2024 15:48:05 +0100 Subject: [PATCH 3/4] [DURACOM-191] Fix circular dependency --- .../core/cache/builders/link.service.spec.ts | 22 +++---------------- .../shared/testing/test-data-service.mock.ts | 16 ++++++++++++++ 2 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 src/app/shared/testing/test-data-service.mock.ts diff --git a/src/app/core/cache/builders/link.service.spec.ts b/src/app/core/cache/builders/link.service.spec.ts index a09adea8f7..96650f1a55 100644 --- a/src/app/core/cache/builders/link.service.spec.ts +++ b/src/app/core/cache/builders/link.service.spec.ts @@ -1,18 +1,13 @@ /* eslint-disable max-classes-per-file */ -import { Injectable } from '@angular/core'; import { TestBed } from '@angular/core/testing'; -import { of } from 'rxjs'; import { isEmpty, take, } from 'rxjs/operators'; import { APP_DATA_SERVICES_MAP } from '../../../../config/app-config.interface'; -import { - followLink, - FollowLinkConfig, -} from '../../../shared/utils/follow-link-config.model'; -import { FindListOptions } from '../../data/find-list-options.model'; +import { TestDataService } from '../../../shared/testing/test-data-service.mock'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; import { HALLink } from '../../shared/hal-link.model'; import { HALResource } from '../../shared/hal-resource.model'; import { ResourceType } from '../../shared/resource-type'; @@ -42,19 +37,8 @@ class TestModel implements HALResource { successor?: TestModel; } -@Injectable() -export class TestDataService { - findListByHref(href: string, findListOptions: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]) { - return of('findListByHref'); - } - - findByHref(href: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]) { - return of('findByHref'); - } -} - const mockDataServiceMap: any = { - [TEST_MODEL.value]: () => import('./link.service.spec').then(m => m.TestDataService), + [TEST_MODEL.value]: () => import('../../../shared/testing/test-data-service.mock').then(m => m.TestDataService), }; let testDataService: TestDataService; diff --git a/src/app/shared/testing/test-data-service.mock.ts b/src/app/shared/testing/test-data-service.mock.ts new file mode 100644 index 0000000000..dbb216ea57 --- /dev/null +++ b/src/app/shared/testing/test-data-service.mock.ts @@ -0,0 +1,16 @@ +import { Injectable } from '@angular/core'; +import { of } from 'rxjs'; + +import { FindListOptions } from '../../core/data/find-list-options.model'; +import { FollowLinkConfig } from '../utils/follow-link-config.model'; + +@Injectable() +export class TestDataService { + findListByHref(href: string, findListOptions: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]) { + return of('findListByHref'); + } + + findByHref(href: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]) { + return of('findByHref'); + } +} From 2e8817712aac198ce6c9c871e1de97e2d23dabed Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Sun, 17 Mar 2024 17:34:35 +0100 Subject: [PATCH 4/4] [DURACOM-191] Fix tests --- .../dso-edit-metadata-value.component.html | 2 +- .../dso-edit-metadata-value.component.spec.ts | 24 +++++++++++++------ .../notify-requests-status.component.spec.ts | 10 ++++++-- .../request-status-alert-box.component.html | 24 ++++++------------- ...request-status-alert-box.component.spec.ts | 13 +++++++--- .../request-status-alert-box.component.ts | 2 ++ ...onfiguration-search-page.component.spec.ts | 2 ++ .../tabulatable-objects.decorator.spec.ts | 16 ++++--------- 8 files changed, 51 insertions(+), 42 deletions(-) diff --git a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.html b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.html index c9afc6ca63..b79b185b40 100644 --- a/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.html +++ b/src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.html @@ -36,7 +36,7 @@ [authorityValue]="mdValue.newValue.confidence" [iconMode]="true" > -