mirror of
https://github.com/renovatebot/renovate.git
synced 2026-10-27 07:50:47 +00:00
7df11ed734
* refactor(lint): extract custom oxlint rules into separate files Split `tools/lint/rules.js` into one file per rule under `tools/lint/rules/`. Also simplify `test-root-describe` with early-exit guard clauses. * feat(lint): add `enforce-ts-extension` oxlint rule Add a custom JS-based oxlint rule that enforces `.ts` extensions on local imports. The rule catches two problems: - `.js` extension used instead of `.ts` (auto-fixable) - missing file extension entirely (report only) Checked locations: - static import/export declarations - dynamic `import()` expressions - vitest module APIs: `vi.mock`, `vi.doMock`, `vi.unmock`, `vi.doUnmock`, `vi.importActual`, `vi.importMock` Both relative paths (`./`, `../`) and path aliases (`~test/`) are treated as local. Package imports are ignored. Also fixes 26 pre-existing violations across 18 spec files. * Update tools/lint/rules/enforce-ts-extension.js Co-authored-by: Anne Stellingwerf <1637358+astellingwerf@users.noreply.github.com> --------- Co-authored-by: Anne Stellingwerf <1637358+astellingwerf@users.noreply.github.com>
161 lines
3.8 KiB
TypeScript
161 lines
3.8 KiB
TypeScript
import { init, logger } from './index.ts';
|
|
import { once, reset } from './once.ts';
|
|
|
|
vi.unmock('./index.ts');
|
|
|
|
// init logger
|
|
await init();
|
|
|
|
describe('logger/once', () => {
|
|
afterEach(() => {
|
|
reset();
|
|
});
|
|
|
|
describe('core', () => {
|
|
it('should call a function only once', () => {
|
|
const innerFn = vi.fn();
|
|
|
|
function outerFn() {
|
|
once(innerFn, undefined, '');
|
|
}
|
|
|
|
outerFn();
|
|
outerFn();
|
|
outerFn();
|
|
expect(innerFn).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('supports support distinct calls', () => {
|
|
const innerFn1 = vi.fn();
|
|
const innerFn2 = vi.fn();
|
|
|
|
function outerFn() {
|
|
once(innerFn1, undefined, '');
|
|
once(innerFn2, undefined, '');
|
|
}
|
|
|
|
outerFn();
|
|
outerFn();
|
|
outerFn();
|
|
expect(innerFn1).toHaveBeenCalledTimes(1);
|
|
expect(innerFn2).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('resets keys', () => {
|
|
const innerFn = vi.fn();
|
|
|
|
function outerFn() {
|
|
once(innerFn, undefined, '');
|
|
}
|
|
|
|
outerFn();
|
|
reset();
|
|
outerFn();
|
|
|
|
expect(innerFn).toHaveBeenCalledTimes(2);
|
|
});
|
|
});
|
|
|
|
describe('logger', () => {
|
|
it('logs once per function call', () => {
|
|
const debug = vi.spyOn(logger, 'debug');
|
|
|
|
function doSomething() {
|
|
logger.once.debug('test');
|
|
}
|
|
|
|
doSomething();
|
|
doSomething();
|
|
doSomething();
|
|
expect(debug).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('distincts between log levels', () => {
|
|
const debug = vi.spyOn(logger, 'debug');
|
|
const info = vi.spyOn(logger, 'info');
|
|
|
|
function doSomething() {
|
|
logger.once.debug('test');
|
|
logger.once.info('test');
|
|
}
|
|
|
|
doSomething();
|
|
doSomething();
|
|
doSomething();
|
|
expect(debug).toHaveBeenCalledTimes(1);
|
|
expect(info).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('distincts between different log statements', () => {
|
|
const debug = vi.spyOn(logger, 'debug');
|
|
|
|
function doSomething() {
|
|
logger.once.debug('foo');
|
|
logger.once.debug('bar');
|
|
logger.once.debug('baz');
|
|
}
|
|
|
|
doSomething();
|
|
doSomething();
|
|
doSomething();
|
|
expect(debug).toHaveBeenNthCalledWith(1, 'foo');
|
|
expect(debug).toHaveBeenNthCalledWith(2, 'bar');
|
|
expect(debug).toHaveBeenNthCalledWith(3, 'baz');
|
|
});
|
|
|
|
it('parameters are taken into account when de-duplicating calls', () => {
|
|
const debug = vi.spyOn(logger, 'debug');
|
|
|
|
function doSomething(s: string) {
|
|
logger.once.debug({ param: s }, s);
|
|
logger.once.debug(s);
|
|
}
|
|
|
|
doSomething('foo');
|
|
doSomething('bar');
|
|
doSomething('bar');
|
|
expect(debug).toHaveBeenNthCalledWith(1, { param: 'foo' }, 'foo');
|
|
expect(debug).toHaveBeenNthCalledWith(2, 'foo');
|
|
expect(debug).toHaveBeenNthCalledWith(3, { param: 'bar' }, 'bar');
|
|
expect(debug).toHaveBeenNthCalledWith(4, 'bar');
|
|
expect(debug).toHaveBeenLastCalledWith('bar');
|
|
});
|
|
|
|
it('allows mixing single-time and regular logging', () => {
|
|
const debug = vi.spyOn(logger, 'debug');
|
|
|
|
function doSomething() {
|
|
logger.once.debug('foo');
|
|
logger.debug('bar');
|
|
logger.once.debug({ some: 'data' }, 'baz');
|
|
}
|
|
|
|
doSomething();
|
|
doSomething();
|
|
doSomething();
|
|
|
|
expect(debug).toHaveBeenNthCalledWith(1, 'foo');
|
|
expect(debug).toHaveBeenNthCalledWith(2, 'bar');
|
|
expect(debug).toHaveBeenNthCalledWith(3, { some: 'data' }, 'baz');
|
|
|
|
expect(debug).toHaveBeenNthCalledWith(4, 'bar');
|
|
|
|
expect(debug).toHaveBeenNthCalledWith(5, 'bar');
|
|
});
|
|
|
|
it('supports reset method', () => {
|
|
const debug = vi.spyOn(logger, 'debug');
|
|
|
|
function doSomething() {
|
|
logger.once.debug('foo');
|
|
}
|
|
|
|
doSomething();
|
|
logger.once.reset();
|
|
doSomething();
|
|
|
|
expect(debug).toHaveBeenCalledTimes(2);
|
|
});
|
|
});
|
|
});
|