mirror of
https://github.com/renovatebot/renovate.git
synced 2026-11-01 18:19:51 +00:00
9717259ffc
Enable no-else-return (with allowElseIf: false) and unicorn/no-lonely-if as errors in .oxlintrc.json and fix all 131 pre-existing violations (91 no-else-return, 40 unicorn/no-lonely-if) across 98 files. The no-else-return violations were fixed with the oxlint autofix (iterated to a fixpoint, plus two else-if chains that required --fix-dangerously) followed by Prettier formatting. One comment dropped by the autofix in lib/modules/manager/pub/artifacts.ts was restored manually. The unicorn/no-lonely-if violations were merged by hand, preserving comments and coverage-ignore hints. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
357 lines
9.3 KiB
TypeScript
357 lines
9.3 KiB
TypeScript
import type { Response } from 'got';
|
|
import { partial } from '~test/util.ts';
|
|
import { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages.ts';
|
|
import { parseUrl } from '../../../util/url.ts';
|
|
import type {
|
|
BbsRestRepo,
|
|
BitbucketError,
|
|
BitbucketErrorResponse,
|
|
} from './types.ts';
|
|
import {
|
|
BITBUCKET_INVALID_REVIEWERS_EXCEPTION,
|
|
getExtraCloneOpts,
|
|
getInvalidReviewers,
|
|
getRepoGitUrl,
|
|
} from './utils.ts';
|
|
|
|
vi.unmock('../../../util/git/index.ts');
|
|
|
|
function sshLink(projectKey: string, repositorySlug: string): string {
|
|
return `ssh://git@stash.renovatebot.com:7999/${projectKey.toLowerCase()}/${repositorySlug}.git`;
|
|
}
|
|
|
|
function httpLink(
|
|
endpointStr: string,
|
|
projectKey: string,
|
|
repositorySlug: string,
|
|
): string {
|
|
return `${endpointStr}scm/${projectKey}/${repositorySlug}.git`;
|
|
}
|
|
|
|
function infoMock(
|
|
endpoint: URL | string,
|
|
projectKey: string,
|
|
repositorySlug: string,
|
|
options: { cloneUrl: { https: boolean; ssh: boolean } } = {
|
|
cloneUrl: { https: true, ssh: true },
|
|
},
|
|
): BbsRestRepo {
|
|
const endpointStr = endpoint.toString();
|
|
const links: {
|
|
self: { href: string }[];
|
|
clone?: { href: string; name: string }[];
|
|
} = {
|
|
self: [
|
|
{
|
|
href: `${endpointStr}projects/${projectKey}/repos/${repositorySlug}/browse`,
|
|
},
|
|
],
|
|
};
|
|
|
|
if (options.cloneUrl.https || options.cloneUrl.ssh) {
|
|
links.clone = [];
|
|
if (options.cloneUrl.https) {
|
|
links.clone.push({
|
|
href: httpLink(endpointStr, projectKey, repositorySlug),
|
|
name: 'http',
|
|
});
|
|
}
|
|
|
|
if (options.cloneUrl.ssh) {
|
|
links.clone.push({
|
|
href: sshLink(projectKey, repositorySlug),
|
|
name: 'ssh',
|
|
});
|
|
}
|
|
return {
|
|
id: 123,
|
|
slug: repositorySlug,
|
|
project: { key: projectKey },
|
|
origin: { name: repositorySlug, slug: repositorySlug },
|
|
links,
|
|
};
|
|
}
|
|
// This mimics the behavior of bb-server which does not include the clone property at all
|
|
// if ssh and https are both turned off
|
|
return {
|
|
id: 1,
|
|
slug: repositorySlug,
|
|
project: { key: projectKey },
|
|
origin: { name: repositorySlug, slug: repositorySlug },
|
|
links: { clone: undefined },
|
|
};
|
|
}
|
|
|
|
describe('modules/platform/bitbucket-server/utils', () => {
|
|
function createError(body?: Partial<BitbucketErrorResponse>) {
|
|
return partial<BitbucketError>({
|
|
response: partial<Response<BitbucketErrorResponse>>({ body }),
|
|
});
|
|
}
|
|
|
|
it('getInvalidReviewers', () => {
|
|
expect(
|
|
getInvalidReviewers(
|
|
createError({
|
|
errors: [
|
|
{
|
|
exceptionName: BITBUCKET_INVALID_REVIEWERS_EXCEPTION,
|
|
reviewerErrors: [{ context: 'dummy' }, {}],
|
|
},
|
|
],
|
|
}),
|
|
),
|
|
).toStrictEqual(['dummy']);
|
|
expect(getInvalidReviewers(createError())).toStrictEqual([]);
|
|
expect(
|
|
getInvalidReviewers(
|
|
createError({
|
|
errors: [{ exceptionName: BITBUCKET_INVALID_REVIEWERS_EXCEPTION }],
|
|
}),
|
|
),
|
|
).toStrictEqual([]);
|
|
});
|
|
|
|
describe('getRepoGitUrl', () => {
|
|
describe('endpoint with path', () => {
|
|
const url = parseUrl('https://stash.renovatebot.com/vcs/')!;
|
|
const username = 'abc';
|
|
const password = '123';
|
|
const opts = {
|
|
username,
|
|
password,
|
|
};
|
|
|
|
it('works gitUrl:undefined generate endpoint', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
undefined,
|
|
infoMock(url, 'SOME', 'repo', {
|
|
cloneUrl: { https: false, ssh: false },
|
|
}),
|
|
opts,
|
|
),
|
|
).toBe(
|
|
httpLink(url.toString(), 'SOME', 'repo').replace(
|
|
'https://',
|
|
`https://${username}:${password}@`,
|
|
),
|
|
);
|
|
});
|
|
|
|
it('works gitUrl:undefined use endpoint with injected auth', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
undefined,
|
|
infoMock(url, 'SOME', 'repo', {
|
|
cloneUrl: { https: true, ssh: false },
|
|
}),
|
|
opts,
|
|
),
|
|
).toBe(
|
|
httpLink(url.toString(), 'SOME', 'repo').replace(
|
|
'https://',
|
|
`https://${username}:${password}@`,
|
|
),
|
|
);
|
|
});
|
|
|
|
it('works gitUrl:undefined use ssh', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
undefined,
|
|
infoMock(url, 'SOME', 'repo', {
|
|
cloneUrl: { https: false, ssh: true },
|
|
}),
|
|
opts,
|
|
),
|
|
).toBe(sshLink('SOME', 'repo'));
|
|
});
|
|
|
|
it('works gitUrl:default', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
'default',
|
|
infoMock(url, 'SOME', 'repo'),
|
|
opts,
|
|
),
|
|
).toBe(
|
|
httpLink(url.toString(), 'SOME', 'repo').replace(
|
|
'https://',
|
|
`https://${username}:${password}@`,
|
|
),
|
|
);
|
|
});
|
|
|
|
it('gitUrl:default invalid http url throws CONFIG_GIT_URL_UNAVAILABLE', () => {
|
|
expect(() =>
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
'default',
|
|
infoMock('invalidUrl', 'SOME', 'repo', {
|
|
cloneUrl: { https: true, ssh: false },
|
|
}),
|
|
opts,
|
|
),
|
|
).toThrow(Error(CONFIG_GIT_URL_UNAVAILABLE));
|
|
});
|
|
|
|
it('gitUrl:default no http url returns generated url', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
'default',
|
|
infoMock(url, 'SOME', 'repo', {
|
|
cloneUrl: { https: false, ssh: false },
|
|
}),
|
|
opts,
|
|
),
|
|
).toBe(
|
|
httpLink(url.toString(), 'SOME', 'repo').replace(
|
|
'https://',
|
|
`https://${username}:${password}@`,
|
|
),
|
|
);
|
|
});
|
|
|
|
it('gitUrl:ssh no ssh url throws CONFIG_GIT_URL_UNAVAILABLE', () => {
|
|
expect(() =>
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
'ssh',
|
|
infoMock(url, 'SOME', 'repo', {
|
|
cloneUrl: { https: false, ssh: false },
|
|
}),
|
|
opts,
|
|
),
|
|
).toThrow(Error(CONFIG_GIT_URL_UNAVAILABLE));
|
|
});
|
|
|
|
it('works gitUrl:ssh', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
'ssh',
|
|
infoMock(url, 'SOME', 'repo'),
|
|
opts,
|
|
),
|
|
).toBe(sshLink('SOME', 'repo'));
|
|
});
|
|
|
|
it('works gitUrl:endpoint', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
'endpoint',
|
|
infoMock(url, 'SOME', 'repo'),
|
|
opts,
|
|
),
|
|
).toBe(
|
|
httpLink(url.toString(), 'SOME', 'repo').replace(
|
|
'https://',
|
|
`https://${username}:${password}@`,
|
|
),
|
|
);
|
|
});
|
|
|
|
it('works gitUrl:endpoint no basic auth', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
'endpoint',
|
|
infoMock(url, 'SOME', 'repo'),
|
|
{},
|
|
),
|
|
).toBe(httpLink(url.toString(), 'SOME', 'repo'));
|
|
});
|
|
});
|
|
|
|
describe('endpoint with no path', () => {
|
|
const url = parseUrl('https://stash.renovatebot.com')!;
|
|
const username = 'abc';
|
|
const password = '123';
|
|
const opts = {
|
|
username,
|
|
password,
|
|
};
|
|
|
|
it('works gitUrl:endpoint', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
'endpoint',
|
|
infoMock(url, 'SOME', 'repo'),
|
|
opts,
|
|
),
|
|
).toBe('https://abc:123@stash.renovatebot.com/scm/SOME/repo.git');
|
|
});
|
|
|
|
it('gitUrl:default no http url returns generated url', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
url.toString(),
|
|
'default',
|
|
infoMock(url, 'SOME', 'repo', {
|
|
cloneUrl: { https: false, ssh: false },
|
|
}),
|
|
opts,
|
|
),
|
|
).toBe('https://abc:123@stash.renovatebot.com/scm/SOME/repo.git');
|
|
});
|
|
});
|
|
it('actually respects the gitUrl Setting', () => {
|
|
expect(
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
'https://some.external.url/',
|
|
'endpoint',
|
|
infoMock('https://some.internal.url/', 'SOME', 'repo'),
|
|
{},
|
|
),
|
|
).toBe(httpLink('https://some.external.url/', 'SOME', 'repo'));
|
|
});
|
|
|
|
it('throws on invalid endpoint URL', () => {
|
|
expect(() =>
|
|
getRepoGitUrl(
|
|
'SOME/repo',
|
|
'not-a-valid-url',
|
|
'endpoint',
|
|
infoMock('https://stash.renovatebot.com/vcs/', 'SOME', 'repo'),
|
|
{},
|
|
),
|
|
).toThrow('Invalid Bitbucket Server endpoint: not-a-valid-url');
|
|
});
|
|
});
|
|
|
|
describe('getExtraCloneOpts', () => {
|
|
it('should not configure bearer token', () => {
|
|
const res = getExtraCloneOpts({});
|
|
expect(res).toEqual({});
|
|
});
|
|
|
|
it('should configure bearer token', () => {
|
|
const res = getExtraCloneOpts({ token: 'abc' });
|
|
expect(res).toEqual({
|
|
'-c': 'http.extraHeader=Authorization: Bearer abc',
|
|
});
|
|
});
|
|
});
|
|
});
|