2019-11-13 16:13:00 -05:00
import * as core from "@actions/core" ;
import * as os from "os" ;
import * as path from "path" ;
import { Events , Outputs , State } from "../src/constants" ;
import { ArtifactCacheEntry } from "../src/contracts" ;
import * as actionUtils from "../src/utils/actionUtils" ;
jest . mock ( "@actions/core" ) ;
jest . mock ( "os" ) ;
afterEach ( ( ) = > {
delete process . env [ Events . Key ] ;
} ) ;
test ( "getArchiveFileSize returns file size" , ( ) = > {
const filePath = path . join ( __dirname , "__fixtures__" , "helloWorld.txt" ) ;
const size = actionUtils . getArchiveFileSize ( filePath ) ;
expect ( size ) . toBe ( 11 ) ;
} ) ;
test ( "isExactKeyMatch with undefined cache entry returns false" , ( ) = > {
const key = "linux-rust" ;
const cacheEntry = undefined ;
expect ( actionUtils . isExactKeyMatch ( key , cacheEntry ) ) . toBe ( false ) ;
} ) ;
test ( "isExactKeyMatch with empty cache entry returns false" , ( ) = > {
const key = "linux-rust" ;
const cacheEntry : ArtifactCacheEntry = { } ;
expect ( actionUtils . isExactKeyMatch ( key , cacheEntry ) ) . toBe ( false ) ;
} ) ;
test ( "isExactKeyMatch with different keys returns false" , ( ) = > {
const key = "linux-rust" ;
const cacheEntry : ArtifactCacheEntry = {
cacheKey : "linux-"
} ;
expect ( actionUtils . isExactKeyMatch ( key , cacheEntry ) ) . toBe ( false ) ;
} ) ;
test ( "isExactKeyMatch with different key accents returns false" , ( ) = > {
const key = "linux-áccent" ;
const cacheEntry : ArtifactCacheEntry = {
cacheKey : "linux-accent"
} ;
expect ( actionUtils . isExactKeyMatch ( key , cacheEntry ) ) . toBe ( false ) ;
} ) ;
test ( "isExactKeyMatch with same key returns true" , ( ) = > {
const key = "linux-rust" ;
const cacheEntry : ArtifactCacheEntry = {
cacheKey : "linux-rust"
} ;
expect ( actionUtils . isExactKeyMatch ( key , cacheEntry ) ) . toBe ( true ) ;
} ) ;
test ( "isExactKeyMatch with same key and different casing returns true" , ( ) = > {
const key = "linux-rust" ;
const cacheEntry : ArtifactCacheEntry = {
cacheKey : "LINUX-RUST"
} ;
expect ( actionUtils . isExactKeyMatch ( key , cacheEntry ) ) . toBe ( true ) ;
} ) ;
test ( "setOutputAndState with undefined entry to set cache-hit output" , ( ) = > {
const key = "linux-rust" ;
const cacheEntry = undefined ;
const setOutputMock = jest . spyOn ( core , "setOutput" ) ;
const saveStateMock = jest . spyOn ( core , "saveState" ) ;
actionUtils . setOutputAndState ( key , cacheEntry ) ;
expect ( setOutputMock ) . toHaveBeenCalledWith ( Outputs . CacheHit , "false" ) ;
expect ( setOutputMock ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( saveStateMock ) . toHaveBeenCalledTimes ( 0 ) ;
} ) ;
test ( "setOutputAndState with exact match to set cache-hit output and state" , ( ) = > {
const key = "linux-rust" ;
const cacheEntry : ArtifactCacheEntry = {
cacheKey : "linux-rust"
} ;
const setOutputMock = jest . spyOn ( core , "setOutput" ) ;
const saveStateMock = jest . spyOn ( core , "saveState" ) ;
actionUtils . setOutputAndState ( key , cacheEntry ) ;
expect ( setOutputMock ) . toHaveBeenCalledWith ( Outputs . CacheHit , "true" ) ;
expect ( setOutputMock ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( saveStateMock ) . toHaveBeenCalledWith (
State . CacheResult ,
JSON . stringify ( cacheEntry )
) ;
expect ( saveStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
} ) ;
test ( "setOutputAndState with no exact match to set cache-hit output and state" , ( ) = > {
const key = "linux-rust" ;
const cacheEntry : ArtifactCacheEntry = {
cacheKey : "linux-rust-bb828da54c148048dd17899ba9fda624811cfb43"
} ;
const setOutputMock = jest . spyOn ( core , "setOutput" ) ;
const saveStateMock = jest . spyOn ( core , "saveState" ) ;
actionUtils . setOutputAndState ( key , cacheEntry ) ;
expect ( setOutputMock ) . toHaveBeenCalledWith ( Outputs . CacheHit , "false" ) ;
expect ( setOutputMock ) . toHaveBeenCalledTimes ( 1 ) ;
expect ( saveStateMock ) . toHaveBeenCalledWith (
State . CacheResult ,
JSON . stringify ( cacheEntry )
) ;
expect ( saveStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
} ) ;
test ( "getCacheState with no state returns undefined" , ( ) = > {
const getStateMock = jest . spyOn ( core , "getState" ) ;
getStateMock . mockImplementation ( ( ) = > {
return "" ;
} ) ;
const state = actionUtils . getCacheState ( ) ;
expect ( state ) . toBe ( undefined ) ;
expect ( getStateMock ) . toHaveBeenCalledWith ( State . CacheResult ) ;
expect ( getStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
} ) ;
test ( "getCacheState with valid state" , ( ) = > {
const cacheEntry : ArtifactCacheEntry = {
cacheKey : "Linux-node-bb828da54c148048dd17899ba9fda624811cfb43" ,
scope : "refs/heads/master" ,
creationTime : "2019-11-13T19:18:02+00:00" ,
archiveLocation : "www.actionscache.test/download"
} ;
const getStateMock = jest . spyOn ( core , "getState" ) ;
getStateMock . mockImplementation ( ( ) = > {
return JSON . stringify ( cacheEntry ) ;
} ) ;
const state = actionUtils . getCacheState ( ) ;
expect ( state ) . toEqual ( cacheEntry ) ;
expect ( getStateMock ) . toHaveBeenCalledWith ( State . CacheResult ) ;
expect ( getStateMock ) . toHaveBeenCalledTimes ( 1 ) ;
} ) ;
2019-11-21 14:37:54 -05:00
test ( "logWarning logs a message with a warning prefix" , ( ) = > {
const message = "A warning occurred." ;
const infoMock = jest . spyOn ( core , "info" ) ;
actionUtils . logWarning ( message ) ;
expect ( infoMock ) . toHaveBeenCalledWith ( ` [warning] ${ message } ` ) ;
} ) ;
2019-11-13 16:13:00 -05:00
test ( "isValidEvent returns false for unknown event" , ( ) = > {
const event = "foo" ;
process . env [ Events . Key ] = event ;
const isValidEvent = actionUtils . isValidEvent ( ) ;
expect ( isValidEvent ) . toBe ( false ) ;
} ) ;
test ( "resolvePath with no ~ in path" , ( ) = > {
const filePath = ".cache/yarn" ;
const resolvedPath = actionUtils . resolvePath ( filePath ) ;
const expectedPath = path . resolve ( filePath ) ;
expect ( resolvedPath ) . toBe ( expectedPath ) ;
} ) ;
test ( "resolvePath with ~ in path" , ( ) = > {
const filePath = "~/.cache/yarn" ;
const homedir = jest . requireActual ( "os" ) . homedir ( ) ;
const homedirMock = jest . spyOn ( os , "homedir" ) ;
homedirMock . mockImplementation ( ( ) = > {
return homedir ;
} ) ;
const resolvedPath = actionUtils . resolvePath ( filePath ) ;
const expectedPath = path . join ( homedir , ".cache/yarn" ) ;
expect ( resolvedPath ) . toBe ( expectedPath ) ;
} ) ;
test ( "resolvePath with home not found" , ( ) = > {
const filePath = "~/.cache/yarn" ;
const homedirMock = jest . spyOn ( os , "homedir" ) ;
homedirMock . mockImplementation ( ( ) = > {
return "" ;
} ) ;
expect ( ( ) = > actionUtils . resolvePath ( filePath ) ) . toThrow (
"Unable to resolve `~` to HOME"
) ;
} ) ;
test ( "isValidEvent returns true for push event" , ( ) = > {
const event = Events . Push ;
process . env [ Events . Key ] = event ;
const isValidEvent = actionUtils . isValidEvent ( ) ;
expect ( isValidEvent ) . toBe ( true ) ;
} ) ;
test ( "isValidEvent returns true for pull request event" , ( ) = > {
const event = Events . PullRequest ;
process . env [ Events . Key ] = event ;
const isValidEvent = actionUtils . isValidEvent ( ) ;
expect ( isValidEvent ) . toBe ( true ) ;
} ) ;