110 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			110 lines
		
	
	
		
			4.0 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 {SpawnSyncReturns} from 'child_process'; | ||
|  | 
 | ||
|  | import * as console from '../../utils/console'; | ||
|  | import {buildVirtualGitClient, mockNgDevConfig, VirtualGitClient} from '../../utils/testing'; | ||
|  | 
 | ||
|  | import {G3Module, G3StatsData} from './g3'; | ||
|  | 
 | ||
|  | describe('G3Module', () => { | ||
|  |   let getG3FileIncludeAndExcludeLists: jasmine.Spy; | ||
|  |   let getLatestShas: jasmine.Spy; | ||
|  |   let getDiffStats: jasmine.Spy; | ||
|  |   let infoSpy: jasmine.Spy; | ||
|  |   let virtualGitClient: VirtualGitClient; | ||
|  | 
 | ||
|  |   beforeEach(() => { | ||
|  |     virtualGitClient = buildVirtualGitClient(); | ||
|  |     getG3FileIncludeAndExcludeLists = | ||
|  |         spyOn(G3Module.prototype, 'getG3FileIncludeAndExcludeLists' as any).and.returnValue(null); | ||
|  |     getLatestShas = spyOn(G3Module.prototype, 'getLatestShas' as any).and.returnValue(null); | ||
|  |     getDiffStats = spyOn(G3Module.prototype, 'getDiffStats' as any).and.returnValue(null); | ||
|  |     infoSpy = spyOn(console, 'info'); | ||
|  |   }); | ||
|  | 
 | ||
|  |   describe('gathering stats', () => { | ||
|  |     it('unless the g3 merge config is not defined in the angular robot file', async () => { | ||
|  |       getG3FileIncludeAndExcludeLists.and.returnValue(null); | ||
|  |       getLatestShas.and.returnValue({g3: 'abc123', master: 'zxy987'}); | ||
|  |       const module = new G3Module(virtualGitClient, {caretaker: {}, ...mockNgDevConfig}); | ||
|  | 
 | ||
|  |       expect(getDiffStats).not.toHaveBeenCalled(); | ||
|  |       expect(await module.data).toBe(undefined); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('unless the branch shas are not able to be retrieved', async () => { | ||
|  |       getLatestShas.and.returnValue(null); | ||
|  |       getG3FileIncludeAndExcludeLists.and.returnValue({include: ['file1'], exclude: []}); | ||
|  |       const module = new G3Module(virtualGitClient, {caretaker: {}, ...mockNgDevConfig}); | ||
|  | 
 | ||
|  |       expect(getDiffStats).not.toHaveBeenCalled(); | ||
|  |       expect(await module.data).toBe(undefined); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('for the files which are being synced to g3', async () => { | ||
|  |       getLatestShas.and.returnValue({g3: 'abc123', master: 'zxy987'}); | ||
|  |       getG3FileIncludeAndExcludeLists.and.returnValue({include: ['project1/*'], exclude: []}); | ||
|  |       getDiffStats.and.callThrough(); | ||
|  |       spyOn(virtualGitClient, 'run').and.callFake((args: string[]): any => { | ||
|  |         const output: Partial<SpawnSyncReturns<string>> = {}; | ||
|  |         if (args[0] === 'rev-list') { | ||
|  |           output.stdout = '3'; | ||
|  |         } | ||
|  |         if (args[0] === 'diff') { | ||
|  |           output.stdout = '5\t6\tproject1/file1\n2\t3\tproject2/file2\n7\t1\tproject1/file3\n'; | ||
|  |         } | ||
|  |         return output; | ||
|  |       }); | ||
|  | 
 | ||
|  |       const module = new G3Module(virtualGitClient, {caretaker: {}, ...mockNgDevConfig}); | ||
|  |       const {insertions, deletions, files, commits} = (await module.data) as G3StatsData; | ||
|  | 
 | ||
|  |       expect(insertions).toBe(12); | ||
|  |       expect(deletions).toBe(7); | ||
|  |       expect(files).toBe(2); | ||
|  |       expect(commits).toBe(3); | ||
|  |     }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   describe('printing the data retrieved', () => { | ||
|  |     it('if files are discovered needing to sync', async () => { | ||
|  |       const fakeData = Promise.resolve({ | ||
|  |         insertions: 25, | ||
|  |         deletions: 10, | ||
|  |         files: 2, | ||
|  |         commits: 2, | ||
|  |       }); | ||
|  | 
 | ||
|  |       const module = new G3Module(virtualGitClient, {caretaker: {}, ...mockNgDevConfig}); | ||
|  |       Object.defineProperty(module, 'data', {value: fakeData}); | ||
|  |       await module.printToTerminal(); | ||
|  | 
 | ||
|  |       expect(infoSpy).toHaveBeenCalledWith( | ||
|  |           '2 files changed, 25 insertions(+), 10 deletions(-) from 2 commits will be included in the next sync'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('if no files need to sync', async () => { | ||
|  |       const fakeData = Promise.resolve({ | ||
|  |         insertions: 0, | ||
|  |         deletions: 0, | ||
|  |         files: 0, | ||
|  |         commits: 25, | ||
|  |       }); | ||
|  | 
 | ||
|  |       const module = new G3Module(virtualGitClient, {caretaker: {}, ...mockNgDevConfig}); | ||
|  |       Object.defineProperty(module, 'data', {value: fakeData}); | ||
|  |       await module.printToTerminal(); | ||
|  | 
 | ||
|  |       expect(infoSpy).toHaveBeenCalledWith('25 commits between g3 and master'); | ||
|  |       expect(infoSpy).toHaveBeenCalledWith('✅  No sync is needed at this time'); | ||
|  |     }); | ||
|  |   }); | ||
|  | }); |