@@ -7,6 +7,7 @@ import { of } from 'rxjs';
77import { ComponentFixture , TestBed } from '@angular/core/testing' ;
88import { ActivatedRoute , Router } from '@angular/router' ;
99
10+ import { UserSelectors } from '@osf/core/store/user/user.selectors' ;
1011import { ProjectOverviewSelectors } from '@osf/features/project/overview/store' ;
1112import { RegistrySelectors } from '@osf/features/registry/store/registry' ;
1213import { ContributorsListComponent } from '@osf/shared/components/contributors-list/contributors-list.component' ;
@@ -24,25 +25,41 @@ import { provideOSFCore } from '@testing/osf.testing.provider';
2425import { CustomDialogServiceMockBuilder } from '@testing/providers/custom-dialog-provider.mock' ;
2526import { ActivatedRouteMockBuilder } from '@testing/providers/route-provider.mock' ;
2627import { RouterMockBuilder } from '@testing/providers/router-provider.mock' ;
27- import { provideMockStore } from '@testing/providers/store-provider.mock' ;
28+ import { BaseSetupOverrides , mergeSignalOverrides , provideMockStore } from '@testing/providers/store-provider.mock' ;
2829
2930import { ViewDuplicatesComponent } from './view-duplicates.component' ;
3031
32+ interface SetupOverrides extends BaseSetupOverrides {
33+ selectors ?: any [ ] ;
34+ }
35+
3136describe ( 'Component: View Duplicates' , ( ) => {
3237 let component : ViewDuplicatesComponent ;
3338 let fixture : ComponentFixture < ViewDuplicatesComponent > ;
3439 let routerMock : ReturnType < RouterMockBuilder [ 'build' ] > ;
3540 let activatedRouteMock : ReturnType < ActivatedRouteMockBuilder [ 'build' ] > ;
3641 let mockCustomDialogService : ReturnType < CustomDialogServiceMockBuilder [ 'build' ] > ;
3742
38- beforeEach ( ( ) => {
43+ function setup ( overrides : SetupOverrides = { } ) {
3944 mockCustomDialogService = CustomDialogServiceMockBuilder . create ( ) . build ( ) ;
4045 routerMock = RouterMockBuilder . create ( ) . build ( ) ;
4146 activatedRouteMock = ActivatedRouteMockBuilder . create ( )
4247 . withParams ( { id : 'rid' } )
4348 . withData ( { resourceType : ResourceType . Project } )
4449 . build ( ) ;
4550
51+ const defaultSelectors = [
52+ { selector : DuplicatesSelectors . getDuplicates , value : [ ] } ,
53+ { selector : DuplicatesSelectors . getDuplicatesLoading , value : false } ,
54+ { selector : DuplicatesSelectors . getDuplicatesTotalCount , value : 0 } ,
55+ { selector : ProjectOverviewSelectors . getProject , value : MOCK_PROJECT_OVERVIEW } ,
56+ { selector : ProjectOverviewSelectors . isProjectAnonymous , value : false } ,
57+ { selector : RegistrySelectors . getRegistry , value : undefined } ,
58+ { selector : RegistrySelectors . isRegistryAnonymous , value : false } ,
59+ { selector : UserSelectors . isProjectCreationDisabled , value : false } ,
60+ ] ;
61+ const signals = mergeSignalOverrides ( defaultSelectors , overrides . selectors || [ ] ) ;
62+
4663 TestBed . configureTestingModule ( {
4764 imports : [
4865 ViewDuplicatesComponent ,
@@ -58,15 +75,7 @@ describe('Component: View Duplicates', () => {
5875 providers : [
5976 provideOSFCore ( ) ,
6077 provideMockStore ( {
61- signals : [
62- { selector : DuplicatesSelectors . getDuplicates , value : [ ] } ,
63- { selector : DuplicatesSelectors . getDuplicatesLoading , value : false } ,
64- { selector : DuplicatesSelectors . getDuplicatesTotalCount , value : 0 } ,
65- { selector : ProjectOverviewSelectors . getProject , value : MOCK_PROJECT_OVERVIEW } ,
66- { selector : ProjectOverviewSelectors . isProjectAnonymous , value : false } ,
67- { selector : RegistrySelectors . getRegistry , value : undefined } ,
68- { selector : RegistrySelectors . isRegistryAnonymous , value : false } ,
69- ] ,
78+ signals,
7079 } ) ,
7180 MockProvider ( CustomDialogService , mockCustomDialogService ) ,
7281 MockProvider ( Router , routerMock ) ,
@@ -78,13 +87,23 @@ describe('Component: View Duplicates', () => {
7887 component = fixture . componentInstance ;
7988
8089 fixture . detectChanges ( ) ;
81- } ) ;
90+ }
8291
8392 it ( 'should create' , ( ) => {
93+ setup ( ) ;
8494 expect ( component ) . toBeTruthy ( ) ;
8595 } ) ;
8696
97+ it ( 'should disable fork button and show tooltip when isProjectCreationDisabled is true' , ( ) => {
98+ setup ( {
99+ selectors : [ { selector : UserSelectors . isProjectCreationDisabled , value : true } ] ,
100+ } ) ;
101+ expect ( component . preventDuplicateCreation ( ) ) . toBe ( true ) ;
102+ expect ( component . duplicateButtonTooltip ( ) ) . toBe ( 'project.overview.actions.duplicatingProjectsNotAllowed' ) ;
103+ } ) ;
104+
87105 it ( 'should open ForkDialog with width 450px when small and not refresh on failure' , ( ) => {
106+ setup ( ) ;
88107 ( component as any ) . actions = { ...component . actions , getDuplicates : vi . fn ( ) } ;
89108
90109 const openSpy = vi
@@ -98,12 +117,14 @@ describe('Component: View Duplicates', () => {
98117 } ) ;
99118
100119 it ( 'should update currentPage when page is defined' , ( ) => {
120+ setup ( ) ;
101121 const event : PaginatorState = { page : 1 } as PaginatorState ;
102122 component . onPageChange ( event ) ;
103123 expect ( component . currentPage ( ) ) . toBe ( 2 ) ;
104124 } ) ;
105125
106126 it ( 'should not update currentPage when page is undefined' , ( ) => {
127+ setup ( ) ;
107128 component . currentPage . set ( 5 ) ;
108129 const event : PaginatorState = { page : undefined } as PaginatorState ;
109130 component . onPageChange ( event ) ;
0 commit comments