135 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | 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}`); | ||
|  | 
 | ||
|  |       try { | ||
|  |         request.replyWithError(errorMessage); | ||
|  |         await api.getBuildInfo(buildNum); | ||
|  |         throw new Error('Exception Expected'); | ||
|  |       } catch (err) { | ||
|  |         expect(err.message).toEqual( | ||
|  |           `CircleCI build info request failed ` + | ||
|  |           `(request to ${BASE_URL}/${buildNum}?circle-token=${TOKEN} failed, reason: ${errorMessage})`); | ||
|  |       } | ||
|  | 
 | ||
|  |       try { | ||
|  |         request.reply(404, errorMessage); | ||
|  |         await api.getBuildInfo(buildNum); | ||
|  |         throw new Error('Exception Expected'); | ||
|  |       } catch (err) { | ||
|  |         expect(err.message).toEqual( | ||
|  |           `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]); | ||
|  | 
 | ||
|  |       const artifactUrl = await api.getBuildArtifactUrl(buildNum, 'some/path/1'); | ||
|  |       expect(artifactUrl).toEqual('https://url/1'); | ||
|  |       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}`); | ||
|  | 
 | ||
|  |       try { | ||
|  |         request.replyWithError(errorMessage); | ||
|  |         await api.getBuildArtifactUrl(buildNum, 'some/path/1'); | ||
|  |         throw new Error('Exception Expected'); | ||
|  |       } catch (err) { | ||
|  |         expect(err.message).toEqual( | ||
|  |           `CircleCI artifact URL request failed ` + | ||
|  |           `(request to ${BASE_URL}/${buildNum}/artifacts?circle-token=${TOKEN} failed, reason: ${errorMessage})`); | ||
|  |       } | ||
|  | 
 | ||
|  |       try { | ||
|  |         request.reply(404, errorMessage); | ||
|  |         await api.getBuildArtifactUrl(buildNum, 'some/path/1'); | ||
|  |         throw new Error('Exception Expected'); | ||
|  |       } catch (err) { | ||
|  |         expect(err.message).toEqual( | ||
|  |           `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]); | ||
|  | 
 | ||
|  |       try { | ||
|  |         await api.getBuildArtifactUrl(buildNum, 'some/path/3'); | ||
|  |         throw new Error('Exception Expected'); | ||
|  |       } catch (err) { | ||
|  |         expect(err.message).toEqual( | ||
|  |           `CircleCI artifact URL request failed ` + | ||
|  |           `(Missing artifact (some/path/3) for CircleCI build: ${buildNum})`); | ||
|  |       } | ||
|  |     }); | ||
|  |   }); | ||
|  | }); |