2022-09-29 22:45:25 +07:00
import * as core from '@actions/core' ;
2022-09-27 19:47:12 +07:00
import fs from 'fs' ;
2023-05-15 19:09:29 +07:00
import semver from 'semver' ;
import * as auth from '../src/authutil' ;
2020-09-15 23:36:09 +07:00
import * as setup from '../src/setup-dotnet' ;
2023-05-30 17:45:38 +07:00
import { DotnetCoreInstaller , DotnetInstallDir } from '../src/installer' ;
2023-05-29 17:43:18 +07:00
import * as cacheUtils from '../src/cache-utils' ;
import * as cacheRestore from '../src/cache-restore' ;
2020-09-15 23:36:09 +07:00
2021-08-20 20:47:49 +07:00
describe ( 'setup-dotnet tests' , ( ) = > {
2023-05-15 19:09:29 +07:00
const inputs = { } as any ;
2023-03-09 19:43:05 +07:00
const getInputSpy = jest . spyOn ( core , 'getInput' ) ;
const getMultilineInputSpy = jest . spyOn ( core , 'getMultilineInput' ) ;
2023-05-29 17:43:18 +07:00
const getBooleanInputSpy = jest . spyOn ( core , 'getBooleanInput' ) ;
2023-05-15 19:09:29 +07:00
const setFailedSpy = jest . spyOn ( core , 'setFailed' ) ;
2023-05-18 16:11:51 +07:00
const warningSpy = jest . spyOn ( core , 'warning' ) ;
2023-05-15 19:09:29 +07:00
const debugSpy = jest . spyOn ( core , 'debug' ) ;
const infoSpy = jest . spyOn ( core , 'info' ) ;
2023-03-09 19:43:05 +07:00
const setOutputSpy = jest . spyOn ( core , 'setOutput' ) ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
const existsSyncSpy = jest . spyOn ( fs , 'existsSync' ) ;
const maxSatisfyingSpy = jest . spyOn ( semver , 'maxSatisfying' ) ;
const installDotnetSpy = jest . spyOn (
DotnetCoreInstaller . prototype ,
'installDotnet'
) ;
2023-05-29 17:43:18 +07:00
const isCacheFeatureAvailableSpy = jest . spyOn (
cacheUtils ,
'isCacheFeatureAvailable'
) ;
const restoreCacheSpy = jest . spyOn ( cacheRestore , 'restoreCache' ) ;
2023-05-15 19:09:29 +07:00
const configAuthenticationSpy = jest . spyOn ( auth , 'configAuthentication' ) ;
2023-05-30 17:45:38 +07:00
const addToPathOriginal = DotnetInstallDir . addToPath ;
2023-05-15 19:09:29 +07:00
describe ( 'run() tests' , ( ) = > {
beforeEach ( ( ) = > {
2023-05-30 17:45:38 +07:00
DotnetInstallDir . addToPath = jest . fn ( ) ;
2023-05-15 19:09:29 +07:00
getMultilineInputSpy . mockImplementation ( input = > inputs [ input as string ] ) ;
getInputSpy . mockImplementation ( input = > inputs [ input as string ] ) ;
2023-05-29 17:43:18 +07:00
getBooleanInputSpy . mockImplementation ( input = > inputs [ input as string ] ) ;
2023-05-15 19:09:29 +07:00
} ) ;
afterEach ( ( ) = > {
2023-05-30 17:45:38 +07:00
DotnetInstallDir . addToPath = addToPathOriginal ;
2023-05-15 19:09:29 +07:00
jest . clearAllMocks ( ) ;
jest . resetAllMocks ( ) ;
} ) ;
it ( 'should fail the action if global-json-file input is present, but the file does not exist in the file system' , async ( ) = > {
inputs [ 'global-json-file' ] = 'fictitious.json' ;
inputs [ 'dotnet-version' ] = [ ] ;
const expectedErrorMessage = ` The specified global.json file ' ${ inputs [ 'global-json-file' ] } ' does not exist ` ;
await setup . run ( ) ;
expect ( setFailedSpy ) . toHaveBeenCalledWith ( expectedErrorMessage ) ;
} ) ;
test ( ` if 'dotnet-version' and 'global-json-file' inputs aren't present, should log into debug output, try to find global.json in the repo root, fail and log message into info output ` , async ( ) = > {
inputs [ 'global-json-file' ] = '' ;
inputs [ 'dotnet-version' ] = [ ] ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
maxSatisfyingSpy . mockImplementation ( ( ) = > null ) ;
setOutputSpy . mockImplementation ( ( ) = > { } ) ;
2020-09-15 23:36:09 +07:00
2023-05-15 19:09:29 +07:00
const expectedDebugMessage =
'No version found, trying to find version from global.json' ;
2023-05-22 17:27:33 +07:00
const expectedInfoMessage = ` The global.json wasn't found in the root directory. No .NET version will be installed. ` ;
2020-09-15 23:36:09 +07:00
2023-05-15 19:09:29 +07:00
await setup . run ( ) ;
2020-09-15 23:36:09 +07:00
2023-05-15 19:09:29 +07:00
expect ( debugSpy ) . toHaveBeenCalledWith ( expectedDebugMessage ) ;
expect ( existsSyncSpy ) . toHaveBeenCalled ( ) ;
expect ( infoSpy ) . toHaveBeenCalledWith ( expectedInfoMessage ) ;
} ) ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
it ( 'should fail the action if quality is supplied but its value is not supported' , async ( ) = > {
inputs [ 'global-json-file' ] = '' ;
inputs [ 'dotnet-version' ] = [ '6.0' ] ;
inputs [ 'dotnet-quality' ] = 'fictitiousQuality' ;
2022-09-29 22:45:25 +07:00
2023-05-18 17:39:22 +07:00
const expectedErrorMessage = ` Value ' ${ inputs [ 'dotnet-quality' ] } ' is not supported for the 'dotnet-quality' option. Supported values are: daily, signed, validated, preview, ga. ` ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
await setup . run ( ) ;
expect ( setFailedSpy ) . toHaveBeenCalledWith ( expectedErrorMessage ) ;
} ) ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
it ( 'should call installDotnet() multiple times if dotnet-version multiline input is provided' , async ( ) = > {
inputs [ 'global-json-file' ] = '' ;
inputs [ 'dotnet-version' ] = [ '6.0' , '7.0' ] ;
inputs [ 'dotnet-quality' ] = '' ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
installDotnetSpy . mockImplementation ( ( ) = > Promise . resolve ( '' ) ) ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
await setup . run ( ) ;
expect ( installDotnetSpy ) . toHaveBeenCalledTimes ( 2 ) ;
} ) ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
it ( 'should call addToPath() after installation complete' , async ( ) = > {
inputs [ 'global-json-file' ] = '' ;
inputs [ 'dotnet-version' ] = [ '6.0' , '7.0' ] ;
inputs [ 'dotnet-quality' ] = '' ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
installDotnetSpy . mockImplementation ( ( ) = > Promise . resolve ( '' ) ) ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
await setup . run ( ) ;
2023-05-30 17:45:38 +07:00
expect ( DotnetInstallDir . addToPath ) . toHaveBeenCalledTimes ( 1 ) ;
2023-05-15 19:09:29 +07:00
} ) ;
2022-09-29 22:45:25 +07:00
2023-05-15 19:09:29 +07:00
it ( 'should call auth.configAuthentication() if source-url input is provided' , async ( ) = > {
inputs [ 'global-json-file' ] = '' ;
inputs [ 'dotnet-version' ] = [ ] ;
inputs [ 'dotnet-quality' ] = '' ;
inputs [ 'source-url' ] = 'fictitious.source.url' ;
2023-03-13 18:34:56 +07:00
2023-05-15 19:09:29 +07:00
configAuthenticationSpy . mockImplementation ( ( ) = > { } ) ;
2023-03-13 18:34:56 +07:00
2023-05-15 19:09:29 +07:00
await setup . run ( ) ;
expect ( configAuthenticationSpy ) . toHaveBeenCalledWith (
inputs [ 'source-url' ] ,
undefined
) ;
} ) ;
2023-03-13 18:34:56 +07:00
2023-05-15 19:09:29 +07:00
it ( 'should call auth.configAuthentication() with proper parameters if source-url and config-file inputs are provided' , async ( ) = > {
inputs [ 'global-json-file' ] = '' ;
inputs [ 'dotnet-version' ] = [ ] ;
inputs [ 'dotnet-quality' ] = '' ;
inputs [ 'source-url' ] = 'fictitious.source.url' ;
inputs [ 'config-file' ] = 'fictitious.path' ;
configAuthenticationSpy . mockImplementation ( ( ) = > { } ) ;
setOutputSpy . mockImplementation ( ( ) = > { } ) ;
2023-03-13 18:34:56 +07:00
2023-05-15 19:09:29 +07:00
await setup . run ( ) ;
expect ( configAuthenticationSpy ) . toHaveBeenCalledWith (
inputs [ 'source-url' ] ,
inputs [ 'config-file' ]
) ;
} ) ;
2023-03-13 18:34:56 +07:00
2023-05-18 16:11:51 +07:00
it ( 'should call setOutput() after installation complete successfully' , async ( ) = > {
2023-05-15 19:09:29 +07:00
inputs [ 'dotnet-version' ] = [ '6.0.300' ] ;
2023-05-18 16:11:51 +07:00
installDotnetSpy . mockImplementation ( ( ) = >
Promise . resolve ( ` ${ inputs [ 'dotnet-version' ] } ` )
) ;
2023-03-13 18:34:56 +07:00
2023-05-15 19:09:29 +07:00
await setup . run ( ) ;
2023-05-30 17:45:38 +07:00
expect ( DotnetInstallDir . addToPath ) . toHaveBeenCalledTimes ( 1 ) ;
2023-05-15 19:09:29 +07:00
} ) ;
2023-05-18 16:11:51 +07:00
it ( ` shouldn't call setOutput() if parsing dotnet-installer logs failed ` , async ( ) = > {
inputs [ 'dotnet-version' ] = [ '6.0.300' ] ;
const warningMessage = ` Failed to output the installed version of .NET. The 'dotnet-version' output will not be set. ` ;
installDotnetSpy . mockImplementation ( ( ) = > Promise . resolve ( null ) ) ;
await setup . run ( ) ;
expect ( warningSpy ) . toHaveBeenCalledWith ( warningMessage ) ;
expect ( setOutputSpy ) . not . toHaveBeenCalled ( ) ;
} ) ;
it ( ` shouldn't call setOutput() if actions didn't install .NET ` , async ( ) = > {
inputs [ 'dotnet-version' ] = [ ] ;
2023-05-18 17:39:22 +07:00
const warningMessage = ` The 'dotnet-version' output will not be set. ` ;
2023-05-18 16:11:51 +07:00
await setup . run ( ) ;
expect ( infoSpy ) . toHaveBeenCalledWith ( warningMessage ) ;
expect ( setOutputSpy ) . not . toHaveBeenCalled ( ) ;
} ) ;
2023-05-29 17:43:18 +07:00
it ( ` should get 'cache-dependency-path' and call restoreCache() if input cache is set to true and cache feature is available ` , async ( ) = > {
inputs [ 'dotnet-version' ] = [ '6.0.300' ] ;
inputs [ 'dotnet-quality' ] = '' ;
inputs [ 'cache' ] = true ;
inputs [ 'cache-dependency-path' ] = 'fictitious.package.lock.json' ;
installDotnetSpy . mockImplementation ( ( ) = > Promise . resolve ( '' ) ) ;
isCacheFeatureAvailableSpy . mockImplementation ( ( ) = > true ) ;
restoreCacheSpy . mockImplementation ( ( ) = > Promise . resolve ( ) ) ;
await setup . run ( ) ;
expect ( i sCacheFeatureAvailableSpy ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( restoreCacheSpy ) . toHaveBeenCalledWith (
inputs [ 'cache-dependency-path' ]
) ;
} ) ;
it ( ` shouldn't call restoreCache() if input cache isn't set to true ` , async ( ) = > {
inputs [ 'dotnet-version' ] = [ '6.0.300' ] ;
inputs [ 'dotnet-quality' ] = '' ;
inputs [ 'cache' ] = false ;
installDotnetSpy . mockImplementation ( ( ) = > Promise . resolve ( '' ) ) ;
isCacheFeatureAvailableSpy . mockImplementation ( ( ) = > true ) ;
restoreCacheSpy . mockImplementation ( ( ) = > Promise . resolve ( ) ) ;
await setup . run ( ) ;
expect ( restoreCacheSpy ) . not . toHaveBeenCalled ( ) ;
} ) ;
it ( ` shouldn't call restoreCache() if cache feature isn't available ` , async ( ) = > {
inputs [ 'dotnet-version' ] = [ '6.0.300' ] ;
inputs [ 'dotnet-quality' ] = '' ;
inputs [ 'cache' ] = true ;
installDotnetSpy . mockImplementation ( ( ) = > Promise . resolve ( '' ) ) ;
isCacheFeatureAvailableSpy . mockImplementation ( ( ) = > false ) ;
restoreCacheSpy . mockImplementation ( ( ) = > Promise . resolve ( ) ) ;
await setup . run ( ) ;
expect ( restoreCacheSpy ) . not . toHaveBeenCalled ( ) ;
} ) ;
2023-05-15 19:09:29 +07:00
} ) ;
2020-09-15 23:36:09 +07:00
} ) ;