| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  | import * as nock from 'nock'; | 
					
						
							|  |  |  | import {CircleCiApi} from '../../lib/common/circle-ci-api'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ORG = 'testorg'; | 
					
						
							|  |  |  | const REPO = 'testrepo'; | 
					
						
							|  |  |  | const TOKEN = 'xxxx'; | 
					
						
							|  |  |  | const BASE_URL = `https://circleci.com/api/v1.1/project/github/${ORG}/${REPO}`; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('CircleCIApi', () => { | 
					
						
							|  |  |  |   describe('constructor()', () => { | 
					
						
							|  |  |  |     it('should throw if \'githubOrg\' is missing or empty', () => { | 
					
						
							|  |  |  |       expect(() => new CircleCiApi('', REPO, TOKEN)). | 
					
						
							|  |  |  |         toThrowError('Missing or empty required parameter \'githubOrg\'!'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should throw if \'githubRepo\' is missing or empty', () => { | 
					
						
							|  |  |  |       expect(() => new CircleCiApi(ORG, '', TOKEN)). | 
					
						
							|  |  |  |         toThrowError('Missing or empty required parameter \'githubRepo\'!'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should throw if \'circleCiToken\' is missing or empty', () => { | 
					
						
							|  |  |  |       expect(() => new CircleCiApi(ORG, REPO, '')). | 
					
						
							|  |  |  |         toThrowError('Missing or empty required parameter \'circleCiToken\'!'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('getBuildInfo', () => { | 
					
						
							|  |  |  |     it('should make a request to the CircleCI API for the given build number', async () => { | 
					
						
							|  |  |  |       const api = new CircleCiApi(ORG, REPO, TOKEN); | 
					
						
							|  |  |  |       const buildNum = 12345; | 
					
						
							|  |  |  |       const expectedBuildInfo: any = { org: ORG, repo: REPO, build_num: buildNum }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const request = nock(BASE_URL) | 
					
						
							|  |  |  |         .get(`/${buildNum}?circle-token=${TOKEN}`) | 
					
						
							|  |  |  |         .reply(200, expectedBuildInfo); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const buildInfo = await api.getBuildInfo(buildNum); | 
					
						
							|  |  |  |       expect(buildInfo).toEqual(expectedBuildInfo); | 
					
						
							|  |  |  |       request.done(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should throw an error if the request fails', async () => { | 
					
						
							|  |  |  |       const api = new CircleCiApi(ORG, REPO, TOKEN); | 
					
						
							|  |  |  |       const buildNum = 12345; | 
					
						
							|  |  |  |       const errorMessage = 'Invalid request'; | 
					
						
							|  |  |  |       const request = nock(BASE_URL).get(`/${buildNum}?circle-token=${TOKEN}`); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       request.replyWithError(errorMessage); | 
					
						
							|  |  |  |       await expectAsync(api.getBuildInfo(buildNum)).toBeRejectedWithError( | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |           `CircleCI build info request failed ` + | 
					
						
							|  |  |  |           `(request to ${BASE_URL}/${buildNum}?circle-token=${TOKEN} failed, reason: ${errorMessage})`); | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       request.reply(404, errorMessage); | 
					
						
							|  |  |  |       await expectAsync(api.getBuildInfo(buildNum)).toBeRejectedWithError( | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |           `CircleCI build info request failed ` + | 
					
						
							|  |  |  |           `(request to ${BASE_URL}/${buildNum}?circle-token=${TOKEN} failed, reason: ${errorMessage})`); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('getBuildArtifactUrl', () => { | 
					
						
							|  |  |  |     it('should make a request to the CircleCI API for the given build number', async () => { | 
					
						
							|  |  |  |       const api = new CircleCiApi(ORG, REPO, TOKEN); | 
					
						
							|  |  |  |       const buildNum = 12345; | 
					
						
							|  |  |  |       const artifact0: any = { path: 'some/path/0', url: 'https://url/0' }; | 
					
						
							|  |  |  |       const artifact1: any = { path: 'some/path/1', url: 'https://url/1' }; | 
					
						
							|  |  |  |       const artifact2: any = { path: 'some/path/2', url: 'https://url/2' }; | 
					
						
							|  |  |  |       const request = nock(BASE_URL) | 
					
						
							|  |  |  |         .get(`/${buildNum}/artifacts?circle-token=${TOKEN}`) | 
					
						
							|  |  |  |         .reply(200, [artifact0, artifact1, artifact2]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       await expectAsync(api.getBuildArtifactUrl(buildNum, 'some/path/1')).toBeResolvedTo('https://url/1'); | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |       request.done(); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should throw an error if the request fails', async () => { | 
					
						
							|  |  |  |       const api = new CircleCiApi(ORG, REPO, TOKEN); | 
					
						
							|  |  |  |       const buildNum = 12345; | 
					
						
							|  |  |  |       const errorMessage = 'Invalid request'; | 
					
						
							|  |  |  |       const request = nock(BASE_URL).get(`/${buildNum}/artifacts?circle-token=${TOKEN}`); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       request.replyWithError(errorMessage); | 
					
						
							|  |  |  |       await expectAsync(api.getBuildArtifactUrl(buildNum, 'some/path/1')).toBeRejectedWithError( | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |           `CircleCI artifact URL request failed ` + | 
					
						
							|  |  |  |           `(request to ${BASE_URL}/${buildNum}/artifacts?circle-token=${TOKEN} failed, reason: ${errorMessage})`); | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       request.reply(404, errorMessage); | 
					
						
							|  |  |  |       await expectAsync(api.getBuildArtifactUrl(buildNum, 'some/path/1')).toBeRejectedWithError( | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |           `CircleCI artifact URL request failed ` + | 
					
						
							|  |  |  |           `(request to ${BASE_URL}/${buildNum}/artifacts?circle-token=${TOKEN} failed, reason: ${errorMessage})`); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should throw an error if the response does not contain the specified artifact', async () => { | 
					
						
							|  |  |  |       const api = new CircleCiApi(ORG, REPO, TOKEN); | 
					
						
							|  |  |  |       const buildNum = 12345; | 
					
						
							|  |  |  |       const artifact0: any = { path: 'some/path/0', url: 'https://url/0' }; | 
					
						
							|  |  |  |       const artifact1: any = { path: 'some/path/1', url: 'https://url/1' }; | 
					
						
							|  |  |  |       const artifact2: any = { path: 'some/path/2', url: 'https://url/2' }; | 
					
						
							|  |  |  |       nock(BASE_URL) | 
					
						
							|  |  |  |         .get(`/${buildNum}/artifacts?circle-token=${TOKEN}`) | 
					
						
							|  |  |  |         .reply(200, [artifact0, artifact1, artifact2]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       await expectAsync(api.getBuildArtifactUrl(buildNum, 'some/path/3')).toBeRejectedWithError( | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |           `CircleCI artifact URL request failed ` + | 
					
						
							|  |  |  |           `(Missing artifact (some/path/3) for CircleCI build: ${buildNum})`); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |