2022-09-29 23:45:25 +08:00
import * as core from '@actions/core' ;
2022-09-27 20:47:12 +08:00
import fs from 'fs' ;
2023-05-15 20:09:29 +08:00
import semver from 'semver' ;
import * as auth from '../src/authutil' ;
2020-09-16 00:36:09 +08:00
import * as setup from '../src/setup-dotnet' ;
2023-05-15 20:09:29 +08:00
import { DotnetCoreInstaller } from '../src/installer' ;
2020-09-16 00:36:09 +08:00
2021-08-20 21:47:49 +08:00
describe ( 'setup-dotnet tests' , ( ) = > {
2023-05-15 20:09:29 +08:00
const inputs = { } as any ;
2023-03-09 20:43:05 +08:00
const getInputSpy = jest . spyOn ( core , 'getInput' ) ;
const getMultilineInputSpy = jest . spyOn ( core , 'getMultilineInput' ) ;
2023-05-15 20:09:29 +08:00
const setFailedSpy = jest . spyOn ( core , 'setFailed' ) ;
2023-05-18 17:11:51 +08:00
const warningSpy = jest . spyOn ( core , 'warning' ) ;
2023-05-15 20:09:29 +08:00
const debugSpy = jest . spyOn ( core , 'debug' ) ;
const infoSpy = jest . spyOn ( core , 'info' ) ;
2023-03-09 20:43:05 +08:00
const setOutputSpy = jest . spyOn ( core , 'setOutput' ) ;
2022-09-29 23:45:25 +08:00
2023-05-15 20:09:29 +08:00
const existsSyncSpy = jest . spyOn ( fs , 'existsSync' ) ;
const maxSatisfyingSpy = jest . spyOn ( semver , 'maxSatisfying' ) ;
const installDotnetSpy = jest . spyOn (
DotnetCoreInstaller . prototype ,
'installDotnet'
) ;
const addToPathSpy = jest . spyOn ( DotnetCoreInstaller , 'addToPath' ) ;
const configAuthenticationSpy = jest . spyOn ( auth , 'configAuthentication' ) ;
describe ( 'run() tests' , ( ) = > {
beforeEach ( ( ) = > {
getMultilineInputSpy . mockImplementation ( input = > inputs [ input as string ] ) ;
getInputSpy . mockImplementation ( input = > inputs [ input as string ] ) ;
} ) ;
afterEach ( ( ) = > {
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 23:45:25 +08:00
2023-05-15 20:09:29 +08:00
maxSatisfyingSpy . mockImplementation ( ( ) = > null ) ;
setOutputSpy . mockImplementation ( ( ) = > { } ) ;
2020-09-16 00:36:09 +08:00
2023-05-15 20:09:29 +08:00
const expectedDebugMessage =
'No version found, trying to find version from global.json' ;
2023-05-22 18:27:33 +08:00
const expectedInfoMessage = ` The global.json wasn't found in the root directory. No .NET version will be installed. ` ;
2020-09-16 00:36:09 +08:00
2023-05-15 20:09:29 +08:00
await setup . run ( ) ;
2020-09-16 00:36:09 +08:00
2023-05-15 20:09:29 +08:00
expect ( debugSpy ) . toHaveBeenCalledWith ( expectedDebugMessage ) ;
expect ( existsSyncSpy ) . toHaveBeenCalled ( ) ;
expect ( infoSpy ) . toHaveBeenCalledWith ( expectedInfoMessage ) ;
} ) ;
2022-09-29 23:45:25 +08:00
2023-05-15 20:09:29 +08: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 23:45:25 +08:00
2023-05-18 18:39:22 +08: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 23:45:25 +08:00
2023-05-15 20:09:29 +08:00
await setup . run ( ) ;
expect ( setFailedSpy ) . toHaveBeenCalledWith ( expectedErrorMessage ) ;
} ) ;
2022-09-29 23:45:25 +08:00
2023-05-15 20:09:29 +08: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 23:45:25 +08:00
2023-05-15 20:09:29 +08:00
installDotnetSpy . mockImplementation ( ( ) = > Promise . resolve ( '' ) ) ;
2022-09-29 23:45:25 +08:00
2023-05-15 20:09:29 +08:00
await setup . run ( ) ;
expect ( installDotnetSpy ) . toHaveBeenCalledTimes ( 2 ) ;
} ) ;
2022-09-29 23:45:25 +08:00
2023-05-15 20:09:29 +08: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 23:45:25 +08:00
2023-05-15 20:09:29 +08:00
installDotnetSpy . mockImplementation ( ( ) = > Promise . resolve ( '' ) ) ;
addToPathSpy . mockImplementation ( ( ) = > { } ) ;
2022-09-29 23:45:25 +08:00
2023-05-15 20:09:29 +08:00
await setup . run ( ) ;
expect ( addToPathSpy ) . toHaveBeenCalledTimes ( 1 ) ;
} ) ;
2022-09-29 23:45:25 +08:00
2023-05-15 20:09:29 +08: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 19:34:56 +08:00
2023-05-15 20:09:29 +08:00
configAuthenticationSpy . mockImplementation ( ( ) = > { } ) ;
2023-03-13 19:34:56 +08:00
2023-05-15 20:09:29 +08:00
await setup . run ( ) ;
expect ( configAuthenticationSpy ) . toHaveBeenCalledWith (
inputs [ 'source-url' ] ,
undefined
) ;
} ) ;
2023-03-13 19:34:56 +08:00
2023-05-15 20:09:29 +08: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 19:34:56 +08:00
2023-05-15 20:09:29 +08:00
await setup . run ( ) ;
expect ( configAuthenticationSpy ) . toHaveBeenCalledWith (
inputs [ 'source-url' ] ,
inputs [ 'config-file' ]
) ;
} ) ;
2023-03-13 19:34:56 +08:00
2023-05-18 17:11:51 +08:00
it ( 'should call setOutput() after installation complete successfully' , async ( ) = > {
2023-05-15 20:09:29 +08:00
inputs [ 'dotnet-version' ] = [ '6.0.300' ] ;
2023-05-18 17:11:51 +08:00
installDotnetSpy . mockImplementation ( ( ) = >
Promise . resolve ( ` ${ inputs [ 'dotnet-version' ] } ` )
) ;
2023-05-15 20:09:29 +08:00
addToPathSpy . mockImplementation ( ( ) = > { } ) ;
2023-03-13 19:34:56 +08:00
2023-05-15 20:09:29 +08:00
await setup . run ( ) ;
expect ( setOutputSpy ) . toHaveBeenCalledTimes ( 1 ) ;
} ) ;
2023-05-18 17:11:51 +08: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 ) ) ;
addToPathSpy . mockImplementation ( ( ) = > { } ) ;
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 18:39:22 +08:00
const warningMessage = ` The 'dotnet-version' output will not be set. ` ;
2023-05-18 17:11:51 +08:00
addToPathSpy . mockImplementation ( ( ) = > { } ) ;
await setup . run ( ) ;
expect ( infoSpy ) . toHaveBeenCalledWith ( warningMessage ) ;
expect ( setOutputSpy ) . not . toHaveBeenCalled ( ) ;
} ) ;
2023-05-15 20:09:29 +08:00
} ) ;
2020-09-16 00:36:09 +08:00
} ) ;