180 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import * as exec from '@actions/exec';
 | |
| import * as cache from '@actions/cache';
 | |
| import * as core from '@actions/core';
 | |
| import * as cacheUtils from '../src/cache-utils';
 | |
| import {PackageManagerInfo} from '../src/package-managers';
 | |
| 
 | |
| describe('getCommandOutput', () => {
 | |
|   //Arrange
 | |
|   let getExecOutputSpy = jest.spyOn(exec, 'getExecOutput');
 | |
| 
 | |
|   it('should return trimmed stdout in case of successful exit code', async () => {
 | |
|     //Arrange
 | |
|     const stdoutResult = ' stdout ';
 | |
|     const trimmedStdout = stdoutResult.trim();
 | |
| 
 | |
|     getExecOutputSpy.mockImplementation((commandLine: string) => {
 | |
|       return new Promise<exec.ExecOutput>(resolve => {
 | |
|         resolve({exitCode: 0, stdout: stdoutResult, stderr: ''});
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     //Act + Assert
 | |
|     return cacheUtils
 | |
|       .getCommandOutput('command')
 | |
|       .then(data => expect(data).toBe(trimmedStdout));
 | |
|   });
 | |
| 
 | |
|   it('should return error in case of unsuccessful exit code', async () => {
 | |
|     //Arrange
 | |
|     const stderrResult = 'error message';
 | |
| 
 | |
|     getExecOutputSpy.mockImplementation((commandLine: string) => {
 | |
|       return new Promise<exec.ExecOutput>(resolve => {
 | |
|         resolve({exitCode: 10, stdout: '', stderr: stderrResult});
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     //Act + Assert
 | |
|     expect(async () => {
 | |
|       await cacheUtils.getCommandOutput('command');
 | |
|     }).rejects.toThrow();
 | |
|   });
 | |
| });
 | |
| 
 | |
| describe('getPackageManagerInfo', () => {
 | |
|   it('should return package manager info in case of valid package manager name', async () => {
 | |
|     //Arrange
 | |
|     const packageManagerName = 'default';
 | |
|     const expectedResult = {
 | |
|       dependencyFilePattern: 'go.sum',
 | |
|       cacheFolderCommandList: ['go env GOMODCACHE', 'go env GOCACHE']
 | |
|     };
 | |
| 
 | |
|     //Act + Assert
 | |
|     return cacheUtils
 | |
|       .getPackageManagerInfo(packageManagerName)
 | |
|       .then(data => expect(data).toEqual(expectedResult));
 | |
|   });
 | |
| 
 | |
|   it('should throw the error in case of invalid package manager name', async () => {
 | |
|     //Arrange
 | |
|     const packageManagerName = 'invalidName';
 | |
| 
 | |
|     //Act + Assert
 | |
|     expect(async () => {
 | |
|       await cacheUtils.getPackageManagerInfo(packageManagerName);
 | |
|     }).rejects.toThrow();
 | |
|   });
 | |
| });
 | |
| 
 | |
| describe('getCacheDirectoryPath', () => {
 | |
|   //Arrange
 | |
|   let getExecOutputSpy = jest.spyOn(exec, 'getExecOutput');
 | |
| 
 | |
|   const validPackageManager: PackageManagerInfo = {
 | |
|     dependencyFilePattern: 'go.sum',
 | |
|     cacheFolderCommandList: ['go env GOMODCACHE', 'go env GOCACHE']
 | |
|   };
 | |
| 
 | |
|   it('should return path to the cache folders which specified package manager uses', async () => {
 | |
|     //Arrange
 | |
|     getExecOutputSpy.mockImplementation((commandLine: string) => {
 | |
|       return new Promise<exec.ExecOutput>(resolve => {
 | |
|         resolve({exitCode: 0, stdout: 'path/to/cache/folder', stderr: ''});
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     const expectedResult = ['path/to/cache/folder', 'path/to/cache/folder'];
 | |
| 
 | |
|     //Act + Assert
 | |
|     return cacheUtils
 | |
|       .getCacheDirectoryPath(validPackageManager)
 | |
|       .then(data => expect(data).toEqual(expectedResult));
 | |
|   });
 | |
| 
 | |
|   it('should throw if the specified package name is invalid', async () => {
 | |
|     getExecOutputSpy.mockImplementation((commandLine: string) => {
 | |
|       return new Promise<exec.ExecOutput>(resolve => {
 | |
|         resolve({exitCode: 10, stdout: '', stderr: 'Error message'});
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     //Act + Assert
 | |
|     expect(async () => {
 | |
|       await cacheUtils.getCacheDirectoryPath(validPackageManager);
 | |
|     }).rejects.toThrow();
 | |
|   });
 | |
| });
 | |
| 
 | |
| describe('isCacheFeatureAvailable', () => {
 | |
|   //Arrange
 | |
|   let isFeatureAvailableSpy = jest.spyOn(cache, 'isFeatureAvailable');
 | |
|   let warningSpy = jest.spyOn(core, 'warning');
 | |
| 
 | |
|   it('should return true when cache feature is available', () => {
 | |
|     //Arrange
 | |
|     isFeatureAvailableSpy.mockImplementation(() => {
 | |
|       return true;
 | |
|     });
 | |
| 
 | |
|     let functionResult;
 | |
| 
 | |
|     //Act
 | |
|     functionResult = cacheUtils.isCacheFeatureAvailable();
 | |
| 
 | |
|     //Assert
 | |
|     expect(functionResult).toBeTruthy();
 | |
|   });
 | |
| 
 | |
|   it('should warn when cache feature is unavailable and GHES is not used ', () => {
 | |
|     //Arrange
 | |
|     isFeatureAvailableSpy.mockImplementation(() => {
 | |
|       return false;
 | |
|     });
 | |
| 
 | |
|     process.env['GITHUB_SERVER_URL'] = 'https://github.com';
 | |
| 
 | |
|     let warningMessage =
 | |
|       'The runner was not able to contact the cache service. Caching will be skipped';
 | |
| 
 | |
|     //Act
 | |
|     cacheUtils.isCacheFeatureAvailable();
 | |
| 
 | |
|     //Assert
 | |
|     expect(warningSpy).toHaveBeenCalledWith(warningMessage);
 | |
|   });
 | |
| 
 | |
|   it('should return false when cache feature is unavailable', () => {
 | |
|     //Arrange
 | |
|     isFeatureAvailableSpy.mockImplementation(() => {
 | |
|       return false;
 | |
|     });
 | |
| 
 | |
|     process.env['GITHUB_SERVER_URL'] = 'https://github.com';
 | |
| 
 | |
|     let functionResult;
 | |
| 
 | |
|     //Act
 | |
|     functionResult = cacheUtils.isCacheFeatureAvailable();
 | |
| 
 | |
|     //Assert
 | |
|     expect(functionResult).toBeFalsy();
 | |
|   });
 | |
| 
 | |
|   it('should throw when cache feature is unavailable and GHES is used', () => {
 | |
|     //Arrange
 | |
|     isFeatureAvailableSpy.mockImplementation(() => {
 | |
|       return false;
 | |
|     });
 | |
| 
 | |
|     process.env['GITHUB_SERVER_URL'] = 'https://nongithub.com';
 | |
| 
 | |
|     let errorMessage =
 | |
|       'Cache action is only supported on GHES version >= 3.5. If you are on version >=3.5 Please check with GHES admin if Actions cache service is enabled or not.';
 | |
| 
 | |
|     //Act + Assert
 | |
|     expect(() => cacheUtils.isCacheFeatureAvailable()).toThrow(errorMessage);
 | |
|   });
 | |
| });
 |