@@ -4,6 +4,30 @@ import { convertToFileTree, fetchFileTree, getPackageFileTree } from '../../serv
44
55const getChildren = ( node ?: PackageFileTree ) : PackageFileTree [ ] => node ?. children ?? [ ]
66
7+ const mockFetchOk = < T > ( body : T ) => {
8+ const fetchMock = vi . fn ( ) . mockResolvedValue ( {
9+ ok : true ,
10+ json : async ( ) => body ,
11+ } )
12+ vi . stubGlobal ( 'fetch' , fetchMock )
13+ return fetchMock
14+ }
15+
16+ const mockFetchError = ( status : number ) => {
17+ const fetchMock = vi . fn ( ) . mockResolvedValue ( {
18+ ok : false ,
19+ status,
20+ } )
21+ vi . stubGlobal ( 'fetch' , fetchMock )
22+ return fetchMock
23+ }
24+
25+ const mockCreateError = ( ) => {
26+ const createErrorMock = vi . fn ( ( opts : { statusCode : number ; message : string } ) => opts )
27+ vi . stubGlobal ( 'createError' , createErrorMock )
28+ return createErrorMock
29+ }
30+
731describe ( 'convertToFileTree' , ( ) => {
832 it ( 'converts jsDelivr nodes to a sorted tree with directories first' , ( ) => {
933 const input : JsDelivrFileNode [ ] = [
@@ -72,6 +96,20 @@ describe('convertToFileTree', () => {
7296 const empty : PackageFileTree [ ] = [ ]
7397 expect ( tree ) . toEqual ( empty )
7498 } )
99+
100+ it ( 'handles directories without a files property' , ( ) => {
101+ const input : JsDelivrFileNode [ ] = [
102+ {
103+ type : 'directory' ,
104+ name : 'src' ,
105+ } ,
106+ ]
107+
108+ const tree = convertToFileTree ( input )
109+
110+ expect ( tree [ 0 ] ?. type ) . toBe ( 'directory' )
111+ expect ( tree [ 0 ] ?. children ) . toEqual ( [ ] )
112+ } )
75113} )
76114
77115describe ( 'fetchFileTree' , ( ) => {
@@ -84,12 +122,7 @@ describe('fetchFileTree', () => {
84122 files : [ ] ,
85123 }
86124
87- const fetchMock = vi . fn ( ) . mockResolvedValue ( {
88- ok : true ,
89- json : async ( ) => body ,
90- } )
91-
92- vi . stubGlobal ( 'fetch' , fetchMock )
125+ mockFetchOk ( body )
93126
94127 try {
95128 const result = await fetchFileTree ( 'pkg' , '1.0.0' )
@@ -100,15 +133,8 @@ describe('fetchFileTree', () => {
100133 } )
101134
102135 it ( 'throws a 404 error when package is not found' , async ( ) => {
103- const fetchMock = vi . fn ( ) . mockResolvedValue ( {
104- ok : false ,
105- status : 404 ,
106- } )
107-
108- const createErrorMock = vi . fn ( ( opts : { statusCode : number ; message : string } ) => opts )
109-
110- vi . stubGlobal ( 'fetch' , fetchMock )
111- vi . stubGlobal ( 'createError' , createErrorMock )
136+ mockFetchError ( 404 )
137+ mockCreateError ( )
112138
113139 try {
114140 await expect ( fetchFileTree ( 'pkg' , '1.0.0' ) ) . rejects . toMatchObject ( { statusCode : 404 } )
@@ -118,15 +144,8 @@ describe('fetchFileTree', () => {
118144 } )
119145
120146 it ( 'throws a 502 error for non-404 failures' , async ( ) => {
121- const fetchMock = vi . fn ( ) . mockResolvedValue ( {
122- ok : false ,
123- status : 500 ,
124- } )
125-
126- const createErrorMock = vi . fn ( ( opts : { statusCode : number ; message : string } ) => opts )
127-
128- vi . stubGlobal ( 'fetch' , fetchMock )
129- vi . stubGlobal ( 'createError' , createErrorMock )
147+ mockFetchError ( 500 )
148+ mockCreateError ( )
130149
131150 try {
132151 await expect ( fetchFileTree ( 'pkg' , '1.0.0' ) ) . rejects . toMatchObject ( { statusCode : 502 } )
@@ -152,12 +171,7 @@ describe('getPackageFileTree', () => {
152171 ] ,
153172 }
154173
155- const fetchMock = vi . fn ( ) . mockResolvedValue ( {
156- ok : true ,
157- json : async ( ) => body ,
158- } )
159-
160- vi . stubGlobal ( 'fetch' , fetchMock )
174+ mockFetchOk ( body )
161175
162176 try {
163177 const result = await getPackageFileTree ( 'pkg' , '1.0.0' )
@@ -170,4 +184,22 @@ describe('getPackageFileTree', () => {
170184 vi . unstubAllGlobals ( )
171185 }
172186 } )
187+
188+ it ( 'returns undefined when default is missing' , async ( ) => {
189+ const body = {
190+ type : 'npm' ,
191+ name : 'pkg' ,
192+ version : '1.0.0' ,
193+ files : [ ] ,
194+ }
195+
196+ mockFetchOk ( body )
197+
198+ try {
199+ const result = await getPackageFileTree ( 'pkg' , '1.0.0' )
200+ expect ( result . default ) . toBeUndefined ( )
201+ } finally {
202+ vi . unstubAllGlobals ( )
203+ }
204+ } )
173205} )
0 commit comments