mirror of https://github.com/renovatebot/renovate
526 lines
12 KiB
TypeScript
526 lines
12 KiB
TypeScript
import { mockExecAll } from '../../../../test/exec-util';
|
|
import { mockedFunction, partial } from '../../../../test/util';
|
|
import { GlobalConfig } from '../../../config/global';
|
|
import { ExecError } from '../../../util/exec/exec-error';
|
|
import { localPathIsSymbolicLink, readLocalSymlink } from '../../../util/fs';
|
|
import { getRepoStatus } from '../../../util/git';
|
|
import type { StatusResult } from '../../../util/git/types';
|
|
import type { UpdateArtifact } from '../types';
|
|
import { updateArtifacts } from '.';
|
|
|
|
jest.mock('../../../util/git');
|
|
jest.mock('../../../util/fs');
|
|
|
|
const getRepoStatusMock = mockedFunction(getRepoStatus);
|
|
|
|
const lstatsMock = mockedFunction(localPathIsSymbolicLink);
|
|
const readlinkMock = mockedFunction(readLocalSymlink);
|
|
|
|
describe('modules/manager/hermit/artifacts', () => {
|
|
describe('updateArtifacts', () => {
|
|
it('should run hermit install for packages and return updated files', async () => {
|
|
lstatsMock.mockResolvedValue(true);
|
|
|
|
readlinkMock.mockResolvedValue('hermit');
|
|
GlobalConfig.set({ localDir: '' });
|
|
|
|
const execSnapshots = mockExecAll();
|
|
getRepoStatusMock.mockResolvedValue(
|
|
partial<StatusResult>({
|
|
not_added: ['bin/go-1.17.1'],
|
|
deleted: ['bin/go-1.17'],
|
|
modified: ['bin/go', 'bin/jq'],
|
|
created: ['bin/jq-extra'],
|
|
renamed: [
|
|
{
|
|
from: 'bin/jq-1.5',
|
|
to: 'bin/jq-1.6',
|
|
},
|
|
],
|
|
}),
|
|
);
|
|
|
|
const res = await updateArtifacts(
|
|
partial<UpdateArtifact>({
|
|
updatedDeps: [
|
|
{
|
|
depName: 'go',
|
|
currentVersion: '1.17',
|
|
newValue: '1.17.1',
|
|
},
|
|
{
|
|
depName: 'jq',
|
|
currentVersion: '1.5',
|
|
newValue: '1.6',
|
|
},
|
|
],
|
|
packageFileName: 'go/bin/hermit',
|
|
}),
|
|
);
|
|
|
|
expect(execSnapshots).toMatchObject([
|
|
{ cmd: './hermit install go-1.17.1 jq-1.6' },
|
|
]);
|
|
|
|
expect(res).toStrictEqual([
|
|
{
|
|
file: {
|
|
path: 'bin/jq-1.5',
|
|
type: 'deletion',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/jq-1.6',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
path: 'bin/go',
|
|
type: 'deletion',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/go',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
path: 'bin/jq',
|
|
type: 'deletion',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/jq',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/jq-extra',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/go-1.17.1',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
path: 'bin/go-1.17',
|
|
type: 'deletion',
|
|
},
|
|
},
|
|
]);
|
|
});
|
|
|
|
it('should uninstall old package for name replacement', async () => {
|
|
lstatsMock.mockResolvedValue(true);
|
|
|
|
readlinkMock.mockResolvedValue('hermit');
|
|
GlobalConfig.set({ localDir: '' });
|
|
|
|
const execSnapshots = mockExecAll();
|
|
getRepoStatusMock.mockResolvedValue(
|
|
partial<StatusResult>({
|
|
not_added: [],
|
|
deleted: [],
|
|
modified: ['bin/java', 'bin/javac', 'bin/jar'],
|
|
renamed: [
|
|
{
|
|
from: 'bin/.openjdk-17.0.3',
|
|
to: 'bin/.openjdk-17.0.4.1_1',
|
|
},
|
|
],
|
|
created: [],
|
|
}),
|
|
);
|
|
|
|
const res = await updateArtifacts(
|
|
partial<UpdateArtifact>({
|
|
updatedDeps: [
|
|
{
|
|
depName: 'openjdk',
|
|
newName: 'openjre',
|
|
currentVersion: '17.0.3',
|
|
newValue: '17.0.4.1_1',
|
|
updateType: 'replacement',
|
|
},
|
|
],
|
|
packageFileName: 'go/bin/hermit',
|
|
}),
|
|
);
|
|
|
|
expect(execSnapshots).toMatchObject([
|
|
{ cmd: './hermit uninstall openjdk' },
|
|
{ cmd: './hermit install openjre-17.0.4.1_1' },
|
|
]);
|
|
|
|
expect(res).toStrictEqual([
|
|
{
|
|
file: {
|
|
path: 'bin/.openjdk-17.0.3',
|
|
type: 'deletion',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/.openjdk-17.0.4.1_1',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
path: 'bin/java',
|
|
type: 'deletion',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/java',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
path: 'bin/javac',
|
|
type: 'deletion',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/javac',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
path: 'bin/jar',
|
|
type: 'deletion',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/jar',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
]);
|
|
});
|
|
|
|
it('should not uninstall package for version only replcaement', async () => {
|
|
lstatsMock.mockResolvedValue(true);
|
|
|
|
readlinkMock.mockResolvedValue('hermit');
|
|
GlobalConfig.set({ localDir: '' });
|
|
|
|
const execSnapshots = mockExecAll();
|
|
getRepoStatusMock.mockResolvedValue(
|
|
partial<StatusResult>({
|
|
not_added: [],
|
|
deleted: [],
|
|
modified: ['bin/go'],
|
|
renamed: [
|
|
{
|
|
from: 'bin/.go-1.19',
|
|
to: 'bin/.go-1.18',
|
|
},
|
|
],
|
|
created: [],
|
|
}),
|
|
);
|
|
|
|
const res = await updateArtifacts(
|
|
partial<UpdateArtifact>({
|
|
updatedDeps: [
|
|
{
|
|
depName: 'go',
|
|
newName: 'go',
|
|
currentVersion: '1.19',
|
|
newValue: '1.18',
|
|
updateType: 'replacement',
|
|
},
|
|
],
|
|
packageFileName: 'go/bin/hermit',
|
|
}),
|
|
);
|
|
|
|
expect(execSnapshots).toMatchObject([
|
|
{ cmd: './hermit install go-1.18' },
|
|
]);
|
|
|
|
expect(res).toStrictEqual([
|
|
{
|
|
file: {
|
|
path: 'bin/.go-1.19',
|
|
type: 'deletion',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/.go-1.18',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
path: 'bin/go',
|
|
type: 'deletion',
|
|
},
|
|
},
|
|
{
|
|
file: {
|
|
contents: 'hermit',
|
|
isSymlink: true,
|
|
isExecutable: undefined,
|
|
path: 'bin/go',
|
|
type: 'addition',
|
|
},
|
|
},
|
|
]);
|
|
});
|
|
|
|
it('should fail if uninstallation fails', async () => {
|
|
lstatsMock.mockResolvedValue(true);
|
|
|
|
readlinkMock.mockResolvedValue(null);
|
|
GlobalConfig.set({ localDir: '' });
|
|
|
|
mockExecAll(
|
|
new ExecError('', {
|
|
stdout: '',
|
|
stderr: 'error executing hermit uninstall',
|
|
cmd: '',
|
|
options: {
|
|
encoding: 'utf-8',
|
|
},
|
|
}),
|
|
);
|
|
|
|
getRepoStatusMock.mockResolvedValue(
|
|
partial<StatusResult>({
|
|
not_added: [],
|
|
deleted: [],
|
|
modified: [],
|
|
created: [],
|
|
renamed: [],
|
|
}),
|
|
);
|
|
|
|
const res = await updateArtifacts(
|
|
partial<UpdateArtifact>({
|
|
updatedDeps: [
|
|
{
|
|
depName: 'openjdk',
|
|
newName: 'openjre',
|
|
currentVersion: '17.0.3',
|
|
newValue: '17.0.4.1_1',
|
|
updateType: 'replacement',
|
|
},
|
|
],
|
|
packageFileName: 'go/bin/hermit',
|
|
}),
|
|
);
|
|
|
|
expect(res).toEqual([
|
|
{
|
|
artifactError: {
|
|
lockFile: 'from: openjdk-17.0.3, to: openjdk',
|
|
stderr: 'error executing hermit uninstall',
|
|
},
|
|
},
|
|
]);
|
|
});
|
|
|
|
it('should fail on error getting link content', async () => {
|
|
lstatsMock.mockResolvedValue(true);
|
|
|
|
readlinkMock.mockResolvedValue(null);
|
|
GlobalConfig.set({ localDir: '' });
|
|
mockExecAll();
|
|
|
|
getRepoStatusMock.mockResolvedValue(
|
|
partial<StatusResult>({
|
|
not_added: [],
|
|
deleted: [],
|
|
modified: [],
|
|
created: [],
|
|
renamed: [
|
|
{
|
|
from: 'bin/jq-1.5',
|
|
to: 'bin/jq-1.6',
|
|
},
|
|
],
|
|
}),
|
|
);
|
|
|
|
const res = await updateArtifacts(
|
|
partial<UpdateArtifact>({
|
|
updatedDeps: [
|
|
{
|
|
depName: 'go',
|
|
currentVersion: '1.17',
|
|
newValue: '1.17.1',
|
|
},
|
|
{
|
|
depName: 'jq',
|
|
currentVersion: '1.5',
|
|
newValue: '1.6',
|
|
},
|
|
],
|
|
packageFileName: 'go/bin/hermit',
|
|
}),
|
|
);
|
|
|
|
expect(res).toEqual([
|
|
{
|
|
artifactError: {
|
|
stderr: 'error getting content for bin/jq-1.6',
|
|
},
|
|
},
|
|
]);
|
|
});
|
|
|
|
it('should return error on installation error', async () => {
|
|
mockExecAll(
|
|
new ExecError('', {
|
|
stdout: '',
|
|
stderr: 'error executing hermit install',
|
|
cmd: '',
|
|
options: {
|
|
encoding: 'utf-8',
|
|
},
|
|
}),
|
|
);
|
|
|
|
const res = await updateArtifacts(
|
|
partial<UpdateArtifact>({
|
|
updatedDeps: [
|
|
{
|
|
depName: 'go',
|
|
currentVersion: '1.17',
|
|
newValue: '1.17.1',
|
|
},
|
|
{
|
|
depName: 'jq',
|
|
currentVersion: '1.5',
|
|
newValue: '1.6',
|
|
},
|
|
],
|
|
packageFileName: 'go/bin/hermit',
|
|
}),
|
|
);
|
|
|
|
expect(res).toStrictEqual([
|
|
{
|
|
artifactError: {
|
|
lockFile: 'from: go-1.17 jq-1.5, to: go-1.17.1 jq-1.6',
|
|
stderr: 'error executing hermit install',
|
|
},
|
|
},
|
|
]);
|
|
});
|
|
|
|
it('should return error on invalid update information', async () => {
|
|
let res = await updateArtifacts(
|
|
partial<UpdateArtifact>({
|
|
updatedDeps: [
|
|
{
|
|
currentVersion: '1.17',
|
|
newValue: '1.17.1',
|
|
},
|
|
],
|
|
packageFileName: 'go/bin/hermit',
|
|
}),
|
|
);
|
|
|
|
expect(res).toStrictEqual([
|
|
{
|
|
artifactError: {
|
|
lockFile: 'from: -1.17, to: -1.17.1',
|
|
stderr: `invalid package to update`,
|
|
},
|
|
},
|
|
]);
|
|
|
|
res = await updateArtifacts(
|
|
partial<UpdateArtifact>({
|
|
updatedDeps: [
|
|
{
|
|
depName: 'go',
|
|
newValue: '1.17.1',
|
|
},
|
|
],
|
|
packageFileName: 'go/bin/hermit',
|
|
}),
|
|
);
|
|
|
|
expect(res).toStrictEqual([
|
|
{
|
|
artifactError: {
|
|
lockFile: 'from: go-, to: go-1.17.1',
|
|
stderr: `invalid package to update`,
|
|
},
|
|
},
|
|
]);
|
|
|
|
res = await updateArtifacts(
|
|
partial<UpdateArtifact>({
|
|
updatedDeps: [
|
|
{
|
|
depName: 'go',
|
|
currentVersion: '1.17',
|
|
},
|
|
],
|
|
packageFileName: 'go/bin/hermit',
|
|
}),
|
|
);
|
|
|
|
expect(res).toStrictEqual([
|
|
{
|
|
artifactError: {
|
|
lockFile: 'from: go-1.17, to: go-',
|
|
stderr: `invalid package to update`,
|
|
},
|
|
},
|
|
]);
|
|
});
|
|
});
|
|
});
|