Skip to content

Commit c068ebd

Browse files
ci(aio): change AIO preview server stuff to use CircleCI
1 parent 7b4459a commit c068ebd

File tree

7 files changed

+63
-52
lines changed

7 files changed

+63
-52
lines changed

Diff for: aio/aio-builds-setup/dockerbuild/scripts-js/lib/upload-server/build-retriever.ts

+12-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as fs from 'fs';
22
import fetch from 'node-fetch';
3+
import {promisify} from 'util';
34
import {CircleCIApi} from '../common/circleci-api';
45
import {assertNotMissingOrEmpty, computeArtifactDownloadPath} from '../common/utils';
56

@@ -40,16 +41,18 @@ export class BuildRetriever {
4041
*/
4142
public async downloadBuildArtifact(buildNum: number, pr: number, sha: string, artifactPath: string) {
4243
try {
43-
const url = await this.api.getBuildArtifactUrl(buildNum, artifactPath);
44-
const response = await fetch(url, {size: this.downloadSizeLimit});
45-
if (response.status !== 200) {
46-
throw new Error(`Error ${response.status} - ${response.statusText}`);
47-
}
48-
const buffer = await response.buffer();
4944
const outPath = computeArtifactDownloadPath(this.downloadDir, pr, sha, artifactPath);
50-
return await new Promise<string>((resolve, reject) =>
51-
fs.writeFile(outPath, buffer, error => error ? reject(error) : resolve(outPath)),
52-
);
45+
const downloadExists = await promisify(fs.exists)(outPath);
46+
if (!downloadExists) {
47+
const url = await this.api.getBuildArtifactUrl(buildNum, artifactPath);
48+
const response = await fetch(url, {size: this.downloadSizeLimit});
49+
if (response.status !== 200) {
50+
throw new Error(`Error ${response.status} - ${response.statusText}`);
51+
}
52+
const buffer = await response.buffer();
53+
await promisify(fs.writeFile)(outPath, buffer);
54+
}
55+
return outPath;
5356
} catch (error) {
5457
throw new Error(`CircleCI artifact download failed (${error.message || error})`);
5558
}

Diff for: aio/aio-builds-setup/dockerbuild/scripts-js/test/clean-up/build-cleaner.spec.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,11 @@ describe('BuildCleaner', () => {
6969

7070
beforeEach(() => {
7171
cleanerGetExistingBuildNumbersSpy = spyOn(cleaner, 'getExistingBuildNumbers')
72-
.and.returnValue(Promise.resolve(EXISTING_BUILDS));
72+
.and.callFake(() => Promise.resolve(EXISTING_BUILDS));
7373
cleanerGetOpenPrNumbersSpy = spyOn(cleaner, 'getOpenPrNumbers')
74-
.and.returnValue(Promise.resolve(OPEN_PRS));
74+
.and.callFake(() => Promise.resolve(OPEN_PRS));
7575
cleanerGetExistingDownloadsSpy = spyOn(cleaner, 'getExistingDownloads')
76-
.and.returnValue(Promise.resolve(EXISTING_DOWNLOADS));
76+
.and.callFake(() => Promise.resolve(EXISTING_DOWNLOADS));
7777

7878
cleanerRemoveUnnecessaryBuildsSpy = spyOn(cleaner, 'removeUnnecessaryBuilds');
7979
cleanerRemoveUnnecessaryDownloadsSpy = spyOn(cleaner, 'removeUnnecessaryDownloads');
@@ -120,7 +120,7 @@ describe('BuildCleaner', () => {
120120

121121
it('should reject if \'getOpenPrNumbers()\' rejects', async () => {
122122
try {
123-
cleanerGetOpenPrNumbersSpy.and.returnValue(Promise.reject('Test'));
123+
cleanerGetOpenPrNumbersSpy.and.callFake(() => Promise.reject('Test'));
124124
await cleaner.cleanUp();
125125
} catch (err) {
126126
expect(err).toBe('Test');
@@ -130,7 +130,7 @@ describe('BuildCleaner', () => {
130130

131131
it('should reject if \'getExistingBuildNumbers()\' rejects', async () => {
132132
try {
133-
cleanerGetExistingBuildNumbersSpy.and.returnValue(Promise.reject('Test'));
133+
cleanerGetExistingBuildNumbersSpy.and.callFake(() => Promise.reject('Test'));
134134
await cleaner.cleanUp();
135135
} catch (err) {
136136
expect(err).toBe('Test');
@@ -140,7 +140,7 @@ describe('BuildCleaner', () => {
140140

141141
it('should reject if \'getExistingDownloads()\' rejects', async () => {
142142
try {
143-
cleanerGetExistingDownloadsSpy.and.returnValue(Promise.reject('Test'));
143+
cleanerGetExistingDownloadsSpy.and.callFake(() => Promise.reject('Test'));
144144
await cleaner.cleanUp();
145145
} catch (err) {
146146
expect(err).toBe('Test');
@@ -150,7 +150,7 @@ describe('BuildCleaner', () => {
150150

151151
it('should reject if \'removeUnnecessaryBuilds()\' rejects', async () => {
152152
try {
153-
cleanerRemoveUnnecessaryBuildsSpy.and.returnValue(Promise.reject('Test'));
153+
cleanerRemoveUnnecessaryBuildsSpy.and.callFake(() => Promise.reject('Test'));
154154
await cleaner.cleanUp();
155155
} catch (err) {
156156
expect(err).toBe('Test');
@@ -159,7 +159,7 @@ describe('BuildCleaner', () => {
159159

160160
it('should reject if \'removeUnnecessaryDownloads()\' rejects', async () => {
161161
try {
162-
cleanerRemoveUnnecessaryDownloadsSpy.and.returnValue(Promise.reject('Test'));
162+
cleanerRemoveUnnecessaryDownloadsSpy.and.callFake(() => Promise.reject('Test'));
163163
await cleaner.cleanUp();
164164
} catch (err) {
165165
expect(err).toBe('Test');

Diff for: aio/aio-builds-setup/dockerbuild/scripts-js/test/common/github-pull-requests.spec.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ describe('GithubPullRequests', () => {
4747

4848

4949
it('should make a POST request to Github with the correct pathname, params and data', () => {
50-
githubApi.post.and.returnValue(Promise.resolve());
50+
githubApi.post.and.callFake(() => Promise.resolve());
5151
prs.addComment(42, 'body');
5252
expect(githubApi.post).toHaveBeenCalledWith('/repos/foo/bar/issues/42/comments', null, {body: 'body'});
5353
});
5454

5555

5656
it('should reject if the request fails', done => {
57-
githubApi.post.and.returnValue(Promise.reject('Test'));
57+
githubApi.post.and.callFake(() => Promise.reject('Test'));
5858
prs.addComment(42, 'body').catch(err => {
5959
expect(err).toBe('Test');
6060
done();
@@ -63,7 +63,7 @@ describe('GithubPullRequests', () => {
6363

6464

6565
it('should resolve with the data from the Github POST', done => {
66-
githubApi.post.and.returnValue(Promise.resolve('Test'));
66+
githubApi.post.and.callFake(() => Promise.resolve('Test'));
6767
prs.addComment(42, 'body').then(data => {
6868
expect(data).toBe('Test');
6969
done();
@@ -89,7 +89,7 @@ describe('GithubPullRequests', () => {
8989

9090
it('should resolve with the data returned from GitHub', done => {
9191
const expected: any = {number: 42};
92-
githubApi.get.and.returnValue(Promise.resolve(expected));
92+
githubApi.get.and.callFake(() => Promise.resolve(expected));
9393
prs.fetch(42).then(data => {
9494
expect(data).toEqual(expected);
9595
done();

Diff for: aio/aio-builds-setup/dockerbuild/scripts-js/test/common/github-teams.spec.ts

+17-16
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ describe('GithubTeams', () => {
5050

5151

5252
it('should return a promise', () => {
53-
githubApi.get.and.returnValue(Promise.resolve());
53+
githubApi.get.and.callFake(() => Promise.resolve());
5454
const promise = teams.isMemberById('user', [1]);
5555
expect(promise).toEqual(jasmine.any(Promise));
5656
});
@@ -66,7 +66,7 @@ describe('GithubTeams', () => {
6666

6767

6868
it('should call \'get()\' with the correct pathname', done => {
69-
githubApi.get.and.returnValue(Promise.resolve());
69+
githubApi.get.and.callFake(() => Promise.resolve());
7070
teams.isMemberById('user', [1]).then(() => {
7171
expect(githubApi.get).toHaveBeenCalledWith('/teams/1/memberships/user');
7272
done();
@@ -75,7 +75,7 @@ describe('GithubTeams', () => {
7575

7676

7777
it('should resolve with false if \'get()\' rejects', done => {
78-
githubApi.get.and.returnValue(Promise.reject(null));
78+
githubApi.get.and.callFake(() => Promise.reject(null));
7979
teams.isMemberById('user', [1]).then(isMember => {
8080
expect(isMember).toBe(false);
8181
expect(githubApi.get).toHaveBeenCalled();
@@ -85,7 +85,7 @@ describe('GithubTeams', () => {
8585

8686

8787
it('should resolve with false if the membership is not active', done => {
88-
githubApi.get.and.returnValue(Promise.resolve({state: 'pending'}));
88+
githubApi.get.and.callFake(() => Promise.resolve({state: 'pending'}));
8989
teams.isMemberById('user', [1]).then(isMember => {
9090
expect(isMember).toBe(false);
9191
expect(githubApi.get).toHaveBeenCalled();
@@ -95,7 +95,7 @@ describe('GithubTeams', () => {
9595

9696

9797
it('should resolve with true if the membership is active', done => {
98-
githubApi.get.and.returnValue(Promise.resolve({state: 'active'}));
98+
githubApi.get.and.callFake(() => Promise.resolve({state: 'active'}));
9999
teams.isMemberById('user', [1]).then(isMember => {
100100
expect(isMember).toBe(true);
101101
done();
@@ -175,7 +175,7 @@ describe('GithubTeams', () => {
175175

176176

177177
it('should resolve with false if \'fetchAll()\' rejects', done => {
178-
teamsFetchAllSpy.and.returnValue(Promise.reject(null));
178+
teamsFetchAllSpy.and.callFake(() => Promise.reject(null));
179179
teams.isMemberBySlug('user', ['team-slug']).then(isMember => {
180180
expect(isMember).toBe(false);
181181
done();
@@ -203,7 +203,7 @@ describe('GithubTeams', () => {
203203

204204

205205
it('should resolve with false if \'isMemberById()\' rejects', done => {
206-
teamsIsMemberByIdSpy.and.returnValue(Promise.reject(null));
206+
teamsIsMemberByIdSpy.and.callFake(() => Promise.reject(null));
207207
teams.isMemberBySlug('user', ['team1']).then(isMember => {
208208
expect(isMember).toBe(false);
209209
expect(teamsIsMemberByIdSpy).toHaveBeenCalled();
@@ -212,16 +212,17 @@ describe('GithubTeams', () => {
212212
});
213213

214214

215-
it('should resolve with the value \'isMemberById()\' resolves with', done => {
216-
teamsIsMemberByIdSpy.and.returnValues(Promise.resolve(false), Promise.resolve(true));
215+
it('should resolve with the value \'isMemberById()\' resolves with', async () => {
217216

218-
Promise.all([
219-
teams.isMemberBySlug('user', ['team1']).then(isMember => expect(isMember).toBe(false)),
220-
teams.isMemberBySlug('user', ['team1']).then(isMember => expect(isMember).toBe(true)),
221-
]).then(() => {
222-
expect(teamsIsMemberByIdSpy).toHaveBeenCalledTimes(2);
223-
done();
224-
});
217+
teamsIsMemberByIdSpy.and.callFake(() => Promise.resolve(true));
218+
const isMember1 = await teams.isMemberBySlug('user', ['team1']);
219+
expect(isMember1).toBe(true);
220+
expect(teamsIsMemberByIdSpy).toHaveBeenCalledWith('user', [1]);
221+
222+
teamsIsMemberByIdSpy.and.callFake(() => Promise.resolve(false));
223+
const isMember2 = await teams.isMemberBySlug('user', ['team1']);
224+
expect(isMember2).toBe(false);
225+
expect(teamsIsMemberByIdSpy).toHaveBeenCalledWith('user', [1]);
225226
});
226227

227228
});

Diff for: aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-creator.spec.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ describe('BuildCreator', () => {
135135

136136
it('should abort and skip further operations if changing the PR\'s visibility fails', done => {
137137
const mockError = new UploadError(543, 'Test');
138-
bcUpdatePrVisibilitySpy.and.returnValue(Promise.reject(mockError));
138+
bcUpdatePrVisibilitySpy.and.callFake(() => Promise.reject(mockError));
139139

140140
bc.create(pr, sha, archive, isPublic).catch(err => {
141141
expect(err).toBe(mockError);
@@ -324,7 +324,7 @@ describe('BuildCreator', () => {
324324
const shas = ['foo', 'bar', 'baz'];
325325
let emitted = false;
326326

327-
bcListShasByDate.and.returnValue(Promise.resolve(shas));
327+
bcListShasByDate.and.callFake(() => Promise.resolve(shas));
328328
bcEmitSpy.and.callFake((type: string, evt: ChangedPrVisibilityEvent) => {
329329
expect(bcListShasByDate).toHaveBeenCalledWith(newPrDir);
330330

@@ -618,7 +618,7 @@ describe('BuildCreator', () => {
618618

619619

620620
it('should reject if listing files fails', done => {
621-
shellLsSpy.and.returnValue(Promise.reject('Test'));
621+
shellLsSpy.and.callFake(() => Promise.reject('Test'));
622622
(bc as any).listShasByDate('input/dir').catch((err: string) => {
623623
expect(err).toBe('Test');
624624
done();
@@ -627,7 +627,7 @@ describe('BuildCreator', () => {
627627

628628

629629
it('should return the filenames', done => {
630-
shellLsSpy.and.returnValue(Promise.resolve([
630+
shellLsSpy.and.callFake(() => Promise.resolve([
631631
lsResult('foo', 100),
632632
lsResult('bar', 200),
633633
lsResult('baz', 300),
@@ -640,7 +640,7 @@ describe('BuildCreator', () => {
640640

641641

642642
it('should sort by date', done => {
643-
shellLsSpy.and.returnValue(Promise.resolve([
643+
shellLsSpy.and.callFake(() => Promise.resolve([
644644
lsResult('foo', 300),
645645
lsResult('bar', 100),
646646
lsResult('baz', 200),
@@ -660,7 +660,7 @@ describe('BuildCreator', () => {
660660
];
661661
mockArray.sort = jasmine.createSpy('sort');
662662

663-
shellLsSpy.and.returnValue(Promise.resolve(mockArray));
663+
shellLsSpy.and.callFake(() => Promise.resolve(mockArray));
664664
(bc as any).listShasByDate('input/dir').
665665
then((shas: string[]) => {
666666
expect(shas).toEqual(['bar', 'baz', 'foo']);
@@ -671,7 +671,7 @@ describe('BuildCreator', () => {
671671

672672

673673
it('should only include directories', done => {
674-
shellLsSpy.and.returnValue(Promise.resolve([
674+
shellLsSpy.and.callFake(() => Promise.resolve([
675675
lsResult('foo', 100),
676676
lsResult('bar', 200, false),
677677
lsResult('baz', 300),

Diff for: aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-retriever.spec.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ describe('BuildRetriever', () => {
1313
let BUILD_INFO: BuildInfo;
1414
let WRITEFILE_RESULT: any;
1515
let writeFileSpy: jasmine.Spy;
16+
let EXISTS_RESULT: boolean;
17+
let existsSpy: jasmine.Spy;
1618
let getBuildArtifactUrlSpy: jasmine.Spy;
1719

1820
beforeEach(() => {
@@ -28,15 +30,20 @@ describe('BuildRetriever', () => {
2830
};
2931

3032
api = new CircleCIApi('ORG', 'REPO', 'TOKEN');
31-
spyOn(api, 'getBuildInfo').and.returnValue(Promise.resolve(BUILD_INFO));
33+
spyOn(api, 'getBuildInfo').and.callFake(() => Promise.resolve(BUILD_INFO));
3234
getBuildArtifactUrlSpy = spyOn(api, 'getBuildArtifactUrl')
33-
.and.returnValue(Promise.resolve(BASE_URL + ARTIFACT_PATH));
35+
.and.callFake(() => Promise.resolve(BASE_URL + ARTIFACT_PATH));
3436

3537
WRITEFILE_RESULT = undefined;
3638
writeFileSpy = spyOn(fs, 'writeFile').and.callFake(
3739
(_path: string, _buffer: Buffer, callback: (err?: any) => {}) => callback(WRITEFILE_RESULT),
3840
);
39-
});
41+
42+
EXISTS_RESULT = false;
43+
existsSpy = spyOn(fs, 'exists').and.callFake(
44+
(_path: string, callback: (err?: any) => {}) => callback(EXISTS_RESULT),
45+
);
46+
});
4047

4148
describe('constructor', () => {
4249
it('should fail if the "downloadDir" is missing', () => {
@@ -101,7 +108,7 @@ describe('BuildRetriever', () => {
101108

102109
it('should fail if the CircleCI API fails', async () => {
103110
try {
104-
getBuildArtifactUrlSpy.and.returnValue(Promise.reject('getBuildArtifactUrl failed'));
111+
getBuildArtifactUrlSpy.and.callFake(() => Promise.reject('getBuildArtifactUrl failed'));
105112
await retriever.downloadBuildArtifact(12345, 777, 'COMMIT', ARTIFACT_PATH);
106113
throw new Error('Exception Expected');
107114
} catch (error) {

Diff for: aio/aio-builds-setup/dockerbuild/scripts-js/test/upload-server/build-verifier.spec.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ describe('BuildVerifier', () => {
6464
};
6565

6666
prsFetchSpy = spyOn(GithubPullRequests.prototype, 'fetch').
67-
and.returnValue(Promise.resolve(mockPrInfo));
67+
and.callFake(() => Promise.resolve(mockPrInfo));
6868

6969
teamsIsMemberBySlugSpy = spyOn(GithubTeams.prototype, 'isMemberBySlug').
70-
and.returnValue(Promise.resolve(true));
70+
and.callFake(() => Promise.resolve(true));
7171
});
7272

7373

@@ -140,7 +140,7 @@ describe('BuildVerifier', () => {
140140

141141

142142
it('should resolve to true if the PR\'s author is a member', done => {
143-
teamsIsMemberBySlugSpy.and.returnValue(Promise.resolve(true));
143+
teamsIsMemberBySlugSpy.and.callFake(() => Promise.resolve(true));
144144

145145
bv.getPrIsTrusted(pr).then(isTrusted => {
146146
expect(isTrusted).toBe(true);
@@ -150,7 +150,7 @@ describe('BuildVerifier', () => {
150150

151151

152152
it('should resolve to false if the PR\'s author is not a member', done => {
153-
teamsIsMemberBySlugSpy.and.returnValue(Promise.resolve(false));
153+
teamsIsMemberBySlugSpy.and.callFake(() => Promise.resolve(false));
154154

155155
bv.getPrIsTrusted(pr).then(isTrusted => {
156156
expect(isTrusted).toBe(false);

0 commit comments

Comments
 (0)