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