119 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			119 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | 
 | ||
|  | /** | ||
|  |  * @license | ||
|  |  * Copyright Google LLC All Rights Reserved. | ||
|  |  * | ||
|  |  * Use of this source code is governed by an MIT-style license that can be | ||
|  |  * found in the LICENSE file at https://angular.io/license
 | ||
|  |  */ | ||
|  | import {SemVer} from 'semver'; | ||
|  | import {ReleaseTrain} from '../../release/versioning'; | ||
|  | 
 | ||
|  | import * as versioning from '../../release/versioning/active-release-trains'; | ||
|  | import * as console from '../../utils/console'; | ||
|  | import {buildVirtualGitClient, mockNgDevConfig, VirtualGitClient} from '../../utils/testing'; | ||
|  | 
 | ||
|  | import {CiModule} from './ci'; | ||
|  | 
 | ||
|  | describe('CiModule', () => { | ||
|  |   let fetchActiveReleaseTrainsSpy: jasmine.Spy; | ||
|  |   let getBranchStatusFromCiSpy: jasmine.Spy; | ||
|  |   let infoSpy: jasmine.Spy; | ||
|  |   let debugSpy: jasmine.Spy; | ||
|  |   let virtualGitClient: VirtualGitClient; | ||
|  | 
 | ||
|  |   beforeEach(() => { | ||
|  |     virtualGitClient = buildVirtualGitClient(); | ||
|  |     fetchActiveReleaseTrainsSpy = spyOn(versioning, 'fetchActiveReleaseTrains'); | ||
|  |     getBranchStatusFromCiSpy = spyOn(CiModule.prototype, 'getBranchStatusFromCi' as any); | ||
|  |     infoSpy = spyOn(console, 'info'); | ||
|  |     debugSpy = spyOn(console, 'debug'); | ||
|  |   }); | ||
|  | 
 | ||
|  |   describe('getting data for active trains', () => { | ||
|  |     it('handles active rc train', async () => { | ||
|  |       const trains = buildMockActiveReleaseTrains(true); | ||
|  |       fetchActiveReleaseTrainsSpy.and.resolveTo(trains); | ||
|  |       const module = new CiModule(virtualGitClient, {caretaker: {}, ...mockNgDevConfig}); | ||
|  |       await module.data; | ||
|  | 
 | ||
|  |       expect(getBranchStatusFromCiSpy).toHaveBeenCalledWith(trains.releaseCandidate.branchName); | ||
|  |       expect(getBranchStatusFromCiSpy).toHaveBeenCalledWith(trains.latest.branchName); | ||
|  |       expect(getBranchStatusFromCiSpy).toHaveBeenCalledWith(trains.next.branchName); | ||
|  |       expect(getBranchStatusFromCiSpy).toHaveBeenCalledTimes(3); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('handles an inactive rc train', async () => { | ||
|  |       const trains = buildMockActiveReleaseTrains(false); | ||
|  |       fetchActiveReleaseTrainsSpy.and.resolveTo(trains); | ||
|  |       const module = new CiModule(virtualGitClient, {caretaker: {}, ...mockNgDevConfig}); | ||
|  |       await module.data; | ||
|  | 
 | ||
|  |       expect(getBranchStatusFromCiSpy).toHaveBeenCalledWith(trains.latest.branchName); | ||
|  |       expect(getBranchStatusFromCiSpy).toHaveBeenCalledWith(trains.next.branchName); | ||
|  |       expect(getBranchStatusFromCiSpy).toHaveBeenCalledTimes(2); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('aggregates information into a useful structure', async () => { | ||
|  |       const trains = buildMockActiveReleaseTrains(false); | ||
|  |       fetchActiveReleaseTrainsSpy.and.resolveTo(trains); | ||
|  |       getBranchStatusFromCiSpy.and.returnValue('success'); | ||
|  |       const module = new CiModule(virtualGitClient, {caretaker: {}, ...mockNgDevConfig}); | ||
|  |       const data = await module.data; | ||
|  | 
 | ||
|  |       expect(data[0]).toEqual( | ||
|  |           {active: false, name: 'releaseCandidate', label: '', status: 'not found'}); | ||
|  |       expect(data[1]).toEqual({ | ||
|  |         active: true, | ||
|  |         name: 'latest-branch', | ||
|  |         label: 'latest (latest-branch)', | ||
|  |         status: 'success', | ||
|  |       }); | ||
|  |     }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('prints the data retrieved', async () => { | ||
|  |     const fakeData = Promise.resolve([ | ||
|  |       { | ||
|  |         active: true, | ||
|  |         name: 'name0', | ||
|  |         label: 'label0', | ||
|  |         status: 'success', | ||
|  |       }, | ||
|  |       { | ||
|  |         active: false, | ||
|  |         name: 'name1', | ||
|  |         label: 'label1', | ||
|  |         status: 'failed', | ||
|  |       }, | ||
|  |     ]); | ||
|  |     fetchActiveReleaseTrainsSpy.and.resolveTo([]); | ||
|  | 
 | ||
|  |     const module = new CiModule(virtualGitClient, {caretaker: {}, ...mockNgDevConfig}); | ||
|  |     Object.defineProperty(module, 'data', {value: fakeData}); | ||
|  | 
 | ||
|  |     await module.printToTerminal(); | ||
|  | 
 | ||
|  |     expect(debugSpy).toHaveBeenCalledWith('No active release train for name1'); | ||
|  |     expect(infoSpy).toHaveBeenCalledWith('label0 ✅'); | ||
|  |   }); | ||
|  | }); | ||
|  | 
 | ||
|  | 
 | ||
|  | /** Build a mock set of ActiveReleaseTrains. */ | ||
|  | function buildMockActiveReleaseTrains(withRc: false): versioning.ActiveReleaseTrains& | ||
|  |     {releaseCandidate: null}; | ||
|  | function buildMockActiveReleaseTrains(withRc: true): versioning.ActiveReleaseTrains& | ||
|  |     {releaseCandidate: ReleaseTrain}; | ||
|  | function buildMockActiveReleaseTrains(withRc: boolean): versioning.ActiveReleaseTrains { | ||
|  |   const baseResult = { | ||
|  |     isMajor: false, | ||
|  |     version: new SemVer('0.0.0'), | ||
|  |   }; | ||
|  |   return { | ||
|  |     releaseCandidate: withRc ? {branchName: 'rc-branch', ...baseResult} : null, | ||
|  |     latest: {branchName: 'latest-branch', ...baseResult}, | ||
|  |     next: {branchName: 'next-branch', ...baseResult} | ||
|  |   }; | ||
|  | } |