@@ -38,6 +38,15 @@ describe('isStandardReadme', () => {
3838} )
3939
4040describe ( 'fetchReadmeFromJsdelivr' , ( ) => {
41+ beforeEach ( ( ) => {
42+ vi . unstubAllGlobals ( )
43+ vi . stubGlobal ( 'defineCachedFunction' , ( fn : Function ) => fn )
44+ vi . stubGlobal ( '$fetch' , $fetchMock )
45+ vi . stubGlobal ( 'parsePackageParams' , parsePackageParams )
46+ vi . stubGlobal ( 'fetchNpmPackage' , fetchNpmPackageMock )
47+ vi . stubGlobal ( 'parseRepositoryInfo' , parseRepositoryInfoMock )
48+ } )
49+
4150 it ( 'returns content when first filename succeeds' , async ( ) => {
4251 const content = '# Package'
4352 const fetchMock = vi . fn ( ) . mockResolvedValue ( {
@@ -73,6 +82,59 @@ describe('fetchReadmeFromJsdelivr', () => {
7382 expect ( result ) . toBeNull ( )
7483 expect ( fetchMock ) . toHaveBeenCalledTimes ( 2 )
7584 } )
85+
86+ it ( 'starts a small batch of candidate fetches in parallel' , async ( ) => {
87+ let resolveReadmeMd ! : ( value : { ok : false } ) => void
88+ let resolveLowercase ! : ( value : { ok : false } ) => void
89+ let resolveReadme ! : ( value : { ok : true ; text : ( ) => Promise < string > } ) => void
90+
91+ const fetchMock = vi . fn ( ( url : string ) => {
92+ if ( url . endsWith ( '/README.md' ) ) {
93+ return new Promise ( resolve => {
94+ resolveReadmeMd = resolve
95+ } )
96+ }
97+
98+ if ( url . endsWith ( '/readme.md' ) ) {
99+ return new Promise ( resolve => {
100+ resolveLowercase = resolve
101+ } )
102+ }
103+
104+ if ( url . endsWith ( '/README' ) ) {
105+ return new Promise ( resolve => {
106+ resolveReadme = resolve
107+ } )
108+ }
109+
110+ return Promise . resolve ( { ok : false } )
111+ } )
112+ vi . stubGlobal ( 'fetch' , fetchMock )
113+
114+ const resultPromise = fetchReadmeFromJsdelivr ( 'pkg' , [
115+ 'README.md' ,
116+ 'readme.md' ,
117+ 'README' ,
118+ 'readme' ,
119+ ] )
120+
121+ expect ( fetchMock ) . toHaveBeenCalledTimes ( 3 )
122+ expect ( fetchMock . mock . calls . map ( ( [ url ] ) => url ) ) . toEqual ( [
123+ 'https://cdn.jsdelivr.net/npm/pkg/README.md' ,
124+ 'https://cdn.jsdelivr.net/npm/pkg/readme.md' ,
125+ 'https://cdn.jsdelivr.net/npm/pkg/README' ,
126+ ] )
127+
128+ resolveReadmeMd ( { ok : false } )
129+ resolveLowercase ( { ok : false } )
130+ resolveReadme ( {
131+ ok : true ,
132+ text : async ( ) => '# Package' ,
133+ } )
134+
135+ await expect ( resultPromise ) . resolves . toBe ( '# Package' )
136+ expect ( fetchMock ) . toHaveBeenCalledTimes ( 3 )
137+ } )
76138} )
77139
78140describe ( 'resolvePackageReadmeSource' , ( ) => {
@@ -172,6 +234,7 @@ describe('resolvePackageReadmeSource', () => {
172234 const result = await resolvePackageReadmeSource ( 'pkg' )
173235
174236 expect ( result ) . toMatchObject ( { markdown : jsdelivrContent } )
237+ expect ( fetchMock ) . toHaveBeenNthCalledWith ( 1 , 'https://cdn.jsdelivr.net/npm/pkg/DOCS.md' )
175238 } )
176239
177240 it ( 'returns undefined markdown when no content and jsdelivr fails' , async ( ) => {
0 commit comments