renovate/lib/manager/homebrew/update.spec.ts
2020-12-11 13:29:43 +01:00

370 lines
12 KiB
TypeScript

import fs from 'fs';
import { Readable } from 'stream';
import * as httpMock from '../../../test/http-mock';
import { updateDependency } from './update';
const aide = fs.readFileSync(
'lib/manager/homebrew/__fixtures__/aide.rb',
'utf8'
);
const ibazel = fs.readFileSync(
'lib/manager/homebrew/__fixtures__/ibazel.rb',
'utf8'
);
const baseUrl = 'https://github.com';
describe('manager/homebrew/update', () => {
beforeEach(() => {
jest.resetAllMocks();
jest.resetModules();
httpMock.setup();
});
afterEach(() => {
httpMock.reset();
});
it('updates "releases" github dependency', async () => {
const upgrade = {
currentValue: 'v0.16.1',
depName: 'Aide',
managerData: {
ownerName: 'aide',
repoName: 'aide',
sha256:
'0f2b7cecc70c1a27d35c06c98804fcdb9f326630de5d035afc447122186010b7',
url:
'https://github.com/aide/aide/releases/download/v0.16.1/aide-0.16.1.tar.gz',
},
newValue: 'v0.17.7',
};
httpMock
.scope(baseUrl)
.get('/aide/aide/releases/download/v0.17.7/aide-0.17.7.tar.gz')
.reply(200, Readable.from(['foo']));
const newContent = await updateDependency({
fileContent: aide,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).not.toBe(aide);
expect(newContent).toMatchSnapshot();
expect(httpMock.getTrace()).toMatchSnapshot();
});
it('updates "archive" github dependency', async () => {
const upgrade = {
currentValue: 'v0.8.2',
depName: 'Ibazel',
managerData: {
ownerName: 'bazelbuild',
repoName: 'bazel-watcher',
sha256:
'26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4',
url:
'https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz',
},
newValue: 'v0.9.3',
};
httpMock
.scope(baseUrl)
.get(
'/bazelbuild/bazel-watcher/releases/download/v0.9.3/bazel-watcher-0.9.3.tar.gz'
)
.reply(200, Readable.from(['foo']));
const newContent = await updateDependency({
fileContent: ibazel,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).not.toBe(ibazel);
expect(newContent).toMatchSnapshot();
expect(httpMock.getTrace()).toMatchSnapshot();
});
it('returns unchanged content if fromStream promise rejects', async () => {
const upgrade = {
currentValue: 'v0.8.2',
depName: 'Ibazel',
managerData: {
ownerName: 'bazelbuild',
repoName: 'bazel-watcher',
sha256:
'26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4',
url:
'https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz',
},
newValue: 'v0.9.3',
};
httpMock
.scope(baseUrl)
.get(
'/bazelbuild/bazel-watcher/releases/download/v0.9.3/bazel-watcher-0.9.3.tar.gz'
)
.replyWithError('')
.get('/bazelbuild/bazel-watcher/archive/v0.9.3.tar.gz')
.replyWithError('');
const newContent = await updateDependency({
fileContent: ibazel,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).toBe(ibazel);
expect(httpMock.getTrace()).toMatchSnapshot();
});
it('returns unchanged content if url field in upgrade object is invalid', async () => {
const content = ibazel;
const upgrade = {
currentValue: 'v0.8.2',
depName: 'Ibazel',
managerData: {
ownerName: 'bazelbuild',
repoName: 'bazel-watcher',
sha256:
'26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4',
url: 'invalid_url',
},
newValue: 'v0.9.3',
};
const newContent = await updateDependency({
fileContent: content,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).toBe(content);
});
it('returns unchanged content if repoName in upgrade object is invalid', async () => {
const content = ibazel;
const upgrade = {
currentValue: 'v0.8.2',
depName: 'Ibazel',
managerData: {
ownerName: 'bazelbuild',
repoName: 'invalid/repo/name',
sha256:
'26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4',
url:
'https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz',
},
newValue: 'v0.9.3',
};
httpMock
.scope(baseUrl)
.get(
'/bazelbuild/invalid/repo/name/releases/download/v0.9.3/invalid/repo/name-0.9.3.tar.gz'
)
.replyWithError('')
.get('/bazelbuild/invalid/repo/name/archive/v0.9.3.tar.gz')
.reply(200, Readable.from(['foo']));
const newContent = await updateDependency({
fileContent: content,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).toBe(content);
expect(httpMock.getTrace()).toMatchSnapshot();
});
it('returns unchanged content if repoName in upgrade object is wrong', async () => {
const content = ibazel;
const upgrade = {
currentValue: 'v0.8.2',
depName: 'Ibazel',
managerData: {
ownerName: 'bazelbuild',
repoName: 'wrong-version/archive/v10.2.3.tar.gz',
sha256:
'26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4',
url:
'https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz',
},
newValue: 'v0.9.3',
};
httpMock
.scope(baseUrl)
.get(
'/bazelbuild/wrong-version/archive/v10.2.3.tar.gz/releases/download/v0.9.3/wrong-version/archive/v10.2.3.tar.gz-0.9.3.tar.gz'
)
.replyWithError('')
.get(
'/bazelbuild/wrong-version/archive/v10.2.3.tar.gz/archive/v0.9.3.tar.gz'
)
.reply(200, Readable.from(['foo']));
const newContent = await updateDependency({
fileContent: content,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).toBe(content);
expect(httpMock.getTrace()).toMatchSnapshot();
});
it('returns unchanged content if url field in Formula file is invalid', async () => {
const content = `
class Ibazel < Formula
desc 'IBazel is a tool for building Bazel targets when source files change.'
homepage 'https://github.com/bazelbuild/bazel-watcher'
url ???https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz"
sha256 '26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4'
end
`;
const upgrade = {
currentValue: 'v0.8.2',
depName: 'Ibazel',
managerData: {
ownerName: 'bazelbuild',
repoName: 'bazel-watcher',
sha256:
'26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4',
url:
'https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz',
},
newValue: 'v0.9.3',
};
httpMock
.scope(baseUrl)
.get(
'/bazelbuild/bazel-watcher/releases/download/v0.9.3/bazel-watcher-0.9.3.tar.gz'
)
.reply(200, Readable.from(['foo']));
const newContent = await updateDependency({
fileContent: content,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).toBe(content);
expect(httpMock.getTrace()).toMatchSnapshot();
});
it('returns unchanged content if url field in Formula file is missing', async () => {
const content = `
class Ibazel < Formula
desc 'IBazel is a tool for building Bazel targets when source files change.'
homepage 'https://github.com/bazelbuild/bazel-watcher'
sha256 '26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4'
end
`;
const upgrade = {
currentValue: 'v0.8.2',
depName: 'Ibazel',
managerData: {
ownerName: 'bazelbuild',
repoName: 'bazel-watcher',
sha256:
'26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4',
url:
'https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz',
},
newValue: 'v0.9.3',
};
httpMock
.scope(baseUrl)
.get(
'/bazelbuild/bazel-watcher/releases/download/v0.9.3/bazel-watcher-0.9.3.tar.gz'
)
.reply(200, Readable.from(['foo']));
const newContent = await updateDependency({
fileContent: content,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).toBe(content);
expect(httpMock.getTrace()).toMatchSnapshot();
});
it('returns unchanged content if sha256 field in Formula file is invalid', async () => {
const content = `
class Ibazel < Formula
desc 'IBazel is a tool for building Bazel targets when source files change.'
homepage 'https://github.com/bazelbuild/bazel-watcher'
url "https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz"
sha256 ???26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4'
end
`;
const upgrade = {
currentValue: 'v0.8.2',
depName: 'Ibazel',
managerData: {
ownerName: 'bazelbuild',
repoName: 'bazel-watcher',
sha256:
'26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4',
url:
'https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz',
},
newValue: 'v0.9.3',
};
httpMock
.scope(baseUrl)
.get(
'/bazelbuild/bazel-watcher/releases/download/v0.9.3/bazel-watcher-0.9.3.tar.gz'
)
.reply(200, Readable.from(['foo']));
const newContent = await updateDependency({
fileContent: content,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).toBe(content);
expect(httpMock.getTrace()).toMatchSnapshot();
});
it('returns unchanged content if sha256 field in Formula file is missing', async () => {
const content = `
class Ibazel < Formula
desc 'IBazel is a tool for building Bazel targets when source files change.'
homepage 'https://github.com/bazelbuild/bazel-watcher'
url "https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz"
end
`;
const upgrade = {
currentValue: 'v0.8.2',
depName: 'Ibazel',
managerData: {
ownerName: 'bazelbuild',
repoName: 'bazel-watcher',
sha256:
'26f5125218fad2741d3caf937b02296d803900e5f153f5b1f733f15391b9f9b4',
url:
'https://github.com/bazelbuild/bazel-watcher/archive/v0.8.2.tar.gz',
},
newValue: 'v0.9.3',
};
httpMock
.scope(baseUrl)
.get(
'/bazelbuild/bazel-watcher/releases/download/v0.9.3/bazel-watcher-0.9.3.tar.gz'
)
.reply(200, Readable.from(['foo']));
const newContent = await updateDependency({
fileContent: content,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).toBe(content);
expect(httpMock.getTrace()).toMatchSnapshot();
});
it('returns unchanged content if both got requests fail', async () => {
const upgrade = {
currentValue: 'v0.16.1',
depName: 'Aide',
managerData: {
ownerName: 'aide',
repoName: 'aide',
sha256:
'0f2b7cecc70c1a27d35c06c98804fcdb9f326630de5d035afc447122186010b7',
url:
'https://github.com/aide/aide/releases/download/v0.16.1/aide-0.16.1.tar.gz',
},
newValue: 'v0.17.7',
};
httpMock
.scope(baseUrl)
.get('/aide/aide/releases/download/v0.17.7/aide-0.17.7.tar.gz')
.replyWithError('')
.get('/aide/aide/archive/v0.17.7.tar.gz')
.replyWithError('');
const newContent = await updateDependency({
fileContent: aide,
upgrade,
});
expect(newContent).not.toBeNull();
expect(newContent).toBe(aide);
expect(newContent).toMatchSnapshot();
expect(httpMock.getTrace()).toMatchSnapshot();
});
});