mirror of
https://github.com/actions/setup-node.git
synced 2024-11-14 11:38:05 +00:00
8170e22e8f
* Add project-dir * Fix find lock file * Remove package-dir input * format & resolve conflicts * Add unit tests * build dist * Apply change request fixes * handle non-dir cache-dependency-path * bump cache version * run checks * Handle globs in cacheDependencyPath * refactor, introduce `cacheDependencyPathToProjectsDirectories` it is necessary for the next PR related yarn optimization * Changes requests * Apply fixes * review fixes * add e2e * Add unique * review updates * review updates second stage * Review fixes 3 * imporve e2e tests
181 lines
5.4 KiB
TypeScript
181 lines
5.4 KiB
TypeScript
import * as core from '@actions/core';
|
|
import * as cache from '@actions/cache';
|
|
import * as path from 'path';
|
|
import * as glob from '@actions/glob';
|
|
|
|
import * as utils from '../src/cache-utils';
|
|
import {restoreCache} from '../src/cache-restore';
|
|
|
|
describe('cache-restore', () => {
|
|
process.env['GITHUB_WORKSPACE'] = path.join(__dirname, 'data');
|
|
if (!process.env.RUNNER_OS) {
|
|
process.env.RUNNER_OS = 'Linux';
|
|
}
|
|
const platform = process.env.RUNNER_OS;
|
|
const commonPath = '/some/random/path';
|
|
const npmCachePath = `${commonPath}/npm`;
|
|
const pnpmCachePath = `${commonPath}/pnpm`;
|
|
const yarn1CachePath = `${commonPath}/yarn1`;
|
|
const yarn2CachePath = `${commonPath}/yarn2`;
|
|
const yarnFileHash =
|
|
'b8a0bae5243251f7c07dd52d1f78ff78281dfefaded700a176261b6b54fa245b';
|
|
const npmFileHash =
|
|
'abf7c9b306a3149dcfba4673e2362755503bcceaab46f0e4e6fee0ade493e20c';
|
|
const pnpmFileHash =
|
|
'26309058093e84713f38869c50cf1cee9b08155ede874ec1b44ce3fca8c68c70';
|
|
const cachesObject = {
|
|
[npmCachePath]: npmFileHash,
|
|
[pnpmCachePath]: pnpmFileHash,
|
|
[yarn1CachePath]: yarnFileHash,
|
|
[yarn2CachePath]: yarnFileHash
|
|
};
|
|
|
|
function findCacheFolder(command: string) {
|
|
switch (command) {
|
|
case 'npm config get cache':
|
|
return npmCachePath;
|
|
case 'pnpm store path --silent':
|
|
return pnpmCachePath;
|
|
case 'yarn cache dir':
|
|
return yarn1CachePath;
|
|
case 'yarn config get cacheFolder':
|
|
return yarn2CachePath;
|
|
default:
|
|
return 'packge/not/found';
|
|
}
|
|
}
|
|
|
|
let saveStateSpy: jest.SpyInstance;
|
|
let infoSpy: jest.SpyInstance;
|
|
let debugSpy: jest.SpyInstance;
|
|
let setOutputSpy: jest.SpyInstance;
|
|
let getCommandOutputSpy: jest.SpyInstance;
|
|
let restoreCacheSpy: jest.SpyInstance;
|
|
let hashFilesSpy: jest.SpyInstance;
|
|
|
|
beforeEach(() => {
|
|
// core
|
|
infoSpy = jest.spyOn(core, 'info');
|
|
infoSpy.mockImplementation(() => undefined);
|
|
|
|
debugSpy = jest.spyOn(core, 'debug');
|
|
debugSpy.mockImplementation(() => undefined);
|
|
|
|
setOutputSpy = jest.spyOn(core, 'setOutput');
|
|
setOutputSpy.mockImplementation(() => undefined);
|
|
|
|
saveStateSpy = jest.spyOn(core, 'saveState');
|
|
saveStateSpy.mockImplementation(() => undefined);
|
|
|
|
// glob
|
|
hashFilesSpy = jest.spyOn(glob, 'hashFiles');
|
|
hashFilesSpy.mockImplementation((pattern: string) => {
|
|
if (pattern.includes('package-lock.json')) {
|
|
return npmFileHash;
|
|
} else if (pattern.includes('pnpm-lock.yaml')) {
|
|
return pnpmFileHash;
|
|
} else if (pattern.includes('yarn.lock')) {
|
|
return yarnFileHash;
|
|
} else {
|
|
return '';
|
|
}
|
|
});
|
|
|
|
// cache
|
|
restoreCacheSpy = jest.spyOn(cache, 'restoreCache');
|
|
restoreCacheSpy.mockImplementation(
|
|
(cachePaths: Array<string>, key: string) => {
|
|
if (!cachePaths || cachePaths.length === 0) {
|
|
return undefined;
|
|
}
|
|
|
|
const cachPath = cachePaths[0];
|
|
const fileHash = cachesObject[cachPath];
|
|
|
|
if (key.includes(fileHash)) {
|
|
return key;
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
);
|
|
|
|
// cache-utils
|
|
getCommandOutputSpy = jest.spyOn(utils, 'getCommandOutput');
|
|
});
|
|
|
|
describe('Validate provided package manager', () => {
|
|
it.each([['npm7'], ['npm6'], ['pnpm6'], ['yarn1'], ['yarn2'], ['random']])(
|
|
'Throw an error because %s is not supported',
|
|
async packageManager => {
|
|
await expect(restoreCache(packageManager, '')).rejects.toThrow(
|
|
`Caching for '${packageManager}' is not supported`
|
|
);
|
|
}
|
|
);
|
|
});
|
|
|
|
describe('Restore dependencies', () => {
|
|
it.each([
|
|
['yarn', '2.1.2', yarnFileHash],
|
|
['yarn', '1.2.3', yarnFileHash],
|
|
['npm', '', npmFileHash],
|
|
['pnpm', '', pnpmFileHash]
|
|
])(
|
|
'restored dependencies for %s',
|
|
async (packageManager, toolVersion, fileHash) => {
|
|
getCommandOutputSpy.mockImplementation((command: string) => {
|
|
if (command.includes('version')) {
|
|
return toolVersion;
|
|
} else {
|
|
return findCacheFolder(command);
|
|
}
|
|
});
|
|
|
|
await restoreCache(packageManager, '');
|
|
expect(hashFilesSpy).toHaveBeenCalled();
|
|
expect(infoSpy).toHaveBeenCalledWith(
|
|
`Cache restored from key: node-cache-${platform}-${packageManager}-${fileHash}`
|
|
);
|
|
expect(infoSpy).not.toHaveBeenCalledWith(
|
|
`${packageManager} cache is not found`
|
|
);
|
|
expect(setOutputSpy).toHaveBeenCalledWith('cache-hit', true);
|
|
}
|
|
);
|
|
});
|
|
|
|
describe('Dependencies changed', () => {
|
|
it.each([
|
|
['yarn', '2.1.2', yarnFileHash],
|
|
['yarn', '1.2.3', yarnFileHash],
|
|
['npm', '', npmFileHash],
|
|
['pnpm', '', pnpmFileHash]
|
|
])(
|
|
'dependencies are changed %s',
|
|
async (packageManager, toolVersion, fileHash) => {
|
|
getCommandOutputSpy.mockImplementation((command: string) => {
|
|
if (command.includes('version')) {
|
|
return toolVersion;
|
|
} else {
|
|
return findCacheFolder(command);
|
|
}
|
|
});
|
|
|
|
restoreCacheSpy.mockImplementationOnce(() => undefined);
|
|
await restoreCache(packageManager, '');
|
|
expect(hashFilesSpy).toHaveBeenCalled();
|
|
expect(infoSpy).toHaveBeenCalledWith(
|
|
`${packageManager} cache is not found`
|
|
);
|
|
expect(setOutputSpy).toHaveBeenCalledWith('cache-hit', false);
|
|
}
|
|
);
|
|
});
|
|
|
|
afterEach(() => {
|
|
jest.resetAllMocks();
|
|
jest.clearAllMocks();
|
|
});
|
|
});
|