2020-05-19 09:25:54 -04:00
import * as core from '@actions/core' ;
2020-03-10 11:51:57 -04:00
import * as io from '@actions/io' ;
import * as tc from '@actions/tool-cache' ;
2022-07-01 01:27:37 +02:00
import * as exec from '@actions/exec' ;
2021-11-29 14:48:31 +05:30
import * as im from '../src/installer' ;
2022-03-31 21:10:37 +02:00
import * as cache from '@actions/cache' ;
2022-11-17 14:35:58 +01:00
import * as httpm from '@actions/http-client' ;
2020-05-19 09:25:54 -04:00
import fs from 'fs' ;
import cp from 'child_process' ;
2022-11-17 14:35:58 +01:00
import osm from 'os' ;
2020-05-19 09:25:54 -04:00
import path from 'path' ;
2021-12-01 23:15:29 +09:00
import each from 'jest-each' ;
2020-05-19 09:25:54 -04:00
import * as main from '../src/main' ;
import * as auth from '../src/authutil' ;
2022-11-17 14:35:58 +01:00
const nodeTestManifest = require ( './data/versions-manifest.json' );
const nodeTestDist = require ( './data/node-dist-index.json' );
const nodeTestDistNightly = require ( './data/node-nightly-index.json' );
const nodeTestDistRc = require ( './data/node-rc-index.json' );
2020-05-19 09:25:54 -04:00
describe ( 'setup-node' , () => {
let inputs = {} as any ;
let os = {} as any ;
let inSpy : jest.SpyInstance ;
let findSpy : jest.SpyInstance ;
2022-11-17 14:35:58 +01:00
let findAllVersionsSpy : jest.SpyInstance ;
2020-05-19 09:25:54 -04:00
let cnSpy : jest.SpyInstance ;
let logSpy : jest.SpyInstance ;
2020-06-29 21:56:37 +03:00
let warningSpy : jest.SpyInstance ;
2020-05-19 09:25:54 -04:00
let getManifestSpy : jest.SpyInstance ;
let getDistSpy : jest.SpyInstance ;
let platSpy : jest.SpyInstance ;
let archSpy : jest.SpyInstance ;
let dlSpy : jest.SpyInstance ;
let exSpy : jest.SpyInstance ;
let cacheSpy : jest.SpyInstance ;
let dbgSpy : jest.SpyInstance ;
let whichSpy : jest.SpyInstance ;
let existsSpy : jest.SpyInstance ;
2021-11-29 14:48:31 +05:30
let readFileSyncSpy : jest.SpyInstance ;
2020-05-19 09:25:54 -04:00
let mkdirpSpy : jest.SpyInstance ;
let execSpy : jest.SpyInstance ;
let authSpy : jest.SpyInstance ;
2021-11-29 14:48:31 +05:30
let parseNodeVersionSpy : jest.SpyInstance ;
2022-03-31 21:10:37 +02:00
let isCacheActionAvailable : jest.SpyInstance ;
2022-07-01 01:27:37 +02:00
let getExecOutputSpy : jest.SpyInstance ;
2022-11-17 14:35:58 +01:00
let getJsonSpy : jest.SpyInstance ;
2020-05-19 09:25:54 -04:00
beforeEach (() => {
// @actions/core
2020-10-01 12:03:22 -04:00
console . log ( '::stop-commands::stoptoken' ); // Disable executing of runner commands when running tests in actions
process . env [ 'GITHUB_PATH' ] = '' ; // Stub out ENV file functionality so we can verify it writes to standard out
2022-10-13 11:11:08 +01:00
process . env [ 'GITHUB_OUTPUT' ] = '' ; // Stub out ENV file functionality so we can verify it writes to standard out
2020-05-19 09:25:54 -04:00
inputs = {};
inSpy = jest . spyOn ( core , 'getInput' );
inSpy . mockImplementation ( name => inputs [ name ]);
// node
os = {};
platSpy = jest . spyOn ( osm , 'platform' );
platSpy . mockImplementation (() => os [ 'platform' ]);
archSpy = jest . spyOn ( osm , 'arch' );
archSpy . mockImplementation (() => os [ 'arch' ]);
execSpy = jest . spyOn ( cp , 'execSync' );
// @actions/tool-cache
findSpy = jest . spyOn ( tc , 'find' );
2022-11-17 14:35:58 +01:00
findAllVersionsSpy = jest . spyOn ( tc , 'findAllVersions' );
2020-05-19 09:25:54 -04:00
dlSpy = jest . spyOn ( tc , 'downloadTool' );
exSpy = jest . spyOn ( tc , 'extractTar' );
cacheSpy = jest . spyOn ( tc , 'cacheDir' );
getManifestSpy = jest . spyOn ( tc , 'getManifestFromRepo' );
getDistSpy = jest . spyOn ( im , 'getVersionsFromDist' );
2021-11-29 14:48:31 +05:30
parseNodeVersionSpy = jest . spyOn ( im , 'parseNodeVersionFile' );
2020-05-19 09:25:54 -04:00
2022-11-17 14:35:58 +01:00
// http-client
getJsonSpy = jest . spyOn ( httpm . HttpClient . prototype , 'getJson' );
2020-05-19 09:25:54 -04:00
// io
whichSpy = jest . spyOn ( io , 'which' );
existsSpy = jest . spyOn ( fs , 'existsSync' );
mkdirpSpy = jest . spyOn ( io , 'mkdirP' );
2022-03-31 21:10:37 +02:00
// @actions/tool-cache
isCacheActionAvailable = jest . spyOn ( cache , 'isFeatureAvailable' );
2020-05-19 09:25:54 -04:00
// disable authentication portion for installer tests
authSpy = jest . spyOn ( auth , 'configAuthentication' );
authSpy . mockImplementation (() => {});
// gets
getManifestSpy . mockImplementation (
() => < tc.IToolRelease [] > nodeTestManifest
);
2022-11-17 14:35:58 +01:00
getDistSpy . mockImplementation ( version => {
const initialUrl = im . getNodejsDistUrl ( version );
if ( initialUrl . endsWith ( '/rc' )) {
return < im.INodeVersion > nodeTestDistRc ;
} else if ( initialUrl . endsWith ( '/nightly' )) {
return < im.INodeVersion > nodeTestDistNightly ;
} else {
return < im.INodeVersion > nodeTestDist ;
}
});
getJsonSpy . mockImplementation ( url => {
let res : any ;
if ( url . includes ( '/rc' )) {
res = < im.INodeVersion > nodeTestDistRc ;
} else if ( url . includes ( '/nightly' )) {
res = < im.INodeVersion > nodeTestDistNightly ;
} else {
res = < im.INodeVersion > nodeTestDist ;
}
return { result : res };
});
2020-05-19 09:25:54 -04:00
// writes
cnSpy = jest . spyOn ( process . stdout , 'write' );
2020-06-29 21:56:37 +03:00
logSpy = jest . spyOn ( core , 'info' );
2020-05-19 09:25:54 -04:00
dbgSpy = jest . spyOn ( core , 'debug' );
2020-06-29 21:56:37 +03:00
warningSpy = jest . spyOn ( core , 'warning' );
2020-05-19 09:25:54 -04:00
cnSpy . mockImplementation ( line => {
// uncomment to debug
// process.stderr.write('write:' + line + '\n');
});
logSpy . mockImplementation ( line => {
// uncomment to debug
// process.stderr.write('log:' + line + '\n');
});
dbgSpy . mockImplementation ( msg => {
// uncomment to see debug output
// process.stderr.write(msg + '\n');
});
2021-11-29 14:48:31 +05:30
warningSpy . mockImplementation ( msg => {
// uncomment to debug
// process.stderr.write('log:' + line + '\n');
});
2022-07-01 01:27:37 +02:00
// @actions/exec
getExecOutputSpy = jest . spyOn ( exec , 'getExecOutput' );
2022-07-01 01:30:18 +02:00
getExecOutputSpy . mockImplementation (() => 'v16.15.0' );
2020-05-19 09:25:54 -04:00
});
afterEach (() => {
jest . resetAllMocks ();
jest . clearAllMocks ();
//jest.restoreAllMocks();
});
2020-10-01 12:03:22 -04:00
afterAll ( async () => {
console . log ( '::stoptoken::' ); // Re-enable executing of runner commands when running tests in actions
2021-11-29 14:48:31 +05:30
jest . restoreAllMocks ();
2020-10-01 12:03:22 -04:00
}, 100000 );
2020-05-19 09:25:54 -04:00
//--------------------------------------------------
// Manifest find tests
//--------------------------------------------------
it ( 'can mock manifest versions' , async () => {
let versions : tc.IToolRelease [] | null = await tc . getManifestFromRepo (
'actions' ,
'node-versions' ,
'mocktoken'
);
expect ( versions ). toBeDefined ();
2022-06-02 03:30:33 -07:00
expect ( versions ? . length ). toBe ( 7 );
2020-05-19 09:25:54 -04:00
});
it ( 'can mock dist versions' , async () => {
2022-11-17 14:35:58 +01:00
const versionSpec = '1.2.3' ;
let versions : im.INodeVersion [] = await im . getVersionsFromDist ( versionSpec );
2020-05-19 09:25:54 -04:00
expect ( versions ). toBeDefined ();
expect ( versions ? . length ). toBe ( 23 );
});
2022-05-18 00:50:05 -07:00
it . each ([
[ '12.16.2' , 'darwin' , '12.16.2' , 'Erbium' ],
[ '12' , 'linux' , '12.16.2' , 'Erbium' ],
[ '10' , 'win32' , '10.20.1' , 'Dubnium' ],
[ '*' , 'linux' , '14.0.0' , 'Fermium' ]
])(
'can find %s from manifest on %s' ,
async ( versionSpec , platform , expectedVersion , expectedLts ) => {
os . platform = platform ;
os . arch = 'x64' ;
let versions : tc.IToolRelease [] | null = await tc . getManifestFromRepo (
'actions' ,
'node-versions' ,
'mocktoken'
);
expect ( versions ). toBeDefined ();
let match = await tc . findFromManifest ( versionSpec , true , versions );
expect ( match ). toBeDefined ();
expect ( match ? . version ). toBe ( expectedVersion );
expect (( match as any ). lts ). toBe ( expectedLts );
}
);
2020-05-19 09:25:54 -04:00
//--------------------------------------------------
// Found in cache tests
//--------------------------------------------------
2021-08-04 17:00:35 +03:00
it ( 'finds version in cache with stable true' , async () => {
2020-05-19 09:25:54 -04:00
inputs [ 'node-version' ] = '12' ;
inputs . stable = 'true' ;
let toolPath = path . normalize ( '/cache/node/12.16.1/x64' );
findSpy . mockImplementation (() => toolPath );
await main . run ();
expect ( logSpy ). toHaveBeenCalledWith ( `Found in cache @ ${ toolPath } ` );
2019-08-03 21:49:54 -04:00
});
2021-08-04 17:00:35 +03:00
it ( 'finds version in cache with stable not supplied' , async () => {
2020-05-19 09:25:54 -04:00
inputs [ 'node-version' ] = '12' ;
inSpy . mockImplementation ( name => inputs [ name ]);
let toolPath = path . normalize ( '/cache/node/12.16.1/x64' );
findSpy . mockImplementation (() => toolPath );
await main . run ();
expect ( logSpy ). toHaveBeenCalledWith ( `Found in cache @ ${ toolPath } ` );
2019-08-03 21:49:54 -04:00
});
2021-08-04 17:00:35 +03:00
it ( 'finds version in cache and adds it to the path' , async () => {
2020-05-19 09:25:54 -04:00
inputs [ 'node-version' ] = '12' ;
inSpy . mockImplementation ( name => inputs [ name ]);
let toolPath = path . normalize ( '/cache/node/12.16.1/x64' );
findSpy . mockImplementation (() => toolPath );
await main . run ();
let expPath = path . join ( toolPath , 'bin' );
expect ( cnSpy ). toHaveBeenCalledWith ( `::add-path:: ${ expPath }${ osm . EOL } ` );
2019-08-03 21:49:54 -04:00
});
2020-05-19 09:25:54 -04:00
it ( 'handles unhandled find error and reports error' , async () => {
let errMsg = 'unhandled error message' ;
inputs [ 'node-version' ] = '12' ;
findSpy . mockImplementation (() => {
throw new Error ( errMsg );
});
await main . run ();
expect ( cnSpy ). toHaveBeenCalledWith ( '::error::' + errMsg + osm . EOL );
});
2021-06-17 17:51:02 +02:00
//--------------------------------------------------
// Manifest tests
//--------------------------------------------------
2020-05-19 09:25:54 -04:00
it ( 'downloads a version from a manifest match' , async () => {
os . platform = 'linux' ;
os . arch = 'x64' ;
// a version which is in the manifest
let versionSpec = '12.16.2' ;
let resolvedVersion = versionSpec ;
inputs [ 'node-version' ] = versionSpec ;
inputs [ 'always-auth' ] = false ;
inputs [ 'token' ] = 'faketoken' ;
let expectedUrl =
2022-06-02 03:30:33 -07:00
'https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz' ;
2020-05-19 09:25:54 -04:00
// ... but not in the local cache
findSpy . mockImplementation (() => '' );
dlSpy . mockImplementation ( async () => '/some/temp/path' );
let toolPath = path . normalize ( '/cache/node/12.16.2/x64' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
await main . run ();
let expPath = path . join ( toolPath , 'bin' );
2022-10-03 17:02:04 +03:00
expect ( getExecOutputSpy ). toHaveBeenCalledWith (
'node' ,
[ '--version' ],
expect . anything ()
);
expect ( getExecOutputSpy ). toHaveBeenCalledWith (
'npm' ,
[ '--version' ],
expect . anything ()
);
expect ( getExecOutputSpy ). toHaveBeenCalledWith (
'yarn' ,
[ '--version' ],
expect . anything ()
);
2020-05-19 09:25:54 -04:00
expect ( dlSpy ). toHaveBeenCalled ();
expect ( exSpy ). toHaveBeenCalled ();
expect ( logSpy ). toHaveBeenCalledWith (
2020-09-03 07:50:29 -05:00
`Acquiring ${ resolvedVersion } - ${ os . arch } from ${ expectedUrl } `
2020-05-19 09:25:54 -04:00
);
expect ( logSpy ). toHaveBeenCalledWith (
`Attempting to download ${ versionSpec } ...`
);
expect ( cnSpy ). toHaveBeenCalledWith ( `::add-path:: ${ expPath }${ osm . EOL } ` );
});
it ( 'falls back to a version from node dist' , async () => {
os . platform = 'linux' ;
os . arch = 'x64' ;
// a version which is not in the manifest but is in node dist
let versionSpec = '11.15.0' ;
let resolvedVersion = versionSpec ;
inputs [ 'node-version' ] = versionSpec ;
inputs [ 'always-auth' ] = false ;
inputs [ 'token' ] = 'faketoken' ;
let expectedUrl =
2022-06-02 03:30:33 -07:00
'https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz' ;
2020-05-19 09:25:54 -04:00
// ... but not in the local cache
findSpy . mockImplementation (() => '' );
dlSpy . mockImplementation ( async () => '/some/temp/path' );
let toolPath = path . normalize ( '/cache/node/11.11.0/x64' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
await main . run ();
let expPath = path . join ( toolPath , 'bin' );
expect ( dlSpy ). toHaveBeenCalled ();
expect ( exSpy ). toHaveBeenCalled ();
expect ( logSpy ). toHaveBeenCalledWith (
'Not found in manifest. Falling back to download directly from Node'
);
expect ( logSpy ). toHaveBeenCalledWith (
`Attempting to download ${ versionSpec } ...`
);
expect ( cnSpy ). toHaveBeenCalledWith ( `::add-path:: ${ expPath }${ osm . EOL } ` );
});
it ( 'does not find a version that does not exist' , async () => {
os . platform = 'linux' ;
os . arch = 'x64' ;
let versionSpec = '9.99.9' ;
inputs [ 'node-version' ] = versionSpec ;
findSpy . mockImplementation (() => '' );
await main . run ();
expect ( logSpy ). toHaveBeenCalledWith (
'Not found in manifest. Falling back to download directly from Node'
);
expect ( logSpy ). toHaveBeenCalledWith (
`Attempting to download ${ versionSpec } ...`
);
expect ( cnSpy ). toHaveBeenCalledWith (
`::error::Unable to find Node version ' ${ versionSpec } ' for platform ${ os . platform } and architecture ${ os . arch } . ${ osm . EOL } `
);
});
it ( 'reports a failed download' , async () => {
let errMsg = 'unhandled download message' ;
os . platform = 'linux' ;
os . arch = 'x64' ;
// a version which is in the manifest
let versionSpec = '12.16.2' ;
let resolvedVersion = versionSpec ;
inputs [ 'node-version' ] = versionSpec ;
inputs [ 'always-auth' ] = false ;
inputs [ 'token' ] = 'faketoken' ;
findSpy . mockImplementation (() => '' );
dlSpy . mockImplementation (() => {
throw new Error ( errMsg );
});
await main . run ();
expect ( cnSpy ). toHaveBeenCalledWith ( `::error:: ${ errMsg }${ osm . EOL } ` );
2019-08-03 21:49:54 -04:00
});
2020-06-29 21:56:37 +03:00
2021-11-29 14:48:31 +05:30
it ( 'acquires specified architecture of node' , async () => {
2020-09-03 10:15:28 -05:00
for ( const { arch , version , osSpec } of [
{ arch : 'x86' , version : '12.16.2' , osSpec : 'win32' },
{ arch : 'x86' , version : '14.0.0' , osSpec : 'win32' }
2020-09-03 08:47:25 -05:00
]) {
2020-09-03 10:15:28 -05:00
os . platform = osSpec ;
os . arch = arch ;
const fileExtension = os . platform === 'win32' ? '7z' : 'tar.gz' ;
2020-09-03 08:47:25 -05:00
const platform = {
linux : 'linux' ,
darwin : 'darwin' ,
win32 : 'win'
2020-09-03 10:15:28 -05:00
}[ os . platform ];
inputs [ 'node-version' ] = version ;
2020-12-08 16:15:38 -06:00
inputs [ 'architecture' ] = arch ;
2020-09-03 10:15:28 -05:00
inputs [ 'always-auth' ] = false ;
inputs [ 'token' ] = 'faketoken' ;
let expectedUrl =
arch === 'x64'
? `https://github.com/actions/node-versions/releases/download/ ${ version } /node- ${ version } - ${ platform } - ${ arch } .zip`
: `https://nodejs.org/dist/v ${ version } /node-v ${ version } - ${ platform } - ${ arch } . ${ fileExtension } ` ;
// ... but not in the local cache
findSpy . mockImplementation (() => '' );
dlSpy . mockImplementation ( async () => '/some/temp/path' );
let toolPath = path . normalize ( `/cache/node/ ${ version } / ${ arch } ` );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
await main . run ();
expect ( dlSpy ). toHaveBeenCalled ();
expect ( logSpy ). toHaveBeenCalledWith (
`Acquiring ${ version } - ${ arch } from ${ expectedUrl } `
);
2020-09-03 08:47:25 -05:00
}
}, 100000 );
2020-06-29 21:56:37 +03:00
describe ( 'check-latest flag' , () => {
2021-08-04 17:00:35 +03:00
it ( 'use local version and dont check manifest if check-latest is not specified' , async () => {
2020-06-29 21:56:37 +03:00
os . platform = 'linux' ;
os . arch = 'x64' ;
inputs [ 'node-version' ] = '12' ;
inputs [ 'check-latest' ] = 'false' ;
const toolPath = path . normalize ( '/cache/node/12.16.1/x64' );
findSpy . mockReturnValue ( toolPath );
await main . run ();
expect ( logSpy ). toHaveBeenCalledWith ( `Found in cache @ ${ toolPath } ` );
expect ( logSpy ). not . toHaveBeenCalledWith (
'Attempt to resolve the latest version from manifest...'
);
2021-06-22 17:52:06 +02:00
expect ( dbgSpy ). not . toHaveBeenCalledWith ( 'No manifest cached' );
2021-06-22 16:11:44 +02:00
expect ( dbgSpy ). not . toHaveBeenCalledWith (
2021-06-22 17:52:06 +02:00
'Getting manifest from actions/node-versions@main'
2021-06-22 16:11:44 +02:00
);
2020-06-29 21:56:37 +03:00
});
2021-08-04 17:00:35 +03:00
it ( 'check latest version and resolve it from local cache' , async () => {
2020-06-29 21:56:37 +03:00
os . platform = 'linux' ;
os . arch = 'x64' ;
inputs [ 'node-version' ] = '12' ;
inputs [ 'check-latest' ] = 'true' ;
const toolPath = path . normalize ( '/cache/node/12.16.2/x64' );
findSpy . mockReturnValue ( toolPath );
dlSpy . mockImplementation ( async () => '/some/temp/path' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
await main . run ();
expect ( logSpy ). toHaveBeenCalledWith (
'Attempt to resolve the latest version from manifest...'
);
2021-06-22 17:52:06 +02:00
expect ( dbgSpy ). toHaveBeenCalledWith ( 'No manifest cached' );
2021-06-22 16:11:44 +02:00
expect ( dbgSpy ). toHaveBeenCalledWith (
2021-06-22 17:52:06 +02:00
'Getting manifest from actions/node-versions@main'
2021-06-22 16:11:44 +02:00
);
2020-06-29 21:56:37 +03:00
expect ( logSpy ). toHaveBeenCalledWith ( "Resolved as '12.16.2'" );
expect ( logSpy ). toHaveBeenCalledWith ( `Found in cache @ ${ toolPath } ` );
});
it ( 'check latest version and install it from manifest' , async () => {
os . platform = 'linux' ;
os . arch = 'x64' ;
inputs [ 'node-version' ] = '12' ;
inputs [ 'check-latest' ] = 'true' ;
findSpy . mockImplementation (() => '' );
dlSpy . mockImplementation ( async () => '/some/temp/path' );
const toolPath = path . normalize ( '/cache/node/12.16.2/x64' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
const expectedUrl =
2022-06-02 03:30:33 -07:00
'https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz' ;
2020-06-29 21:56:37 +03:00
await main . run ();
expect ( logSpy ). toHaveBeenCalledWith (
'Attempt to resolve the latest version from manifest...'
);
2021-06-22 17:52:06 +02:00
expect ( dbgSpy ). toHaveBeenCalledWith ( 'No manifest cached' );
2021-06-22 16:11:44 +02:00
expect ( dbgSpy ). toHaveBeenCalledWith (
2021-06-22 17:52:06 +02:00
'Getting manifest from actions/node-versions@main'
2021-06-22 16:11:44 +02:00
);
2020-06-29 21:56:37 +03:00
expect ( logSpy ). toHaveBeenCalledWith ( "Resolved as '12.16.2'" );
expect ( logSpy ). toHaveBeenCalledWith (
2020-09-03 07:50:29 -05:00
`Acquiring 12.16.2 - ${ os . arch } from ${ expectedUrl } `
2020-06-29 21:56:37 +03:00
);
expect ( logSpy ). toHaveBeenCalledWith ( 'Extracting ...' );
});
it ( 'fallback to dist if version if not found in manifest' , async () => {
os . platform = 'linux' ;
os . arch = 'x64' ;
// a version which is not in the manifest but is in node dist
let versionSpec = '11' ;
inputs [ 'node-version' ] = versionSpec ;
inputs [ 'check-latest' ] = 'true' ;
inputs [ 'always-auth' ] = false ;
inputs [ 'token' ] = 'faketoken' ;
// ... but not in the local cache
findSpy . mockImplementation (() => '' );
dlSpy . mockImplementation ( async () => '/some/temp/path' );
let toolPath = path . normalize ( '/cache/node/11.11.0/x64' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
await main . run ();
let expPath = path . join ( toolPath , 'bin' );
expect ( dlSpy ). toHaveBeenCalled ();
expect ( exSpy ). toHaveBeenCalled ();
expect ( logSpy ). toHaveBeenCalledWith (
'Attempt to resolve the latest version from manifest...'
);
2021-06-22 17:52:06 +02:00
expect ( dbgSpy ). toHaveBeenCalledWith ( 'No manifest cached' );
2021-06-22 16:11:44 +02:00
expect ( dbgSpy ). toHaveBeenCalledWith (
2021-06-22 17:52:06 +02:00
'Getting manifest from actions/node-versions@main'
2021-06-22 16:11:44 +02:00
);
2020-06-29 21:56:37 +03:00
expect ( logSpy ). toHaveBeenCalledWith (
`Failed to resolve version ${ versionSpec } from manifest`
);
expect ( logSpy ). toHaveBeenCalledWith (
`Attempting to download ${ versionSpec } ...`
);
expect ( cnSpy ). toHaveBeenCalledWith ( `::add-path:: ${ expPath }${ osm . EOL } ` );
});
it ( 'fallback to dist if manifest is not available' , async () => {
os . platform = 'linux' ;
os . arch = 'x64' ;
// a version which is not in the manifest but is in node dist
let versionSpec = '12' ;
inputs [ 'node-version' ] = versionSpec ;
inputs [ 'check-latest' ] = 'true' ;
inputs [ 'always-auth' ] = false ;
inputs [ 'token' ] = 'faketoken' ;
// ... but not in the local cache
findSpy . mockImplementation (() => '' );
getManifestSpy . mockImplementation (() => {
throw new Error ( 'Unable to download manifest' );
});
dlSpy . mockImplementation ( async () => '/some/temp/path' );
let toolPath = path . normalize ( '/cache/node/12.11.0/x64' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
await main . run ();
let expPath = path . join ( toolPath , 'bin' );
expect ( dlSpy ). toHaveBeenCalled ();
expect ( exSpy ). toHaveBeenCalled ();
expect ( logSpy ). toHaveBeenCalledWith (
'Attempt to resolve the latest version from manifest...'
);
expect ( logSpy ). toHaveBeenCalledWith (
'Unable to resolve version from manifest...'
);
expect ( logSpy ). toHaveBeenCalledWith (
`Failed to resolve version ${ versionSpec } from manifest`
);
expect ( logSpy ). toHaveBeenCalledWith (
`Attempting to download ${ versionSpec } ...`
);
expect ( cnSpy ). toHaveBeenCalledWith ( `::add-path:: ${ expPath }${ osm . EOL } ` );
});
});
2021-06-17 17:51:02 +02:00
2021-11-29 14:48:31 +05:30
describe ( 'node-version-file flag' , () => {
it ( 'not used if node-version is provided' , async () => {
// Arrange
inputs [ 'node-version' ] = '12' ;
// Act
await main . run ();
// Assert
expect ( parseNodeVersionSpy ). toHaveBeenCalledTimes ( 0 );
});
it ( 'not used if node-version-file not provided' , async () => {
// Act
await main . run ();
// Assert
expect ( parseNodeVersionSpy ). toHaveBeenCalledTimes ( 0 );
});
2022-07-27 14:27:21 -07:00
it ( 'reads node-version-file if provided' , async () => {
2021-11-29 14:48:31 +05:30
// Arrange
const versionSpec = 'v14' ;
const versionFile = '.nvmrc' ;
const expectedVersionSpec = '14' ;
process . env [ 'GITHUB_WORKSPACE' ] = path . join ( __dirname , 'data' );
inputs [ 'node-version-file' ] = versionFile ;
parseNodeVersionSpy . mockImplementation (() => expectedVersionSpec );
existsSpy . mockImplementationOnce (
input => input === path . join ( __dirname , 'data' , versionFile )
);
2022-06-29 15:37:53 -07:00
2021-11-29 14:48:31 +05:30
// Act
await main . run ();
2022-06-29 12:28:21 -07:00
// Assert
expect ( existsSpy ). toHaveBeenCalledTimes ( 1 );
expect ( existsSpy ). toHaveReturnedWith ( true );
2022-06-29 15:37:53 -07:00
expect ( parseNodeVersionSpy ). toHaveBeenCalledWith ( versionSpec );
2022-06-29 12:28:21 -07:00
expect ( logSpy ). toHaveBeenCalledWith (
2022-06-29 15:11:14 -07:00
`Resolved ${ versionFile } as ${ expectedVersionSpec } `
2022-06-29 12:28:21 -07:00
);
});
2022-07-21 10:17:21 -07:00
it ( 'reads package.json as node-version-file if provided' , async () => {
// Arrange
const versionSpec = fs . readFileSync (
path . join ( __dirname , 'data/package.json' ),
'utf-8'
);
const versionFile = 'package.json' ;
const expectedVersionSpec = '14' ;
process . env [ 'GITHUB_WORKSPACE' ] = path . join ( __dirname , 'data' );
inputs [ 'node-version-file' ] = versionFile ;
parseNodeVersionSpy . mockImplementation (() => expectedVersionSpec );
existsSpy . mockImplementationOnce (
input => input === path . join ( __dirname , 'data' , versionFile )
);
// Act
await main . run ();
// Assert
expect ( existsSpy ). toHaveBeenCalledTimes ( 1 );
expect ( existsSpy ). toHaveReturnedWith ( true );
2021-11-29 14:48:31 +05:30
expect ( parseNodeVersionSpy ). toHaveBeenCalledWith ( versionSpec );
expect ( logSpy ). toHaveBeenCalledWith (
`Resolved ${ versionFile } as ${ expectedVersionSpec } `
);
});
it ( 'both node-version-file and node-version are provided' , async () => {
inputs [ 'node-version' ] = '12' ;
const versionSpec = 'v14' ;
const versionFile = '.nvmrc' ;
const expectedVersionSpec = '14' ;
process . env [ 'GITHUB_WORKSPACE' ] = path . join ( __dirname , '..' );
inputs [ 'node-version-file' ] = versionFile ;
parseNodeVersionSpy . mockImplementation (() => expectedVersionSpec );
// Act
await main . run ();
// Assert
expect ( existsSpy ). toHaveBeenCalledTimes ( 0 );
expect ( parseNodeVersionSpy ). not . toHaveBeenCalled ();
expect ( warningSpy ). toHaveBeenCalledWith (
'Both node-version and node-version-file inputs are specified, only node-version will be used'
);
});
it ( 'should throw an error if node-version-file is not found' , async () => {
const versionFile = '.nvmrc' ;
const versionFilePath = path . join ( __dirname , '..' , versionFile );
inputs [ 'node-version-file' ] = versionFile ;
inSpy . mockImplementation ( name => inputs [ name ]);
existsSpy . mockImplementationOnce (
input => input === path . join ( __dirname , 'data' , versionFile )
);
// Act
await main . run ();
// Assert
expect ( existsSpy ). toHaveBeenCalled ();
expect ( existsSpy ). toHaveReturnedWith ( false );
expect ( parseNodeVersionSpy ). not . toHaveBeenCalled ();
expect ( cnSpy ). toHaveBeenCalledWith (
`::error::The specified node version file at: ${ versionFilePath } does not exist ${ osm . EOL } `
);
});
});
2022-03-31 21:10:37 +02:00
describe ( 'cache on GHES' , () => {
it ( 'Should throw an error, because cache is not supported' , async () => {
inputs [ 'node-version' ] = '12' ;
inputs [ 'cache' ] = 'npm' ;
inSpy . mockImplementation ( name => inputs [ name ]);
let toolPath = path . normalize ( '/cache/node/12.16.1/x64' );
findSpy . mockImplementation (() => toolPath );
// expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
process . env [ 'GITHUB_SERVER_URL' ] = 'https://www.test.com' ;
isCacheActionAvailable . mockImplementation (() => false );
await main . run ();
2022-12-09 12:05:59 +01:00
expect ( warningSpy ). toHaveBeenCalledWith (
// `::error::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.${osm.EOL}`
'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.'
2022-03-31 21:10:37 +02:00
);
});
it ( 'Should throw an internal error' , async () => {
inputs [ 'node-version' ] = '12' ;
inputs [ 'cache' ] = 'npm' ;
inSpy . mockImplementation ( name => inputs [ name ]);
let toolPath = path . normalize ( '/cache/node/12.16.1/x64' );
findSpy . mockImplementation (() => toolPath );
// expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
process . env [ 'GITHUB_SERVER_URL' ] = '' ;
isCacheActionAvailable . mockImplementation (() => false );
await main . run ();
expect ( warningSpy ). toHaveBeenCalledWith (
'The runner was not able to contact the cache service. Caching will be skipped'
);
});
});
2021-06-17 17:51:02 +02:00
describe ( 'LTS version' , () => {
2021-06-30 09:27:49 +02:00
beforeEach (() => {
2021-06-17 17:51:02 +02:00
os . platform = 'linux' ;
os . arch = 'x64' ;
2021-06-30 09:27:49 +02:00
inputs . stable = 'true' ;
});
2021-06-17 17:51:02 +02:00
2022-06-02 03:30:33 -07:00
it . each ([
[ 'erbium' , '12.16.2' ],
[ '*' , '14.0.0' ],
[ '-1' , '12.16.2' ]
])(
'find latest LTS version and resolve it from local cache (lts/%s)' ,
async ( lts , expectedVersion ) => {
// arrange
inputs [ 'node-version' ] = `lts/ ${ lts } ` ;
const toolPath = path . normalize ( `/cache/node/ ${ expectedVersion } /x64` );
findSpy . mockReturnValue ( toolPath );
// act
await main . run ();
// assert
expect ( logSpy ). toHaveBeenCalledWith (
'Attempt to resolve LTS alias from manifest...'
);
expect ( dbgSpy ). toHaveBeenCalledWith (
'Getting manifest from actions/node-versions@main'
);
expect ( dbgSpy ). not . toHaveBeenCalledWith ( 'No manifest cached' );
expect ( dbgSpy ). toHaveBeenCalledWith (
`LTS alias ' ${ lts } ' for Node version 'lts/ ${ lts } '`
);
expect ( dbgSpy ). toHaveBeenCalledWith (
`Found LTS release ' ${ expectedVersion } ' for Node version 'lts/ ${ lts } '`
);
expect ( logSpy ). toHaveBeenCalledWith ( `Found in cache @ ${ toolPath } ` );
expect ( cnSpy ). toHaveBeenCalledWith (
`::add-path:: ${ path . join ( toolPath , 'bin' ) }${ osm . EOL } `
);
}
);
2021-06-17 18:34:09 +02:00
2022-06-02 03:30:33 -07:00
it . each ([
[
'erbium' ,
'12.16.2' ,
'https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz'
],
[
'*' ,
'14.0.0' ,
'https://github.com/actions/node-versions/releases/download/14.0.0-20200507.99/node-14.0.0-linux-x64.tar.gz'
],
[
'-1' ,
'12.16.2' ,
'https://github.com/actions/node-versions/releases/download/12.16.2-20200507.95/node-12.16.2-linux-x64.tar.gz'
]
])(
'find latest LTS version and install it from manifest (lts/%s)' ,
async ( lts , expectedVersion , expectedUrl ) => {
// arrange
inputs [ 'node-version' ] = `lts/ ${ lts } ` ;
const toolPath = path . normalize ( `/cache/node/ ${ expectedVersion } /x64` );
findSpy . mockImplementation (() => '' );
dlSpy . mockImplementation ( async () => '/some/temp/path' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
const expectedMajor = expectedVersion . split ( '.' )[ 0 ];
// act
await main . run ();
// assert
expect ( logSpy ). toHaveBeenCalledWith (
'Attempt to resolve LTS alias from manifest...'
);
expect ( dbgSpy ). toHaveBeenCalledWith (
'Getting manifest from actions/node-versions@main'
);
expect ( dbgSpy ). not . toHaveBeenCalledWith ( 'No manifest cached' );
expect ( dbgSpy ). toHaveBeenCalledWith (
`LTS alias ' ${ lts } ' for Node version 'lts/ ${ lts } '`
);
expect ( dbgSpy ). toHaveBeenCalledWith (
`Found LTS release ' ${ expectedVersion } ' for Node version 'lts/ ${ lts } '`
);
expect ( logSpy ). toHaveBeenCalledWith (
`Attempting to download ${ expectedMajor } ...`
);
expect ( logSpy ). toHaveBeenCalledWith (
`Acquiring ${ expectedVersion } - ${ os . arch } from ${ expectedUrl } `
);
expect ( logSpy ). toHaveBeenCalledWith ( 'Extracting ...' );
expect ( logSpy ). toHaveBeenCalledWith ( 'Adding to the cache ...' );
expect ( cnSpy ). toHaveBeenCalledWith (
`::add-path:: ${ path . join ( toolPath , 'bin' ) }${ osm . EOL } `
);
}
);
2021-06-17 18:53:38 +02:00
2021-06-30 09:34:42 +02:00
it ( 'fail with unable to parse LTS alias (lts/)' , async () => {
2021-06-17 18:53:38 +02:00
// arrange
inputs [ 'node-version' ] = 'lts/' ;
findSpy . mockImplementation (() => '' );
// act
await main . run ();
// assert
2021-06-22 16:11:44 +02:00
expect ( logSpy ). toHaveBeenCalledWith (
'Attempt to resolve LTS alias from manifest...'
);
expect ( dbgSpy ). toHaveBeenCalledWith (
'Getting manifest from actions/node-versions@main'
);
expect ( cnSpy ). toHaveBeenCalledWith (
2021-06-30 09:34:42 +02:00
`::error::Unable to parse LTS alias for Node version 'lts/' ${ osm . EOL } `
2021-06-22 16:11:44 +02:00
);
2021-06-17 18:53:38 +02:00
});
it ( 'fail to find LTS version (lts/unknown)' , async () => {
// arrange
inputs [ 'node-version' ] = 'lts/unknown' ;
findSpy . mockImplementation (() => '' );
// act
await main . run ();
// assert
2021-06-22 16:11:44 +02:00
expect ( logSpy ). toHaveBeenCalledWith (
'Attempt to resolve LTS alias from manifest...'
);
expect ( dbgSpy ). toHaveBeenCalledWith (
'Getting manifest from actions/node-versions@main'
);
expect ( dbgSpy ). toHaveBeenCalledWith (
`LTS alias 'unknown' for Node version 'lts/unknown'`
);
expect ( cnSpy ). toHaveBeenCalledWith (
`::error::Unable to find LTS release 'unknown' for Node version 'lts/unknown'. ${ osm . EOL } `
);
2021-06-17 18:53:38 +02:00
});
2021-06-22 15:45:25 +02:00
it ( 'fail if manifest is not available' , async () => {
// arrange
inputs [ 'node-version' ] = 'lts/erbium' ;
// ... but not in the local cache
findSpy . mockImplementation (() => '' );
getManifestSpy . mockImplementation (() => {
throw new Error ( 'Unable to download manifest' );
});
// act
await main . run ();
// assert
2021-06-22 16:11:44 +02:00
expect ( logSpy ). toHaveBeenCalledWith (
'Attempt to resolve LTS alias from manifest...'
);
expect ( dbgSpy ). toHaveBeenCalledWith (
'Getting manifest from actions/node-versions@main'
);
expect ( cnSpy ). toHaveBeenCalledWith (
`::error::Unable to download manifest ${ osm . EOL } `
);
});
});
2022-05-12 17:26:02 +02:00
2022-11-17 14:35:58 +01:00
describe ( 'rc versions' , () => {
it . each ([
[
'13.10.1-rc.0' ,
'13.10.1-rc.0' ,
'https://nodejs.org/download/rc/v13.10.1-rc.0/node-v13.10.1-rc.0-linux-x64.tar.gz'
],
[
'14.15.5-rc.1' ,
'14.15.5-rc.1' ,
'https://nodejs.org/download/rc/v14.15.5-rc.1/node-v14.15.5-rc.1-linux-x64.tar.gz'
],
[
'16.17.0-rc.1' ,
'16.17.0-rc.1' ,
'https://nodejs.org/download/rc/v16.17.0-rc.1/node-v16.17.0-rc.1-linux-x64.tar.gz'
],
[
'17.0.0-rc.1' ,
'17.0.0-rc.1' ,
'https://nodejs.org/download/rc/v17.0.0-rc.1/node-v17.0.0-rc.1-linux-x64.tar.gz'
],
[
'19.0.0-rc.2' ,
'19.0.0-rc.2' ,
'https://nodejs.org/download/rc/v19.0.0-rc.2/node-v19.0.0-rc.2-linux-x64.tar.gz'
]
])(
'finds the versions in the index.json and installs it' ,
async ( input , expectedVersion , expectedUrl ) => {
const toolPath = path . normalize ( `/cache/node/ ${ expectedVersion } /x64` );
findSpy . mockImplementation (() => '' );
findAllVersionsSpy . mockImplementation (() => []);
dlSpy . mockImplementation ( async () => '/some/temp/path' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
inputs [ 'node-version' ] = input ;
os [ 'arch' ] = 'x64' ;
os [ 'platform' ] = 'linux' ;
// act
await main . run ();
// assert
expect ( logSpy ). toHaveBeenCalledWith (
`Attempting to download ${ input } ...`
);
expect ( logSpy ). toHaveBeenCalledWith (
`Acquiring ${ expectedVersion } - ${ os . arch } from ${ expectedUrl } `
);
expect ( logSpy ). toHaveBeenCalledWith ( 'Extracting ...' );
expect ( logSpy ). toHaveBeenCalledWith ( 'Adding to the cache ...' );
expect ( cnSpy ). toHaveBeenCalledWith (
`::add-path:: ${ path . join ( toolPath , 'bin' ) }${ osm . EOL } `
);
}
);
it . each ([
[ '13.10.1-rc.0' , '13.10.1-rc.0' ],
[ '14.15.5-rc.1' , '14.15.5-rc.1' ],
[ '16.17.0-rc.1' , '16.17.0-rc.1' ],
[ '17.0.0-rc.1' , '17.0.0-rc.1' ]
])(
'finds the %s version in the hostedToolcache' ,
async ( input , expectedVersion ) => {
const toolPath = path . normalize ( `/cache/node/ ${ expectedVersion } /x64` );
findSpy . mockReturnValue ( toolPath );
inputs [ 'node-version' ] = input ;
os [ 'arch' ] = 'x64' ;
os [ 'platform' ] = 'linux' ;
// act
await main . run ();
// assert
expect ( logSpy ). toHaveBeenCalledWith ( `Found in cache @ ${ toolPath } ` );
expect ( cnSpy ). toHaveBeenCalledWith (
`::add-path:: ${ path . join ( toolPath , 'bin' ) }${ osm . EOL } `
);
}
);
it ( 'throws an error if version is not found' , async () => {
const versionSpec = '19.0.0-rc.3' ;
findSpy . mockImplementation (() => '' );
findAllVersionsSpy . mockImplementation (() => []);
dlSpy . mockImplementation ( async () => '/some/temp/path' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
inputs [ 'node-version' ] = versionSpec ;
os [ 'arch' ] = 'x64' ;
os [ 'platform' ] = 'linux' ;
// act
await main . run ();
// assert
expect ( logSpy ). toHaveBeenCalledWith (
`Attempting to download ${ versionSpec } ...`
);
expect ( cnSpy ). toHaveBeenCalledWith (
`::error::Unable to find Node version ' ${ versionSpec } ' for platform ${ os . platform } and architecture ${ os . arch } . ${ osm . EOL } `
);
});
});
describe ( 'nightly versions' , () => {
it . each ([
[
'17.5.0-nightly' ,
'17.5.0-nightly20220209e43808936a' ,
'https://nodejs.org/download/nightly/v17.5.0-nightly20220209e43808936a/node-v17.5.0-nightly20220209e43808936a-linux-x64.tar.gz'
],
[
'17-nightly' ,
'17.5.0-nightly20220209e43808936a' ,
'https://nodejs.org/download/nightly/v17.5.0-nightly20220209e43808936a/node-v17.5.0-nightly20220209e43808936a-linux-x64.tar.gz'
],
[
'18.0.0-nightly' ,
'18.0.0-nightly20220419bde889bd4e' ,
'https://nodejs.org/download/nightly/v18.0.0-nightly20220419bde889bd4e/node-v18.0.0-nightly20220419bde889bd4e-linux-x64.tar.gz'
],
[
'18-nightly' ,
'18.0.0-nightly20220419bde889bd4e' ,
'https://nodejs.org/download/nightly/v18.0.0-nightly20220419bde889bd4e/node-v18.0.0-nightly20220419bde889bd4e-linux-x64.tar.gz'
],
[
'20.0.0-nightly' ,
'20.0.0-nightly2022101987cdf7d412' ,
'https://nodejs.org/download/nightly/v20.0.0-nightly2022101987cdf7d412/node-v20.0.0-nightly2022101987cdf7d412-linux-x64.tar.gz'
]
])(
'finds the versions in the index.json and installs it' ,
async ( input , expectedVersion , expectedUrl ) => {
const toolPath = path . normalize ( `/cache/node/ ${ expectedVersion } /x64` );
findSpy . mockImplementation (() => '' );
findAllVersionsSpy . mockImplementation (() => []);
dlSpy . mockImplementation ( async () => '/some/temp/path' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
inputs [ 'node-version' ] = input ;
os [ 'arch' ] = 'x64' ;
os [ 'platform' ] = 'linux' ;
// act
await main . run ();
// assert
expect ( logSpy ). toHaveBeenCalledWith (
`Attempting to download ${ input } ...`
);
expect ( logSpy ). toHaveBeenCalledWith (
`Acquiring ${ expectedVersion } - ${ os . arch } from ${ expectedUrl } `
);
expect ( logSpy ). toHaveBeenCalledWith ( 'Extracting ...' );
expect ( logSpy ). toHaveBeenCalledWith ( 'Adding to the cache ...' );
expect ( cnSpy ). toHaveBeenCalledWith (
`::add-path:: ${ path . join ( toolPath , 'bin' ) }${ osm . EOL } `
);
}
);
it . each ([
[ '17.5.0-nightly' , '17.5.0-nightly20220209e43808936a' ],
[ '17-nightly' , '17.5.0-nightly20220209e43808936a' ],
[ '20.0.0-nightly' , '20.0.0-nightly2022101987cdf7d412' ]
])(
'finds the %s version in the hostedToolcache' ,
async ( input , expectedVersion ) => {
const toolPath = path . normalize ( `/cache/node/ ${ expectedVersion } /x64` );
findSpy . mockReturnValue ( toolPath );
findAllVersionsSpy . mockReturnValue ([
'17.5.0-nightly20220209e43808936a' ,
'17.5.0-nightly20220209e43808935a' ,
'20.0.0-nightly2022101987cdf7d412' ,
'20.0.0-nightly2022101987cdf7d411'
]);
inputs [ 'node-version' ] = input ;
os [ 'arch' ] = 'x64' ;
os [ 'platform' ] = 'linux' ;
// act
await main . run ();
// assert
expect ( findAllVersionsSpy ). toHaveBeenCalled ();
expect ( logSpy ). toHaveBeenCalledWith ( `Found in cache @ ${ toolPath } ` );
expect ( cnSpy ). toHaveBeenCalledWith (
`::add-path:: ${ path . join ( toolPath , 'bin' ) }${ osm . EOL } `
);
}
);
it . each ([
[
'17.5.0-nightly' ,
'17.5.0-nightly20220209e43808936a' ,
'17.0.0-nightly202110193f11666dc7' ,
'https://nodejs.org/download/nightly/v17.5.0-nightly20220209e43808936a/node-v17.5.0-nightly20220209e43808936a-linux-x64.tar.gz'
],
[
'17-nightly' ,
'17.5.0-nightly20220209e43808936a' ,
'17.0.0-nightly202110193f11666dc7' ,
'https://nodejs.org/download/nightly/v17.5.0-nightly20220209e43808936a/node-v17.5.0-nightly20220209e43808936a-linux-x64.tar.gz'
],
[
'18.0.0-nightly' ,
'18.0.0-nightly20220419bde889bd4e' ,
'18.0.0-nightly202204180699150267' ,
'https://nodejs.org/download/nightly/v18.0.0-nightly20220419bde889bd4e/node-v18.0.0-nightly20220419bde889bd4e-linux-x64.tar.gz'
],
[
'18-nightly' ,
'18.0.0-nightly20220419bde889bd4e' ,
'18.0.0-nightly202204180699150267' ,
'https://nodejs.org/download/nightly/v18.0.0-nightly20220419bde889bd4e/node-v18.0.0-nightly20220419bde889bd4e-linux-x64.tar.gz'
],
[
'20.0.0-nightly' ,
'20.0.0-nightly2022101987cdf7d412' ,
'20.0.0-nightly2022101987cdf7d411' ,
'https://nodejs.org/download/nightly/v20.0.0-nightly2022101987cdf7d412/node-v20.0.0-nightly2022101987cdf7d412-linux-x64.tar.gz'
]
])(
'get %s version from dist if check-latest is true' ,
async ( input , expectedVersion , foundVersion , expectedUrl ) => {
const foundToolPath = path . normalize ( `/cache/node/ ${ foundVersion } /x64` );
const toolPath = path . normalize ( `/cache/node/ ${ expectedVersion } /x64` );
inputs [ 'node-version' ] = input ;
inputs [ 'check-latest' ] = 'true' ;
os [ 'arch' ] = 'x64' ;
os [ 'platform' ] = 'linux' ;
findSpy . mockReturnValue ( foundToolPath );
findAllVersionsSpy . mockReturnValue ([
'17.0.0-nightly202110193f11666dc7' ,
'18.0.0-nightly202204180699150267' ,
'20.0.0-nightly2022101987cdf7d411'
]);
dlSpy . mockImplementation ( async () => '/some/temp/path' );
exSpy . mockImplementation ( async () => '/some/other/temp/path' );
cacheSpy . mockImplementation ( async () => toolPath );
// act
await main . run ();
// assert
expect ( findAllVersionsSpy ). toHaveBeenCalled ();
expect ( logSpy ). toHaveBeenCalledWith (
`Acquiring ${ expectedVersion } - ${ os . arch } from ${ expectedUrl } `
);
expect ( logSpy ). toHaveBeenCalledWith ( 'Extracting ...' );
expect ( logSpy ). toHaveBeenCalledWith ( 'Adding to the cache ...' );
expect ( cnSpy ). toHaveBeenCalledWith (
`::add-path:: ${ path . join ( toolPath , 'bin' ) }${ osm . EOL } `
);
}
);
});
2022-05-12 17:26:02 +02:00
describe ( 'latest alias syntax' , () => {
it . each ([ 'latest' , 'current' , 'node' ])(
'download the %s version if alias is provided' ,
async inputVersion => {
// Arrange
inputs [ 'node-version' ] = inputVersion ;
os . platform = 'darwin' ;
os . arch = 'x64' ;
findSpy . mockImplementation (() => '' );
getManifestSpy . mockImplementation (() => {
throw new Error ( 'Unable to download manifest' );
});
// Act
await main . run ();
// assert
expect ( logSpy ). toHaveBeenCalledWith ( 'Unable to download manifest' );
expect ( logSpy ). toHaveBeenCalledWith ( 'getting latest node version...' );
}
);
});
2022-05-19 17:33:13 +02:00
describe ( 'latest alias syntax from cache' , () => {
it . each ([ 'latest' , 'current' , 'node' ])(
'download the %s version if alias is provided' ,
async inputVersion => {
// Arrange
inputs [ 'node-version' ] = inputVersion ;
const expectedVersion = nodeTestDist [ 0 ];
os . platform = 'darwin' ;
os . arch = 'x64' ;
const toolPath = path . normalize (
`/cache/node/ ${ expectedVersion . version } /x64`
);
findSpy . mockReturnValue ( toolPath );
// Act
await main . run ();
// assert
expect ( logSpy ). toHaveBeenCalledWith ( `Found in cache @ ${ toolPath } ` );
expect ( logSpy ). toHaveBeenCalledWith ( 'getting latest node version...' );
}
);
});
2019-08-03 21:49:54 -04:00
});
2021-12-01 23:15:29 +09:00
describe ( 'helper methods' , () => {
describe ( 'parseNodeVersionFile' , () => {
each `
2021-12-02 00:44:59 +09:00
contents | expected
${ '12' } | ${ '12' }
${ '12.3' } | ${ '12.3' }
${ '12.3.4' } | ${ '12.3.4' }
${ 'v12.3.4' } | ${ '12.3.4' }
${ 'lts/erbium' } | ${ 'lts/erbium' }
${ 'lts/*' } | ${ 'lts/*' }
${ 'nodejs 12.3.4' } | ${ '12.3.4' }
${ 'ruby 2.3.4\nnodejs 12.3.4\npython 3.4.5' } | ${ '12.3.4' }
${ '' } | ${ '' }
${ 'unknown format' } | ${ 'unknown format' }
2021-12-01 23:15:29 +09:00
` . it ( 'parses "$contents"' , ({ contents , expected }) => {
expect ( im . parseNodeVersionFile ( contents )). toBe ( expected );
});
});
});