diff --git a/src/provisioner.ts b/src/provisioner.ts
index 6d863ced8a35ac198b1a5609c7659ac331607c05..ad5d4f982b827d7dbc667ee6c226da8bdeac4744 100644
--- a/src/provisioner.ts
+++ b/src/provisioner.ts
@@ -40,8 +40,8 @@ export class Provisioner {
 
         let responded = false;
         let resolve: (msg: string) => void;
-        let reject: (err: string) => void;
-        const deferP: Promise<string> = new Promise((res, rej) => {resolve = res; reject = rej;});
+        let reject: (err: Error) => void;
+        const deferP: Promise<string> = new Promise((res, rej) => {resolve = res; reject = rej; });
 
         const approveFn = (approved: boolean, expired = false) => {
             if (responded) {
@@ -54,9 +54,9 @@ export class Provisioner {
                 resolve("Approved");
             } else {
                 if (expired) {
-                    reject("Timed out waiting for a response from the Discord owners");
+                    reject(Error("Timed out waiting for a response from the Discord owners"));
                 } else {
-                    reject("The bridge has been declined by the Discord guild");
+                    reject(Error("The bridge has been declined by the Discord guild"));
                 }
             }
         };
diff --git a/test/mocks/channel.ts b/test/mocks/channel.ts
index 4b3097e329ed4fa0e0d50fed06ef2b5ebd285225..274169c5d01b791cf777176ff1de34719811c446 100644
--- a/test/mocks/channel.ts
+++ b/test/mocks/channel.ts
@@ -1,5 +1,6 @@
 import {MockMember} from "./member";
 import {MockCollection} from "./collection";
+import {Permissions, PermissionResolvable} from "discord.js";
 
 // we are a test file and thus need those
 /* tslint:disable:no-unused-expression max-file-line-count no-any */
@@ -14,7 +15,12 @@ export class MockChannel {
         public name: string = "",
         public topic: string = "",
     ) { }
+
     public async send(data: any): Promise<any> {
         return data;
     }
+
+    public permissionsFor(member: MockMember) {
+        return new Permissions(Permissions.FLAGS.MANAGE_WEBHOOKS as PermissionResolvable);
+    }
 }
diff --git a/test/test_provisioner.ts b/test/test_provisioner.ts
new file mode 100644
index 0000000000000000000000000000000000000000..561b4351f587033030daa45abb4a64f35d26c809
--- /dev/null
+++ b/test/test_provisioner.ts
@@ -0,0 +1,81 @@
+import * as Chai from "chai";
+import * as Discord from "discord.js";
+import * as Proxyquire from "proxyquire";
+
+import { Provisioner } from "../src/provisioner";
+import { MockChannel } from "./mocks/channel";
+import { MockMember } from "./mocks/member";
+
+// we are a test file and thus need those
+/* tslint:disable:no-any */
+
+const expect = Chai.expect;
+const INTERVAL = 250;
+let lastStatus = null;
+// const assert = Chai.assert;
+const bot = {
+    GetBotId: () => {
+        return "1234";
+    },
+    GetIntentFromDiscordMember: (member) => {
+        return {
+            getClient: () => {
+                return {
+                    setPresence: async (status) => {
+                        lastStatus = status;
+                    },
+                };
+            },
+        };
+    },
+};
+
+const TIMEOUT_MS = 1000;
+
+describe("Provisioner", () => {
+    describe("AskBridgePermission", () => {
+        it("should fail to bridge a room that timed out", async () => {
+            const p = new Provisioner();
+            const startAt = Date.now();
+            await p.AskBridgePermission(
+                new MockChannel("foo", "bar") as any,
+                "Mark",
+                TIMEOUT_MS,
+            ).then(() => {
+                throw Error("Should have thrown an error");
+            }).catch((err) => {
+                expect(err.message).to.eq("Timed out waiting for a response from the Discord owners");
+                const delay = Date.now() - startAt;
+                if (delay < TIMEOUT_MS) {
+                    throw Error(`Should have waited for timeout before resolving, waited: ${delay}ms`);
+                }
+            });
+        });
+        it("should fail to bridge a room that was declined", async () => {
+            const p = new Provisioner();
+            const promise = p.AskBridgePermission(
+                new MockChannel("foo", "bar") as any,
+                "Mark",
+                TIMEOUT_MS,
+            ).then(() => {
+                throw Error("Should have thrown an error");
+            }).catch((err) => {
+                expect(err.message).to.eq("The bridge has been declined by the Discord guild");
+            });
+            await p.MarkApproved(new MockChannel("foo", "bar") as any, new MockMember("abc", "Mark") as any, false);
+            await promise;
+        });
+        it("should bridge a room that was approved", async () => {
+            const p = new Provisioner();
+            const promise = p.AskBridgePermission(
+                new MockChannel("foo", "bar") as any,
+                "Mark",
+                TIMEOUT_MS,
+            ).then((msg) => {
+                expect(msg).to.eq("Approved");
+            });
+            await p.MarkApproved(new MockChannel("foo", "bar") as any, new MockMember("abc", "Mark") as any, true);
+            await promise;
+        });
+    });
+});