2020-05-19 15:25:54 +02:00
import * as core from '@actions/core' ;
2020-03-10 16:51:57 +01: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 10:18:31 +01:00
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 15:25:54 +02: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 15:25:54 +02:00
import path from 'path' ;
2021-12-01 15:15:29 +01:00
import each from 'jest-each' ;
2020-05-19 15:25:54 +02: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 15:25:54 +02: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 15:25:54 +02:00
let cnSpy : jest.SpyInstance ;
let logSpy : jest.SpyInstance ;
2020-06-29 20:56:37 +02:00
let warningSpy : jest.SpyInstance ;
2020-05-19 15:25:54 +02: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 10:18:31 +01:00
let readFileSyncSpy : jest.SpyInstance ;
2020-05-19 15:25:54 +02:00
let mkdirpSpy : jest.SpyInstance ;
let execSpy : jest.SpyInstance ;
let authSpy : jest.SpyInstance ;
2021-11-29 10:18:31 +01:00
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 15:25:54 +02:00
beforeEach ( ( ) = > {
// @actions/core
2020-10-01 18:03:22 +02: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 12:11:08 +02:00
process . env [ 'GITHUB_OUTPUT' ] = '' ; // Stub out ENV file functionality so we can verify it writes to standard out
2020-05-19 15:25:54 +02: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 15:25:54 +02: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 10:18:31 +01:00
parseNodeVersionSpy = jest . spyOn ( im , 'parseNodeVersionFile' ) ;
2020-05-19 15:25:54 +02:00
2022-11-17 14:35:58 +01:00
// http-client
getJsonSpy = jest . spyOn ( httpm . HttpClient . prototype , 'getJson' ) ;
2020-05-19 15:25:54 +02: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 15:25:54 +02: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 15:25:54 +02:00
// writes
cnSpy = jest . spyOn ( process . stdout , 'write' ) ;
2020-06-29 20:56:37 +02:00
logSpy = jest . spyOn ( core , 'info' ) ;
2020-05-19 15:25:54 +02:00
dbgSpy = jest . spyOn ( core , 'debug' ) ;
2020-06-29 20:56:37 +02:00
warningSpy = jest . spyOn ( core , 'warning' ) ;
2020-05-19 15:25:54 +02: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 10:18:31 +01:00
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 15:25:54 +02:00
} ) ;
afterEach ( ( ) = > {
jest . resetAllMocks ( ) ;
jest . clearAllMocks ( ) ;
//jest.restoreAllMocks();
} ) ;
2020-10-01 18:03:22 +02:00
afterAll ( async ( ) = > {
console . log ( '::stoptoken::' ) ; // Re-enable executing of runner commands when running tests in actions
2021-11-29 10:18:31 +01:00
jest . restoreAllMocks ( ) ;
2020-10-01 18:03:22 +02:00
} , 100000 ) ;
2020-05-19 15:25:54 +02: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 12:30:33 +02:00
expect ( versions ? . length ) . toBe ( 7 ) ;
2020-05-19 15:25:54 +02: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 15:25:54 +02:00
expect ( versions ) . toBeDefined ( ) ;
expect ( versions ? . length ) . toBe ( 23 ) ;
} ) ;
2022-05-18 09:50:05 +02: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 15:25:54 +02:00
//--------------------------------------------------
// Found in cache tests
//--------------------------------------------------
2021-08-04 16:00:35 +02:00
it ( 'finds version in cache with stable true' , async ( ) = > {
2020-05-19 15:25:54 +02: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-04 03:49:54 +02:00
} ) ;
2021-08-04 16:00:35 +02:00
it ( 'finds version in cache with stable not supplied' , async ( ) = > {
2020-05-19 15:25:54 +02: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-04 03:49:54 +02:00
} ) ;
2021-08-04 16:00:35 +02:00
it ( 'finds version in cache and adds it to the path' , async ( ) = > {
2020-05-19 15:25:54 +02: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-04 03:49:54 +02:00
} ) ;
2020-05-19 15:25:54 +02: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 15:25:54 +02: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 12:30:33 +02: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 15:25:54 +02: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 16:02:04 +02: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 15:25:54 +02:00
expect ( dlSpy ) . toHaveBeenCalled ( ) ;
expect ( exSpy ) . toHaveBeenCalled ( ) ;
expect ( logSpy ) . toHaveBeenCalledWith (
2020-09-03 14:50:29 +02:00
` Acquiring ${ resolvedVersion } - ${ os . arch } from ${ expectedUrl } `
2020-05-19 15:25:54 +02: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 12:30:33 +02: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 15:25:54 +02: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-04 03:49:54 +02:00
} ) ;
2020-06-29 20:56:37 +02:00
2021-11-29 10:18:31 +01:00
it ( 'acquires specified architecture of node' , async ( ) = > {
2020-09-03 17:15:28 +02: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 15:47:25 +02:00
] ) {
2020-09-03 17:15:28 +02:00
os . platform = osSpec ;
os . arch = arch ;
const fileExtension = os . platform === 'win32' ? '7z' : 'tar.gz' ;
2020-09-03 15:47:25 +02:00
const platform = {
linux : 'linux' ,
darwin : 'darwin' ,
win32 : 'win'
2020-09-03 17:15:28 +02:00
} [ os . platform ] ;
inputs [ 'node-version' ] = version ;
2020-12-08 23:15:38 +01:00
inputs [ 'architecture' ] = arch ;
2020-09-03 17:15:28 +02: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 15:47:25 +02:00
}
} , 100000 ) ;
2020-06-29 20:56:37 +02:00
describe ( 'check-latest flag' , ( ) = > {
2021-08-04 16:00:35 +02:00
it ( 'use local version and dont check manifest if check-latest is not specified' , async ( ) = > {
2020-06-29 20:56:37 +02: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 20:56:37 +02:00
} ) ;
2021-08-04 16:00:35 +02:00
it ( 'check latest version and resolve it from local cache' , async ( ) = > {
2020-06-29 20:56:37 +02: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 20:56:37 +02: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 12:30:33 +02: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 20:56:37 +02: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 20:56:37 +02:00
expect ( logSpy ) . toHaveBeenCalledWith ( "Resolved as '12.16.2'" ) ;
expect ( logSpy ) . toHaveBeenCalledWith (
2020-09-03 14:50:29 +02:00
` Acquiring 12.16.2 - ${ os . arch } from ${ expectedUrl } `
2020-06-29 20:56:37 +02: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 20:56:37 +02: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 10:18:31 +01:00
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 23:27:21 +02:00
it ( 'reads node-version-file if provided' , async ( ) = > {
2021-11-29 10:18:31 +01:00
// 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-30 00:37:53 +02:00
2021-11-29 10:18:31 +01:00
// Act
await main . run ( ) ;
2022-06-29 21:28:21 +02:00
// Assert
expect ( existsSpy ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( existsSpy ) . toHaveReturnedWith ( true ) ;
2022-06-30 00:37:53 +02:00
expect ( parseNodeVersionSpy ) . toHaveBeenCalledWith ( versionSpec ) ;
2022-06-29 21:28:21 +02:00
expect ( logSpy ) . toHaveBeenCalledWith (
2022-06-30 00:11:14 +02:00
` Resolved ${ versionFile } as ${ expectedVersionSpec } `
2022-06-29 21:28:21 +02:00
) ;
} ) ;
2022-07-21 19:17:21 +02: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 10:18:31 +01:00
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 12:30:33 +02: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 12:30:33 +02: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...' ) ;
}
) ;
} ) ;
2022-12-26 14:51:01 +01:00
describe ( 'corepack flag' , ( ) = > {
it ( 'use corepack if specified' , async ( ) = > {
inputs [ 'corepack' ] = 'true' ;
await main . run ( ) ;
expect ( getExecOutputSpy ) . toHaveBeenCalledWith (
'corepack' ,
[ 'enable' ] ,
expect . anything ( )
) ;
} ) ;
it ( 'use corepack with given package manager' , async ( ) = > {
inputs [ 'corepack' ] = 'npm' ;
await main . run ( ) ;
expect ( getExecOutputSpy ) . toHaveBeenCalledWith (
'corepack' ,
[ 'enable' , 'npm' ] ,
expect . anything ( )
) ;
} ) ;
it ( 'use corepack with multiple package managers' , async ( ) = > {
inputs [ 'corepack' ] = 'npm yarn' ;
await main . run ( ) ;
expect ( getExecOutputSpy ) . toHaveBeenCalledWith (
'corepack' ,
[ 'enable' , 'npm' , 'yarn' ] ,
expect . anything ( )
) ;
} ) ;
it ( 'fails to use corepack with an invalid package manager' , async ( ) = > {
await expect ( im . enableCorepack ( 'npm turbo' ) ) . rejects . toThrowError (
` One or more of the specified package managers [ npm turbo ] are not supported by corepack `
) ;
} ) ;
} ) ;
2019-08-04 03:49:54 +02:00
} ) ;
2021-12-01 15:15:29 +01:00
describe ( 'helper methods' , ( ) = > {
describe ( 'parseNodeVersionFile' , ( ) = > {
each `
2021-12-01 16:44:59 +01: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 15:15:29 +01:00
` .it('parses " $ contents"', ({contents, expected}) => {
expect ( im . parseNodeVersionFile ( contents ) ) . toBe ( expected ) ;
} ) ;
} ) ;
} ) ;