Skip to content

Commit 43812dd

Browse files
chrfalchclaude
andcommitted
test: update verifyArtifactsAreOnMaven test for classifier HEAD-checks
The verifier now HEAD-checks the POM plus all eight classifier tarballs instead of GETting only the POM; the mocks/assertions follow, and a new case covers a missing classifier behind an existing POM (the exact gap the classifier checks were added to catch). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent e6ee71a commit 43812dd

1 file changed

Lines changed: 55 additions & 12 deletions

File tree

.github/workflow-scripts/__tests__/verifyArtifactsAreOnMaven-test.js

Lines changed: 55 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,47 @@ jest.mock('../utils.js', () => ({
2222
process.exit = mockExit;
2323
global.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+
2547
describe('#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

Comments
 (0)