Skip to content
Snippets Groups Projects
util.ts 2.58 KiB
Newer Older
import crypto from 'crypto';
import * as upath from 'upath';
import { RenovateConfig as _RenovateConfig } from '../lib/config';
import { getConfig } from '../lib/config/defaults';
import { platform as _platform } from '../lib/platform';
import * as _fs from '../lib/util/fs';
/**
 * Simple wrapper for getting mocked version of a module
 * @param module module which is mocked by `jest.mock`
 */
export function mocked<T>(module: T): jest.Mocked<T> {
  return module as never;
}
/**
 * Partially mock a module, providing an object with explicit mocks
 * @param moduleName The module to mock
 * @param overrides An object containing the mocks
 * @example
 * jest.mock('../../util/exec/docker/index', () =>
 *   require('../../../test/util').mockPartial('../../util/exec/docker/index', {
 *     removeDanglingContainers: jest.fn(),
 *   })
 * );
 */
export function mockPartial(moduleName: string, overrides?: object): unknown {
  const absolutePath = upath.join(module.parent.filename, '../', moduleName);
  const originalModule = jest.requireActual(absolutePath);
  return {
    __esModule: true,
    ...originalModule,
    ...overrides,
  };
}

/**
 * Simply wrapper to create partial mocks.
 * @param obj Object to cast to final type
 */
export function partial<T>(obj: Partial<T>): T {
  return obj as T;
}

export const fs = mocked(_fs);
export const platform = mocked(_platform);

// Required because of isolatedModules
export type RenovateConfig = _RenovateConfig;

export const defaultConfig = getConfig();

export function getName(file: string): string {
  const [, name] = /lib\/(.*?)\.spec\.ts$/.exec(file.replace(/\\/g, '/'));
  return name;
}

/**
 * Can be used to search and replace strings in jest snapshots.
 * @example
 * expect.addSnapshotSerializer(
 *     replacingSerializer(upath.toUnix(gradleDir.path), 'localDir')
 * );
 */
export const replacingSerializer = (
  search: string,
  replacement: string
): jest.SnapshotSerializerPlugin => ({
  test: (value) => typeof value === 'string' && value.includes(search),
  serialize: (val, config, indent, depth, refs, printer) => {
    const replaced = (val as string).replace(search, replacement);
    return printer(replaced, config, indent, depth, refs);
  },
});

function toHash(buf: Buffer): string {
  return crypto.createHash('sha256').update(buf).digest('hex');
}

export const bufferSerializer = (): jest.SnapshotSerializerPlugin => ({
  test: (value) => Buffer.isBuffer(value),
  serialize: (val, config, indent, depth, refs, printer) => {
    const replaced = toHash(val);
    return printer(replaced, config, indent, depth, refs);
  },
});