From 2625858d592c482bf966e180d3fe44a04176b70b Mon Sep 17 00:00:00 2001
From: Sergei Zharinov <zharinov@users.noreply.github.com>
Date: Mon, 9 Aug 2021 11:21:51 +0300
Subject: [PATCH] refactor(config): Explicit asserts instead of lonely
 snapshots (#11174)

---
 lib/config/__snapshots__/massage.spec.ts.snap |   9 -
 .../migrate-validate.spec.ts.snap             |  15 -
 .../__snapshots__/migration.spec.ts.snap      |  95 ----
 lib/config/massage.spec.ts                    |   8 +-
 lib/config/migrate-validate.spec.ts           |  13 +-
 lib/config/migration.spec.ts                  |  66 ++-
 .../presets/__snapshots__/index.spec.ts.snap  | 460 ------------------
 .../__snapshots__/index.spec.ts.snap          |   6 -
 .../presets/bitbucket-server/index.spec.ts    |   3 +-
 .../gitea/__snapshots__/index.spec.ts.snap    |   6 -
 lib/config/presets/gitea/index.spec.ts        |   3 +-
 .../github/__snapshots__/index.spec.ts.snap   |   6 -
 lib/config/presets/github/index.spec.ts       |   3 +-
 lib/config/presets/index.spec.ts              | 427 ++++++++++------
 .../local/__snapshots__/index.spec.ts.snap    |  54 --
 lib/config/presets/local/index.spec.ts        |  27 +-
 .../npm/__snapshots__/index.spec.ts.snap      |   7 -
 lib/config/presets/npm/index.spec.ts          |   3 +-
 18 files changed, 360 insertions(+), 851 deletions(-)
 delete mode 100644 lib/config/presets/npm/__snapshots__/index.spec.ts.snap

diff --git a/lib/config/__snapshots__/massage.spec.ts.snap b/lib/config/__snapshots__/massage.spec.ts.snap
index d2fef9508d..f4604219f2 100644
--- a/lib/config/__snapshots__/massage.spec.ts.snap
+++ b/lib/config/__snapshots__/massage.spec.ts.snap
@@ -1,12 +1,5 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`config/massage massageConfig massages npmToken 1`] = `
-Object {
-  "npmrc": "//registry.npmjs.org/:_authToken=some-token
-",
-}
-`;
-
 exports[`config/massage massageConfig massages packageRules matchUpdateTypes 1`] = `
 Object {
   "packageRules": Array [
@@ -37,5 +30,3 @@ Object {
   ],
 }
 `;
-
-exports[`config/massage massageConfig returns empty 1`] = `Object {}`;
diff --git a/lib/config/__snapshots__/migrate-validate.spec.ts.snap b/lib/config/__snapshots__/migrate-validate.spec.ts.snap
index ceae554eb3..ad6dbb3c48 100644
--- a/lib/config/__snapshots__/migrate-validate.spec.ts.snap
+++ b/lib/config/__snapshots__/migrate-validate.spec.ts.snap
@@ -1,12 +1,5 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`config/migrate-validate migrateAndValidate() handles empty 1`] = `
-Object {
-  "errors": Array [],
-  "warnings": Array [],
-}
-`;
-
 exports[`config/migrate-validate migrateAndValidate() handles invalid 1`] = `
 Object {
   "errors": Array [
@@ -20,14 +13,6 @@ Object {
 }
 `;
 
-exports[`config/migrate-validate migrateAndValidate() handles migration 1`] = `
-Object {
-  "automerge": false,
-  "errors": Array [],
-  "warnings": Array [],
-}
-`;
-
 exports[`config/migrate-validate migrateAndValidate() isOnboarded 1`] = `
 Object {
   "errors": Array [],
diff --git a/lib/config/__snapshots__/migration.spec.ts.snap b/lib/config/__snapshots__/migration.spec.ts.snap
index 6245413a4a..6fbb6f5f52 100644
--- a/lib/config/__snapshots__/migration.spec.ts.snap
+++ b/lib/config/__snapshots__/migration.spec.ts.snap
@@ -1,24 +1,5 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`config/migration it migrates hostRules fields 1`] = `
-Object {
-  "hostRules": Array [
-    Object {
-      "matchHost": "https://some.domain.com",
-      "token": "abc123",
-    },
-    Object {
-      "matchHost": "domain.com",
-      "token": "abc123",
-    },
-    Object {
-      "matchHost": "some.domain.com",
-      "token": "abc123",
-    },
-  ],
-}
-`;
-
 exports[`config/migration it migrates nested packageRules 1`] = `
 Object {
   "packageRules": Array [
@@ -51,65 +32,12 @@ Object {
 }
 `;
 
-exports[`config/migration it migrates presets 1`] = `
-Object {
-  "extends": Array [
-    "local>org/renovate-config",
-  ],
-}
-`;
-
 exports[`config/migration migrateConfig(config, parentConfig) does not migrate multi days 1`] = `
 Object {
   "schedule": "after 5:00pm on wednesday and thursday",
 }
 `;
 
-exports[`config/migration migrateConfig(config, parentConfig) it migrates packageRules 1`] = `
-Object {
-  "packageRules": Array [
-    Object {
-      "excludePackageNames": Array [
-        "baz",
-      ],
-      "excludePackagePatterns": Array [
-        "^baz",
-      ],
-      "matchBaseBranches": Array [
-        "master",
-      ],
-      "matchDatasources": Array [
-        "orb",
-      ],
-      "matchDepTypes": Array [
-        "peerDependencies",
-      ],
-      "matchLanguages": Array [
-        "python",
-      ],
-      "matchManagers": Array [
-        "dockerfile",
-      ],
-      "matchPackageNames": Array [
-        "foo",
-      ],
-      "matchPackagePatterns": Array [
-        "^bar",
-      ],
-      "matchPaths": Array [
-        "package.json",
-      ],
-      "matchSourceUrlPrefixes": Array [
-        "https://github.com/vuejs/vue",
-      ],
-      "matchUpdateTypes": Array [
-        "major",
-      ],
-    },
-  ],
-}
-`;
-
 exports[`config/migration migrateConfig(config, parentConfig) migrates before and after schedules 1`] = `
 Object {
   "major": Object {
@@ -410,17 +338,6 @@ Object {
 }
 `;
 
-exports[`config/migration migrateConfig(config, parentConfig) migrates packages 1`] = `
-Object {
-  "packageRules": Array [
-    Object {
-      "groupName": "angular packages",
-      "matchPackagePatterns": "^(@angular|typescript)",
-    },
-  ],
-}
-`;
-
 exports[`config/migration migrateConfig(config, parentConfig) migrates subconfig 1`] = `
 Object {
   "lockFileMaintenance": Object {
@@ -460,15 +377,3 @@ Object {
   ],
 }
 `;
-
-exports[`config/migration migrateConfig(config, parentConfig) removes invalid configs 1`] = `
-Object {
-  "baseBranches": Array [],
-  "commitMessage": "test",
-  "ignorePaths": Array [],
-  "includePaths": Array [
-    "test",
-  ],
-  "rebaseWhen": "auto",
-}
-`;
diff --git a/lib/config/massage.spec.ts b/lib/config/massage.spec.ts
index fd002d82c2..c8a44eb84a 100644
--- a/lib/config/massage.spec.ts
+++ b/lib/config/massage.spec.ts
@@ -7,8 +7,7 @@ describe(getName(), () => {
     it('returns empty', () => {
       const config: RenovateConfig = {};
       const res = massage.massageConfig(config);
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({});
     });
     it('massages strings to array', () => {
       const config: RenovateConfig = {
@@ -21,8 +20,9 @@ describe(getName(), () => {
       const config: RenovateConfig = {
         npmToken: 'some-token',
       };
-      // FIXME: explicit assert condition
-      expect(massage.massageConfig(config)).toMatchSnapshot();
+      expect(massage.massageConfig(config)).toEqual({
+        npmrc: '//registry.npmjs.org/:_authToken=some-token\n',
+      });
     });
     it('massages packageRules matchUpdateTypes', () => {
       const config: RenovateConfig = {
diff --git a/lib/config/migrate-validate.spec.ts b/lib/config/migrate-validate.spec.ts
index 51ad43bd39..5fd350a01e 100644
--- a/lib/config/migrate-validate.spec.ts
+++ b/lib/config/migrate-validate.spec.ts
@@ -11,14 +11,19 @@ describe(getName(), () => {
   describe('migrateAndValidate()', () => {
     it('handles empty', async () => {
       const res = await migrateAndValidate(config, {});
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        errors: [],
+        warnings: [],
+      });
     });
     it('handles migration', async () => {
       const input: RenovateConfig = { automerge: 'none' as any };
       const res = await migrateAndValidate(config, input);
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        automerge: false,
+        errors: [],
+        warnings: [],
+      });
     });
     it('handles invalid', async () => {
       const input: RenovateConfig = { foo: 'none' };
diff --git a/lib/config/migration.spec.ts b/lib/config/migration.spec.ts
index acb3cf0c05..dc723f9a5e 100644
--- a/lib/config/migration.spec.ts
+++ b/lib/config/migration.spec.ts
@@ -273,8 +273,14 @@ describe(getName(), () => {
         parentConfig
       );
       expect(isMigrated).toBe(true);
-      // FIXME: explicit assert condition
-      expect(migratedConfig).toMatchSnapshot();
+      expect(migratedConfig).toEqual({
+        packageRules: [
+          {
+            matchPackagePatterns: '^(@angular|typescript)',
+            groupName: 'angular packages',
+          },
+        ],
+      });
     });
     it('overrides existing automerge setting', () => {
       const config: TestRenovateConfig = {
@@ -445,8 +451,13 @@ describe(getName(), () => {
         config,
         defaultConfig
       );
-      // FIXME: explicit assert condition
-      expect(migratedConfig).toMatchSnapshot();
+      expect(migratedConfig).toEqual({
+        baseBranches: [],
+        commitMessage: 'test',
+        ignorePaths: [],
+        includePaths: ['test'],
+        rebaseWhen: 'auto',
+      });
       expect(isMigrated).toBe(true);
     });
     it('it migrates semanticCommits', () => {
@@ -627,8 +638,24 @@ describe(getName(), () => {
         defaultConfig
       );
       expect(isMigrated).toBe(true);
-      // FIXME: explicit assert condition
-      expect(migratedConfig).toMatchSnapshot();
+      expect(migratedConfig).toEqual({
+        packageRules: [
+          {
+            excludePackageNames: ['baz'],
+            excludePackagePatterns: ['^baz'],
+            matchBaseBranches: ['master'],
+            matchDatasources: ['orb'],
+            matchDepTypes: ['peerDependencies'],
+            matchLanguages: ['python'],
+            matchManagers: ['dockerfile'],
+            matchPackageNames: ['foo'],
+            matchPackagePatterns: ['^bar'],
+            matchPaths: ['package.json'],
+            matchSourceUrlPrefixes: ['https://github.com/vuejs/vue'],
+            matchUpdateTypes: ['major'],
+          },
+        ],
+      });
     });
   });
   it('it migrates nested packageRules', () => {
@@ -665,18 +692,9 @@ describe(getName(), () => {
   it('it migrates hostRules fields', () => {
     const config: RenovateConfig = {
       hostRules: [
-        {
-          baseUrl: 'https://some.domain.com',
-          token: 'abc123',
-        },
-        {
-          domainName: 'domain.com',
-          token: 'abc123',
-        },
-        {
-          hostName: 'some.domain.com',
-          token: 'abc123',
-        },
+        { baseUrl: 'https://some.domain.com', token: 'abc123' },
+        { domainName: 'domain.com', token: 'abc123' },
+        { hostName: 'some.domain.com', token: 'abc123' },
       ],
     } as any;
     const { isMigrated, migratedConfig } = configMigration.migrateConfig(
@@ -684,8 +702,13 @@ describe(getName(), () => {
       defaultConfig
     );
     expect(isMigrated).toBe(true);
-    // FIXME: explicit assert condition
-    expect(migratedConfig).toMatchSnapshot();
+    expect(migratedConfig).toEqual({
+      hostRules: [
+        { matchHost: 'https://some.domain.com', token: 'abc123' },
+        { matchHost: 'domain.com', token: 'abc123' },
+        { matchHost: 'some.domain.com', token: 'abc123' },
+      ],
+    });
   });
   it('it migrates presets', () => {
     setAdminConfig({
@@ -702,7 +725,6 @@ describe(getName(), () => {
       defaultConfig
     );
     expect(isMigrated).toBe(true);
-    // FIXME: explicit assert condition
-    expect(migratedConfig).toMatchSnapshot();
+    expect(migratedConfig).toEqual({ extends: ['local>org/renovate-config'] });
   });
 });
diff --git a/lib/config/presets/__snapshots__/index.spec.ts.snap b/lib/config/presets/__snapshots__/index.spec.ts.snap
index a94385764e..63987db40e 100644
--- a/lib/config/presets/__snapshots__/index.spec.ts.snap
+++ b/lib/config/presets/__snapshots__/index.spec.ts.snap
@@ -17,398 +17,12 @@ Object {
 }
 `;
 
-exports[`config/presets/index getPreset gets parameterised configs 1`] = `
-Object {
-  "description": Array [
-    "Group eslint packages into same branch/PR",
-  ],
-  "packageRules": Array [
-    Object {
-      "extends": Array [
-        "packages:eslint",
-      ],
-      "groupName": "eslint",
-    },
-  ],
-}
-`;
-
 exports[`config/presets/index getPreset handles 404 packages 1`] = `undefined`;
 
 exports[`config/presets/index getPreset handles 404 packages 2`] = `undefined`;
 
 exports[`config/presets/index getPreset handles 404 packages 3`] = `undefined`;
 
-exports[`config/presets/index getPreset handles missing params 1`] = `
-Object {
-  "description": Array [
-    "Group {{arg1}} packages into same branch/PR",
-  ],
-  "packageRules": Array [
-    Object {
-      "extends": Array [],
-      "groupName": "{{arg1}}",
-    },
-  ],
-}
-`;
-
-exports[`config/presets/index getPreset handles no config 1`] = `undefined`;
-
-exports[`config/presets/index getPreset handles no config 2`] = `undefined`;
-
-exports[`config/presets/index getPreset handles no config 3`] = `undefined`;
-
-exports[`config/presets/index getPreset handles preset not found 1`] = `undefined`;
-
-exports[`config/presets/index getPreset handles preset not found 2`] = `undefined`;
-
-exports[`config/presets/index getPreset handles preset not found 3`] = `undefined`;
-
-exports[`config/presets/index getPreset handles removed presets with a migration 1`] = `
-Object {
-  "extends": Array [
-    ":separateMajorReleases",
-    ":combinePatchMinorReleases",
-    ":ignoreUnstable",
-    ":prImmediately",
-    ":semanticPrefixFixDepsChoreOthers",
-    ":updateNotScheduled",
-    ":automergeDisabled",
-    ":ignoreModulesAndTests",
-    ":autodetectPinVersions",
-    ":prHourlyLimit2",
-    ":prConcurrentLimit20",
-    "group:monorepos",
-    "group:recommended",
-    "workarounds:all",
-  ],
-}
-`;
-
-exports[`config/presets/index getPreset handles throw errors 1`] = `undefined`;
-
-exports[`config/presets/index getPreset handles throw errors 2`] = `undefined`;
-
-exports[`config/presets/index getPreset handles throw errors 3`] = `undefined`;
-
-exports[`config/presets/index getPreset ignores irrelevant params 1`] = `
-Object {
-  "description": Array [
-    "Use version pinning (maintain a single version only and not semver ranges)",
-  ],
-  "rangeStrategy": "pin",
-}
-`;
-
-exports[`config/presets/index parsePreset parses gitea 1`] = `
-Object {
-  "packageName": "some/repo",
-  "params": undefined,
-  "presetName": "default",
-  "presetPath": undefined,
-  "presetSource": "gitea",
-}
-`;
-
-exports[`config/presets/index parsePreset parses github 1`] = `
-Object {
-  "packageName": "some/repo",
-  "params": undefined,
-  "presetName": "default",
-  "presetPath": undefined,
-  "presetSource": "github",
-}
-`;
-
-exports[`config/presets/index parsePreset parses github subdirectories 1`] = `
-Object {
-  "packageName": "some/repo",
-  "params": undefined,
-  "presetName": "somefile",
-  "presetPath": "somepath/somesubpath",
-  "presetSource": "github",
-}
-`;
-
-exports[`config/presets/index parsePreset parses github subfiles 1`] = `
-Object {
-  "packageName": "some/repo",
-  "params": undefined,
-  "presetName": "somefile",
-  "presetPath": undefined,
-  "presetSource": "github",
-}
-`;
-
-exports[`config/presets/index parsePreset parses github subfiles with preset and sub-preset name 1`] = `
-Object {
-  "packageName": "some/repo",
-  "params": undefined,
-  "presetName": "somefile/somepreset/somesubpreset",
-  "presetPath": undefined,
-  "presetSource": "github",
-}
-`;
-
-exports[`config/presets/index parsePreset parses github subfiles with preset name 1`] = `
-Object {
-  "packageName": "some/repo",
-  "params": undefined,
-  "presetName": "somefile/somepreset",
-  "presetPath": undefined,
-  "presetSource": "github",
-}
-`;
-
-exports[`config/presets/index parsePreset parses github toplevel file using subdirectory syntax 1`] = `
-Object {
-  "packageName": "some/repo",
-  "params": undefined,
-  "presetName": "somefile",
-  "presetPath": undefined,
-  "presetSource": "github",
-}
-`;
-
-exports[`config/presets/index parsePreset parses gitlab 1`] = `
-Object {
-  "packageName": "some/repo",
-  "params": undefined,
-  "presetName": "default",
-  "presetPath": undefined,
-  "presetSource": "gitlab",
-}
-`;
-
-exports[`config/presets/index parsePreset parses local 1`] = `
-Object {
-  "packageName": "some/repo",
-  "params": undefined,
-  "presetName": "default",
-  "presetPath": undefined,
-  "presetSource": "local",
-}
-`;
-
-exports[`config/presets/index parsePreset parses local with subdirectory 1`] = `
-Object {
-  "packageName": "some-group/some-repo",
-  "params": undefined,
-  "presetName": "some-file",
-  "presetPath": "some-dir",
-  "presetSource": "local",
-}
-`;
-
-exports[`config/presets/index parsePreset parses no prefix as local 1`] = `
-Object {
-  "packageName": "some/repo",
-  "params": undefined,
-  "presetName": "default",
-  "presetPath": undefined,
-  "presetSource": "local",
-}
-`;
-
-exports[`config/presets/index parsePreset returns default package name 1`] = `
-Object {
-  "packageName": "default",
-  "params": undefined,
-  "presetName": "base",
-  "presetPath": undefined,
-  "presetSource": "internal",
-}
-`;
-
-exports[`config/presets/index parsePreset returns default package name with params 1`] = `
-Object {
-  "packageName": "default",
-  "params": Array [
-    "packages/eslint",
-    "eslint",
-  ],
-  "presetName": "group",
-  "presetPath": undefined,
-  "presetSource": "internal",
-}
-`;
-
-exports[`config/presets/index parsePreset returns non-scoped default 1`] = `
-Object {
-  "packageName": "renovate-config-somepackage",
-  "params": undefined,
-  "presetName": "default",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns non-scoped package name 1`] = `
-Object {
-  "packageName": "renovate-config-somepackage",
-  "params": undefined,
-  "presetName": "webapp",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns non-scoped package name full 1`] = `
-Object {
-  "packageName": "renovate-config-somepackage",
-  "params": undefined,
-  "presetName": "webapp",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns non-scoped package name with params 1`] = `
-Object {
-  "packageName": "renovate-config-somepackage",
-  "params": Array [
-    "param1",
-  ],
-  "presetName": "webapp",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns scope with packageName and default 1`] = `
-Object {
-  "packageName": "@somescope/somepackagename",
-  "params": undefined,
-  "presetName": "default",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns scope with packageName and params and default 1`] = `
-Object {
-  "packageName": "@somescope/somepackagename",
-  "params": Array [
-    "param1",
-    "param2",
-    "param3",
-  ],
-  "presetName": "default",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns scope with packageName and presetName 1`] = `
-Object {
-  "packageName": "@somescope/somepackagename",
-  "params": undefined,
-  "presetName": "somePresetName",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns scope with packageName and presetName and params 1`] = `
-Object {
-  "packageName": "@somescope/somepackagename",
-  "params": Array [
-    "param1",
-    "param2",
-  ],
-  "presetName": "somePresetName",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns scope with presetName 1`] = `
-Object {
-  "packageName": "@somescope/renovate-config",
-  "params": undefined,
-  "presetName": "somePresetName",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns scope with presetName and params 1`] = `
-Object {
-  "packageName": "@somescope/renovate-config",
-  "params": Array [
-    "param1",
-  ],
-  "presetName": "somePresetName",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns simple scope 1`] = `
-Object {
-  "packageName": "@somescope/renovate-config",
-  "params": undefined,
-  "presetName": "default",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index parsePreset returns simple scope and params 1`] = `
-Object {
-  "packageName": "@somescope/renovate-config",
-  "params": Array [
-    "param1",
-  ],
-  "presetName": "default",
-  "presetPath": undefined,
-  "presetSource": "npm",
-}
-`;
-
-exports[`config/presets/index replaceArgs replaces args in strings 1`] = `"c foo ab"`;
-
-exports[`config/presets/index replaceArgs replaces arrays 1`] = `
-Object {
-  "foo": Array [
-    "a",
-    Object {
-      "bar": "b",
-      "baz": 5,
-    },
-  ],
-}
-`;
-
-exports[`config/presets/index replaceArgs replaces objects 1`] = `
-Object {
-  "bar": Object {
-    "aaa": Object {
-      "bbb": "woo c",
-    },
-    "baz": "b boo",
-  },
-  "foo": "ha a",
-}
-`;
-
-exports[`config/presets/index resolvePreset combines two package alls 1`] = `
-Object {
-  "matchPackageNames": Array [
-    "@types/eslint",
-    "babel-eslint",
-  ],
-  "matchPackagePrefixes": Array [
-    "@typescript-eslint/",
-    "eslint",
-    "stylelint",
-  ],
-}
-`;
-
-exports[`config/presets/index resolvePreset ignores presets 1`] = `Object {}`;
-
 exports[`config/presets/index resolvePreset migrates automerge in presets 1`] = `
 Object {
   "automergeType": "pr",
@@ -550,24 +164,6 @@ Object {
 }
 `;
 
-exports[`config/presets/index resolvePreset resolves packageRule 1`] = `
-Object {
-  "packageRules": Array [
-    Object {
-      "groupName": "eslint",
-      "matchPackageNames": Array [
-        "@types/eslint",
-        "babel-eslint",
-      ],
-      "matchPackagePrefixes": Array [
-        "@typescript-eslint/",
-        "eslint",
-      ],
-    },
-  ],
-}
-`;
-
 exports[`config/presets/index resolvePreset resolves self-hosted presets without baseConfig 1`] = `
 Object {
   "labels": Array [
@@ -575,59 +171,3 @@ Object {
   ],
 }
 `;
-
-exports[`config/presets/index resolvePreset returns same if no presets 1`] = `
-Object {
-  "foo": 1,
-}
-`;
-
-exports[`config/presets/index resolvePreset throws if invalid preset 1`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws if invalid preset 2`] = `"Preset name not found within published preset config (wrongpreset:invalid-preset)"`;
-
-exports[`config/presets/index resolvePreset throws if invalid preset 3`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws if invalid preset file 1`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws if invalid preset file 2`] = `"Cannot find preset's package (notfound)"`;
-
-exports[`config/presets/index resolvePreset throws if invalid preset file 3`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws if path + invalid syntax 1`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws if path + invalid syntax 2`] = `"Preset is invalid (github>user/repo//)"`;
-
-exports[`config/presets/index resolvePreset throws if path + invalid syntax 3`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws if path + sub-preset 1`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws if path + sub-preset 2`] = `"Sub-presets cannot be combined with a custom path (github>user/repo//path:subpreset)"`;
-
-exports[`config/presets/index resolvePreset throws if path + sub-preset 3`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws if valid and invalid 1`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws if valid and invalid 2`] = `"Preset name not found within published preset config (wrongpreset:invalid-preset)"`;
-
-exports[`config/presets/index resolvePreset throws if valid and invalid 3`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws noconfig 1`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws noconfig 2`] = `"Preset package is missing a renovate-config entry (noconfig:base)"`;
-
-exports[`config/presets/index resolvePreset throws noconfig 3`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws throw 1`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws throw 2`] = `undefined`;
-
-exports[`config/presets/index resolvePreset throws throw 3`] = `undefined`;
-
-exports[`config/presets/index resolvePreset works with valid 1`] = `
-Object {
-  "foo": 1,
-  "ignoreDeps": Array [],
-  "rangeStrategy": "pin",
-}
-`;
diff --git a/lib/config/presets/bitbucket-server/__snapshots__/index.spec.ts.snap b/lib/config/presets/bitbucket-server/__snapshots__/index.spec.ts.snap
index 57c29ca8d6..26af38c45b 100644
--- a/lib/config/presets/bitbucket-server/__snapshots__/index.spec.ts.snap
+++ b/lib/config/presets/bitbucket-server/__snapshots__/index.spec.ts.snap
@@ -1,12 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
 exports[`config/presets/bitbucket-server/index fetchJSONFile() returns JSON 1`] = `
-Object {
-  "from": "api",
-}
-`;
-
-exports[`config/presets/bitbucket-server/index fetchJSONFile() returns JSON 2`] = `
 Array [
   Object {
     "headers": Object {
diff --git a/lib/config/presets/bitbucket-server/index.spec.ts b/lib/config/presets/bitbucket-server/index.spec.ts
index 3e1d54ca0f..a6f0c86611 100644
--- a/lib/config/presets/bitbucket-server/index.spec.ts
+++ b/lib/config/presets/bitbucket-server/index.spec.ts
@@ -32,8 +32,7 @@ describe(getName(), () => {
         'some-filename.json',
         bitbucketApiHost
       );
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({ from: 'api' });
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
 
diff --git a/lib/config/presets/gitea/__snapshots__/index.spec.ts.snap b/lib/config/presets/gitea/__snapshots__/index.spec.ts.snap
index deae29bd3b..85b877cd00 100644
--- a/lib/config/presets/gitea/__snapshots__/index.spec.ts.snap
+++ b/lib/config/presets/gitea/__snapshots__/index.spec.ts.snap
@@ -1,12 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
 exports[`config/presets/gitea/index fetchJSONFile() returns JSON 1`] = `
-Object {
-  "from": "api",
-}
-`;
-
-exports[`config/presets/gitea/index fetchJSONFile() returns JSON 2`] = `
 Array [
   Object {
     "headers": Object {
diff --git a/lib/config/presets/gitea/index.spec.ts b/lib/config/presets/gitea/index.spec.ts
index 0de6bf8026..213b77ad6e 100644
--- a/lib/config/presets/gitea/index.spec.ts
+++ b/lib/config/presets/gitea/index.spec.ts
@@ -32,8 +32,7 @@ describe(getName(), () => {
         'some-filename.json',
         giteaApiHost
       );
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({ from: 'api' });
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
   });
diff --git a/lib/config/presets/github/__snapshots__/index.spec.ts.snap b/lib/config/presets/github/__snapshots__/index.spec.ts.snap
index cdd613ef77..b87f96fba1 100644
--- a/lib/config/presets/github/__snapshots__/index.spec.ts.snap
+++ b/lib/config/presets/github/__snapshots__/index.spec.ts.snap
@@ -1,12 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
 exports[`config/presets/github/index fetchJSONFile() returns JSON 1`] = `
-Object {
-  "from": "api",
-}
-`;
-
-exports[`config/presets/github/index fetchJSONFile() returns JSON 2`] = `
 Array [
   Object {
     "headers": Object {
diff --git a/lib/config/presets/github/index.spec.ts b/lib/config/presets/github/index.spec.ts
index 744c900cce..79fc22a514 100644
--- a/lib/config/presets/github/index.spec.ts
+++ b/lib/config/presets/github/index.spec.ts
@@ -30,8 +30,7 @@ describe(getName(), () => {
         'some-filename.json',
         githubApiHost
       );
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({ from: 'api' });
       expect(httpMock.getTrace()).toMatchSnapshot();
     });
   });
diff --git a/lib/config/presets/index.spec.ts b/lib/config/presets/index.spec.ts
index 511573486b..f79be302a2 100644
--- a/lib/config/presets/index.spec.ts
+++ b/lib/config/presets/index.spec.ts
@@ -50,8 +50,7 @@ describe(getName(), () => {
       config.extends = [];
       const res = await presets.resolveConfigPresets(config);
       expect(config).toMatchObject(res);
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({ foo: 1 });
     });
     it('throws if invalid preset file', async () => {
       config.foo = 1;
@@ -63,10 +62,11 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
-      expect(e.validationSource).toMatchSnapshot();
-      expect(e.validationError).toMatchSnapshot();
-      expect(e.validationMessage).toMatchSnapshot();
+      expect(e.validationSource).toBeUndefined();
+      expect(e.validationError).toEqual(
+        "Cannot find preset's package (notfound)"
+      );
+      expect(e.validationMessage).toBeUndefined();
     });
     it('throws if invalid preset', async () => {
       config.foo = 1;
@@ -78,10 +78,11 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
-      expect(e.validationSource).toMatchSnapshot();
-      expect(e.validationError).toMatchSnapshot();
-      expect(e.validationMessage).toMatchSnapshot();
+      expect(e.validationSource).toBeUndefined();
+      expect(e.validationError).toEqual(
+        'Preset name not found within published preset config (wrongpreset:invalid-preset)'
+      );
+      expect(e.validationMessage).toBeUndefined();
     });
 
     it('throws if path + invalid syntax', async () => {
@@ -94,10 +95,11 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
-      expect(e.validationSource).toMatchSnapshot();
-      expect(e.validationError).toMatchSnapshot();
-      expect(e.validationMessage).toMatchSnapshot();
+      expect(e.validationSource).toBeUndefined();
+      expect(e.validationError).toEqual(
+        'Preset is invalid (github>user/repo//)'
+      );
+      expect(e.validationMessage).toBeUndefined();
     });
 
     it('throws if path + sub-preset', async () => {
@@ -110,10 +112,11 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
-      expect(e.validationSource).toMatchSnapshot();
-      expect(e.validationError).toMatchSnapshot();
-      expect(e.validationMessage).toMatchSnapshot();
+      expect(e.validationSource).toBeUndefined();
+      expect(e.validationError).toEqual(
+        'Sub-presets cannot be combined with a custom path (github>user/repo//path:subpreset)'
+      );
+      expect(e.validationMessage).toBeUndefined();
     });
 
     it('throws noconfig', async () => {
@@ -126,10 +129,11 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
-      expect(e.validationSource).toMatchSnapshot();
-      expect(e.validationError).toMatchSnapshot();
-      expect(e.validationMessage).toMatchSnapshot();
+      expect(e.validationSource).toBeUndefined();
+      expect(e.validationError).toEqual(
+        'Preset package is missing a renovate-config entry (noconfig:base)'
+      );
+      expect(e.validationMessage).toBeUndefined();
     });
 
     it('throws throw', async () => {
@@ -142,10 +146,9 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
-      expect(e.validationSource).toMatchSnapshot();
-      expect(e.validationError).toMatchSnapshot();
-      expect(e.validationMessage).toMatchSnapshot();
+      expect(e.validationSource).toBeUndefined();
+      expect(e.validationError).toBeUndefined();
+      expect(e.validationMessage).toBeUndefined();
     });
 
     it('works with valid', async () => {
@@ -153,7 +156,11 @@ describe(getName(), () => {
       config.ignoreDeps = [];
       config.extends = [':pinVersions'];
       const res = await presets.resolveConfigPresets(config);
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        foo: 1,
+        ignoreDeps: [],
+        rangeStrategy: 'pin',
+      });
       expect(res.rangeStrategy).toEqual('pin');
     });
     it('throws if valid and invalid', async () => {
@@ -166,16 +173,19 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
-      expect(e.validationSource).toMatchSnapshot();
-      expect(e.validationError).toMatchSnapshot();
-      expect(e.validationMessage).toMatchSnapshot();
+      expect(e.validationSource).toBeUndefined();
+      expect(e.validationError).toEqual(
+        'Preset name not found within published preset config (wrongpreset:invalid-preset)'
+      );
+      expect(e.validationMessage).toBeUndefined();
     });
     it('combines two package alls', async () => {
       config.extends = ['packages:eslint', 'packages:stylelint'];
       const res = await presets.resolveConfigPresets(config);
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        matchPackageNames: ['@types/eslint', 'babel-eslint'],
+        matchPackagePrefixes: ['@typescript-eslint/', 'eslint', 'stylelint'],
+      });
     });
     it('resolves packageRule', async () => {
       config.packageRules = [
@@ -185,8 +195,15 @@ describe(getName(), () => {
         },
       ];
       const res = await presets.resolveConfigPresets(config);
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        packageRules: [
+          {
+            groupName: 'eslint',
+            matchPackageNames: ['@types/eslint', 'babel-eslint'],
+            matchPackagePrefixes: ['@typescript-eslint/', 'eslint'],
+          },
+        ],
+      });
     });
     it('resolves eslint', async () => {
       config.extends = ['packages:eslint'];
@@ -226,8 +243,7 @@ describe(getName(), () => {
         'config:base',
       ]);
       expect(config).toMatchObject(res);
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({});
     });
 
     it('resolves self-hosted presets without baseConfig', async () => {
@@ -253,8 +269,7 @@ describe(getName(), () => {
     it('replaces args in strings', () => {
       const str = '{{arg2}} foo {{arg0}}{{arg1}}';
       const res = presets.replaceArgs(str, argMappings);
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual('c foo ab');
     });
     it('replaces args twice in same string', () => {
       const str = '{{arg2}}{{arg0}} foo {{arg0}}{{arg1}}';
@@ -272,170 +287,294 @@ describe(getName(), () => {
         },
       };
       const res = presets.replaceArgs(obj, argMappings);
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        bar: { aaa: { bbb: 'woo c' }, baz: 'b boo' },
+        foo: 'ha a',
+      });
     });
     it('replaces arrays', () => {
       const obj = {
-        foo: [
-          '{{arg0}}',
-          {
-            bar: '{{arg1}}',
-            baz: 5,
-          },
-        ],
+        foo: ['{{arg0}}', { bar: '{{arg1}}', baz: 5 }],
       };
       const res = presets.replaceArgs(obj, argMappings);
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        foo: ['a', { bar: 'b', baz: 5 }],
+      });
     });
   });
   describe('parsePreset', () => {
     // default namespace
     it('returns default package name', () => {
-      // FIXME: explicit assert condition
-      expect(presets.parsePreset(':base')).toMatchSnapshot();
+      expect(presets.parsePreset(':base')).toEqual({
+        packageName: 'default',
+        params: undefined,
+        presetName: 'base',
+        presetPath: undefined,
+        presetSource: 'internal',
+      });
     });
     it('parses github', () => {
-      // FIXME: explicit assert condition
-      expect(presets.parsePreset('github>some/repo')).toMatchSnapshot();
+      expect(presets.parsePreset('github>some/repo')).toEqual({
+        packageName: 'some/repo',
+        params: undefined,
+        presetName: 'default',
+        presetPath: undefined,
+        presetSource: 'github',
+      });
     });
     it('parses github subfiles', () => {
-      // FIXME: explicit assert condition
-      expect(
-        presets.parsePreset('github>some/repo:somefile')
-      ).toMatchSnapshot();
+      expect(presets.parsePreset('github>some/repo:somefile')).toEqual({
+        packageName: 'some/repo',
+        params: undefined,
+        presetName: 'somefile',
+        presetPath: undefined,
+        presetSource: 'github',
+      });
     });
     it('parses github subfiles with preset name', () => {
-      // FIXME: explicit assert condition
       expect(
         presets.parsePreset('github>some/repo:somefile/somepreset')
-      ).toMatchSnapshot();
+      ).toEqual({
+        packageName: 'some/repo',
+        params: undefined,
+        presetName: 'somefile/somepreset',
+        presetPath: undefined,
+        presetSource: 'github',
+      });
     });
     it('parses github subfiles with preset and sub-preset name', () => {
-      // FIXME: explicit assert condition
       expect(
         presets.parsePreset(
           'github>some/repo:somefile/somepreset/somesubpreset'
         )
-      ).toMatchSnapshot();
+      ).toEqual({
+        packageName: 'some/repo',
+        params: undefined,
+        presetName: 'somefile/somepreset/somesubpreset',
+        presetPath: undefined,
+        presetSource: 'github',
+      });
     });
     it('parses github subdirectories', () => {
-      // FIXME: explicit assert condition
       expect(
         presets.parsePreset('github>some/repo//somepath/somesubpath/somefile')
-      ).toMatchSnapshot();
+      ).toEqual({
+        packageName: 'some/repo',
+        params: undefined,
+        presetName: 'somefile',
+        presetPath: 'somepath/somesubpath',
+        presetSource: 'github',
+      });
     });
     it('parses github toplevel file using subdirectory syntax', () => {
-      // FIXME: explicit assert condition
-      expect(
-        presets.parsePreset('github>some/repo//somefile')
-      ).toMatchSnapshot();
+      expect(presets.parsePreset('github>some/repo//somefile')).toEqual({
+        packageName: 'some/repo',
+        params: undefined,
+        presetName: 'somefile',
+        presetPath: undefined,
+        presetSource: 'github',
+      });
     });
     it('parses gitlab', () => {
-      // FIXME: explicit assert condition
-      expect(presets.parsePreset('gitlab>some/repo')).toMatchSnapshot();
+      expect(presets.parsePreset('gitlab>some/repo')).toEqual({
+        packageName: 'some/repo',
+        params: undefined,
+        presetName: 'default',
+        presetPath: undefined,
+        presetSource: 'gitlab',
+      });
     });
     it('parses gitea', () => {
-      // FIXME: explicit assert condition
-      expect(presets.parsePreset('gitea>some/repo')).toMatchSnapshot();
+      expect(presets.parsePreset('gitea>some/repo')).toEqual({
+        packageName: 'some/repo',
+        params: undefined,
+        presetName: 'default',
+        presetPath: undefined,
+        presetSource: 'gitea',
+      });
     });
     it('parses local', () => {
-      // FIXME: explicit assert condition
-      expect(presets.parsePreset('local>some/repo')).toMatchSnapshot();
+      expect(presets.parsePreset('local>some/repo')).toEqual({
+        packageName: 'some/repo',
+        params: undefined,
+        presetName: 'default',
+        presetPath: undefined,
+        presetSource: 'local',
+      });
     });
     it('parses local with subdirectory', () => {
-      // FIXME: explicit assert condition
       expect(
         presets.parsePreset('local>some-group/some-repo//some-dir/some-file')
-      ).toMatchSnapshot();
+      ).toEqual({
+        packageName: 'some-group/some-repo',
+        params: undefined,
+        presetName: 'some-file',
+        presetPath: 'some-dir',
+        presetSource: 'local',
+      });
     });
     it('parses no prefix as local', () => {
-      // FIXME: explicit assert condition
-      expect(presets.parsePreset('some/repo')).toMatchSnapshot();
+      expect(presets.parsePreset('some/repo')).toEqual({
+        packageName: 'some/repo',
+        params: undefined,
+        presetName: 'default',
+        presetPath: undefined,
+        presetSource: 'local',
+      });
     });
     it('returns default package name with params', () => {
-      // FIXME: explicit assert condition
-      expect(
-        presets.parsePreset(':group(packages/eslint, eslint)')
-      ).toMatchSnapshot();
+      expect(presets.parsePreset(':group(packages/eslint, eslint)')).toEqual({
+        packageName: 'default',
+        params: ['packages/eslint', 'eslint'],
+        presetName: 'group',
+        presetPath: undefined,
+        presetSource: 'internal',
+      });
     });
     // scoped namespace
     it('returns simple scope', () => {
-      // FIXME: explicit assert condition
-      expect(presets.parsePreset('@somescope')).toMatchSnapshot();
+      expect(presets.parsePreset('@somescope')).toEqual({
+        packageName: '@somescope/renovate-config',
+        params: undefined,
+        presetName: 'default',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
     it('returns simple scope and params', () => {
-      // FIXME: explicit assert condition
-      expect(presets.parsePreset('@somescope(param1)')).toMatchSnapshot();
+      expect(presets.parsePreset('@somescope(param1)')).toEqual({
+        packageName: '@somescope/renovate-config',
+        params: ['param1'],
+        presetName: 'default',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
     it('returns scope with packageName and default', () => {
-      // FIXME: explicit assert condition
-      expect(
-        presets.parsePreset('@somescope/somepackagename')
-      ).toMatchSnapshot();
+      expect(presets.parsePreset('@somescope/somepackagename')).toEqual({
+        packageName: '@somescope/somepackagename',
+        params: undefined,
+        presetName: 'default',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
     it('returns scope with packageName and params and default', () => {
-      // FIXME: explicit assert condition
       expect(
         presets.parsePreset(
           '@somescope/somepackagename(param1, param2, param3)'
         )
-      ).toMatchSnapshot();
+      ).toEqual({
+        packageName: '@somescope/somepackagename',
+        params: ['param1', 'param2', 'param3'],
+        presetName: 'default',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
     it('returns scope with presetName', () => {
-      // FIXME: explicit assert condition
-      expect(
-        presets.parsePreset('@somescope:somePresetName')
-      ).toMatchSnapshot();
+      expect(presets.parsePreset('@somescope:somePresetName')).toEqual({
+        packageName: '@somescope/renovate-config',
+        params: undefined,
+        presetName: 'somePresetName',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
     it('returns scope with presetName and params', () => {
-      // FIXME: explicit assert condition
-      expect(
-        presets.parsePreset('@somescope:somePresetName(param1)')
-      ).toMatchSnapshot();
+      expect(presets.parsePreset('@somescope:somePresetName(param1)')).toEqual({
+        packageName: '@somescope/renovate-config',
+        params: ['param1'],
+        presetName: 'somePresetName',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
     it('returns scope with packageName and presetName', () => {
-      // FIXME: explicit assert condition
       expect(
         presets.parsePreset('@somescope/somepackagename:somePresetName')
-      ).toMatchSnapshot();
+      ).toEqual({
+        packageName: '@somescope/somepackagename',
+        params: undefined,
+        presetName: 'somePresetName',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
     it('returns scope with packageName and presetName and params', () => {
-      // FIXME: explicit assert condition
       expect(
         presets.parsePreset(
           '@somescope/somepackagename:somePresetName(param1, param2)'
         )
-      ).toMatchSnapshot();
+      ).toEqual({
+        packageName: '@somescope/somepackagename',
+        params: ['param1', 'param2'],
+        presetName: 'somePresetName',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
     // non-scoped namespace
     it('returns non-scoped default', () => {
-      // FIXME: explicit assert condition
-      expect(presets.parsePreset('somepackage')).toMatchSnapshot();
+      expect(presets.parsePreset('somepackage')).toEqual({
+        packageName: 'renovate-config-somepackage',
+        params: undefined,
+        presetName: 'default',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
     it('returns non-scoped package name', () => {
-      // FIXME: explicit assert condition
-      expect(presets.parsePreset('somepackage:webapp')).toMatchSnapshot();
+      expect(presets.parsePreset('somepackage:webapp')).toEqual({
+        packageName: 'renovate-config-somepackage',
+        params: undefined,
+        presetName: 'webapp',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
     it('returns non-scoped package name full', () => {
-      // FIXME: explicit assert condition
-      expect(
-        presets.parsePreset('renovate-config-somepackage:webapp')
-      ).toMatchSnapshot();
+      expect(presets.parsePreset('renovate-config-somepackage:webapp')).toEqual(
+        {
+          packageName: 'renovate-config-somepackage',
+          params: undefined,
+          presetName: 'webapp',
+          presetPath: undefined,
+          presetSource: 'npm',
+        }
+      );
     });
     it('returns non-scoped package name with params', () => {
-      // FIXME: explicit assert condition
-      expect(
-        presets.parsePreset('somepackage:webapp(param1)')
-      ).toMatchSnapshot();
+      expect(presets.parsePreset('somepackage:webapp(param1)')).toEqual({
+        packageName: 'renovate-config-somepackage',
+        params: ['param1'],
+        presetName: 'webapp',
+        presetPath: undefined,
+        presetSource: 'npm',
+      });
     });
   });
   describe('getPreset', () => {
     it('handles removed presets with a migration', async () => {
       const res = await presets.getPreset(':base', {});
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        extends: [
+          ':separateMajorReleases',
+          ':combinePatchMinorReleases',
+          ':ignoreUnstable',
+          ':prImmediately',
+          ':semanticPrefixFixDepsChoreOthers',
+          ':updateNotScheduled',
+          ':automergeDisabled',
+          ':ignoreModulesAndTests',
+          ':autodetectPinVersions',
+          ':prHourlyLimit2',
+          ':prConcurrentLimit20',
+          'group:monorepos',
+          'group:recommended',
+          'workarounds:all',
+        ],
+      });
     });
     it('handles removed presets with no migration', async () => {
       const res = await presets.getPreset('helpers:oddIsUnstable', {});
@@ -452,18 +591,36 @@ describe(getName(), () => {
         ':group(packages:eslint, eslint)',
         {}
       );
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        description: ['Group eslint packages into same branch/PR'],
+        packageRules: [
+          {
+            extends: ['packages:eslint'],
+            groupName: 'eslint',
+          },
+        ],
+      });
     });
     it('handles missing params', async () => {
       const res = await presets.getPreset(':group()', {});
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        description: ['Group {{arg1}} packages into same branch/PR'],
+        packageRules: [
+          {
+            extends: [],
+            groupName: '{{arg1}}',
+          },
+        ],
+      });
     });
     it('ignores irrelevant params', async () => {
       const res = await presets.getPreset(':pinVersions(foo, bar)', {});
-      // FIXME: explicit assert condition
-      expect(res).toMatchSnapshot();
+      expect(res).toEqual({
+        description: [
+          'Use version pinning (maintain a single version only and not semver ranges)',
+        ],
+        rangeStrategy: 'pin',
+      });
     });
     it('handles 404 packages', async () => {
       let e: Error;
@@ -473,7 +630,6 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
       expect(e.validationSource).toMatchSnapshot();
       expect(e.validationError).toMatchSnapshot();
       expect(e.validationMessage).toMatchSnapshot();
@@ -486,10 +642,9 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
-      expect(e.validationSource).toMatchSnapshot();
-      expect(e.validationError).toMatchSnapshot();
-      expect(e.validationMessage).toMatchSnapshot();
+      expect(e.validationSource).toBeUndefined();
+      expect(e.validationError).toBeUndefined();
+      expect(e.validationMessage).toBeUndefined();
     });
     it('handles throw errors', async () => {
       let e: Error;
@@ -499,10 +654,9 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
-      expect(e.validationSource).toMatchSnapshot();
-      expect(e.validationError).toMatchSnapshot();
-      expect(e.validationMessage).toMatchSnapshot();
+      expect(e.validationSource).toBeUndefined();
+      expect(e.validationError).toBeUndefined();
+      expect(e.validationMessage).toBeUndefined();
     });
     it('handles preset not found', async () => {
       let e: Error;
@@ -512,10 +666,9 @@ describe(getName(), () => {
         e = err;
       }
       expect(e).toBeDefined();
-      // FIXME: explicit assert condition
-      expect(e.validationSource).toMatchSnapshot();
-      expect(e.validationError).toMatchSnapshot();
-      expect(e.validationMessage).toMatchSnapshot();
+      expect(e.validationSource).toBeUndefined();
+      expect(e.validationError).toBeUndefined();
+      expect(e.validationMessage).toBeUndefined();
     });
   });
 });
diff --git a/lib/config/presets/local/__snapshots__/index.spec.ts.snap b/lib/config/presets/local/__snapshots__/index.spec.ts.snap
index 9560d78b28..942564e6df 100644
--- a/lib/config/presets/local/__snapshots__/index.spec.ts.snap
+++ b/lib/config/presets/local/__snapshots__/index.spec.ts.snap
@@ -11,12 +11,6 @@ Array [
 ]
 `;
 
-exports[`config/presets/local/index getPreset() forwards to azure 2`] = `
-Object {
-  "resolved": "preset",
-}
-`;
-
 exports[`config/presets/local/index getPreset() forwards to bitbucket 1`] = `
 Array [
   Array [
@@ -28,12 +22,6 @@ Array [
 ]
 `;
 
-exports[`config/presets/local/index getPreset() forwards to bitbucket 2`] = `
-Object {
-  "resolved": "preset",
-}
-`;
-
 exports[`config/presets/local/index getPreset() forwards to custom bitbucket-server 1`] = `
 Array [
   Array [
@@ -45,12 +33,6 @@ Array [
 ]
 `;
 
-exports[`config/presets/local/index getPreset() forwards to custom bitbucket-server 2`] = `
-Object {
-  "resolved": "preset",
-}
-`;
-
 exports[`config/presets/local/index getPreset() forwards to custom gitea 1`] = `
 Array [
   Array [
@@ -62,12 +44,6 @@ Array [
 ]
 `;
 
-exports[`config/presets/local/index getPreset() forwards to custom gitea 2`] = `
-Object {
-  "resolved": "preset",
-}
-`;
-
 exports[`config/presets/local/index getPreset() forwards to custom github 1`] = `
 Array [
   Array [
@@ -79,12 +55,6 @@ Array [
 ]
 `;
 
-exports[`config/presets/local/index getPreset() forwards to custom github 2`] = `
-Object {
-  "resolved": "preset",
-}
-`;
-
 exports[`config/presets/local/index getPreset() forwards to custom gitlab 1`] = `
 Array [
   Array [
@@ -96,12 +66,6 @@ Array [
 ]
 `;
 
-exports[`config/presets/local/index getPreset() forwards to custom gitlab 2`] = `
-Object {
-  "resolved": "preset",
-}
-`;
-
 exports[`config/presets/local/index getPreset() forwards to gitea 1`] = `
 Array [
   Array [
@@ -113,12 +77,6 @@ Array [
 ]
 `;
 
-exports[`config/presets/local/index getPreset() forwards to gitea 2`] = `
-Object {
-  "resolved": "preset",
-}
-`;
-
 exports[`config/presets/local/index getPreset() forwards to github 1`] = `
 Array [
   Array [
@@ -130,12 +88,6 @@ Array [
 ]
 `;
 
-exports[`config/presets/local/index getPreset() forwards to github 2`] = `
-Object {
-  "resolved": "preset",
-}
-`;
-
 exports[`config/presets/local/index getPreset() forwards to gitlab 1`] = `
 Array [
   Array [
@@ -146,9 +98,3 @@ Array [
   ],
 ]
 `;
-
-exports[`config/presets/local/index getPreset() forwards to gitlab 2`] = `
-Object {
-  "resolved": "preset",
-}
-`;
diff --git a/lib/config/presets/local/index.spec.ts b/lib/config/presets/local/index.spec.ts
index 2a2978c97f..adf8a4cf59 100644
--- a/lib/config/presets/local/index.spec.ts
+++ b/lib/config/presets/local/index.spec.ts
@@ -65,8 +65,7 @@ describe(getName(), () => {
         },
       });
       expect(azure.getPresetFromEndpoint.mock.calls).toMatchSnapshot();
-      // FIXME: explicit assert condition
-      expect(content).toMatchSnapshot();
+      expect(content).toEqual({ resolved: 'preset' });
     });
 
     it('forwards to bitbucket', async () => {
@@ -78,8 +77,7 @@ describe(getName(), () => {
         },
       });
       expect(bitbucket.getPresetFromEndpoint.mock.calls).toMatchSnapshot();
-      // FIXME: explicit assert condition
-      expect(content).toMatchSnapshot();
+      expect(content).toEqual({ resolved: 'preset' });
     });
 
     it('forwards to custom bitbucket-server', async () => {
@@ -94,8 +92,7 @@ describe(getName(), () => {
       expect(
         bitbucketServer.getPresetFromEndpoint.mock.calls
       ).toMatchSnapshot();
-      // FIXME: explicit assert condition
-      expect(content).toMatchSnapshot();
+      expect(content).toEqual({ resolved: 'preset' });
     });
 
     it('forwards to gitea', async () => {
@@ -106,8 +103,7 @@ describe(getName(), () => {
         },
       });
       expect(gitea.getPresetFromEndpoint.mock.calls).toMatchSnapshot();
-      // FIXME: explicit assert condition
-      expect(content).toMatchSnapshot();
+      expect(content).toEqual({ resolved: 'preset' });
     });
     it('forwards to custom gitea', async () => {
       const content = await local.getPreset({
@@ -119,8 +115,7 @@ describe(getName(), () => {
         },
       });
       expect(gitea.getPresetFromEndpoint.mock.calls).toMatchSnapshot();
-      // FIXME: explicit assert condition
-      expect(content).toMatchSnapshot();
+      expect(content).toEqual({ resolved: 'preset' });
     });
 
     it('forwards to github', async () => {
@@ -131,8 +126,7 @@ describe(getName(), () => {
         },
       });
       expect(github.getPresetFromEndpoint.mock.calls).toMatchSnapshot();
-      // FIXME: explicit assert condition
-      expect(content).toMatchSnapshot();
+      expect(content).toEqual({ resolved: 'preset' });
     });
     it('forwards to custom github', async () => {
       const content = await local.getPreset({
@@ -144,8 +138,7 @@ describe(getName(), () => {
         },
       });
       expect(github.getPresetFromEndpoint.mock.calls).toMatchSnapshot();
-      // FIXME: explicit assert condition
-      expect(content).toMatchSnapshot();
+      expect(content).toEqual({ resolved: 'preset' });
     });
 
     it('forwards to gitlab', async () => {
@@ -157,8 +150,7 @@ describe(getName(), () => {
         },
       });
       expect(gitlab.getPresetFromEndpoint.mock.calls).toMatchSnapshot();
-      // FIXME: explicit assert condition
-      expect(content).toMatchSnapshot();
+      expect(content).toEqual({ resolved: 'preset' });
     });
     it('forwards to custom gitlab', async () => {
       const content = await local.getPreset({
@@ -170,8 +162,7 @@ describe(getName(), () => {
         },
       });
       expect(gitlab.getPresetFromEndpoint.mock.calls).toMatchSnapshot();
-      // FIXME: explicit assert condition
-      expect(content).toMatchSnapshot();
+      expect(content).toEqual({ resolved: 'preset' });
     });
   });
 });
diff --git a/lib/config/presets/npm/__snapshots__/index.spec.ts.snap b/lib/config/presets/npm/__snapshots__/index.spec.ts.snap
deleted file mode 100644
index b4544d12eb..0000000000
--- a/lib/config/presets/npm/__snapshots__/index.spec.ts.snap
+++ /dev/null
@@ -1,7 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`config/presets/npm/index should return preset 1`] = `
-Object {
-  "rangeStrategy": "auto",
-}
-`;
diff --git a/lib/config/presets/npm/index.spec.ts b/lib/config/presets/npm/index.spec.ts
index d888536f82..19151aa612 100644
--- a/lib/config/presets/npm/index.spec.ts
+++ b/lib/config/presets/npm/index.spec.ts
@@ -118,7 +118,6 @@ describe(getName(), () => {
       .get('/workingpreset')
       .reply(200, presetPackage);
     const res = await npm.getPreset({ packageName: 'workingpreset' });
-    // FIXME: explicit assert condition
-    expect(res).toMatchSnapshot();
+    expect(res).toEqual({ rangeStrategy: 'auto' });
   });
 });
-- 
GitLab