Skip to content
Snippets Groups Projects
Unverified Commit b160644d authored by Sergei Zharinov's avatar Sergei Zharinov Committed by GitHub
Browse files

feat(preset): Support Azure local presets (#9458)

parent fa6d1e32
No related merge requests found
......@@ -202,7 +202,6 @@ To host your preset config on Gitea:
Renovate also supports local presets, e.g. presets that are hosted on the same platform as the target repository.
This is especially helpful in self-hosted scenarios where public presets cannot be used.
Local presets are only supported on GitHub, GitLab, Gitea, Bitbucket Cloud and Bitbucket Server.
Local presets are specified either by leaving out any prefix, e.g. `owner/name`, or explicitly by adding a `local>` prefix, e.g. `local>owner/name`.
Renovate will determine the current platform and look up the preset from there.
......
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`config/presets/azure/index fetchJSONFile() returns JSON 1`] = `
Array [
Array [
"123456",
"some-filename.json",
],
]
`;
import { Readable } from 'stream';
import { getName, mocked } from '../../../../test/util';
import { setPlatformApi } from '../../../platform';
import * as _azureApi from '../../../platform/azure/azure-got-wrapper';
import { PRESET_DEP_NOT_FOUND, PRESET_INVALID_JSON } from '../util';
import * as azure from '.';
jest.unmock('../../../platform');
jest.mock('../../../platform/azure/azure-got-wrapper');
const azureApi = mocked(_azureApi);
describe(getName(__filename), () => {
beforeAll(() => {
setPlatformApi('azure');
});
describe('fetchJSONFile()', () => {
it('returns JSON', async () => {
const data = { foo: 'bar' };
const azureApiMock = {
getItemContent: jest.fn(() =>
Promise.resolve(Readable.from(JSON.stringify(data)))
),
getRepositories: jest.fn(() =>
Promise.resolve([
{ id: '123456', name: 'repo', project: { name: 'some' } },
])
),
};
azureApi.gitApi.mockImplementationOnce(() => azureApiMock as any);
const res = await azure.fetchJSONFile('some/repo', 'some-filename.json');
expect(res).toEqual(data);
expect(azureApiMock.getItemContent.mock.calls).toMatchSnapshot();
});
it('throws on error', async () => {
azureApi.gitApi.mockImplementationOnce(
() =>
({
getItemContent: jest.fn(() => {
throw new Error('unknown');
}),
getRepositories: jest.fn(() =>
Promise.resolve([
{ id: '123456', name: 'repo', project: { name: 'some' } },
])
),
} as any)
);
await expect(
azure.fetchJSONFile('some/repo', 'some-filename.json')
).rejects.toThrow(PRESET_DEP_NOT_FOUND);
});
it('throws on invalid json', async () => {
azureApi.gitApi.mockImplementationOnce(
() =>
({
getItemContent: jest.fn(() =>
Promise.resolve(Readable.from('!@#'))
),
getRepositories: jest.fn(() =>
Promise.resolve([
{ id: '123456', name: 'repo', project: { name: 'some' } },
])
),
} as any)
);
await expect(
azure.fetchJSONFile('some/repo', 'some-filename.json')
).rejects.toThrow(PRESET_INVALID_JSON);
});
});
describe('getPresetFromEndpoint()', () => {
it('uses custom path', async () => {
const data = { foo: 'bar' };
azureApi.gitApi.mockImplementationOnce(
() =>
({
getItemContent: jest.fn(() =>
Promise.resolve(Readable.from(JSON.stringify(data)))
),
getRepositories: jest.fn(() =>
Promise.resolve([
{ id: '123456', name: 'repo', project: { name: 'some' } },
])
),
} as any)
);
const res = await azure.getPresetFromEndpoint(
'some/repo',
'some-filename',
'foo/bar',
''
);
expect(res).toEqual(data);
});
});
});
export { fetchJSONFile, getPresetFromEndpoint } from '../local/common';
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`config/presets/local/index getPreset() forwards to azure 1`] = `
Array [
Array [
"some/repo",
"default",
undefined,
undefined,
],
]
`;
exports[`config/presets/local/index getPreset() forwards to azure 2`] = `
Object {
"resolved": "preset",
}
`;
exports[`config/presets/local/index getPreset() forwards to bitbucket 1`] = `
Array [
Array [
......
import { getName, mocked } from '../../../../test/util';
import * as _azure from '../azure';
import * as _bitbucket from '../bitbucket';
import * as _bitbucketServer from '../bitbucket-server';
import * as _gitea from '../gitea';
......@@ -6,12 +7,14 @@ import * as _github from '../github';
import * as _gitlab from '../gitlab';
import * as local from '.';
jest.mock('../azure');
jest.mock('../bitbucket');
jest.mock('../bitbucket-server');
jest.mock('../gitea');
jest.mock('../github');
jest.mock('../gitlab');
const azure = mocked(_azure);
const bitbucket = mocked(_bitbucket);
const bitbucketServer = mocked(_bitbucketServer);
const gitea = mocked(_gitea);
......@@ -22,6 +25,7 @@ describe(getName(__filename), () => {
beforeEach(() => {
jest.resetAllMocks();
const preset = { resolved: 'preset' };
azure.getPresetFromEndpoint.mockResolvedValueOnce(preset);
bitbucket.getPresetFromEndpoint.mockResolvedValueOnce(preset);
bitbucketServer.getPresetFromEndpoint.mockResolvedValueOnce(preset);
gitea.getPresetFromEndpoint.mockResolvedValueOnce(preset);
......@@ -52,6 +56,18 @@ describe(getName(__filename), () => {
}).rejects.toThrow();
});
it('forwards to azure', async () => {
const content = await local.getPreset({
packageName: 'some/repo',
presetName: 'default',
baseConfig: {
platform: 'azure',
},
});
expect(azure.getPresetFromEndpoint.mock.calls).toMatchSnapshot();
expect(content).toMatchSnapshot();
});
it('forwards to bitbucket', async () => {
const content = await local.getPreset({
packageName: 'some/repo',
......
import {
PLATFORM_TYPE_AZURE,
PLATFORM_TYPE_BITBUCKET,
PLATFORM_TYPE_BITBUCKET_SERVER,
PLATFORM_TYPE_GITEA,
PLATFORM_TYPE_GITHUB,
PLATFORM_TYPE_GITLAB,
} from '../../../constants/platforms';
import * as azure from '../azure';
import * as bitbucket from '../bitbucket';
import * as bitbucketServer from '../bitbucket-server';
import * as gitea from '../gitea';
......@@ -13,6 +15,7 @@ import * as gitlab from '../gitlab';
import type { Preset, PresetConfig } from '../types';
const resolvers = {
[PLATFORM_TYPE_AZURE]: azure,
[PLATFORM_TYPE_BITBUCKET]: bitbucket,
[PLATFORM_TYPE_BITBUCKET_SERVER]: bitbucketServer,
[PLATFORM_TYPE_GITEA]: gitea,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment