@@ -3,7 +3,8 @@ import { FormDetailsComponent } from './form-details.component';
33import { EventsService } from '../../events.service' ;
44import { MatDialog } from '@angular/material/dialog' ;
55import { MatSnackBar } from '@angular/material/snack-bar' ;
6- import { LocalStorageService } from '../../../../upgrade/ajs-upgraded-providers' ;
6+ import { LocalStorageService , UserService } from '../../../../upgrade/ajs-upgraded-providers' ;
7+ import { StateService } from '@uirouter/angular' ;
78import { of , throwError } from 'rxjs' ;
89import { Event as MageEvent } from 'src/app/filter/filter.types' ;
910
@@ -14,8 +15,8 @@ describe('FormDetailsComponent', () => {
1415 let mockDialog : jasmine . SpyObj < MatDialog > ;
1516 let mockSnackBar : jasmine . SpyObj < MatSnackBar > ;
1617 let mockLocalStorageService : any ;
17- let mockStateParams : any ;
18- let mockState : any ;
18+ let mockUserService : any ;
19+ let mockStateService : any ;
1920
2021 const mockEvent : MageEvent = {
2122 id : 1 ,
@@ -50,11 +51,16 @@ describe('FormDetailsComponent', () => {
5051 mockLocalStorageService = {
5152 getToken : jasmine . createSpy ( 'getToken' ) . and . returnValue ( 'test-token' )
5253 } ;
53- mockStateParams = {
54- eventId : '1' ,
55- formId : null
54+ mockUserService = {
55+ myself : jasmine . createSpy ( 'myself' )
56+ } ;
57+ mockStateService = {
58+ params : {
59+ eventId : '1' ,
60+ formId : null
61+ } ,
62+ go : jasmine . createSpy ( 'go' )
5663 } ;
57- mockState = jasmine . createSpyObj ( '$state' , [ 'go' ] ) ;
5864
5965 await TestBed . configureTestingModule ( {
6066 declarations : [ FormDetailsComponent ] ,
@@ -63,8 +69,8 @@ describe('FormDetailsComponent', () => {
6369 { provide : MatDialog , useValue : mockDialog } ,
6470 { provide : MatSnackBar , useValue : mockSnackBar } ,
6571 { provide : LocalStorageService , useValue : mockLocalStorageService } ,
66- { provide : '$stateParams' , useValue : mockStateParams } ,
67- { provide : '$state' , useValue : mockState }
72+ { provide : UserService , useValue : mockUserService } ,
73+ { provide : StateService , useValue : mockStateService }
6874 ]
6975 } )
7076 . compileComponents ( ) ;
@@ -78,9 +84,14 @@ describe('FormDetailsComponent', () => {
7884 } ) ;
7985
8086 describe ( 'ngOnInit' , ( ) => {
87+ beforeEach ( ( ) => {
88+ spyOn < any > ( component , 'generateSampleObservations' ) ;
89+ spyOn < any > ( component , 'fetchFormIcons' ) ;
90+ } ) ;
91+
8192 it ( 'should load event and setup breadcrumbs for new form' , ( ) => {
8293 mockEventsService . getEventById . and . returnValue ( of ( mockEvent ) ) ;
83- mockStateParams . formId = null ;
94+ mockStateService . params . formId = null ;
8495
8596 component . ngOnInit ( ) ;
8697
@@ -98,7 +109,7 @@ describe('FormDetailsComponent', () => {
98109
99110 it ( 'should load event and existing form for edit' , ( ) => {
100111 mockEventsService . getEventById . and . returnValue ( of ( mockEvent ) ) ;
101- mockStateParams . formId = '1' ;
112+ mockStateService . params . formId = '1' ;
102113
103114 component . ngOnInit ( ) ;
104115
@@ -122,7 +133,7 @@ describe('FormDetailsComponent', () => {
122133 it ( 'should handle missing formId in event forms' , ( ) => {
123134 const eventWithoutForm = { ...mockEvent , forms : [ ] } ;
124135 mockEventsService . getEventById . and . returnValue ( of ( eventWithoutForm ) ) ;
125- mockStateParams . formId = '999' ;
136+ mockStateService . params . formId = '999' ;
126137
127138 component . ngOnInit ( ) ;
128139
@@ -329,7 +340,7 @@ describe('FormDetailsComponent', () => {
329340
330341 component . navigateToFields ( ) ;
331342
332- expect ( mockState . go ) . toHaveBeenCalledWith ( 'admin.formFieldsEdit' , { eventId : 1 , formId : 1 } ) ;
343+ expect ( mockStateService . go ) . toHaveBeenCalledWith ( 'admin.formFieldsEdit' , { eventId : 1 , formId : 1 } ) ;
333344 } ) ;
334345 } ) ;
335346
@@ -340,7 +351,7 @@ describe('FormDetailsComponent', () => {
340351
341352 component . navigateToMap ( ) ;
342353
343- expect ( mockState . go ) . toHaveBeenCalledWith ( 'admin.formMapEdit' , { eventId : 1 , formId : 1 } ) ;
354+ expect ( mockStateService . go ) . toHaveBeenCalledWith ( 'admin.formMapEdit' , { eventId : 1 , formId : 1 } ) ;
344355 } ) ;
345356 } ) ;
346357
@@ -351,31 +362,44 @@ describe('FormDetailsComponent', () => {
351362
352363 component . navigateToFeed ( ) ;
353364
354- expect ( mockState . go ) . toHaveBeenCalledWith ( 'admin.formFeedEdit' , { eventId : 1 , formId : 1 } ) ;
365+ expect ( mockStateService . go ) . toHaveBeenCalledWith ( 'admin.formFeedEdit' , { eventId : 1 , formId : 1 } ) ;
355366 } ) ;
356367 } ) ;
357368
358369 describe ( 'exportForm' , ( ) => {
370+ let mockAnchor : any ;
371+
359372 beforeEach ( ( ) => {
360373 component . event = mockEvent ;
361374 component . form = { id : 1 , name : 'Test Form' } ;
362375 component . token = 'test-token' ;
376+
377+ mockAnchor = {
378+ href : '' ,
379+ download : '' ,
380+ style : { display : '' } ,
381+ click : jasmine . createSpy ( 'click' )
382+ } ;
383+ spyOn ( document , 'createElement' ) . and . returnValue ( mockAnchor ) ;
384+ spyOn ( document . body , 'appendChild' ) ;
385+ spyOn ( document . body , 'removeChild' ) ;
363386 } ) ;
364387
365388 it ( 'should trigger download for form export' , ( ) => {
366- spyOn ( document , 'createElement' ) . and . callThrough ( ) ;
367- spyOn ( document . body , 'appendChild' ) . and . callThrough ( ) ;
368- spyOn ( document . body , 'removeChild' ) . and . callThrough ( ) ;
369-
370389 component . exportForm ( ) ;
371390
372391 expect ( mockSnackBar . open ) . toHaveBeenCalledWith ( 'Exporting form...' , 'Close' , { duration : 2000 } ) ;
373392 expect ( document . createElement ) . toHaveBeenCalledWith ( 'a' ) ;
393+ expect ( mockAnchor . href ) . toContain ( '/api/events/1/1/form.zip' ) ;
394+ expect ( mockAnchor . href ) . toContain ( 'access_token=test-token' ) ;
395+ expect ( mockAnchor . download ) . toBe ( 'Test Form.zip' ) ;
396+ expect ( document . body . appendChild ) . toHaveBeenCalledWith ( mockAnchor ) ;
397+ expect ( mockAnchor . click ) . toHaveBeenCalled ( ) ;
398+ expect ( document . body . removeChild ) . toHaveBeenCalledWith ( mockAnchor ) ;
374399 } ) ;
375400
376401 it ( 'should not export if token is not available' , ( ) => {
377402 component . token = null ;
378- spyOn ( document , 'createElement' ) ;
379403
380404 component . exportForm ( ) ;
381405
@@ -385,15 +409,10 @@ describe('FormDetailsComponent', () => {
385409
386410 it ( 'should use default filename if form name is not set' , ( ) => {
387411 component . form = { id : 1 } ;
388- const anchorElement = document . createElement ( 'a' ) ;
389- spyOn ( document , 'createElement' ) . and . returnValue ( anchorElement ) ;
390- spyOn ( document . body , 'appendChild' ) ;
391- spyOn ( document . body , 'removeChild' ) ;
392- spyOn ( anchorElement , 'click' ) ;
393412
394413 component . exportForm ( ) ;
395414
396- expect ( anchorElement . download ) . toBe ( 'form.zip' ) ;
415+ expect ( mockAnchor . download ) . toBe ( 'form.zip' ) ;
397416 } ) ;
398417 } ) ;
399418} ) ;
0 commit comments