@ -3,7 +3,7 @@ import * as exec from "@actions/exec";
import * as io from "@actions/io" ;
import * as path from "path" ;
import * as cacheHttpClient from "../src/cacheHttpClient" ;
import { Inputs } from "../src/constants" ;
import { Events, Inputs } from "../src/constants" ;
import { ArtifactCacheEntry } from "../src/contracts" ;
import run from "../src/restore" ;
import * as actionUtils from "../src/utils/actionUtils" ;
@ -26,12 +26,38 @@ beforeAll(() => {
}
) ;
jest . spyOn ( actionUtils , "isValidEvent" ) . mockImplementation ( ( ) = > {
const actualUtils = jest . requireActual ( "../src/utils/actionUtils" ) ;
return actualUtils . isValidEvent ( ) ;
} ) ;
jest . spyOn ( actionUtils , "getSupportedEvents" ) . mockImplementation ( ( ) = > {
const actualUtils = jest . requireActual ( "../src/utils/actionUtils" ) ;
return actualUtils . getSupportedEvents ( ) ;
} ) ;
jest . spyOn ( io , "which" ) . mockImplementation ( tool = > {
return Promise . resolve ( tool ) ;
} ) ;
} ) ;
beforeEach ( ( ) = > {
process . env [ Events . Key ] = Events . Push ;
} ) ;
afterEach ( ( ) = > {
testUtils . clearInputs ( ) ;
delete process . env [ Events . Key ] ;
} ) ;
test ( "restore with invalid event" , async ( ) = > {
const failedMock = jest . spyOn ( core , "setFailed" ) ;
const invalidEvent = "commit_comment" ;
process . env [ Events . Key ] = invalidEvent ;
await run ( ) ;
expect ( failedMock ) . toHaveBeenCalledWith (
` Event Validation Error: The event type ${ invalidEvent } is not supported. Only push, pull_request events are supported at this time. `
) ;
} ) ;
test ( "restore with no path should fail" , async ( ) = > {
@ -255,6 +281,82 @@ test("restore with cache found", async () => {
expect ( failedMock ) . toHaveBeenCalledTimes ( 0 ) ;
} ) ;
test ( "restore with a pull request event and cache found" , async ( ) = > {
const key = "node-test" ;
const cachePath = path . resolve ( "node_modules" ) ;
testUtils . setInputs ( {
path : "node_modules" ,
key
} ) ;
process . env [ Events . Key ] = Events . PullRequest ;
const infoMock = jest . spyOn ( core , "info" ) ;
const warningMock = jest . spyOn ( core , "warning" ) ;
const failedMock = jest . spyOn ( core , "setFailed" ) ;
const stateMock = jest . spyOn ( core , "saveState" ) ;
const cacheEntry : ArtifactCacheEntry = {
cacheKey : key ,
scope : "refs/heads/master" ,
archiveLocation : "https://www.example.com/download"
} ;
const getCacheMock = jest . spyOn ( cacheHttpClient , "getCacheEntry" ) ;
getCacheMock . mockImplementation ( ( ) = > {
return Promise . resolve ( cacheEntry ) ;
} ) ;
const tempPath = "/foo/bar" ;
const createTempDirectoryMock = jest . spyOn (
actionUtils ,
"createTempDirectory"
) ;
createTempDirectoryMock . mockImplementation ( ( ) = > {
return Promise . resolve ( tempPath ) ;
} ) ;
const archivePath = path . join ( tempPath , "cache.tgz" ) ;
const setCacheStateMock = jest . spyOn ( actionUtils , "setCacheState" ) ;
const downloadCacheMock = jest . spyOn ( cacheHttpClient , "downloadCache" ) ;
const fileSize = 142 ;
const getArchiveFileSizeMock = jest
. spyOn ( actionUtils , "getArchiveFileSize" )
. mockReturnValue ( fileSize ) ;
const mkdirMock = jest . spyOn ( io , "mkdirP" ) ;
const execMock = jest . spyOn ( exec , "exec" ) ;
const setCacheHitOutputMock = jest . spyOn ( actionUtils , "setCacheHitOutput" ) ;
await run ( ) ;
expect ( stateMock ) . toHaveBeenCalledWith ( "CACHE_KEY" , key ) ;
expect ( getCacheMock ) . toHaveBeenCalledWith ( [ key ] ) ;
expect ( setCacheStateMock ) . toHaveBeenCalledWith ( cacheEntry ) ;
expect ( createTempDirectoryMock ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( downloadCacheMock ) . toHaveBeenCalledWith ( cacheEntry , archivePath ) ;
expect ( getArchiveFileSizeMock ) . toHaveBeenCalledWith ( archivePath ) ;
expect ( mkdirMock ) . toHaveBeenCalledWith ( cachePath ) ;
const IS_WINDOWS = process . platform === "win32" ;
const tarArchivePath = IS_WINDOWS
? archivePath . replace ( /\\/g , "/" )
: archivePath ;
const tarCachePath = IS_WINDOWS ? cachePath . replace ( /\\/g , "/" ) : cachePath ;
const args = IS_WINDOWS ? [ "-xz" , "--force-local" ] : [ "-xz" ] ;
args . push ( . . . [ "-f" , tarArchivePath , "-C" , tarCachePath ] ) ;
expect ( execMock ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( execMock ) . toHaveBeenCalledWith ( ` "tar" ` , args ) ;
expect ( setCacheHitOutputMock ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( setCacheHitOutputMock ) . toHaveBeenCalledWith ( true ) ;
expect ( infoMock ) . toHaveBeenCalledWith ( ` Cache restored from key: ${ key } ` ) ;
expect ( warningMock ) . toHaveBeenCalledTimes ( 0 ) ;
expect ( failedMock ) . toHaveBeenCalledTimes ( 0 ) ;
} ) ;
test ( "restore with cache found for restore key" , async ( ) = > {
const key = "node-test" ;
const restoreKey = "node-" ;