@@ -22,24 +22,47 @@ jest.mock('../utils.js', () => ({
2222process . exit = mockExit ;
2323global . fetch = mockFetch ;
2424
25+ const BASE_URL =
26+ 'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts' ;
27+
28+ // The verifier HEAD-checks the POM plus every classifier tarball attached to
29+ // the react-native-artifacts publication (external-artifacts/build.gradle.kts).
30+ const expectedUrls = version => [
31+ `${ BASE_URL } /${ version } /react-native-artifacts-${ version } .pom` ,
32+ ...[
33+ 'reactnative-core-debug' ,
34+ 'reactnative-core-release' ,
35+ 'reactnative-dependencies-debug' ,
36+ 'reactnative-dependencies-release' ,
37+ 'reactnative-headers-debug' ,
38+ 'reactnative-headers-release' ,
39+ 'reactnative-dependencies-headers-debug' ,
40+ 'reactnative-dependencies-headers-release' ,
41+ ] . map (
42+ classifier =>
43+ `${ BASE_URL } /${ version } /react-native-artifacts-${ version } -${ classifier } .tar.gz` ,
44+ ) ,
45+ ] ;
46+
2547describe ( '#verifyArtifactsAreOnMaven' , ( ) => {
2648 beforeEach ( jest . clearAllMocks ) ;
2749
2850 it ( 'waits for the packages to be published on maven when version has no v' , async ( ) => {
2951 mockSleep . mockReturnValueOnce ( Promise . resolve ( ) ) . mockImplementation ( ( ) => {
3052 throw new Error ( 'Should not be called again!' ) ;
3153 } ) ;
54+ // First attempt: the POM is not there yet. Second attempt: every URL is.
3255 mockFetch
3356 . mockReturnValueOnce ( Promise . resolve ( { status : 404 } ) )
34- . mockReturnValueOnce ( Promise . resolve ( { status : 200 } ) ) ;
57+ . mockReturnValue ( Promise . resolve ( { status : 200 } ) ) ;
3558
3659 const version = '0.78.1' ;
3760 await verifyArtifactsAreOnMaven ( version ) ;
3861
3962 expect ( mockSleep ) . toHaveBeenCalledTimes ( 1 ) ;
40- expect ( mockFetch ) . toHaveBeenCalledWith (
41- 'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1/react-native-artifacts-0.78.1.pom' ,
42- ) ;
63+ for ( const url of expectedUrls ( '0.78.1' ) ) {
64+ expect ( mockFetch ) . toHaveBeenCalledWith ( url , { method : 'HEAD' } ) ;
65+ }
4366 } ) ;
4467
4568 it ( 'waits for the packages to be published on maven, when version starts with v' , async ( ) => {
@@ -48,27 +71,46 @@ describe('#verifyArtifactsAreOnMaven', () => {
4871 } ) ;
4972 mockFetch
5073 . mockReturnValueOnce ( Promise . resolve ( { status : 404 } ) )
51- . mockReturnValueOnce ( Promise . resolve ( { status : 200 } ) ) ;
74+ . mockReturnValue ( Promise . resolve ( { status : 200 } ) ) ;
5275
5376 const version = 'v0.78.1' ;
5477 await verifyArtifactsAreOnMaven ( version ) ;
5578
5679 expect ( mockSleep ) . toHaveBeenCalledTimes ( 1 ) ;
57- expect ( mockFetch ) . toHaveBeenCalledWith (
58- 'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1/react-native-artifacts-0.78.1.pom' ,
59- ) ;
80+ for ( const url of expectedUrls ( '0.78.1' ) ) {
81+ expect ( mockFetch ) . toHaveBeenCalledWith ( url , { method : 'HEAD' } ) ;
82+ }
6083 } ) ;
6184
6285 it ( 'passes immediately if packages are already on Maven' , async ( ) => {
63- mockFetch . mockReturnValueOnce ( Promise . resolve ( { status : 200 } ) ) ;
86+ mockFetch . mockReturnValue ( Promise . resolve ( { status : 200 } ) ) ;
6487
6588 const version = '0.78.1' ;
6689 await verifyArtifactsAreOnMaven ( version ) ;
6790
6891 expect ( mockSleep ) . toHaveBeenCalledTimes ( 0 ) ;
69- expect ( mockFetch ) . toHaveBeenCalledWith (
70- 'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1/react-native-artifacts-0.78.1.pom' ,
71- ) ;
92+ // All nine URLs (POM + 8 classifier tarballs) are verified in one pass.
93+ expect ( mockFetch ) . toHaveBeenCalledTimes ( 9 ) ;
94+ for ( const url of expectedUrls ( '0.78.1' ) ) {
95+ expect ( mockFetch ) . toHaveBeenCalledWith ( url , { method : 'HEAD' } ) ;
96+ }
97+ } ) ;
98+
99+ it ( 'waits when a classifier artifact is missing even though the POM exists' , async ( ) => {
100+ mockSleep . mockReturnValueOnce ( Promise . resolve ( ) ) . mockImplementation ( ( ) => {
101+ throw new Error ( 'Should not be called again!' ) ;
102+ } ) ;
103+ // First attempt: POM ok, first classifier missing. Second attempt: all ok.
104+ mockFetch
105+ . mockReturnValueOnce ( Promise . resolve ( { status : 200 } ) )
106+ . mockReturnValueOnce ( Promise . resolve ( { status : 404 } ) )
107+ . mockReturnValue ( Promise . resolve ( { status : 200 } ) ) ;
108+
109+ const version = '0.78.1' ;
110+ await verifyArtifactsAreOnMaven ( version ) ;
111+
112+ expect ( mockSleep ) . toHaveBeenCalledTimes ( 1 ) ;
113+ expect ( mockExit ) . not . toHaveBeenCalled ( ) ;
72114 } ) ;
73115
74116 it ( 'tries 90 times and then exits' , async ( ) => {
@@ -82,6 +124,7 @@ describe('#verifyArtifactsAreOnMaven', () => {
82124 expect ( mockExit ) . toHaveBeenCalledWith ( 1 ) ;
83125 expect ( mockFetch ) . toHaveBeenCalledWith (
84126 'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1/react-native-artifacts-0.78.1.pom' ,
127+ { method : 'HEAD' } ,
85128 ) ;
86129 } ) ;
87130} ) ;
0 commit comments