11import { describe , it , expect , vi } from 'vitest' ;
22import { fireEvent , render } from '@testing-library/svelte' ;
33
4+ // Mocking public variables
5+ vi . mock ( '$env/dynamic/public' , ( ) => {
6+ return { env : { } } ;
7+ } ) ;
8+
9+ // Mocking bootstrap.Modal
410class MockModal {
511 show = vi . fn ( ) ;
612}
@@ -10,6 +16,9 @@ global.window.bootstrap = {
1016 Modal : MockModal
1117} ;
1218
19+ // Mocking fetch
20+ global . fetch = vi . fn ( ) ;
21+
1322import JobLogsModal from '../src/lib/components/jobs/JobLogsModal.svelte' ;
1423
1524describe ( 'JobLogsModal' , async ( ) => {
@@ -18,7 +27,8 @@ describe('JobLogsModal', async () => {
1827 const error = `TASK ERROR:Task id: 20 (Create OME-Zarr structure), e.workflow_task_order=0
1928TRACEBACK:
2029Command "/tmp/FRACTAL_TASKS_DIR/.fractal/fractal-tasks-core0.14.1/venv/bin/python" is not valid. Hint: make sure that it is executable.` ;
21- await result . component . show ( { status : 'failed' , log : error } ) ;
30+ mockSuccesfulJobFetch ( { id : 1 , status : 'failed' , log : error } ) ;
31+ await result . component . show ( { id : 1 , status : 'failed' , log : null } , false ) ;
2232 const pre = result . container . querySelector ( 'pre' ) ;
2333 expect ( pre . classList . contains ( 'highlight' ) ) . eq ( true ) ;
2434 expect ( pre . innerHTML ) . eq ( error ) ;
@@ -39,7 +49,8 @@ Traceback (most recent call last):
3949pydantic.error_wrappers.ValidationError: 1 validation error for CreateOmeZarr
4050allowed_channels
4151 field required (type=value_error.missing)` ;
42- await result . component . show ( { status : 'failed' , log : error } ) ;
52+ mockSuccesfulJobFetch ( { id : 1 , status : 'failed' , log : error } ) ;
53+ await result . component . show ( { id : 1 , status : 'failed' , log : null } , true ) ;
4354 const pre = result . container . querySelector ( 'pre' ) ;
4455 let divs = pre . querySelectorAll ( 'div' ) ;
4556 expect ( divs . length ) . eq ( 2 ) ;
@@ -66,9 +77,37 @@ allowed_channels
6677 it ( 'display successful log' , async ( ) => {
6778 const result = render ( JobLogsModal ) ;
6879 const log = 'Successful log...' ;
69- await result . component . show ( { status : 'done' , log } ) ;
80+ mockSuccesfulJobFetch ( { id : 1 , status : 'done' , log } ) ;
81+ await result . component . show ( { id : 1 , status : 'done' , log : null } , false ) ;
7082 const pre = result . container . querySelector ( 'pre' ) ;
7183 expect ( pre . classList . contains ( 'highlight' ) ) . eq ( false ) ;
7284 expect ( pre . innerHTML ) . eq ( log ) ;
7385 } ) ;
86+
87+ it ( 'error while loading job for user' , async ( ) => {
88+ const result = render ( JobLogsModal ) ;
89+ fetch . mockResolvedValue ( {
90+ ok : false ,
91+ json : ( ) => new Promise ( ( resolve ) => resolve ( { error : 'Something happened' } ) )
92+ } ) ;
93+ await result . component . show ( { id : 1 , status : 'done' , log : null } , false ) ;
94+ expect ( result . queryByText ( / U n a b l e t o f e t c h j o b / ) ) . not . null ;
95+ } ) ;
96+
97+ it ( 'error while loading job for admin' , async ( ) => {
98+ const result = render ( JobLogsModal ) ;
99+ fetch . mockResolvedValue ( {
100+ ok : false ,
101+ json : ( ) => new Promise ( ( resolve ) => resolve ( { error : 'Something happened' } ) )
102+ } ) ;
103+ await result . component . show ( { id : 1 , status : 'done' , log : null } , true ) ;
104+ expect ( result . queryByText ( / U n a b l e t o f e t c h j o b / ) ) . not . null ;
105+ } ) ;
74106} ) ;
107+
108+ function mockSuccesfulJobFetch ( job ) {
109+ fetch . mockResolvedValue ( {
110+ ok : true ,
111+ json : ( ) => new Promise ( ( resolve ) => resolve ( job ) )
112+ } ) ;
113+ }
0 commit comments