2022-03-31 19:11:27 +00:00
import * as cache from '@actions/cache' ;
import * as core from '@actions/core' ;
2023-06-28 20:02:44 +00:00
import * as io from '@actions/io' ;
import fs from 'fs' ;
import path from 'path' ;
2020-12-17 15:03:54 +00:00
import {
validateVersion ,
2022-03-31 19:11:27 +00:00
validatePythonVersionFormatForPyPy ,
2023-06-28 20:02:44 +00:00
isCacheFeatureAvailable ,
getVersionInputFromFile ,
2024-01-03 23:33:23 +00:00
getVersionsInputFromPlainFile ,
2023-10-10 12:59:54 +00:00
getVersionInputFromTomlFile ,
getNextPageUrl
2020-12-17 15:03:54 +00:00
} from '../src/utils' ;
2022-03-31 19:11:27 +00:00
jest . mock ( '@actions/cache' ) ;
jest . mock ( '@actions/core' ) ;
2020-12-17 15:03:54 +00:00
describe ( 'validatePythonVersionFormatForPyPy' , ( ) = > {
it . each ( [
[ '3.6' , true ] ,
[ '3.7' , true ] ,
[ '3.6.x' , false ] ,
[ '3.7.x' , false ] ,
[ '3.x' , false ] ,
[ '3' , false ]
] ) ( '%s -> %s' , ( input , expected ) = > {
expect ( validatePythonVersionFormatForPyPy ( input ) ) . toEqual ( expected ) ;
} ) ;
} ) ;
describe ( 'validateVersion' , ( ) = > {
it . each ( [
[ 'v7.3.3' , true ] ,
[ 'v7.3.x' , true ] ,
[ 'v7.x' , true ] ,
[ 'x' , true ] ,
[ 'v7.3.3-rc.1' , true ] ,
[ 'nightly' , true ] ,
[ 'v7.3.b' , false ] ,
[ '3.6' , true ] ,
[ '3.b' , false ] ,
[ '3' , true ]
] ) ( '%s -> %s' , ( input , expected ) = > {
expect ( validateVersion ( input ) ) . toEqual ( expected ) ;
} ) ;
} ) ;
2022-03-31 19:11:27 +00:00
describe ( 'isCacheFeatureAvailable' , ( ) = > {
it ( 'isCacheFeatureAvailable disabled on GHES' , ( ) = > {
jest . spyOn ( cache , 'isFeatureAvailable' ) . mockImplementation ( ( ) = > false ) ;
2022-12-19 13:00:46 +00:00
const infoMock = jest . spyOn ( core , 'warning' ) ;
const message =
'Caching is only supported on GHES version >= 3.5. If you are on a version >= 3.5, please check with your GHES admin if the Actions cache service is enabled or not.' ;
2022-03-31 19:11:27 +00:00
try {
process . env [ 'GITHUB_SERVER_URL' ] = 'http://example.com' ;
2022-12-19 13:00:46 +00:00
expect ( isCacheFeatureAvailable ( ) ) . toBeFalsy ( ) ;
expect ( infoMock ) . toHaveBeenCalledWith ( message ) ;
2022-03-31 19:11:27 +00:00
} finally {
delete process . env [ 'GITHUB_SERVER_URL' ] ;
}
} ) ;
it ( 'isCacheFeatureAvailable disabled on dotcom' , ( ) = > {
jest . spyOn ( cache , 'isFeatureAvailable' ) . mockImplementation ( ( ) = > false ) ;
const infoMock = jest . spyOn ( core , 'warning' ) ;
const message =
'The runner was not able to contact the cache service. Caching will be skipped' ;
try {
process . env [ 'GITHUB_SERVER_URL' ] = 'http://github.com' ;
expect ( isCacheFeatureAvailable ( ) ) . toBe ( false ) ;
expect ( infoMock ) . toHaveBeenCalledWith ( message ) ;
} finally {
delete process . env [ 'GITHUB_SERVER_URL' ] ;
}
} ) ;
it ( 'isCacheFeatureAvailable is enabled' , ( ) = > {
jest . spyOn ( cache , 'isFeatureAvailable' ) . mockImplementation ( ( ) = > true ) ;
expect ( isCacheFeatureAvailable ( ) ) . toBe ( true ) ;
} ) ;
} ) ;
2023-06-28 20:02:44 +00:00
const tempDir = path . join (
__dirname ,
'runner' ,
path . join ( Math . random ( ) . toString ( 36 ) . substring ( 7 ) ) ,
'temp'
) ;
describe ( 'Version from file test' , ( ) = > {
2024-01-03 23:33:23 +00:00
it . each ( [ getVersionsInputFromPlainFile , getVersionInputFromFile ] ) (
2023-06-28 20:02:44 +00:00
'Version from plain file test' ,
async _fn = > {
await io . mkdirP ( tempDir ) ;
const pythonVersionFileName = 'python-version.file' ;
const pythonVersionFilePath = path . join ( tempDir , pythonVersionFileName ) ;
const pythonVersionFileContent = '3.7' ;
fs . writeFileSync ( pythonVersionFilePath , pythonVersionFileContent ) ;
expect ( _fn ( pythonVersionFilePath ) ) . toEqual ( [ pythonVersionFileContent ] ) ;
}
) ;
2024-01-03 23:33:23 +00:00
it . each ( [ getVersionsInputFromPlainFile , getVersionInputFromFile ] ) (
'Versions from multiline plain file test' ,
async _fn = > {
await io . mkdirP ( tempDir ) ;
const pythonVersionFileName = 'python-version.file' ;
const pythonVersionFilePath = path . join ( tempDir , pythonVersionFileName ) ;
const pythonVersionFileContent = '3.8\r\n3.7' ;
fs . writeFileSync ( pythonVersionFilePath , pythonVersionFileContent ) ;
expect ( _fn ( pythonVersionFilePath ) ) . toEqual ( [ '3.8' , '3.7' ] ) ;
}
) ;
it . each ( [ getVersionsInputFromPlainFile , getVersionInputFromFile ] ) (
'Version from complex plain file test' ,
async _fn = > {
await io . mkdirP ( tempDir ) ;
const pythonVersionFileName = 'python-version.file' ;
const pythonVersionFilePath = path . join ( tempDir , pythonVersionFileName ) ;
const pythonVersionFileContent = '3.10/envs/virtualenv\r# 3.9\n3.8\r\n3.7\r\n 3.6 \r\n' ;
fs . writeFileSync ( pythonVersionFilePath , pythonVersionFileContent ) ;
expect ( _fn ( pythonVersionFilePath ) ) . toEqual ( [ '3.10' , '3.8' , '3.7' , '3.6' ] ) ;
}
) ;
2023-06-28 20:02:44 +00:00
it . each ( [ getVersionInputFromTomlFile , getVersionInputFromFile ] ) (
'Version from standard pyproject.toml test' ,
async _fn = > {
await io . mkdirP ( tempDir ) ;
const pythonVersionFileName = 'pyproject.toml' ;
const pythonVersionFilePath = path . join ( tempDir , pythonVersionFileName ) ;
2023-09-07 13:45:09 +00:00
const pythonVersion = '>=3.7.0' ;
2023-06-28 20:02:44 +00:00
const pythonVersionFileContent = ` [project] \ nrequires-python = " ${ pythonVersion } " ` ;
fs . writeFileSync ( pythonVersionFilePath , pythonVersionFileContent ) ;
expect ( _fn ( pythonVersionFilePath ) ) . toEqual ( [ pythonVersion ] ) ;
}
) ;
it . each ( [ getVersionInputFromTomlFile , getVersionInputFromFile ] ) (
'Version from poetry pyproject.toml test' ,
async _fn = > {
await io . mkdirP ( tempDir ) ;
const pythonVersionFileName = 'pyproject.toml' ;
const pythonVersionFilePath = path . join ( tempDir , pythonVersionFileName ) ;
2023-09-07 13:45:09 +00:00
const pythonVersion = '>=3.7.0' ;
2023-06-28 20:02:44 +00:00
const pythonVersionFileContent = ` [tool.poetry.dependencies] \ npython = " ${ pythonVersion } " ` ;
fs . writeFileSync ( pythonVersionFilePath , pythonVersionFileContent ) ;
expect ( _fn ( pythonVersionFilePath ) ) . toEqual ( [ pythonVersion ] ) ;
}
) ;
it . each ( [ getVersionInputFromTomlFile , getVersionInputFromFile ] ) (
'Version undefined' ,
async _fn = > {
await io . mkdirP ( tempDir ) ;
const pythonVersionFileName = 'pyproject.toml' ;
const pythonVersionFilePath = path . join ( tempDir , pythonVersionFileName ) ;
fs . writeFileSync ( pythonVersionFilePath , ` ` ) ;
expect ( _fn ( pythonVersionFilePath ) ) . toEqual ( [ ] ) ;
}
) ;
} ) ;
2023-10-10 12:59:54 +00:00
describe ( 'getNextPageUrl' , ( ) = > {
it ( 'GitHub API pagination next page is parsed correctly' , ( ) = > {
function generateResponse ( link : string ) {
return {
statusCode : 200 ,
result : null ,
headers : {
link : link
}
} ;
}
const page1Links =
'<https://api.github.com/repositories/129883600/releases?page=2>; rel="next", <https://api.github.com/repositories/129883600/releases?page=3>; rel="last"' ;
expect ( getNextPageUrl ( generateResponse ( page1Links ) ) ) . toStrictEqual (
'https://api.github.com/repositories/129883600/releases?page=2'
) ;
const page2Links =
'<https://api.github.com/repositories/129883600/releases?page=1>; rel="prev", <https://api.github.com/repositories/129883600/releases?page=1>; rel="first"' ;
expect ( getNextPageUrl ( generateResponse ( page2Links ) ) ) . toBeNull ( ) ;
} ) ;
} ) ;