1- import { MockProvider } from 'ng-mocks' ;
2-
31import { DynamicDialogConfig , DynamicDialogRef } from 'primeng/dynamicdialog' ;
42
3+ import { of , throwError } from 'rxjs' ;
4+
55import { ComponentFixture , TestBed } from '@angular/core/testing' ;
66
77import { ToastService } from '@osf/shared/services/toast.service' ;
@@ -11,88 +11,91 @@ import { AddToCollectionConfirmationDialogComponent } from './add-to-collection-
1111import { MOCK_PROJECT } from '@testing/mocks/project.mock' ;
1212import { OSFTestingModule } from '@testing/osf.testing.module' ;
1313import { provideMockStore } from '@testing/providers/store-provider.mock' ;
14- import { ToastServiceMockBuilder } from '@testing/providers/toast-provider.mock' ;
1514
1615describe ( 'AddToCollectionConfirmationDialogComponent' , ( ) => {
1716 let component : AddToCollectionConfirmationDialogComponent ;
1817 let fixture : ComponentFixture < AddToCollectionConfirmationDialogComponent > ;
19- let mockDialogRef : DynamicDialogRef ;
20- let toastServiceMock : ReturnType < ToastServiceMockBuilder [ 'build' ] > ;
21-
22- const mockPayload = {
23- collectionId : 'collection-1' ,
24- projectId : 'project-1' ,
25- collectionMetadata : { title : 'Test Collection' } ,
26- userId : 'user-1' ,
27- } ;
28-
29- const mockProject = MOCK_PROJECT ;
18+ let dialogRef : DynamicDialogRef ;
19+ let toastService : jest . Mocked < ToastService > ;
20+ let configData : { payload ?: any ; project ?: any } ;
21+ let updateProjectPublicStatus : jest . Mock ;
22+ let createCollectionSubmission : jest . Mock ;
3023
3124 beforeEach ( async ( ) => {
32- mockDialogRef = {
33- close : jest . fn ( ) ,
34- } as any ;
35-
36- toastServiceMock = ToastServiceMockBuilder . create ( ) . build ( ) ;
25+ dialogRef = { close : jest . fn ( ) } as any ;
26+ toastService = { showSuccess : jest . fn ( ) } as any ;
27+ configData = {
28+ payload : {
29+ collectionId : 'collection-1' ,
30+ projectId : 'project-1' ,
31+ collectionMetadata : { title : 'Test Collection' } ,
32+ userId : 'user-1' ,
33+ } ,
34+ project : { ...MOCK_PROJECT , isPublic : false , id : 'project-1' } ,
35+ } ;
36+ updateProjectPublicStatus = jest . fn ( ) . mockReturnValue ( of ( null ) ) ;
37+ createCollectionSubmission = jest . fn ( ) . mockReturnValue ( of ( null ) ) ;
3738
3839 await TestBed . configureTestingModule ( {
3940 imports : [ AddToCollectionConfirmationDialogComponent , OSFTestingModule ] ,
4041 providers : [
41- MockProvider ( DynamicDialogRef , mockDialogRef ) ,
42- MockProvider ( ToastService , toastServiceMock ) ,
43- MockProvider ( DynamicDialogConfig , {
44- data : {
45- payload : mockPayload ,
46- project : mockProject ,
47- } ,
48- } ) ,
49- provideMockStore ( {
50- signals : [ ] ,
51- } ) ,
42+ { provide : DynamicDialogRef , useValue : dialogRef } ,
43+ { provide : ToastService , useValue : toastService } ,
44+ { provide : DynamicDialogConfig , useValue : { data : configData } } ,
45+ provideMockStore ( { signals : [ ] } ) ,
5246 ] ,
5347 } ) . compileComponents ( ) ;
5448
5549 fixture = TestBed . createComponent ( AddToCollectionConfirmationDialogComponent ) ;
5650 component = fixture . componentInstance ;
51+ component . actions = {
52+ updateProjectPublicStatus,
53+ createCollectionSubmission,
54+ } as any ;
5755 fixture . detectChanges ( ) ;
5856 } ) ;
5957
6058 it ( 'should create' , ( ) => {
6159 expect ( component ) . toBeTruthy ( ) ;
6260 } ) ;
6361
64- it ( 'should initialize with dialog data' , ( ) => {
65- expect ( component . config . data . payload ) . toEqual ( mockPayload ) ;
66- expect ( component . config . data . project ) . toEqual ( mockProject ) ;
62+ it ( 'should dispatch updates and close on confirm when project is private' , ( ) => {
63+ component . handleAddToCollectionConfirm ( ) ;
64+
65+ expect ( updateProjectPublicStatus ) . toHaveBeenCalledWith ( [ { id : 'project-1' , public : true } ] ) ;
66+ expect ( createCollectionSubmission ) . toHaveBeenCalledWith ( configData . payload ) ;
67+ expect ( dialogRef . close ) . toHaveBeenCalledWith ( true ) ;
68+ expect ( toastService . showSuccess ) . toHaveBeenCalledWith ( 'collections.addToCollection.confirmationDialogToastMessage' ) ;
69+ expect ( component . isSubmitting ( ) ) . toBe ( false ) ;
6770 } ) ;
6871
69- it ( 'should handle add to collection confirmation' , ( ) => {
72+ it ( 'should skip public status update when project already public' , ( ) => {
73+ configData . project . isPublic = true ;
74+ updateProjectPublicStatus . mockClear ( ) ;
75+
7076 component . handleAddToCollectionConfirm ( ) ;
7177
72- expect ( mockDialogRef . close ) . toHaveBeenCalledWith ( true ) ;
78+ expect ( updateProjectPublicStatus ) . not . toHaveBeenCalled ( ) ;
79+ expect ( createCollectionSubmission ) . toHaveBeenCalledWith ( configData . payload ) ;
80+ expect ( dialogRef . close ) . toHaveBeenCalledWith ( true ) ;
7381 } ) ;
7482
75- it ( 'should have config data' , ( ) => {
76- expect ( component . config . data . payload ) . toBeDefined ( ) ;
77- expect ( component . config . data . payload . collectionId ) . toBe ( 'collection-1' ) ;
78- expect ( component . config . data . payload . projectId ) . toBe ( 'project-1' ) ;
79- expect ( component . config . data . payload . userId ) . toBe ( 'user-1' ) ;
80- } ) ;
83+ it ( 'should do nothing when payload or project is missing' , ( ) => {
84+ configData . payload = undefined ;
85+ component . handleAddToCollectionConfirm ( ) ;
8186
82- it ( 'should have project data in config' , ( ) => {
83- expect ( component . config . data . project ) . toBeDefined ( ) ;
84- expect ( component . config . data . project . id ) . toBe ( 'project-1' ) ;
85- expect ( component . config . data . project . title ) . toBe ( 'Test Project' ) ;
86- expect ( component . config . data . project . isPublic ) . toBe ( true ) ;
87+ expect ( updateProjectPublicStatus ) . not . toHaveBeenCalled ( ) ;
88+ expect ( createCollectionSubmission ) . not . toHaveBeenCalled ( ) ;
89+ expect ( dialogRef . close ) . not . toHaveBeenCalled ( ) ;
8790 } ) ;
8891
89- it ( 'should have actions defined' , ( ) => {
90- expect ( component . actions ) . toBeDefined ( ) ;
91- expect ( component . actions . createCollectionSubmission ) . toBeDefined ( ) ;
92- expect ( component . actions . updateProjectPublicStatus ) . toBeDefined ( ) ;
93- } ) ;
92+ it ( 'should reset submitting state and not close on error' , ( ) => {
93+ createCollectionSubmission . mockReturnValue ( throwError ( ( ) => new Error ( 'fail' ) ) ) ;
94+
95+ component . handleAddToCollectionConfirm ( ) ;
9496
95- it ( 'should have isSubmitting signal' , ( ) => {
9697 expect ( component . isSubmitting ( ) ) . toBe ( false ) ;
98+ expect ( dialogRef . close ) . not . toHaveBeenCalled ( ) ;
99+ expect ( toastService . showSuccess ) . not . toHaveBeenCalled ( ) ;
97100 } ) ;
98101} ) ;
0 commit comments