fix: better branch code coverage (#24276)

This commit is contained in:
Michael Kriese 2023-09-07 06:39:39 +02:00 committed by GitHub
parent 68438adfd0
commit f0d676242a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 51 additions and 23 deletions

View file

@ -404,7 +404,7 @@ jobs:
- name: Check coverage threshold
run: |
pnpm nyc check-coverage -t ./coverage/nyc \
--branches 99.4 \
--branches 99.57 \
--functions 100 \
--lines 100 \
--statements 100

View file

@ -183,9 +183,9 @@ export function parsePreset(input: string): ParsedPreset {
throw new Error(PRESET_INVALID);
}
({ repo, presetPath, presetName, tag } =
nonScopedPresetWithSubdirRegex.exec(str)?.groups ?? {});
nonScopedPresetWithSubdirRegex.exec(str)!.groups!);
} else {
({ repo, presetName, tag } = gitPresetRegex.exec(str)?.groups ?? {});
({ repo, presetName, tag } = gitPresetRegex.exec(str)!.groups!);
if (presetSource === 'npm' && !repo.startsWith('renovate-config-')) {
repo = `renovate-config-${repo}`;

View file

@ -8,7 +8,7 @@ type OmitFn = (...args: any[]) => any;
*
* @example getCallSite() // => 'Object.<anonymous> (/path/to/file.js:10:15)'
*/
function getCallSite(omitFn: OmitFn = getCallSite): string | null {
function getCallSite(omitFn: OmitFn): string | null {
const stackTraceLimitOrig = Error.stackTraceLimit;
const prepareStackTraceOrig = Error.prepareStackTrace;

View file

@ -105,7 +105,12 @@ export async function getDependency(
.plus({ minutes: cacheMinutes })
.toISO()!;
let cacheHardTtlMinutes = GlobalConfig.get('cacheHardTtlMinutes');
if (!(is.number(cacheHardTtlMinutes) && cacheHardTtlMinutes > cacheMinutes)) {
if (
!(
is.number(cacheHardTtlMinutes) &&
/* istanbul ignore next: needs test */ cacheHardTtlMinutes > cacheMinutes
)
) {
cacheHardTtlMinutes = cacheMinutes;
}
@ -204,7 +209,9 @@ export async function getDependency(
cacheNamespace,
packageUrl,
{ ...dep, cacheData },
etag ? cacheHardTtlMinutes : cacheMinutes
etag
? /* istanbul ignore next: needs test */ cacheHardTtlMinutes
: cacheMinutes
);
} else {
dep.isPrivate = true;

View file

@ -63,7 +63,9 @@ export async function getResourceUrl(
({ type, version }) => type === resourceType && semver.valid(version)
)
.sort((x, y) =>
x.version && y.version ? semver.compare(x.version, y.version) : 0
x.version && y.version
? semver.compare(x.version, y.version)
: /* istanbul ignore next: hard to test */ 0
);
const { serviceId, version } = services.pop()!;

View file

@ -24,6 +24,7 @@ import { getRepoStatus } from '../../../util/git';
import * as hostRules from '../../../util/host-rules';
import { regEx } from '../../../util/regex';
import { Json } from '../../../util/schema-utils';
import { coerceString } from '../../../util/string';
import { GitTagsDatasource } from '../../datasource/git-tags';
import { PackagistDatasource } from '../../datasource/packagist';
import type { UpdateArtifact, UpdateArtifactsResult } from '../types';
@ -71,7 +72,7 @@ function getAuthJson(): string | null {
}
if (gitlabHostRule?.token) {
const host = gitlabHostRule.resolvedHost ?? 'gitlab.com';
const host = coerceString(gitlabHostRule.resolvedHost, 'gitlab.com');
authJson['gitlab-token'] = authJson['gitlab-token'] ?? {};
authJson['gitlab-token'][host] = gitlabHostRule.token;
// https://getcomposer.org/doc/articles/authentication-for-private-packages.md#gitlab-token

View file

@ -4,6 +4,7 @@ import { GlobalConfig } from '../../../config/global';
import { logger } from '../../../logger';
import type { HostRuleSearchResult } from '../../../types';
import type { ToolConstraint } from '../../../util/exec/types';
import { coerceNumber } from '../../../util/number';
import { api, id as composerVersioningId } from '../../versioning/composer';
import type { UpdateArtifactsConfig } from '../types';
import type { Lockfile, PackageFile } from './schema';
@ -78,8 +79,8 @@ export function extractConstraints(
const phpVersion = config?.platform.php;
if (phpVersion) {
const major = api.getMajor(phpVersion);
const minor = api.getMinor(phpVersion) ?? 0;
const patch = api.getPatch(phpVersion) ?? 0;
const minor = coerceNumber(api.getMinor(phpVersion));
const patch = coerceNumber(api.getPatch(phpVersion));
res.php = `<=${major}.${minor}.${patch}`;
} else if (require.php) {
res.php = require.php;

View file

@ -5,6 +5,7 @@ import upath from 'upath';
import { GlobalConfig } from '../../../config/global';
import { TEMPORARY_ERROR } from '../../../constants/error-messages';
import { logger } from '../../../logger';
import { coerceArray } from '../../../util/array';
import { exec } from '../../../util/exec';
import type { ExecOptions } from '../../../util/exec/types';
import {
@ -97,7 +98,9 @@ function useModcacherw(goVersion: string | undefined): boolean {
return true;
}
const [, majorPart, minorPart] = regEx(/(\d+)\.(\d+)/).exec(goVersion) ?? [];
const [, majorPart, minorPart] = coerceArray(
regEx(/(\d+)\.(\d+)/).exec(goVersion)
);
const [major, minor] = [majorPart, minorPart].map((x) => parseInt(x, 10));
return (
@ -196,7 +199,9 @@ export async function updateArtifacts({
GONOSUMDB: process.env.GONOSUMDB,
GOSUMDB: process.env.GOSUMDB,
GOINSECURE: process.env.GOINSECURE,
GOFLAGS: useModcacherw(goConstraints) ? '-modcacherw' : null,
GOFLAGS: useModcacherw(goConstraints)
? '-modcacherw'
: /* istanbul ignore next: hard to test */ null,
CGO_ENABLED: GlobalConfig.get('binarySource') === 'docker' ? '0' : null,
...getGitEnvironmentVariables(['go']),
},
@ -342,7 +347,7 @@ export async function updateArtifacts({
});
}
}
for (const f of status.deleted || []) {
for (const f of coerceArray(status.deleted)) {
res.push({
file: {
type: 'deletion',

View file

@ -1,3 +1,4 @@
import { coerceArray } from '../../../util/array';
import { newlineRegex, regEx } from '../../../util/regex';
import { ClojureDatasource } from '../../datasource/clojure';
import type { PackageDependency, PackageFileContent } from '../types';
@ -139,8 +140,9 @@ function extractLeinRepos(content: string): string[] {
}
}
const repoSectionContent = repoContent.slice(0, endIdx);
const matches =
repoSectionContent.match(regEx(/"https?:\/\/[^"]*"/g)) ?? [];
const matches = coerceArray(
repoSectionContent.match(regEx(/"https?:\/\/[^"]*"/g))
);
const urls = matches.map((x) =>
x.replace(regEx(/^"/), '').replace(regEx(/"$/), '')
);

View file

@ -1,3 +1,4 @@
import { coerceArray } from '../../../util/array';
import { newlineRegex, regEx } from '../../../util/regex';
import type { PuppetfileModule } from './types';
@ -34,7 +35,7 @@ export class Puppetfile {
): PuppetfileModule[] {
const modules = this.forgeModules.get(forgeUrl ?? null);
return modules ?? [];
return coerceArray(modules);
}
}

View file

@ -39,7 +39,7 @@ export class HermitVersioning extends RegExpVersioningApi {
compatibility,
} = groups;
const release = [
typeof major === 'undefined' ? 0 : Number.parseInt(major, 10),
Number.parseInt(major, 10),
typeof minor === 'undefined' ? 0 : Number.parseInt(minor, 10),
typeof patch === 'undefined' ? 0 : Number.parseInt(patch, 10),
typeof supplement === 'undefined' ? 0 : Number.parseInt(supplement, 10),

View file

@ -76,5 +76,8 @@ export function jsonStripWhitespaces(json: string | null): string | null {
*
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#parameters
*/
return quickStringify(JSON5.parse(json)) ?? null;
return (
quickStringify(JSON5.parse(json)) ??
/* istanbul ignore next: should never happen */ null
);
}

View file

@ -6,6 +6,7 @@ import type { PackageFile } from '../../modules/manager/types';
import { platform } from '../../modules/platform';
import { GitHubMaxPrBodyLen } from '../../modules/platform/github';
import { regEx } from '../../util/regex';
import { coerceString } from '../../util/string';
import * as template from '../../util/template';
import type { BranchConfig, SelectAllConfig } from '../types';
import { extractRepoProblems } from './common';
@ -76,8 +77,7 @@ function getAllSelectedBranches(
function getCheckedBranches(issueBody: string): Record<string, string> {
let dependencyDashboardChecks: Record<string, string> = {};
for (const [, type, branchName] of issueBody?.matchAll(markedBranchesRe) ??
[]) {
for (const [, type, branchName] of issueBody.matchAll(markedBranchesRe)) {
dependencyDashboardChecks[branchName] = type;
}
dependencyDashboardChecks = getAllSelectedBranches(
@ -427,7 +427,7 @@ export async function ensureDependencyDashboard(
);
if (updatedIssue) {
const { dependencyDashboardChecks } = parseDashboardIssue(
updatedIssue.body ?? ''
coerceString(updatedIssue.body)
);
for (const branchName of Object.keys(config.dependencyDashboardChecks!)) {
delete dependencyDashboardChecks[branchName];

View file

@ -331,5 +331,10 @@ describe('workers/repository/errors-warnings', () => {
const res = getDepWarningsOnboardingPR(packageFiles, config);
expect(res).toBe('');
});
it('handles undefined', () => {
const res = getDepWarningsOnboardingPR(undefined as never, {});
expect(res).toBe('');
});
});
});

View file

@ -2,6 +2,7 @@
import type { RenovateConfig } from '../../config/types';
import { logger } from '../../logger';
import type { PackageFile } from '../../modules/manager/types';
import { coerceArray } from '../../util/array';
import { emojify } from '../../util/emoji';
import { regEx } from '../../util/regex';
import type { DepWarnings } from '../types';
@ -41,8 +42,8 @@ function getDepWarnings(
for (const file of files ?? []) {
// TODO: remove condition when type is fixed (#22198)
if (file.packageFile) {
for (const dep of file.deps ?? []) {
for (const w of dep.warnings ?? []) {
for (const dep of coerceArray(file.deps)) {
for (const w of coerceArray(dep.warnings)) {
const message = w.message;
if (!warnings.includes(message)) {
warnings.push(message);