Files
renovate/tools/lint/rules/logger-err-key.spec.ts
Sebastian Poxhofer b2d3b64c48 refactor(lint): enforce err key for errors in logger metadata (#45759)
* refactor(lint): enforce err key for errors in logger metadata

* refactor(lint): flag error message and stack strings in logger-err-key
2026-09-09 13:55:14 +00:00

123 lines
4.1 KiB
TypeScript

import { RuleTester } from 'oxlint/plugins-dev';
import rule from './logger-err-key.ts';
RuleTester.describe = describe;
RuleTester.it = it;
const ruleTester = new RuleTester({
languageOptions: { parserOptions: { lang: 'ts' } },
});
ruleTester.run('logger-err-key', rule, {
valid: [
`logger.error({ err }, 'Failed');`,
`logger.debug({ err: res.error }, 'Failed');`,
`logger.once.warn({ err }, 'Failed');`,
// non-error-ish value under the error key is fine
`logger.error({ error: 'string' }, 'Failed');`,
`logger.error({ error: res.message }, 'Failed');`,
`logger.error({ error: err.code }, 'Failed');`,
`logger.error({ error: err['message'] }, 'Failed');`,
// other keys holding an error are not flagged
`logger.warn({ configError: error }, 'Failed');`,
// computed keys and spreads are ignored
`logger.error({ [key]: err }, 'Failed');`,
`logger.error({ ...meta }, 'Failed');`,
// no metadata object
`logger.error('Failed');`,
`logger.error();`,
// not a logger call
`other.error({ error: err }, 'Failed');`,
`logger['error']({ error: err }, 'Failed');`,
`logger.child.error({ error: err }, 'Failed');`,
],
invalid: [
{
code: `logger.error({ error: err }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.error({ err }, 'Failed');`,
},
{
code: `logger.debug({ error }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.debug({ err: error }, 'Failed');`,
},
{
code: `logger.info({ error: err }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.info({ err }, 'Failed');`,
},
{
code: `logger.trace({ error: err }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.trace({ err }, 'Failed');`,
},
{
code: `logger.once.warn({ error: err }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.once.warn({ err }, 'Failed');`,
},
{
code: `logger.error({ exception: err }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.error({ err }, 'Failed');`,
},
{
code: `logger.error({ error: new SomeError('x') }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.error({ err: new SomeError('x') }, 'Failed');`,
},
{
code: `logger.error({ error: res.parseError }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.error({ err: res.parseError }, 'Failed');`,
},
{
code: `logger.error({ error: err as Error }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.error({ err: err as Error }, 'Failed');`,
},
{
code: `logger.error({ 'error': err }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.error({ err }, 'Failed');`,
},
{
code: `logger.error({ url, error: err }, 'Failed');`,
errors: [{ messageId: 'errKey' }],
output: `logger.error({ url, err }, 'Failed');`,
},
// error message or stack strings under a non-canonical key
{
code: `logger.warn({ error: err.message }, 'Failed');`,
errors: [{ messageId: 'errString' }],
output: `logger.warn({ err }, 'Failed');`,
},
{
code: `logger.fatal({ error: err.stack }, 'Failed');`,
errors: [{ messageId: 'errString' }],
output: `logger.fatal({ err }, 'Failed');`,
},
{
code: `logger.warn({ url, error: error.message }, 'Failed');`,
errors: [{ messageId: 'errString' }],
output: `logger.warn({ url, err: error }, 'Failed');`,
},
{
code: `logger.debug({ error: res.parseError.message }, 'Failed');`,
errors: [{ messageId: 'errString' }],
output: `logger.debug({ err: res.parseError }, 'Failed');`,
},
{
code: `logger.debug({ error: (err as Error).message }, 'Failed');`,
errors: [{ messageId: 'errString' }],
output: `logger.debug({ err: err as Error }, 'Failed');`,
},
{
code: `logger.debug({ exception: err.stack as string }, 'Failed');`,
errors: [{ messageId: 'errString' }],
output: `logger.debug({ err }, 'Failed');`,
},
],
});