import { mergeChildConfig } from '../../../config';
import { getConfig } from '../../../config/defaults';
import { allManagersList } from '../../../modules/manager';
import { generateFingerprintConfig } from './extract-fingerprint-config';

describe('workers/repository/extract/extract-fingerprint-config', () => {
  it('filter with enabledManagers', () => {
    const config = mergeChildConfig(getConfig(), {
      registryAliases: {
        stable: 'http://some.link', // intentionally placing the field incorrectly
      },
      ignorePaths: ['ignore-path-1'],
      includePaths: ['include-path-1'],
      npm: {
        fileMatch: ['hero.json'],
        ignorePaths: ['ignore-path-2'],
        includePaths: ['include-path-2'],
        registryAliases: {
          notStable: 'http://some.link.2',
        },
      },
      enabledManagers: ['npm', 'regex'],
      regexManagers: [
        {
          customType: 'regex',
          fileMatch: ['js', '***$}{]]['],
          matchStrings: ['^(?<depName>foo)(?<currentValue>bar)$'],
          datasourceTemplate: 'maven',
          versioningTemplate: 'gradle',
        },
      ],
    });

    const fingerprintConfig = generateFingerprintConfig(config);

    expect(fingerprintConfig.managerList).toEqual(new Set(['npm', 'regex']));
    expect(
      fingerprintConfig.managers.find((manager) => manager.manager === 'npm')
    ).toEqual({
      enabled: true,
      fileList: [],
      fileMatch: ['(^|/)package\\.json$', 'hero.json'],
      ignorePaths: ['ignore-path-2'],
      includePaths: ['include-path-2'],
      manager: 'npm',
      npmrc: null,
      npmrcMerge: false,
      registryAliases: {
        notStable: 'http://some.link.2',
      },
      skipInstalls: null,
    });
    expect(
      fingerprintConfig.managers.find((manager) => manager.manager === 'regex')
    ).toEqual({
      fileMatch: ['js', '***$}{]]['],
      ignorePaths: ['ignore-path-1'],
      includePaths: ['include-path-1'],
      fileList: [],
      matchStrings: ['^(?<depName>foo)(?<currentValue>bar)$'],
      datasourceTemplate: 'maven',
      versioningTemplate: 'gradle',
      enabled: true,
      manager: 'regex',
      npmrc: null,
      npmrcMerge: false,
      registryAliases: {
        stable: 'http://some.link',
      },
      skipInstalls: null,
    });
  });

  it('filter with all managers enabled', () => {
    const config = mergeChildConfig(getConfig(), {
      npmrc: 'some-string',
      npmrcMerge: true,
      npm: { fileMatch: ['hero.json'] },
    });
    const fingerprintConfig = generateFingerprintConfig(config);
    expect(fingerprintConfig.managerList).toEqual(new Set(allManagersList));
    expect(
      fingerprintConfig.managers.find((manager) => manager.manager === 'npm')
    ).toEqual({
      enabled: true,
      fileList: [],
      fileMatch: ['(^|/)package\\.json$', 'hero.json'],
      ignorePaths: ['**/node_modules/**', '**/bower_components/**'],
      includePaths: [],
      manager: 'npm',
      npmrc: 'some-string',
      npmrcMerge: true,
      registryAliases: {},
      skipInstalls: null,
    });
    expect(
      fingerprintConfig.managers.find(
        (manager) => manager.manager === 'dockerfile'
      )
    ).toEqual({
      enabled: true,
      fileList: [],
      fileMatch: [
        '(^|/|\\.)([Dd]ocker|[Cc]ontainer)file$',
        '(^|/)([Dd]ocker|[Cc]ontainer)file[^/]*$',
      ],
      ignorePaths: ['**/node_modules/**', '**/bower_components/**'],
      includePaths: [],
      manager: 'dockerfile',
      npmrc: 'some-string',
      npmrcMerge: true,
      registryAliases: {},
      skipInstalls: null,
    });
    expect(
      fingerprintConfig.managers.find((manager) => manager.manager === 'regex')
    ).toBeUndefined();
  });
});