2022-05-25 12:07:29 +02:00
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
2023-03-08 10:45:16 +02:00
const getExecOutputSpy = jest . spyOn ( exec , 'getExecOutput' );
2022-05-25 12:07:29 +02:00
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
2023-03-08 10:45:16 +02:00
await expect ( async () => {
2022-05-25 12:07:29 +02:00
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 = {
2026-01-26 22:29:03 +05:30
dependencyFilePattern : 'go.mod' ,
2022-05-25 12:07:29 +02:00
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
2023-03-08 10:45:16 +02:00
await expect ( async () => {
2022-05-25 12:07:29 +02:00
await cacheUtils . getPackageManagerInfo ( packageManagerName );
}). rejects . toThrow ();
});
});
describe ( 'getCacheDirectoryPath' , () => {
//Arrange
2023-03-08 10:45:16 +02:00
const getExecOutputSpy = jest . spyOn ( exec , 'getExecOutput' );
2022-05-25 12:07:29 +02:00
const validPackageManager : PackageManagerInfo = {
2026-01-26 22:29:03 +05:30
dependencyFilePattern : 'go.mod' ,
2022-05-25 12:07:29 +02:00
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 ));
});
2022-12-19 11:22:17 +01:00
it ( 'should return path to the cache folder if one command return empty str' , async () => {
//Arrange
getExecOutputSpy . mockImplementationOnce (( commandLine : string ) => {
return new Promise < exec.ExecOutput >( resolve => {
resolve ({ exitCode : 0 , stdout : 'path/to/cache/folder' , stderr : '' });
});
});
getExecOutputSpy . mockImplementationOnce (( commandLine : string ) => {
return new Promise < exec.ExecOutput >( resolve => {
resolve ({ exitCode : 0 , stdout : '' , stderr : '' });
});
});
const expectedResult = [ 'path/to/cache/folder' ];
//Act + Assert
return cacheUtils
. getCacheDirectoryPath ( validPackageManager )
. then ( data => expect ( data ). toEqual ( expectedResult ));
});
it ( 'should throw if the both commands return empty str' , async () => {
getExecOutputSpy . mockImplementation (( commandLine : string ) => {
return new Promise < exec.ExecOutput >( resolve => {
resolve ({ exitCode : 10 , stdout : '' , stderr : '' });
});
});
//Act + Assert
2023-03-08 10:45:16 +02:00
await expect ( async () => {
2022-12-19 11:22:17 +01:00
await cacheUtils . getCacheDirectoryPath ( validPackageManager );
}). rejects . toThrow ();
});
2022-05-25 12:07:29 +02:00
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
2023-03-08 10:45:16 +02:00
await expect ( async () => {
2022-05-25 12:07:29 +02:00
await cacheUtils . getCacheDirectoryPath ( validPackageManager );
}). rejects . toThrow ();
});
});
describe ( 'isCacheFeatureAvailable' , () => {
//Arrange
2023-03-08 10:45:16 +02:00
const isFeatureAvailableSpy = jest . spyOn ( cache , 'isFeatureAvailable' );
const warningSpy = jest . spyOn ( core , 'warning' );
2022-05-25 12:07:29 +02:00
it ( 'should return true when cache feature is available' , () => {
//Arrange
isFeatureAvailableSpy . mockImplementation (() => {
return true ;
});
//Act
2023-03-08 10:45:16 +02:00
const functionResult = cacheUtils . isCacheFeatureAvailable ();
2022-05-25 12:07:29 +02:00
//Assert
expect ( functionResult ). toBeTruthy ();
});
2023-03-08 10:45:16 +02:00
it ( 'should warn when cache feature is unavailable and GHES is not used' , () => {
2022-05-25 12:07:29 +02:00
//Arrange
isFeatureAvailableSpy . mockImplementation (() => {
return false ;
});
process . env [ 'GITHUB_SERVER_URL' ] = 'https://github.com' ;
2023-03-08 10:45:16 +02:00
const warningMessage =
2022-05-25 12:07:29 +02:00
'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' ;
//Act
2023-03-08 10:45:16 +02:00
const functionResult = cacheUtils . isCacheFeatureAvailable ();
2022-05-25 12:07:29 +02:00
//Assert
expect ( functionResult ). toBeFalsy ();
});
2022-12-16 23:05:54 +09:00
it ( 'should warn when cache feature is unavailable and GHES is used' , () => {
2022-05-25 12:07:29 +02:00
//Arrange
isFeatureAvailableSpy . mockImplementation (() => {
return false ;
});
process . env [ 'GITHUB_SERVER_URL' ] = 'https://nongithub.com' ;
2023-03-08 10:45:16 +02:00
const warningMessage =
2022-05-25 12:07:29 +02:00
'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
2022-12-16 23:05:54 +09:00
expect ( cacheUtils . isCacheFeatureAvailable ()). toBeFalsy ();
expect ( warningSpy ). toHaveBeenCalledWith ( warningMessage );
2022-05-25 12:07:29 +02:00
});
});
2024-10-21 18:56:08 +02:00
describe ( 'isGhes' , () => {
const pristineEnv = process . env ;
beforeEach (() => {
jest . resetModules ();
process . env = {... pristineEnv };
});
afterAll (() => {
process . env = pristineEnv ;
});
it ( 'returns false when the GITHUB_SERVER_URL environment variable is not defined' , async () => {
delete process . env [ 'GITHUB_SERVER_URL' ];
expect ( cacheUtils . isGhes ()). toBeFalsy ();
});
it ( 'returns false when the GITHUB_SERVER_URL environment variable is set to github.com' , async () => {
process . env [ 'GITHUB_SERVER_URL' ] = 'https://github.com' ;
expect ( cacheUtils . isGhes ()). toBeFalsy ();
});
it ( 'returns false when the GITHUB_SERVER_URL environment variable is set to a GitHub Enterprise Cloud-style URL' , async () => {
process . env [ 'GITHUB_SERVER_URL' ] = 'https://contoso.ghe.com' ;
expect ( cacheUtils . isGhes ()). toBeFalsy ();
});
it ( 'returns false when the GITHUB_SERVER_URL environment variable has a .localhost suffix' , async () => {
process . env [ 'GITHUB_SERVER_URL' ] = 'https://mock-github.localhost' ;
expect ( cacheUtils . isGhes ()). toBeFalsy ();
});
it ( 'returns true when the GITHUB_SERVER_URL environment variable is set to some other URL' , async () => {
process . env [ 'GITHUB_SERVER_URL' ] = 'https://src.onpremise.fabrikam.com' ;
expect ( cacheUtils . isGhes ()). toBeTruthy ();
});
});