diff --git a/lib/workers/repository/configured.js b/lib/workers/repository/configured.ts
similarity index 57%
rename from lib/workers/repository/configured.js
rename to lib/workers/repository/configured.ts
index df772c4fd65f582223ecc00ae121e90b1e85e7aa..021a262e60b7898d8ed20154e69d19ea9a532e67 100644
--- a/lib/workers/repository/configured.js
+++ b/lib/workers/repository/configured.ts
@@ -1,8 +1,6 @@
-module.exports = {
-  checkIfConfigured,
-};
+import { RenovateConfig } from '../../config';
 
-function checkIfConfigured(config) {
+export function checkIfConfigured(config: RenovateConfig): void {
   if (config.enabled === false) {
     throw new Error('disabled');
   }
diff --git a/lib/workers/repository/error-config.js b/lib/workers/repository/error-config.ts
similarity index 86%
rename from lib/workers/repository/error-config.js
rename to lib/workers/repository/error-config.ts
index b3755a627c68065c1c305d8e8f3a2f9af6b3a764..11277bc2778d9c6eef44836c0489e3bcc2882b1d 100644
--- a/lib/workers/repository/error-config.js
+++ b/lib/workers/repository/error-config.ts
@@ -1,11 +1,11 @@
-const { logger } = require('../../logger');
-const { platform } = require('../../platform');
+import { logger } from '../../logger';
+import { platform } from '../../platform';
+import { RenovateConfig } from '../../config';
 
-module.exports = {
-  raiseConfigWarningIssue,
-};
-
-async function raiseConfigWarningIssue(config, error) {
+export async function raiseConfigWarningIssue(
+  config: RenovateConfig,
+  error: Error
+): Promise<void> {
   logger.debug('raiseConfigWarningIssue()');
   let body = `There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.\n\n`;
   if (error.configFile) {
diff --git a/lib/workers/repository/error.js b/lib/workers/repository/error.ts
similarity index 97%
rename from lib/workers/repository/error.js
rename to lib/workers/repository/error.ts
index 614fb62e9ce6d49c68f1072be1a6ada722d4aac8..a12820b8899646b8c7b4e02393848fa9d3103b58 100644
--- a/lib/workers/repository/error.js
+++ b/lib/workers/repository/error.ts
@@ -1,7 +1,11 @@
 import { logger, setMeta } from '../../logger';
 import { raiseConfigWarningIssue } from './error-config';
+import { RenovateConfig } from '../../config';
 
-export default async function handleError(config, err) {
+export default async function handleError(
+  config: RenovateConfig,
+  err: Error
+): Promise<string> {
   setMeta({
     repository: config.repository,
   });
diff --git a/lib/workers/repository/index.js b/lib/workers/repository/index.ts
similarity index 66%
rename from lib/workers/repository/index.js
rename to lib/workers/repository/index.ts
index 49798d330a0753f5e38632dee9055ac1e4692fc6..03367faab2c0d7b16498d05c318dddf19d3521a1 100644
--- a/lib/workers/repository/index.js
+++ b/lib/workers/repository/index.ts
@@ -1,24 +1,25 @@
+import fs from 'fs-extra';
+
 import handleError from './error';
 import { platform } from '../../platform';
-
-const fs = require('fs-extra');
-const { logger, setMeta } = require('../../logger');
-const { initRepo } = require('./init');
-const { ensureOnboardingPr } = require('./onboarding/pr');
-const { processResult } = require('./result');
-const { processRepo } = require('./process');
-const { finaliseRepo } = require('./finalise');
-const { ensureMasterIssue } = require('./master-issue');
-
-export { renovateRepository };
+import { logger, setMeta } from '../../logger';
+import { initRepo } from './init';
+import { ensureOnboardingPr } from './onboarding/pr';
+import { processResult, ProcessResult } from './result';
+import { processRepo } from './process';
+import { finaliseRepo } from './finalise';
+import { ensureMasterIssue } from './master-issue';
+import { RenovateConfig } from '../../config';
 
 // istanbul ignore next
-async function renovateRepository(repoConfig) {
+export async function renovateRepository(
+  repoConfig: RenovateConfig
+): Promise<ProcessResult> {
   let config = { ...repoConfig };
   setMeta({ repository: config.repository });
   logger.info('Renovating repository');
   logger.trace({ config });
-  let repoResult;
+  let repoResult: ProcessResult;
   try {
     await fs.ensureDir(config.localDir);
     logger.debug('Using localDir: ' + config.localDir);
diff --git a/lib/workers/repository/master-issue.js b/lib/workers/repository/master-issue.ts
similarity index 94%
rename from lib/workers/repository/master-issue.js
rename to lib/workers/repository/master-issue.ts
index 32e7e9bf836403dfb4d3c4bffd3b263a1655d2c2..82296b31f493c3ba983f0a0a1bb47ab581c94331 100644
--- a/lib/workers/repository/master-issue.js
+++ b/lib/workers/repository/master-issue.ts
@@ -1,11 +1,9 @@
-const { logger } = require('../../logger');
-const { platform } = require('../../platform');
+import { logger } from '../../logger';
+import { platform, Pr } from '../../platform';
+import { BranchConfig } from '../common';
+import { RenovateConfig } from '../../config';
 
-module.exports = {
-  ensureMasterIssue,
-};
-
-function getListItem(branch, type, pr) {
+function getListItem(branch: BranchConfig, type: string, pr?: Pr): string {
   let item = ' - [ ] ';
   item += `<!-- ${type}-branch=${branch.branchName} -->`;
   if (pr) {
@@ -22,7 +20,10 @@ function getListItem(branch, type, pr) {
   return item + ' (' + uniquePackages.join(', ') + ')\n';
 }
 
-async function ensureMasterIssue(config, branches) {
+export async function ensureMasterIssue(
+  config: RenovateConfig,
+  branches: BranchConfig[]
+): Promise<void> {
   if (
     !(
       config.masterIssue ||
diff --git a/lib/workers/repository/result.js b/lib/workers/repository/result.ts
similarity index 61%
rename from lib/workers/repository/result.js
rename to lib/workers/repository/result.ts
index 76a08c1a76b32a8afd0f90c91ecc890c114bec16..4a90fdeac176c7381986d78e574ebe0bdbd61b93 100644
--- a/lib/workers/repository/result.js
+++ b/lib/workers/repository/result.ts
@@ -1,8 +1,16 @@
-module.exports = {
-  processResult,
-};
+import { RenovateConfig } from '../../config';
 
-function processResult(config, res) {
+type ProcessStatus = 'disabled' | 'enabled' | 'onboarding' | 'unknown';
+
+export interface ProcessResult {
+  res: string;
+  status: ProcessStatus;
+}
+
+export function processResult(
+  config: RenovateConfig,
+  res: string
+): ProcessResult {
   const disabledStatuses = [
     'archived',
     'blocked',
@@ -16,7 +24,7 @@ function processResult(config, res) {
     'uninitiated',
     'empty',
   ];
-  let status;
+  let status: ProcessStatus;
   // istanbul ignore next
   if (disabledStatuses.includes(res)) {
     status = 'disabled';
diff --git a/package.json b/package.json
index f4a6a528e1e5f4ca5f61b24661cab70856abd394..639278a4ed463963e3df61e77ff1f08f4184a739 100644
--- a/package.json
+++ b/package.json
@@ -213,6 +213,7 @@
     "husky": "3.1.0",
     "jest": "24.9.0",
     "jest-junit": "10.0.0",
+    "jest-mock-extended": "1.0.7",
     "jest-silent-reporter": "0.1.2",
     "mockdate": "2.0.5",
     "nock": "11.7.1",
diff --git a/test/workers/repository/__snapshots__/index.spec.js.snap b/test/workers/repository/__snapshots__/index.spec.ts.snap
similarity index 100%
rename from test/workers/repository/__snapshots__/index.spec.js.snap
rename to test/workers/repository/__snapshots__/index.spec.ts.snap
diff --git a/test/workers/repository/configured.spec.js b/test/workers/repository/configured.spec.ts
similarity index 75%
rename from test/workers/repository/configured.spec.js
rename to test/workers/repository/configured.spec.ts
index 1264df280e2bda263fc045a527586b5606e1f293..1977926e2d4b0f63f6338380760d6d718de4f009 100644
--- a/test/workers/repository/configured.spec.js
+++ b/test/workers/repository/configured.spec.ts
@@ -1,11 +1,10 @@
-const {
-  checkIfConfigured,
-} = require('../../../lib/workers/repository/configured');
+import { checkIfConfigured } from '../../../lib/workers/repository/configured';
+import { getConfig, RenovateConfig } from '../../util';
 
-let config;
+let config: RenovateConfig;
 beforeEach(() => {
   jest.resetAllMocks();
-  config = { ...require('../../config/config/_fixtures') };
+  config = getConfig;
 });
 
 describe('workers/repository/configured', () => {
diff --git a/test/workers/repository/error-config.spec.js b/test/workers/repository/error-config.spec.ts
similarity index 67%
rename from test/workers/repository/error-config.spec.js
rename to test/workers/repository/error-config.spec.ts
index 354f5cd8e4240e46662cc8082ec701f9320f742a..fab8668426de047818a28775d7a0b5e832fb7ff0 100644
--- a/test/workers/repository/error-config.spec.js
+++ b/test/workers/repository/error-config.spec.ts
@@ -1,14 +1,15 @@
-const {
-  raiseConfigWarningIssue,
-} = require('../../../lib/workers/repository/error-config');
+import { mock } from 'jest-mock-extended';
 
-/** @type any */
-const { platform } = require('../../../lib/platform');
+import { raiseConfigWarningIssue } from '../../../lib/workers/repository/error-config';
+import { RenovateConfig, getConfig, platform } from '../../util';
+import { Pr } from '../../../lib/platform';
 
-let config;
+jest.mock('../../../lib/platform');
+
+let config: RenovateConfig;
 beforeEach(() => {
   jest.resetAllMocks();
-  config = require('../../config/config/_fixtures');
+  config = getConfig;
 });
 
 describe('workers/repository/error-config', () => {
@@ -17,7 +18,7 @@ describe('workers/repository/error-config', () => {
       const error = new Error('config-validation');
       error.configFile = 'package.json';
       error.validationMessage = 'some-message';
-      platform.ensureIssue.mockReturnValue('created');
+      platform.ensureIssue.mockResolvedValueOnce('created');
       const res = await raiseConfigWarningIssue(config, error);
       expect(res).toBeUndefined();
     });
@@ -25,7 +26,7 @@ describe('workers/repository/error-config', () => {
       const error = new Error('config-validation');
       error.configFile = 'package.json';
       error.validationMessage = 'some-message';
-      platform.ensureIssue.mockReturnValue('created');
+      platform.ensureIssue.mockResolvedValueOnce('created');
       const res = await raiseConfigWarningIssue(
         { ...config, dryRun: true },
         error
@@ -36,7 +37,11 @@ describe('workers/repository/error-config', () => {
       const error = new Error('config-validation');
       error.configFile = 'package.json';
       error.validationMessage = 'some-message';
-      platform.getBranchPr.mockReturnValueOnce({ number: 1, state: 'open' });
+      platform.getBranchPr.mockResolvedValue({
+        ...mock<Pr>(),
+        number: 1,
+        state: 'open',
+      });
       const res = await raiseConfigWarningIssue(config, error);
       expect(res).toBeUndefined();
     });
@@ -44,7 +49,11 @@ describe('workers/repository/error-config', () => {
       const error = new Error('config-validation');
       error.configFile = 'package.json';
       error.validationMessage = 'some-message';
-      platform.getBranchPr.mockReturnValueOnce({ number: 1, state: 'open' });
+      platform.getBranchPr.mockResolvedValue({
+        ...mock<Pr>(),
+        number: 1,
+        state: 'open',
+      });
       const res = await raiseConfigWarningIssue(
         { ...config, dryRun: true },
         error
diff --git a/test/workers/repository/error.spec.js b/test/workers/repository/error.spec.ts
similarity index 94%
rename from test/workers/repository/error.spec.js
rename to test/workers/repository/error.spec.ts
index 504c41b26dcca036becd89aec05d93fa8cd29d13..0c72cb47318a90771124997266e21e313e7569c9 100644
--- a/test/workers/repository/error.spec.js
+++ b/test/workers/repository/error.spec.ts
@@ -1,11 +1,12 @@
 import handleError from '../../../lib/workers/repository/error';
+import { RenovateConfig, getConfig } from '../../util';
 
 jest.mock('../../../lib/workers/repository/error-config');
 
-let config;
+let config: RenovateConfig;
 beforeEach(() => {
   jest.resetAllMocks();
-  config = require('../../config/config/_fixtures');
+  config = getConfig;
 });
 
 describe('workers/repository/error', () => {
diff --git a/test/workers/repository/extract/manager-files.spec.ts b/test/workers/repository/extract/manager-files.spec.ts
index 766d1a979cd4da215a3450841ba3c02a63594a9b..4220a56faa6347d0e0c56288012745e62e4efe3c 100644
--- a/test/workers/repository/extract/manager-files.spec.ts
+++ b/test/workers/repository/extract/manager-files.spec.ts
@@ -1,7 +1,7 @@
 import { getManagerPackageFiles } from '../../../../lib/workers/repository/extract/manager-files';
 import * as _fileMatch from '../../../../lib/workers/repository/extract/file-match';
 import * as _dockerfile from '../../../../lib/manager/dockerfile';
-import { mocked, platform } from '../../../util';
+import { mocked, platform, getConfig } from '../../../util';
 import { RenovateConfig } from '../../../../lib/config';
 
 jest.mock('../../../../lib/workers/repository/extract/file-match');
@@ -15,7 +15,7 @@ describe('workers/repository/extract/manager-files', () => {
     let config: RenovateConfig;
     beforeEach(() => {
       jest.resetAllMocks();
-      config = { ...require('../../../config/config/_fixtures') };
+      config = getConfig;
     });
     it('returns empty of manager is disabled', async () => {
       const managerConfig = { manager: 'travis', enabled: false };
diff --git a/test/workers/repository/index.spec.js b/test/workers/repository/index.spec.js
deleted file mode 100644
index 26a16de3e7b6471d8194db18cd1d3c12d17cc7d9..0000000000000000000000000000000000000000
--- a/test/workers/repository/index.spec.js
+++ /dev/null
@@ -1,22 +0,0 @@
-const { renovateRepository } = require('../../../lib/workers/repository/index');
-/** @type any */
-const process = require('../../../lib/workers/repository/process');
-
-jest.mock('../../../lib/workers/repository/init');
-jest.mock('../../../lib/workers/repository/process');
-jest.mock('../../../lib/workers/repository/result');
-jest.mock('../../../lib/workers/repository/error');
-
-describe('workers/repository', () => {
-  describe('renovateRepository()', () => {
-    let config;
-    beforeEach(() => {
-      config = require('../../config/config/_fixtures');
-    });
-    it('runs', async () => {
-      process.processRepo = jest.fn(() => ({}));
-      const res = await renovateRepository(config);
-      expect(res).toMatchSnapshot();
-    });
-  });
-});
diff --git a/test/workers/repository/index.spec.ts b/test/workers/repository/index.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9cce00c58ad5eaafc6d851c667fd80a20b8012b8
--- /dev/null
+++ b/test/workers/repository/index.spec.ts
@@ -0,0 +1,27 @@
+import { mock } from 'jest-mock-extended';
+
+import { renovateRepository } from '../../../lib/workers/repository/index';
+import * as _process from '../../../lib/workers/repository/process';
+import { mocked, RenovateConfig, getConfig } from '../../util';
+import { ExtractAndUpdateResult } from '../../../lib/workers/repository/process/extract-update';
+
+const process = mocked(_process);
+
+jest.mock('../../../lib/workers/repository/init');
+jest.mock('../../../lib/workers/repository/process');
+jest.mock('../../../lib/workers/repository/result');
+jest.mock('../../../lib/workers/repository/error');
+
+describe('workers/repository', () => {
+  describe('renovateRepository()', () => {
+    let config: RenovateConfig;
+    beforeEach(() => {
+      config = getConfig;
+    });
+    it('runs', async () => {
+      process.processRepo.mockResolvedValue(mock<ExtractAndUpdateResult>());
+      const res = await renovateRepository(config);
+      expect(res).toMatchSnapshot();
+    });
+  });
+});
diff --git a/test/workers/repository/master-issue.spec.js b/test/workers/repository/master-issue.spec.ts
similarity index 76%
rename from test/workers/repository/master-issue.spec.js
rename to test/workers/repository/master-issue.spec.ts
index 668d70c3ad963cae672fcaefdd9c9da21dce2342..cde7b50edf57ff72a598c3d59ae5ebdf094b21a0 100644
--- a/test/workers/repository/master-issue.spec.js
+++ b/test/workers/repository/master-issue.spec.ts
@@ -1,21 +1,22 @@
-const fs = require('fs');
-const masterIssue = require('../../../lib/workers/repository/master-issue');
+import fs from 'fs';
+import { mock } from 'jest-mock-extended';
 
-/** @type any */
-const { platform } = require('../../../lib/platform');
+import * as masterIssue from '../../../lib/workers/repository/master-issue';
+import { RenovateConfig, getConfig, platform } from '../../util';
+import { BranchConfig, PrUpgrade } from '../../../lib/workers/common';
+import { Pr } from '../../../lib/platform';
 
-/** @type any */
-let config;
+let config: RenovateConfig;
 beforeEach(() => {
   jest.resetAllMocks();
-  config = { ...require('../../config/config/_fixtures') };
+  config = getConfig();
   config.platform = 'github';
   config.errors = [];
   config.warnings = [];
 });
 
 async function dryRun(
-  branches,
+  branches: BranchConfig[],
   // eslint-disable-next-line no-shadow
   platform,
   ensureIssueClosingCalls = 0,
@@ -37,7 +38,7 @@ async function dryRun(
 describe('workers/repository/master-issue', () => {
   describe('ensureMasterIssue()', () => {
     it('do nothing if masterissue is disable', async () => {
-      const branches = [];
+      const branches: BranchConfig[] = [];
       await masterIssue.ensureMasterIssue(config, branches);
       expect(platform.ensureIssueClosing).toHaveBeenCalledTimes(0);
       expect(platform.ensureIssue).toHaveBeenCalledTimes(0);
@@ -51,9 +52,11 @@ describe('workers/repository/master-issue', () => {
     it('do nothing if it has no masterissueapproval branches', async () => {
       const branches = [
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr1',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr2',
           masterIssueApproval: false,
         },
@@ -69,7 +72,7 @@ describe('workers/repository/master-issue', () => {
     });
 
     it('closes master issue when there is 0 PR opened and masterIssueAutoclose is true', async () => {
-      const branches = [];
+      const branches: BranchConfig[] = [];
       config.masterIssue = true;
       config.masterIssueAutoclose = true;
       await masterIssue.ensureMasterIssue(config, branches);
@@ -87,11 +90,9 @@ describe('workers/repository/master-issue', () => {
 
     it('closes master issue when all branches are automerged and masterIssueAutoclose is true', async () => {
       const branches = [
+        { ...mock<BranchConfig>(), prTitle: 'pr1', res: 'automerged' },
         {
-          prTitle: 'pr1',
-          res: 'automerged',
-        },
-        {
+          ...mock<BranchConfig>(),
           prTitle: 'pr2',
           res: 'automerged',
           masterIssueApproval: false,
@@ -113,7 +114,7 @@ describe('workers/repository/master-issue', () => {
     });
 
     it('open or update master issue when all branches are closed and masterIssueAutoclose is false', async () => {
-      const branches = [];
+      const branches: BranchConfig[] = [];
       config.masterIssue = true;
       await masterIssue.ensureMasterIssue(config, branches);
       expect(platform.ensureIssueClosing).toHaveBeenCalledTimes(0);
@@ -134,50 +135,58 @@ describe('workers/repository/master-issue', () => {
     it('checks an issue with 2 Pending Approvals, 2 not scheduled, 2 pr-hourly-limit-reached and 2 in error', async () => {
       const branches = [
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr1',
-          upgrades: [{ depName: 'dep1' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep1' }],
           res: 'needs-approval',
           branchName: 'branchName1',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr2',
-          upgrades: [{ depName: 'dep2' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep2' }],
           res: 'needs-approval',
           branchName: 'branchName2',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr3',
-          upgrades: [{ depName: 'dep3' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep3' }],
           res: 'not-scheduled',
           branchName: 'branchName3',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr4',
-          upgrades: [{ depName: 'dep4' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep4' }],
           res: 'not-scheduled',
           branchName: 'branchName4',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr5',
-          upgrades: [{ depName: 'dep5' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep5' }],
           res: 'pr-hourly-limit-reached',
           branchName: 'branchName5',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr6',
-          upgrades: [{ depName: 'dep6' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep6' }],
           res: 'pr-hourly-limit-reached',
           branchName: 'branchName6',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr7',
-          upgrades: [{ depName: 'dep7' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep7' }],
           res: 'error',
           branchName: 'branchName7',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr8',
-          upgrades: [{ depName: 'dep8' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep8' }],
           res: 'error',
           branchName: 'branchName8',
         },
@@ -205,21 +214,27 @@ describe('workers/repository/master-issue', () => {
     it('checks an issue with 2 PR pr-edited', async () => {
       const branches = [
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr1',
-          upgrades: [{ depName: 'dep1' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep1' }],
           res: 'pr-edited',
           branchName: 'branchName1',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr2',
-          upgrades: [{ depName: 'dep2' }, { depName: 'dep3' }],
+          upgrades: [
+            { ...mock<PrUpgrade>(), depName: 'dep2' },
+            { ...mock<PrUpgrade>(), depName: 'dep3' },
+          ],
           res: 'pr-edited',
           branchName: 'branchName2',
         },
       ];
       config.masterIssue = true;
-      platform.getBranchPr.mockReturnValueOnce({ number: 1 });
-      platform.getBranchPr.mockReturnValueOnce(undefined);
+      platform.getBranchPr
+        .mockResolvedValueOnce({ ...mock<Pr>(), number: 1 })
+        .mockResolvedValueOnce(undefined);
       await masterIssue.ensureMasterIssue(config, branches);
       expect(platform.ensureIssueClosing).toHaveBeenCalledTimes(0);
       expect(platform.ensureIssue).toHaveBeenCalledTimes(1);
@@ -244,28 +259,35 @@ describe('workers/repository/master-issue', () => {
     it('checks an issue with 3 PR in progress and rebase all option', async () => {
       const branches = [
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr1',
-          upgrades: [{ depName: 'dep1' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep1' }],
           res: 'rebase',
           branchName: 'branchName1',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr2',
-          upgrades: [{ depName: 'dep2' }, { depName: 'dep3' }],
+          upgrades: [
+            { ...mock<PrUpgrade>(), depName: 'dep2' },
+            { ...mock<PrUpgrade>(), depName: 'dep3' },
+          ],
           res: 'rebase',
           branchName: 'branchName2',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr3',
-          upgrades: [{ depName: 'dep3' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep3' }],
           res: 'rebase',
           branchName: 'branchName3',
         },
       ];
       config.masterIssue = true;
-      platform.getBranchPr.mockReturnValueOnce({ number: 1 });
-      platform.getBranchPr.mockReturnValueOnce(undefined);
-      platform.getBranchPr.mockReturnValueOnce({ number: 3 });
+      platform.getBranchPr
+        .mockResolvedValueOnce({ ...mock<Pr>(), number: 1 })
+        .mockResolvedValueOnce(undefined)
+        .mockResolvedValueOnce({ ...mock<Pr>(), number: 3 });
       await masterIssue.ensureMasterIssue(config, branches);
       expect(platform.ensureIssueClosing).toHaveBeenCalledTimes(0);
       expect(platform.ensureIssue).toHaveBeenCalledTimes(1);
@@ -291,22 +313,28 @@ describe('workers/repository/master-issue', () => {
     it('checks an issue with 2 PR closed / ignored', async () => {
       const branches = [
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr1',
-          upgrades: [{ depName: 'dep1' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep1' }],
           res: 'already-existed',
           branchName: 'branchName1',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr2',
-          upgrades: [{ depName: 'dep2' }, { depName: 'dep3' }],
+          upgrades: [
+            { ...mock<PrUpgrade>(), depName: 'dep2' },
+            { ...mock<PrUpgrade>(), depName: 'dep3' },
+          ],
           res: 'already-existed',
           branchName: 'branchName2',
         },
       ];
       config.masterIssue = true;
-      platform.getBranchPr.mockReturnValueOnce({ number: 1 });
-      platform.getBranchPr.mockReturnValueOnce(undefined);
-      platform.getBranchPr.mockReturnValueOnce({ number: 3 });
+      platform.getBranchPr
+        .mockResolvedValueOnce({ ...mock<Pr>(), number: 1 })
+        .mockResolvedValueOnce(undefined)
+        .mockResolvedValueOnce({ ...mock<Pr>(), number: 3 });
       await masterIssue.ensureMasterIssue(config, branches);
       expect(platform.ensureIssueClosing).toHaveBeenCalledTimes(0);
       expect(platform.ensureIssue).toHaveBeenCalledTimes(1);
@@ -335,26 +363,33 @@ describe('workers/repository/master-issue', () => {
     it('checks an issue with 3 PR in approval', async () => {
       const branches = [
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr1',
-          upgrades: [{ depName: 'dep1' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep1' }],
           res: 'needs-pr-approval',
           branchName: 'branchName1',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr2',
-          upgrades: [{ depName: 'dep2' }, { depName: 'dep3' }],
+          upgrades: [
+            { ...mock<PrUpgrade>(), depName: 'dep2' },
+            { ...mock<PrUpgrade>(), depName: 'dep3' },
+          ],
           res: 'needs-pr-approval',
           branchName: 'branchName2',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr3',
-          upgrades: [{ depName: 'dep3' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep3' }],
           res: 'needs-pr-approval',
           branchName: 'branchName3',
         },
         {
+          ...mock<BranchConfig>(),
           prTitle: 'pr4',
-          upgrades: [{ depName: 'dep4' }],
+          upgrades: [{ ...mock<PrUpgrade>(), depName: 'dep4' }],
           res: 'pending',
           branchName: 'branchName4',
         },
diff --git a/test/workers/repository/onboarding/branch/__snapshots__/index.spec.js.snap b/test/workers/repository/onboarding/branch/__snapshots__/index.spec.ts.snap
similarity index 100%
rename from test/workers/repository/onboarding/branch/__snapshots__/index.spec.js.snap
rename to test/workers/repository/onboarding/branch/__snapshots__/index.spec.ts.snap
diff --git a/test/workers/repository/onboarding/branch/index.spec.js b/test/workers/repository/onboarding/branch/index.spec.ts
similarity index 69%
rename from test/workers/repository/onboarding/branch/index.spec.js
rename to test/workers/repository/onboarding/branch/index.spec.ts
index 8e9cb59ccc7129be28cc75dc1c18c7187d65648b..cb7073bc41c44e41a842f3f32250c6f779716346 100644
--- a/test/workers/repository/onboarding/branch/index.spec.js
+++ b/test/workers/repository/onboarding/branch/index.spec.ts
@@ -1,21 +1,17 @@
-const defaultConfig = require('../../../../../lib/config/defaults').getConfig();
-const {
-  checkOnboardingBranch,
-} = require('../../../../../lib/workers/repository/onboarding/branch');
-/** @type any */
-const { platform } = require('../../../../../lib/platform');
+import { mock } from 'jest-mock-extended';
+import { RenovateConfig, platform, getConfig } from '../../../../util';
+import { checkOnboardingBranch } from '../../../../../lib/workers/repository/onboarding/branch';
+import { Pr } from '../../../../../lib/platform';
 
 jest.mock('../../../../../lib/workers/repository/onboarding/branch/rebase');
 
 describe('workers/repository/onboarding/branch', () => {
   describe('checkOnboardingBranch', () => {
-    let config;
+    let config: RenovateConfig;
     beforeEach(() => {
       jest.resetAllMocks();
-      config = {
-        ...defaultConfig,
-      };
-      platform.getFileList.mockReturnValue([]);
+      config = getConfig();
+      platform.getFileList.mockResolvedValue([]);
     });
     it('throws if no package files', async () => {
       await expect(checkOnboardingBranch(config)).rejects.toThrow();
@@ -33,45 +29,45 @@ describe('workers/repository/onboarding/branch', () => {
     it('handles skipped onboarding, requireConfig=true, and a config file', async () => {
       config.requireConfig = true;
       config.onboarding = false;
-      platform.getFileList.mockReturnValueOnce(['renovate.json']);
+      platform.getFileList.mockResolvedValueOnce(['renovate.json']);
       const res = await checkOnboardingBranch(config);
       expect(res.repoIsOnboarded).toBe(true);
     });
     it('handles skipped onboarding, requireConfig=true, and no config file', async () => {
       config.requireConfig = true;
       config.onboarding = false;
-      platform.getFileList.mockReturnValueOnce(['package.json']);
-      platform.getFile.mockReturnValueOnce('{}');
+      platform.getFileList.mockResolvedValueOnce(['package.json']);
+      platform.getFile.mockResolvedValueOnce('{}');
       const onboardingResult = checkOnboardingBranch(config);
       await expect(onboardingResult).rejects.toThrow('disabled');
     });
     it('detects repo is onboarded via file', async () => {
-      platform.getFileList.mockReturnValueOnce(['renovate.json']);
+      platform.getFileList.mockResolvedValueOnce(['renovate.json']);
       const res = await checkOnboardingBranch(config);
       expect(res.repoIsOnboarded).toBe(true);
     });
     it('detects repo is onboarded via package.json config', async () => {
-      platform.getFileList.mockReturnValueOnce(['package.json']);
-      platform.getFile.mockReturnValueOnce('{"renovate":{}}');
+      platform.getFileList.mockResolvedValueOnce(['package.json']);
+      platform.getFile.mockResolvedValueOnce('{"renovate":{}}');
       const res = await checkOnboardingBranch(config);
       expect(res.repoIsOnboarded).toBe(true);
     });
     it('detects repo is onboarded via PR', async () => {
       config.requireConfig = false;
-      platform.findPr.mockReturnValue(true);
+      platform.findPr.mockResolvedValueOnce(mock<Pr>());
       const res = await checkOnboardingBranch(config);
       expect(res.repoIsOnboarded).toBe(true);
     });
     it('throws if no required config', async () => {
       config.requireConfig = true;
-      platform.findPr.mockReturnValue(true);
-      platform.getPrList.mockReturnValueOnce([
-        { branchName: 'renovate/something', state: 'open' },
+      platform.findPr.mockResolvedValue(mock<Pr>());
+      platform.getPrList.mockResolvedValueOnce([
+        { ...mock<Pr>(), branchName: 'renovate/something', state: 'open' },
       ]);
       await expect(checkOnboardingBranch(config)).rejects.toThrow();
     });
     it('creates onboarding branch with greenkeeper migration', async () => {
-      platform.getFileList.mockReturnValue(['package.json']);
+      platform.getFileList.mockResolvedValue(['package.json']);
       const pJsonContent = JSON.stringify({
         name: 'some-name',
         version: '0.0.1',
@@ -81,16 +77,16 @@ describe('workers/repository/onboarding/branch', () => {
           ignore: ['foo', 'bar'],
         },
       });
-      platform.getFile.mockReturnValue(pJsonContent);
+      platform.getFile.mockResolvedValue(pJsonContent);
       await checkOnboardingBranch(config);
       expect(
         platform.commitFilesToBranch.mock.calls[0][0].files[0].contents
       ).toMatchSnapshot();
     });
     it('updates onboarding branch', async () => {
-      platform.getFileList.mockReturnValue(['package.json']);
-      platform.findPr.mockReturnValueOnce(null);
-      platform.getBranchPr.mockReturnValueOnce({});
+      platform.getFileList.mockResolvedValue(['package.json']);
+      platform.findPr.mockResolvedValue(null);
+      platform.getBranchPr.mockResolvedValueOnce(mock<Pr>());
       const res = await checkOnboardingBranch(config);
       expect(res.repoIsOnboarded).toBe(false);
       expect(res.branchList).toEqual(['renovate/configure']);
diff --git a/test/workers/repository/onboarding/branch/rebase.spec.js b/test/workers/repository/onboarding/branch/rebase.spec.ts
similarity index 60%
rename from test/workers/repository/onboarding/branch/rebase.spec.js
rename to test/workers/repository/onboarding/branch/rebase.spec.ts
index 98978e1421227079822e9817706bf15b2d6e6345..1449f2ba63de8591e2142041a51b63a2104ea09c 100644
--- a/test/workers/repository/onboarding/branch/rebase.spec.js
+++ b/test/workers/repository/onboarding/branch/rebase.spec.ts
@@ -1,14 +1,11 @@
-const defaultConfig = require('../../../../../lib/config/defaults').getConfig();
-const {
-  rebaseOnboardingBranch,
-} = require('../../../../../lib/workers/repository/onboarding/branch/rebase');
-
-/** @type any */
-const { platform } = require('../../../../../lib/platform');
+import { mock } from 'jest-mock-extended';
+import { RenovateConfig, defaultConfig, platform } from '../../../../util';
+import { rebaseOnboardingBranch } from '../../../../../lib/workers/repository/onboarding/branch/rebase';
+import { Pr } from '../../../../../lib/platform';
 
 describe('workers/repository/onboarding/branch/rebase', () => {
   describe('rebaseOnboardingBranch()', () => {
-    let config;
+    let config: RenovateConfig;
     beforeEach(() => {
       jest.resetAllMocks();
       config = {
@@ -16,7 +13,8 @@ describe('workers/repository/onboarding/branch/rebase', () => {
       };
     });
     it('does not rebase modified branch', async () => {
-      platform.getBranchPr.mockReturnValueOnce({
+      platform.getBranchPr.mockResolvedValueOnce({
+        ...mock<Pr>(),
         isModified: true,
       });
       await rebaseOnboardingBranch(config);
@@ -25,9 +23,11 @@ describe('workers/repository/onboarding/branch/rebase', () => {
     it('does nothing if branch is up to date', async () => {
       const contents =
         JSON.stringify(defaultConfig.onboardingConfig, null, 2) + '\n';
-      platform.getFile.mockReturnValueOnce(contents); // package.json
-      platform.getFile.mockReturnValueOnce(contents); // renovate.json
-      platform.getBranchPr.mockReturnValueOnce({
+      platform.getFile
+        .mockResolvedValueOnce(contents) // package.json
+        .mockResolvedValueOnce(contents); // renovate.json
+      platform.getBranchPr.mockResolvedValueOnce({
+        ...mock<Pr>(),
         isModified: false,
         isStale: false,
       });
@@ -35,7 +35,8 @@ describe('workers/repository/onboarding/branch/rebase', () => {
       expect(platform.commitFilesToBranch).toHaveBeenCalledTimes(0);
     });
     it('rebases onboarding branch', async () => {
-      platform.getBranchPr.mockReturnValueOnce({
+      platform.getBranchPr.mockResolvedValueOnce({
+        ...mock<Pr>(),
         isStale: true,
         isModified: false,
       });
diff --git a/test/workers/repository/onboarding/pr/__snapshots__/base-branch.spec.js.snap b/test/workers/repository/onboarding/pr/__snapshots__/base-branch.spec.ts.snap
similarity index 100%
rename from test/workers/repository/onboarding/pr/__snapshots__/base-branch.spec.js.snap
rename to test/workers/repository/onboarding/pr/__snapshots__/base-branch.spec.ts.snap
diff --git a/test/workers/repository/onboarding/pr/__snapshots__/config-description.spec.js.snap b/test/workers/repository/onboarding/pr/__snapshots__/config-description.spec.ts.snap
similarity index 100%
rename from test/workers/repository/onboarding/pr/__snapshots__/config-description.spec.js.snap
rename to test/workers/repository/onboarding/pr/__snapshots__/config-description.spec.ts.snap
diff --git a/test/workers/repository/onboarding/pr/__snapshots__/errors-warnings.spec.js.snap b/test/workers/repository/onboarding/pr/__snapshots__/errors-warnings.spec.ts.snap
similarity index 100%
rename from test/workers/repository/onboarding/pr/__snapshots__/errors-warnings.spec.js.snap
rename to test/workers/repository/onboarding/pr/__snapshots__/errors-warnings.spec.ts.snap
diff --git a/test/workers/repository/onboarding/pr/base-branch.spec.js b/test/workers/repository/onboarding/pr/base-branch.spec.ts
similarity index 65%
rename from test/workers/repository/onboarding/pr/base-branch.spec.js
rename to test/workers/repository/onboarding/pr/base-branch.spec.ts
index 7b6edc92b50da24ce9182af820dedf83add103fc..43631ea468f7cebb91d95d904c486d74a7f9fafc 100644
--- a/test/workers/repository/onboarding/pr/base-branch.spec.js
+++ b/test/workers/repository/onboarding/pr/base-branch.spec.ts
@@ -1,17 +1,13 @@
-const defaultConfig = require('../../../../../lib/config/defaults').getConfig();
+import { RenovateConfig, getConfig } from '../../../../util';
 
-const {
-  getBaseBranchDesc,
-} = require('../../../../../lib/workers/repository/onboarding/pr/base-branch');
+import { getBaseBranchDesc } from '../../../../../lib/workers/repository/onboarding/pr/base-branch';
 
 describe('workers/repository/onboarding/pr/base-branch', () => {
   describe('getBaseBranchDesc()', () => {
-    let config;
+    let config: RenovateConfig;
     beforeEach(() => {
       jest.resetAllMocks();
-      config = {
-        ...defaultConfig,
-      };
+      config = getConfig();
     });
     it('returns empty if no baseBranch', () => {
       const res = getBaseBranchDesc(config);
diff --git a/test/workers/repository/onboarding/pr/config-description.spec.js b/test/workers/repository/onboarding/pr/config-description.spec.ts
similarity index 84%
rename from test/workers/repository/onboarding/pr/config-description.spec.js
rename to test/workers/repository/onboarding/pr/config-description.spec.ts
index dbd3b7a02250db153459aa96c92375e61b1bf126..4cc1cb2de24e56e45307d254f2c16b2eb6a8996c 100644
--- a/test/workers/repository/onboarding/pr/config-description.spec.js
+++ b/test/workers/repository/onboarding/pr/config-description.spec.ts
@@ -1,17 +1,13 @@
-const defaultConfig = require('../../../../../lib/config/defaults').getConfig();
+import { RenovateConfig, getConfig } from '../../../../util';
 
-const {
-  getConfigDesc,
-} = require('../../../../../lib/workers/repository/onboarding/pr/config-description');
+import { getConfigDesc } from '../../../../../lib/workers/repository/onboarding/pr/config-description';
 
 describe('workers/repository/onboarding/pr/config-description', () => {
   describe('getConfigDesc()', () => {
-    let config;
+    let config: RenovateConfig;
     beforeEach(() => {
       jest.resetAllMocks();
-      config = {
-        ...defaultConfig,
-      };
+      config = getConfig();
     });
     it('returns empty', () => {
       delete config.description;
@@ -48,6 +44,7 @@ describe('workers/repository/onboarding/pr/config-description', () => {
       expect(res.indexOf('Docker-only')).toBe(-1);
     });
     it('assignees, labels and schedule', () => {
+      delete config.description;
       config.packageFiles = [];
       config.assignees = ['someone', '@someone-else'];
       config.labels = ['renovate', 'deps'];
diff --git a/test/workers/repository/onboarding/pr/errors-warnings.spec.js b/test/workers/repository/onboarding/pr/errors-warnings.spec.ts
similarity index 85%
rename from test/workers/repository/onboarding/pr/errors-warnings.spec.js
rename to test/workers/repository/onboarding/pr/errors-warnings.spec.ts
index bbdfd32e7a2f76d803e33feee5af79a21035b880..8113863494596e6cea663613cc4ac2ecedcad038 100644
--- a/test/workers/repository/onboarding/pr/errors-warnings.spec.js
+++ b/test/workers/repository/onboarding/pr/errors-warnings.spec.ts
@@ -1,19 +1,17 @@
-const defaultConfig = require('../../../../../lib/config/defaults').getConfig();
+import { RenovateConfig, getConfig } from '../../../../util';
 
-const {
+import {
   getWarnings,
   getErrors,
   getDepWarnings,
-} = require('../../../../../lib/workers/repository/onboarding/pr/errors-warnings');
+} from '../../../../../lib/workers/repository/onboarding/pr/errors-warnings';
 
 describe('workers/repository/onboarding/pr/errors-warnings', () => {
   describe('getWarnings()', () => {
-    let config;
+    let config: RenovateConfig;
     beforeEach(() => {
       jest.resetAllMocks();
-      config = {
-        ...defaultConfig,
-      };
+      config = getConfig();
     });
     it('returns warning text', () => {
       config.warnings = [
@@ -67,12 +65,10 @@ describe('workers/repository/onboarding/pr/errors-warnings', () => {
     });
   });
   describe('getErrors()', () => {
-    let config;
+    let config: RenovateConfig;
     beforeEach(() => {
       jest.resetAllMocks();
-      config = {
-        ...defaultConfig,
-      };
+      config = getConfig();
     });
     it('returns error text', () => {
       config.errors = [
diff --git a/test/workers/repository/onboarding/pr/index.spec.js b/test/workers/repository/onboarding/pr/index.spec.ts
similarity index 91%
rename from test/workers/repository/onboarding/pr/index.spec.js
rename to test/workers/repository/onboarding/pr/index.spec.ts
index 80ae3dd6b55f78090552b13ee71fd5179704a106..4924baa230000a7e455a56cf099a45e2d12e1003 100644
--- a/test/workers/repository/onboarding/pr/index.spec.js
+++ b/test/workers/repository/onboarding/pr/index.spec.ts
@@ -1,4 +1,5 @@
-const defaultConfig = require('../../../../../lib/config/defaults').getConfig();
+import { RenovateConfig, defaultConfig } from '../../../../util';
+import { BranchConfig } from '../../../../../lib/workers/common';
 
 const {
   ensureOnboardingPr,
@@ -9,9 +10,9 @@ const { platform } = require('../../../../../lib/platform');
 
 describe('workers/repository/onboarding/pr', () => {
   describe('ensureOnboardingPr()', () => {
-    let config;
+    let config: RenovateConfig;
     let packageFiles;
-    let branches;
+    let branches: BranchConfig[];
     beforeEach(() => {
       jest.resetAllMocks();
       config = {
@@ -25,7 +26,7 @@ describe('workers/repository/onboarding/pr', () => {
       platform.getPrBody = jest.fn(input => input);
       platform.createPr.mockReturnValue({});
     });
-    let createPrBody;
+    let createPrBody: string;
     it('returns if onboarded', async () => {
       config.repoIsOnboarded = true;
       await ensureOnboardingPr(config, packageFiles, branches);
diff --git a/test/workers/repository/result.spec.js b/test/workers/repository/result.spec.ts
similarity index 54%
rename from test/workers/repository/result.spec.js
rename to test/workers/repository/result.spec.ts
index b739e56736c3986b1e9700289b436cadbe0a22a2..dd35e8db8764842e6faf51102a11a1b971e16b7b 100644
--- a/test/workers/repository/result.spec.js
+++ b/test/workers/repository/result.spec.ts
@@ -1,9 +1,10 @@
-const { processResult } = require('../../../lib/workers/repository/result');
+import { processResult } from '../../../lib/workers/repository/result';
+import { RenovateConfig, getConfig } from '../../util';
 
-let config;
+let config: RenovateConfig;
 beforeEach(() => {
   jest.resetAllMocks();
-  config = require('../../config/config/_fixtures');
+  config = getConfig;
 });
 
 describe('workers/repository/result', () => {
diff --git a/test/workers/repository/updates/__snapshots__/generate.spec.js.snap b/test/workers/repository/updates/__snapshots__/generate.spec.ts.snap
similarity index 100%
rename from test/workers/repository/updates/__snapshots__/generate.spec.js.snap
rename to test/workers/repository/updates/__snapshots__/generate.spec.ts.snap
diff --git a/test/workers/repository/updates/branchify.spec.js b/test/workers/repository/updates/branchify.spec.ts
similarity index 84%
rename from test/workers/repository/updates/branchify.spec.js
rename to test/workers/repository/updates/branchify.spec.ts
index 19e32e427b3f5981efa8f7b2e7da651eed1b3aa2..d99b621888d265c64b2e8904e49f6c5ddf6c8152 100644
--- a/test/workers/repository/updates/branchify.spec.js
+++ b/test/workers/repository/updates/branchify.spec.ts
@@ -1,31 +1,28 @@
-/** @type any */
-let config;
+import { RenovateConfig, mocked } from '../../../util';
+import { branchifyUpgrades } from '../../../../lib/workers/repository/updates/branchify';
+import * as _flatten from '../../../../lib/workers/repository/updates/flatten';
+import { BranchConfig } from '../../../../lib/workers/common';
+import { getConfig } from '../../../../lib/config/defaults';
+
+const flattenUpdates = mocked(_flatten).flattenUpdates;
+jest.mock('../../../../lib/workers/repository/updates/flatten');
+
+let config: RenovateConfig;
 beforeEach(() => {
   jest.resetAllMocks();
-  config = { ...require('../../../config/config/_fixtures') };
+  config = getConfig();
   config.errors = [];
   config.warnings = [];
 });
 
-const {
-  branchifyUpgrades,
-} = require('../../../../lib/workers/repository/updates/branchify');
-
-/** @type any */
-const {
-  flattenUpdates,
-} = require('../../../../lib/workers/repository/updates/flatten');
-
-jest.mock('../../../../lib/workers/repository/updates/flatten');
-
 describe('workers/repository/updates/branchify', () => {
   describe('branchifyUpgrades()', () => {
-    it('returns empty', async () => {
+    it('returns empty', () => {
       flattenUpdates.mockReturnValueOnce([]);
-      const res = await branchifyUpgrades(config, {});
+      const res = branchifyUpgrades(config, {});
       expect(res.branches).toEqual([]);
     });
-    it('returns one branch if one input', async () => {
+    it('returns one branch if one input', () => {
       flattenUpdates.mockReturnValueOnce([
         {
           depName: 'foo',
@@ -36,12 +33,12 @@ describe('workers/repository/updates/branchify', () => {
         },
       ]);
       config.repoIsOnboarded = true;
-      const res = await branchifyUpgrades(config, {});
+      const res = branchifyUpgrades(config, {});
       expect(Object.keys(res.branches)).toHaveLength(1);
       expect(res.branches[0].isMinor).toBe(true);
       expect(res.branches[0].upgrades[0].isMinor).toBe(true);
     });
-    it('uses major/minor/patch slugs', async () => {
+    it('uses major/minor/patch slugs', () => {
       flattenUpdates.mockReturnValueOnce([
         {
           depName: 'foo',
@@ -89,7 +86,7 @@ describe('workers/repository/updates/branchify', () => {
         },
       ]);
       config.repoIsOnboarded = true;
-      const res = await branchifyUpgrades(config, {});
+      const res = branchifyUpgrades(config, {});
       expect(Object.keys(res.branches)).toHaveLength(4);
       expect(res.branches[0].isMajor).toBe(true);
       expect(res.branches[0].groupSlug).toBe(`major-some-packages`);
@@ -100,7 +97,7 @@ describe('workers/repository/updates/branchify', () => {
       expect(res.branches[3].isMajor).toBe(true);
       expect(res.branches[3].groupSlug).toBe(`major-2-other-packages`);
     });
-    it('does not group if different compiled branch names', async () => {
+    it('does not group if different compiled branch names', () => {
       flattenUpdates.mockReturnValueOnce([
         {
           depName: 'foo',
@@ -121,10 +118,10 @@ describe('workers/repository/updates/branchify', () => {
           prTitle: 'some-title',
         },
       ]);
-      const res = await branchifyUpgrades(config, {});
+      const res = branchifyUpgrades(config, {});
       expect(Object.keys(res.branches)).toHaveLength(3);
     });
-    it('groups if same compiled branch names', async () => {
+    it('groups if same compiled branch names', () => {
       flattenUpdates.mockReturnValueOnce([
         {
           depName: 'foo',
@@ -145,10 +142,10 @@ describe('workers/repository/updates/branchify', () => {
           prTitle: 'some-title',
         },
       ]);
-      const res = await branchifyUpgrades(config, {});
+      const res = branchifyUpgrades(config, {});
       expect(Object.keys(res.branches)).toHaveLength(2);
     });
-    it('groups if same compiled group name', async () => {
+    it('groups if same compiled group name', () => {
       flattenUpdates.mockReturnValueOnce([
         {
           depName: 'foo',
@@ -173,10 +170,10 @@ describe('workers/repository/updates/branchify', () => {
           group: { branchName: 'renovate/my-group' },
         },
       ]);
-      const res = await branchifyUpgrades(config, {});
+      const res = branchifyUpgrades(config, {});
       expect(Object.keys(res.branches)).toHaveLength(2);
     });
-    it('enforces valid git branch name', async () => {
+    it('enforces valid git branch name', () => {
       const fixtures = [
         {
           upgrade: {
@@ -240,8 +237,8 @@ describe('workers/repository/updates/branchify', () => {
         fixtures.map(({ upgrade }) => upgrade)
       );
 
-      (await branchifyUpgrades(config, {})).branches.forEach(
-        ({ branchName }, index) => {
+      branchifyUpgrades(config, {}).branches.forEach(
+        ({ branchName }: BranchConfig, index: number) => {
           expect(branchName).toBe(fixtures[index].expectedBranchName);
         }
       );
diff --git a/test/workers/repository/updates/flatten.spec.js b/test/workers/repository/updates/flatten.spec.ts
similarity index 91%
rename from test/workers/repository/updates/flatten.spec.js
rename to test/workers/repository/updates/flatten.spec.ts
index 2cde0443390482c2af964e3f73db3470a343f293..8d8a66346e4352a8553796d1615da45ad3e455b3 100644
--- a/test/workers/repository/updates/flatten.spec.js
+++ b/test/workers/repository/updates/flatten.spec.ts
@@ -1,12 +1,11 @@
-const {
-  flattenUpdates,
-} = require('../../../../lib/workers/repository/updates/flatten');
+import { RenovateConfig, getConfig } from '../../../util';
 
-/** @type any */
-let config;
+import { flattenUpdates } from '../../../../lib/workers/repository/updates/flatten';
+
+let config: RenovateConfig;
 beforeEach(() => {
   jest.resetAllMocks();
-  config = { ...require('../../../config/config/_fixtures') };
+  config = getConfig();
   config.errors = [];
   config.warnings = [];
 });
diff --git a/test/workers/repository/updates/generate.spec.js b/test/workers/repository/updates/generate.spec.ts
similarity index 98%
rename from test/workers/repository/updates/generate.spec.js
rename to test/workers/repository/updates/generate.spec.ts
index f74765d859aafc99d78f1e77487f8f43f3b82241..f68a68e72acb340f813b089b00ed3c779f9ede9b 100644
--- a/test/workers/repository/updates/generate.spec.js
+++ b/test/workers/repository/updates/generate.spec.ts
@@ -1,13 +1,10 @@
-const defaultConfig = require('../../../../lib/config/defaults').getConfig();
+import { defaultConfig } from '../../../util';
+import { generateBranchConfig } from '../../../../lib/workers/repository/updates/generate';
 
 beforeEach(() => {
   jest.resetAllMocks();
 });
 
-const {
-  generateBranchConfig,
-} = require('../../../../lib/workers/repository/updates/generate');
-
 describe('workers/repository/updates/generate', () => {
   describe('generateBranchConfig()', () => {
     it('does not group single upgrade', () => {
diff --git a/yarn.lock b/yarn.lock
index af0b067d333f6a7e2600e67a298d736053cca66f..4bb17c468cde0de034fa7ca3d9bd70b79e7c55d5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5008,6 +5008,13 @@ jest-message-util@^24.9.0:
     slash "^2.0.0"
     stack-utils "^1.0.1"
 
+jest-mock-extended@1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/jest-mock-extended/-/jest-mock-extended-1.0.7.tgz#25da632f569037330260b9c0171b21f42285a86e"
+  integrity sha512-2b/6quDLAOOz+WJy9OgV236Fh8Hb4VEta81huQsn+/tslgljeUIOYCWViWDENRHPKiIvuyYlYVG7+dT+SrWR/w==
+  dependencies:
+    ts-essentials "^4.0.0"
+
 jest-mock@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6"
@@ -9036,6 +9043,11 @@ trough@^1.0.0:
   resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.4.tgz#3b52b1f13924f460c3fbfd0df69b587dbcbc762e"
   integrity sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==
 
+ts-essentials@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-4.0.0.tgz#506c42b270bbd0465574b90416533175b09205ab"
+  integrity sha512-uQJX+SRY9mtbKU+g9kl5Fi7AEMofPCvHfJkQlaygpPmHPZrtgaBqbWFOYyiA47RhnSwwnXdepUJrgqUYxoUyhQ==
+
 tslib@^1.8.1, tslib@^1.9.0:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"