| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  | // Imports
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  | import {GithubApi} from '../../lib/common/github-api'; | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  | import {GithubPullRequests, PullRequest} from '../../lib/common/github-pull-requests'; | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  | import {GithubTeams} from '../../lib/common/github-teams'; | 
					
						
							| 
									
										
										
										
											2018-08-15 13:47:45 +01:00
										 |  |  | import {BuildVerifier} from '../../lib/preview-server/build-verifier'; | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Tests
 | 
					
						
							|  |  |  | describe('BuildVerifier', () => { | 
					
						
							|  |  |  |   const defaultConfig = { | 
					
						
							|  |  |  |     allowedTeamSlugs: ['team1', 'team2'], | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |     githubOrg: 'organization', | 
					
						
							|  |  |  |     githubRepo: 'repo', | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  |     githubToken: 'githubToken', | 
					
						
							|  |  |  |     secret: 'secret', | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |     trustedPrLabel: 'trusted: pr-label', | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |   let prs: GithubPullRequests; | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  |   let bv: BuildVerifier; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Helpers
 | 
					
						
							|  |  |  |   const createBuildVerifier = (partialConfig: Partial<typeof defaultConfig> = {}) => { | 
					
						
							| 
									
										
										
										
											2017-06-17 21:03:10 +03:00
										 |  |  |     const cfg = {...defaultConfig, ...partialConfig} as typeof defaultConfig; | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |     const api = new GithubApi(cfg.githubToken); | 
					
						
							|  |  |  |     prs = new GithubPullRequests(api, cfg.githubOrg, cfg.githubRepo); | 
					
						
							|  |  |  |     const teams = new GithubTeams(api, cfg.githubOrg); | 
					
						
							|  |  |  |     return new BuildVerifier(prs, teams, cfg.allowedTeamSlugs, cfg.trustedPrLabel); | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   beforeEach(() => bv = createBuildVerifier()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('constructor()', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |     ['githubToken', 'githubRepo', 'githubOrg', 'allowedTeamSlugs', 'trustedPrLabel']. | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |       forEach(param => { | 
					
						
							|  |  |  |         it(`should throw if '${param}' is missing or empty`, () => { | 
					
						
							|  |  |  |           expect(() => createBuildVerifier({[param]: ''})). | 
					
						
							|  |  |  |             toThrowError(`Missing or empty required parameter '${param}'!`); | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('should throw if \'allowedTeamSlugs\' is an empty array', () => { | 
					
						
							|  |  |  |       expect(() => createBuildVerifier({allowedTeamSlugs: []})). | 
					
						
							|  |  |  |         toThrowError('Missing or empty required parameter \'allowedTeamSlugs\'!'); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |   describe('getSignificantFilesChanged', () => { | 
					
						
							|  |  |  |     it('should return false if none of the fetched files match the given pattern', async () => { | 
					
						
							|  |  |  |       const fetchFilesSpy = spyOn(prs, 'fetchFiles'); | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       fetchFilesSpy.and.resolveTo([ | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:05 +03:00
										 |  |  |         {filename: 'a/b/c', sha: 'a1'}, | 
					
						
							|  |  |  |         {filename: 'd/e/f', sha: 'b2'}, | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       ]); | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |       expect(await bv.getSignificantFilesChanged(777, /^x/)).toEqual(false); | 
					
						
							|  |  |  |       expect(fetchFilesSpy).toHaveBeenCalledWith(777); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       fetchFilesSpy.calls.reset(); | 
					
						
							|  |  |  |       expect(await bv.getSignificantFilesChanged(777, /^a/)).toEqual(true); | 
					
						
							|  |  |  |       expect(fetchFilesSpy).toHaveBeenCalledWith(777); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |   describe('getPrIsTrusted()', () => { | 
					
						
							|  |  |  |     const pr = 9; | 
					
						
							|  |  |  |     let mockPrInfo: PullRequest; | 
					
						
							|  |  |  |     let prsFetchSpy: jasmine.Spy; | 
					
						
							|  |  |  |     let teamsIsMemberBySlugSpy: jasmine.Spy; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     beforeEach(() => { | 
					
						
							|  |  |  |       mockPrInfo = { | 
					
						
							|  |  |  |         labels: [ | 
					
						
							|  |  |  |           {name: 'foo'}, | 
					
						
							|  |  |  |           {name: 'bar'}, | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         number: 9, | 
					
						
							|  |  |  |         user: {login: 'username'}, | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       prsFetchSpy = spyOn(GithubPullRequests.prototype, 'fetch').and.resolveTo(mockPrInfo); | 
					
						
							|  |  |  |       teamsIsMemberBySlugSpy = spyOn(GithubTeams.prototype, 'isMemberBySlug').and.resolveTo(true); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |     it('should return a promise', async () => { | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |       const promise = bv.getPrIsTrusted(pr); | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       expect(promise).toBeInstanceOf(Promise); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       // Do not complete the test (and release the spies) synchronously to avoid running the actual
 | 
					
						
							|  |  |  |       // `GithubTeams#isMemberBySlug()`.
 | 
					
						
							|  |  |  |       await promise; | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |     it('should fetch the corresponding PR', async () => { | 
					
						
							|  |  |  |       await bv.getPrIsTrusted(pr); | 
					
						
							|  |  |  |       expect(prsFetchSpy).toHaveBeenCalledWith(pr); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |     it('should fail if fetching the PR errors', async () => { | 
					
						
							|  |  |  |       prsFetchSpy.and.rejectWith('Test'); | 
					
						
							|  |  |  |       await expectAsync(bv.getPrIsTrusted(pr)).toBeRejectedWith('Test'); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('when the PR has the "trusted PR" label', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       beforeEach(() => mockPrInfo.labels.push({name: 'trusted: pr-label'})); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       it('should resolve to true', async () => { | 
					
						
							|  |  |  |         await expectAsync(bv.getPrIsTrusted(pr)).toBeResolvedTo(true); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       it('should not try to verify the author\'s membership status', async () => { | 
					
						
							|  |  |  |         await expectAsync(bv.getPrIsTrusted(pr)); | 
					
						
							|  |  |  |         expect(teamsIsMemberBySlugSpy).not.toHaveBeenCalled(); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('when the PR does not have the "trusted PR" label', () => { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       it('should verify the PR author\'s membership in the specified teams', async () => { | 
					
						
							|  |  |  |         await bv.getPrIsTrusted(pr); | 
					
						
							|  |  |  |         expect(teamsIsMemberBySlugSpy).toHaveBeenCalledWith('username', ['team1', 'team2']); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       it('should fail if verifying membership errors', async () => { | 
					
						
							|  |  |  |         teamsIsMemberBySlugSpy.and.rejectWith('Test'); | 
					
						
							|  |  |  |         await expectAsync(bv.getPrIsTrusted(pr)).toBeRejectedWith('Test'); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       it('should resolve to true if the PR\'s author is a member', async () => { | 
					
						
							|  |  |  |         teamsIsMemberBySlugSpy.and.resolveTo(true); | 
					
						
							|  |  |  |         await expectAsync(bv.getPrIsTrusted(pr)).toBeResolvedTo(true); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-02 16:14:14 +03:00
										 |  |  |       it('should resolve to false if the PR\'s author is not a member', async () => { | 
					
						
							|  |  |  |         teamsIsMemberBySlugSpy.and.resolveTo(false); | 
					
						
							|  |  |  |         await expectAsync(bv.getPrIsTrusted(pr)).toBeResolvedTo(false); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  | }); |