Repository: opsdroid/opsdroid

Issue:
Move GitHub connector into core
This issue covers adding the [GitHub connector](https://github.com/opsdroid/connector-github) to core.

## Background
A while ago we began moving connectors from external plugins into the core of the project (see #185 for more context). We started with [slack](https://github.com/opsdroid/opsdroid/blob/master/opsdroid/connector/slack/__init__.py) and [websockets](https://github.com/opsdroid/opsdroid/blob/master/opsdroid/connector/websocket/__init__.py) but need to go through all the other existing plugins and move them into the core.

## Steps

 - Make a new submodule directory in [`opsdroid.connector`](https://github.com/opsdroid/opsdroid/tree/master/opsdroid/connector) and copy the connector code over.
 - Update the [`requirements.txt`](https://github.com/opsdroid/opsdroid/blob/master/requirements.txt) with any dependencies from the connector if necessary.
 - Write tests for the connector. (See the [Slack connector tests](https://github.com/jacobtomlinson/opsdroid/blob/master/tests/test_connector_slack.py) for inspiration).
 - Copy the relevant information from the connector `README.md` into a [new documentation page](https://github.com/opsdroid/opsdroid/tree/master/docs/connectors).
 - Add the new page to the [mkdocs.yml](https://github.com/opsdroid/opsdroid/blob/master/mkdocs.yml).
 - Add to the [list of connectors](https://github.com/opsdroid/opsdroid/blob/master/docs/configuration-reference.md#connector-modules).
 - Add a deprecation notice to the old connector. (See [the slack connector](https://github.com/opsdroid/connector-slack))


Discussion:
@jacobtomlinson I am interested in taking a stab at this.
Hello @souravsingh please go ahead and work on this issue, let us know if you need any help 👍 
Hello @souravsingh how are you doing with this issue, do you need any help with it?
Hey @souravsingh I'm guessing you've not had time to work on this. If anyone else wants to take this up then please go ahead.
I have been getting busy with work. Let me create a WIP pull request.
@souravsingh That's no problem! I look forward to reviewing your PR.

Resolving patch:
diff --git a/opsdroid/connector/github/__init__.py b/opsdroid/connector/github/__init__.py
new file mode 100644
--- /dev/null
+++ b/opsdroid/connector/github/__init__.py
@@ -0,0 +1,114 @@
+"""A connector for GitHub."""
+import json
+import logging
+
+import aiohttp
+
+from opsdroid.connector import Connector
+from opsdroid.message import Message
+
+
+_LOGGER = logging.getLogger(__name__)
+GITHUB_API_URL = "https://api.github.com"
+
+
+class ConnectorGitHub(Connector):
+    """A connector for GitHub."""
+
+    def __init__(self, config):
+        """Create the connector."""
+        super().__init__(config)
+        logging.debug("Loaded GitHub connector")
+        self.config = config
+        try:
+            self.github_token = config["token"]
+        except KeyError:
+            _LOGGER.error("Missing auth token!"
+                          "You must set 'token' in your config")
+        self.name = self.config.get("name", "github")
+        self.default_room = None
+        self.opsdroid = None
+        self.github_username = None
+
+    async def connect(self, opsdroid):
+        """Connect to GitHub."""
+        self.opsdroid = opsdroid
+        url = '{}/user?access_token={}'.format(
+            GITHUB_API_URL, self.github_token)
+        async with aiohttp.ClientSession() as session:
+            response = await session.get(url)
+            if response.status >= 300:
+                _LOGGER.error("Error connecting to github: %s",
+                              response.text())
+                return False
+            _LOGGER.debug("Reading bot information...")
+            bot_data = await response.json()
+        _LOGGER.debug("Done.")
+        self.github_username = bot_data["login"]
+
+        self.opsdroid.web_server.web_app.router.add_post(
+            "/connector/{}".format(self.name),
+            self.github_message_handler)
+
+    async def disconnect(self, opsdroid):
+        """Disconnect from GitHub."""
+        pass
+
+    async def listen(self, opsdroid):
+        """Listen for new message."""
+        pass  # Listening is handled by the aiohttp web server
+
+    async def github_message_handler(self, request):
+        """Handle event from GitHub."""
+        req = await request.post()
+        payload = json.loads(req["payload"])
+        try:
+            if payload["action"] == "created" and "comment" in payload:
+                issue_number = payload["issue"]["number"]
+                body = payload["comment"]["body"]
+            elif payload["action"] == "opened" and "issue" in payload:
+                issue_number = payload["issue"]["number"]
+                body = payload["issue"]["body"]
+            elif payload["action"] == "opened" and "pull_request" in payload:
+                issue_number = payload["pull_request"]["number"]
+                body = payload["pull_request"]["body"]
+            else:
+                _LOGGER.debug("No message to respond to.")
+                _LOGGER.debug(payload)
+                return aiohttp.web.Response(
+                    text=json.dumps("No message to respond to."),
+                    status=200)
+
+            issue = "{}/{}#{}".format(payload["repository"]["owner"]["login"],
+                                      payload["repository"]["name"],
+                                      issue_number)
+            message = Message(body,
+                              payload["sender"]["login"],
+                              issue,
+                              self)
+            await self.opsdroid.parse(message)
+        except KeyError as error:
+            _LOGGER.error("Key %s not found in payload", error)
+            _LOGGER.debug(payload)
+        return aiohttp.web.Response(
+            text=json.dumps("Received"), status=201)
+
+    async def respond(self, message, room=None):
+        """Respond with a message."""
+        # stop immediately if the message is from the bot itself.
+        if message.user == self.github_username:
+            return True
+        _LOGGER.debug("Responding via GitHub")
+        repo, issue = message.room.split('#')
+        url = "{}/repos/{}/issues/{}/comments".format(
+            GITHUB_API_URL, repo, issue)
+        headers = {'Authorization': ' token {}'.format(self.github_token)}
+        async with aiohttp.ClientSession() as session:
+            resp = await session.post(url,
+                                      json={"body": message.text},
+                                      headers=headers)
+            if resp.status == 201:
+                _LOGGER.info("Message sent.")
+                return True
+            _LOGGER.error(await resp.json())
+            return False


Test patch:
diff --git a/tests/responses/github_comment_payload.json b/tests/responses/github_comment_payload.json
new file mode 100644
--- /dev/null
+++ b/tests/responses/github_comment_payload.json
@@ -0,0 +1,215 @@
+{
+    "action": "created",
+    "issue": {
+      "url": "https://api.github.com/repos/opsdroid/opsdroid/issues/237",
+      "repository_url": "https://api.github.com/repos/opsdroid/opsdroid",
+      "labels_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/237/labels{/name}",
+      "comments_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/237/comments",
+      "events_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/237/events",
+      "html_url": "https://github.com/opsdroid/opsdroid/issues/237",
+      "id": 261768248,
+      "node_id": "MDU6SXNzdWUyNjE3NjgyNDg=",
+      "number": 237,
+      "title": "test issue, please ignore",
+      "user": {
+        "login": "jacobtomlinson",
+        "id": 1610850,
+        "node_id": "MDQ6VXNlcjE2MTA4NTA=",
+        "avatar_url": "https://avatars3.githubusercontent.com/u/1610850?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/jacobtomlinson",
+        "html_url": "https://github.com/jacobtomlinson",
+        "followers_url": "https://api.github.com/users/jacobtomlinson/followers",
+        "following_url": "https://api.github.com/users/jacobtomlinson/following{/other_user}",
+        "gists_url": "https://api.github.com/users/jacobtomlinson/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/jacobtomlinson/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/jacobtomlinson/subscriptions",
+        "organizations_url": "https://api.github.com/users/jacobtomlinson/orgs",
+        "repos_url": "https://api.github.com/users/jacobtomlinson/repos",
+        "events_url": "https://api.github.com/users/jacobtomlinson/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/jacobtomlinson/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "labels": [
+
+      ],
+      "state": "closed",
+      "locked": false,
+      "assignee": null,
+      "assignees": [
+
+      ],
+      "milestone": null,
+      "comments": 2,
+      "created_at": "2017-09-29T20:55:49Z",
+      "updated_at": "2018-11-16T08:29:51Z",
+      "closed_at": "2017-09-30T19:37:25Z",
+      "author_association": "MEMBER",
+      "body": "This issue is for testing some opsdroid skills. Please ignore."
+    },
+    "comment": {
+      "url": "https://api.github.com/repos/opsdroid/opsdroid/issues/comments/439318644",
+      "html_url": "https://github.com/opsdroid/opsdroid/issues/237#issuecomment-439318644",
+      "issue_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/237",
+      "id": 439318644,
+      "node_id": "MDEyOklzc3VlQ29tbWVudDQzOTMxODY0NA==",
+      "user": {
+        "login": "jacobtomlinson",
+        "id": 1610850,
+        "node_id": "MDQ6VXNlcjE2MTA4NTA=",
+        "avatar_url": "https://avatars3.githubusercontent.com/u/1610850?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/jacobtomlinson",
+        "html_url": "https://github.com/jacobtomlinson",
+        "followers_url": "https://api.github.com/users/jacobtomlinson/followers",
+        "following_url": "https://api.github.com/users/jacobtomlinson/following{/other_user}",
+        "gists_url": "https://api.github.com/users/jacobtomlinson/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/jacobtomlinson/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/jacobtomlinson/subscriptions",
+        "organizations_url": "https://api.github.com/users/jacobtomlinson/orgs",
+        "repos_url": "https://api.github.com/users/jacobtomlinson/repos",
+        "events_url": "https://api.github.com/users/jacobtomlinson/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/jacobtomlinson/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "created_at": "2018-11-16T08:29:51Z",
+      "updated_at": "2018-11-16T08:29:51Z",
+      "author_association": "MEMBER",
+      "body": "hello"
+    },
+    "repository": {
+      "id": 64034523,
+      "node_id": "MDEwOlJlcG9zaXRvcnk2NDAzNDUyMw==",
+      "name": "opsdroid",
+      "full_name": "opsdroid/opsdroid",
+      "private": false,
+      "owner": {
+        "login": "opsdroid",
+        "id": 20677702,
+        "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+        "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/opsdroid",
+        "html_url": "https://github.com/opsdroid",
+        "followers_url": "https://api.github.com/users/opsdroid/followers",
+        "following_url": "https://api.github.com/users/opsdroid/following{/other_user}",
+        "gists_url": "https://api.github.com/users/opsdroid/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/opsdroid/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/opsdroid/subscriptions",
+        "organizations_url": "https://api.github.com/users/opsdroid/orgs",
+        "repos_url": "https://api.github.com/users/opsdroid/repos",
+        "events_url": "https://api.github.com/users/opsdroid/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/opsdroid/received_events",
+        "type": "Organization",
+        "site_admin": false
+      },
+      "html_url": "https://github.com/opsdroid/opsdroid",
+      "description": "🤖 An open source chat-ops bot framework",
+      "fork": false,
+      "url": "https://api.github.com/repos/opsdroid/opsdroid",
+      "forks_url": "https://api.github.com/repos/opsdroid/opsdroid/forks",
+      "keys_url": "https://api.github.com/repos/opsdroid/opsdroid/keys{/key_id}",
+      "collaborators_url": "https://api.github.com/repos/opsdroid/opsdroid/collaborators{/collaborator}",
+      "teams_url": "https://api.github.com/repos/opsdroid/opsdroid/teams",
+      "hooks_url": "https://api.github.com/repos/opsdroid/opsdroid/hooks",
+      "issue_events_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/events{/number}",
+      "events_url": "https://api.github.com/repos/opsdroid/opsdroid/events",
+      "assignees_url": "https://api.github.com/repos/opsdroid/opsdroid/assignees{/user}",
+      "branches_url": "https://api.github.com/repos/opsdroid/opsdroid/branches{/branch}",
+      "tags_url": "https://api.github.com/repos/opsdroid/opsdroid/tags",
+      "blobs_url": "https://api.github.com/repos/opsdroid/opsdroid/git/blobs{/sha}",
+      "git_tags_url": "https://api.github.com/repos/opsdroid/opsdroid/git/tags{/sha}",
+      "git_refs_url": "https://api.github.com/repos/opsdroid/opsdroid/git/refs{/sha}",
+      "trees_url": "https://api.github.com/repos/opsdroid/opsdroid/git/trees{/sha}",
+      "statuses_url": "https://api.github.com/repos/opsdroid/opsdroid/statuses/{sha}",
+      "languages_url": "https://api.github.com/repos/opsdroid/opsdroid/languages",
+      "stargazers_url": "https://api.github.com/repos/opsdroid/opsdroid/stargazers",
+      "contributors_url": "https://api.github.com/repos/opsdroid/opsdroid/contributors",
+      "subscribers_url": "https://api.github.com/repos/opsdroid/opsdroid/subscribers",
+      "subscription_url": "https://api.github.com/repos/opsdroid/opsdroid/subscription",
+      "commits_url": "https://api.github.com/repos/opsdroid/opsdroid/commits{/sha}",
+      "git_commits_url": "https://api.github.com/repos/opsdroid/opsdroid/git/commits{/sha}",
+      "comments_url": "https://api.github.com/repos/opsdroid/opsdroid/comments{/number}",
+      "issue_comment_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/comments{/number}",
+      "contents_url": "https://api.github.com/repos/opsdroid/opsdroid/contents/{+path}",
+      "compare_url": "https://api.github.com/repos/opsdroid/opsdroid/compare/{base}...{head}",
+      "merges_url": "https://api.github.com/repos/opsdroid/opsdroid/merges",
+      "archive_url": "https://api.github.com/repos/opsdroid/opsdroid/{archive_format}{/ref}",
+      "downloads_url": "https://api.github.com/repos/opsdroid/opsdroid/downloads",
+      "issues_url": "https://api.github.com/repos/opsdroid/opsdroid/issues{/number}",
+      "pulls_url": "https://api.github.com/repos/opsdroid/opsdroid/pulls{/number}",
+      "milestones_url": "https://api.github.com/repos/opsdroid/opsdroid/milestones{/number}",
+      "notifications_url": "https://api.github.com/repos/opsdroid/opsdroid/notifications{?since,all,participating}",
+      "labels_url": "https://api.github.com/repos/opsdroid/opsdroid/labels{/name}",
+      "releases_url": "https://api.github.com/repos/opsdroid/opsdroid/releases{/id}",
+      "deployments_url": "https://api.github.com/repos/opsdroid/opsdroid/deployments",
+      "created_at": "2016-07-23T20:18:56Z",
+      "updated_at": "2018-11-15T08:44:25Z",
+      "pushed_at": "2018-11-15T08:44:24Z",
+      "git_url": "git://github.com/opsdroid/opsdroid.git",
+      "ssh_url": "git@github.com:opsdroid/opsdroid.git",
+      "clone_url": "https://github.com/opsdroid/opsdroid.git",
+      "svn_url": "https://github.com/opsdroid/opsdroid",
+      "homepage": "https://opsdroid.github.io",
+      "size": 676,
+      "stargazers_count": 199,
+      "watchers_count": 199,
+      "language": "Python",
+      "has_issues": true,
+      "has_projects": false,
+      "has_downloads": true,
+      "has_wiki": false,
+      "has_pages": false,
+      "forks_count": 100,
+      "mirror_url": null,
+      "archived": false,
+      "open_issues_count": 54,
+      "license": {
+        "key": "apache-2.0",
+        "name": "Apache License 2.0",
+        "spdx_id": "Apache-2.0",
+        "url": "https://api.github.com/licenses/apache-2.0",
+        "node_id": "MDc6TGljZW5zZTI="
+      },
+      "forks": 100,
+      "open_issues": 54,
+      "watchers": 199,
+      "default_branch": "master"
+    },
+    "organization": {
+      "login": "opsdroid",
+      "id": 20677702,
+      "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+      "url": "https://api.github.com/orgs/opsdroid",
+      "repos_url": "https://api.github.com/orgs/opsdroid/repos",
+      "events_url": "https://api.github.com/orgs/opsdroid/events",
+      "hooks_url": "https://api.github.com/orgs/opsdroid/hooks",
+      "issues_url": "https://api.github.com/orgs/opsdroid/issues",
+      "members_url": "https://api.github.com/orgs/opsdroid/members{/member}",
+      "public_members_url": "https://api.github.com/orgs/opsdroid/public_members{/member}",
+      "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+      "description": "An open source python chat-ops bot framework"
+    },
+    "sender": {
+      "login": "jacobtomlinson",
+      "id": 1610850,
+      "node_id": "MDQ6VXNlcjE2MTA4NTA=",
+      "avatar_url": "https://avatars3.githubusercontent.com/u/1610850?v=4",
+      "gravatar_id": "",
+      "url": "https://api.github.com/users/jacobtomlinson",
+      "html_url": "https://github.com/jacobtomlinson",
+      "followers_url": "https://api.github.com/users/jacobtomlinson/followers",
+      "following_url": "https://api.github.com/users/jacobtomlinson/following{/other_user}",
+      "gists_url": "https://api.github.com/users/jacobtomlinson/gists{/gist_id}",
+      "starred_url": "https://api.github.com/users/jacobtomlinson/starred{/owner}{/repo}",
+      "subscriptions_url": "https://api.github.com/users/jacobtomlinson/subscriptions",
+      "organizations_url": "https://api.github.com/users/jacobtomlinson/orgs",
+      "repos_url": "https://api.github.com/users/jacobtomlinson/repos",
+      "events_url": "https://api.github.com/users/jacobtomlinson/events{/privacy}",
+      "received_events_url": "https://api.github.com/users/jacobtomlinson/received_events",
+      "type": "User",
+      "site_admin": false
+    }
+  }
diff --git a/tests/responses/github_issue_payload.json b/tests/responses/github_issue_payload.json
new file mode 100644
--- /dev/null
+++ b/tests/responses/github_issue_payload.json
@@ -0,0 +1,184 @@
+{
+    "action": "opened",
+    "issue": {
+      "url": "https://api.github.com/repos/opsdroid/opsdroid/issues/740",
+      "repository_url": "https://api.github.com/repos/opsdroid/opsdroid",
+      "labels_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/740/labels{/name}",
+      "comments_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/740/comments",
+      "events_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/740/events",
+      "html_url": "https://github.com/opsdroid/opsdroid/issues/740",
+      "id": 381840536,
+      "node_id": "MDU6SXNzdWUzODE4NDA1MzY=",
+      "number": 740,
+      "title": "A test please ignore",
+      "user": {
+        "login": "jacobtomlinson",
+        "id": 1610850,
+        "node_id": "MDQ6VXNlcjE2MTA4NTA=",
+        "avatar_url": "https://avatars3.githubusercontent.com/u/1610850?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/jacobtomlinson",
+        "html_url": "https://github.com/jacobtomlinson",
+        "followers_url": "https://api.github.com/users/jacobtomlinson/followers",
+        "following_url": "https://api.github.com/users/jacobtomlinson/following{/other_user}",
+        "gists_url": "https://api.github.com/users/jacobtomlinson/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/jacobtomlinson/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/jacobtomlinson/subscriptions",
+        "organizations_url": "https://api.github.com/users/jacobtomlinson/orgs",
+        "repos_url": "https://api.github.com/users/jacobtomlinson/repos",
+        "events_url": "https://api.github.com/users/jacobtomlinson/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/jacobtomlinson/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "labels": [
+
+      ],
+      "state": "open",
+      "locked": false,
+      "assignee": null,
+      "assignees": [
+
+      ],
+      "milestone": null,
+      "comments": 0,
+      "created_at": "2018-11-17T08:08:25Z",
+      "updated_at": "2018-11-17T08:08:25Z",
+      "closed_at": null,
+      "author_association": "MEMBER",
+      "body": "test"
+    },
+    "repository": {
+      "id": 64034523,
+      "node_id": "MDEwOlJlcG9zaXRvcnk2NDAzNDUyMw==",
+      "name": "opsdroid",
+      "full_name": "opsdroid/opsdroid",
+      "private": false,
+      "owner": {
+        "login": "opsdroid",
+        "id": 20677702,
+        "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+        "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/opsdroid",
+        "html_url": "https://github.com/opsdroid",
+        "followers_url": "https://api.github.com/users/opsdroid/followers",
+        "following_url": "https://api.github.com/users/opsdroid/following{/other_user}",
+        "gists_url": "https://api.github.com/users/opsdroid/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/opsdroid/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/opsdroid/subscriptions",
+        "organizations_url": "https://api.github.com/users/opsdroid/orgs",
+        "repos_url": "https://api.github.com/users/opsdroid/repos",
+        "events_url": "https://api.github.com/users/opsdroid/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/opsdroid/received_events",
+        "type": "Organization",
+        "site_admin": false
+      },
+      "html_url": "https://github.com/opsdroid/opsdroid",
+      "description": "🤖 An open source chat-ops bot framework",
+      "fork": false,
+      "url": "https://api.github.com/repos/opsdroid/opsdroid",
+      "forks_url": "https://api.github.com/repos/opsdroid/opsdroid/forks",
+      "keys_url": "https://api.github.com/repos/opsdroid/opsdroid/keys{/key_id}",
+      "collaborators_url": "https://api.github.com/repos/opsdroid/opsdroid/collaborators{/collaborator}",
+      "teams_url": "https://api.github.com/repos/opsdroid/opsdroid/teams",
+      "hooks_url": "https://api.github.com/repos/opsdroid/opsdroid/hooks",
+      "issue_events_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/events{/number}",
+      "events_url": "https://api.github.com/repos/opsdroid/opsdroid/events",
+      "assignees_url": "https://api.github.com/repos/opsdroid/opsdroid/assignees{/user}",
+      "branches_url": "https://api.github.com/repos/opsdroid/opsdroid/branches{/branch}",
+      "tags_url": "https://api.github.com/repos/opsdroid/opsdroid/tags",
+      "blobs_url": "https://api.github.com/repos/opsdroid/opsdroid/git/blobs{/sha}",
+      "git_tags_url": "https://api.github.com/repos/opsdroid/opsdroid/git/tags{/sha}",
+      "git_refs_url": "https://api.github.com/repos/opsdroid/opsdroid/git/refs{/sha}",
+      "trees_url": "https://api.github.com/repos/opsdroid/opsdroid/git/trees{/sha}",
+      "statuses_url": "https://api.github.com/repos/opsdroid/opsdroid/statuses/{sha}",
+      "languages_url": "https://api.github.com/repos/opsdroid/opsdroid/languages",
+      "stargazers_url": "https://api.github.com/repos/opsdroid/opsdroid/stargazers",
+      "contributors_url": "https://api.github.com/repos/opsdroid/opsdroid/contributors",
+      "subscribers_url": "https://api.github.com/repos/opsdroid/opsdroid/subscribers",
+      "subscription_url": "https://api.github.com/repos/opsdroid/opsdroid/subscription",
+      "commits_url": "https://api.github.com/repos/opsdroid/opsdroid/commits{/sha}",
+      "git_commits_url": "https://api.github.com/repos/opsdroid/opsdroid/git/commits{/sha}",
+      "comments_url": "https://api.github.com/repos/opsdroid/opsdroid/comments{/number}",
+      "issue_comment_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/comments{/number}",
+      "contents_url": "https://api.github.com/repos/opsdroid/opsdroid/contents/{+path}",
+      "compare_url": "https://api.github.com/repos/opsdroid/opsdroid/compare/{base}...{head}",
+      "merges_url": "https://api.github.com/repos/opsdroid/opsdroid/merges",
+      "archive_url": "https://api.github.com/repos/opsdroid/opsdroid/{archive_format}{/ref}",
+      "downloads_url": "https://api.github.com/repos/opsdroid/opsdroid/downloads",
+      "issues_url": "https://api.github.com/repos/opsdroid/opsdroid/issues{/number}",
+      "pulls_url": "https://api.github.com/repos/opsdroid/opsdroid/pulls{/number}",
+      "milestones_url": "https://api.github.com/repos/opsdroid/opsdroid/milestones{/number}",
+      "notifications_url": "https://api.github.com/repos/opsdroid/opsdroid/notifications{?since,all,participating}",
+      "labels_url": "https://api.github.com/repos/opsdroid/opsdroid/labels{/name}",
+      "releases_url": "https://api.github.com/repos/opsdroid/opsdroid/releases{/id}",
+      "deployments_url": "https://api.github.com/repos/opsdroid/opsdroid/deployments",
+      "created_at": "2016-07-23T20:18:56Z",
+      "updated_at": "2018-11-15T08:44:25Z",
+      "pushed_at": "2018-11-16T12:16:50Z",
+      "git_url": "git://github.com/opsdroid/opsdroid.git",
+      "ssh_url": "git@github.com:opsdroid/opsdroid.git",
+      "clone_url": "https://github.com/opsdroid/opsdroid.git",
+      "svn_url": "https://github.com/opsdroid/opsdroid",
+      "homepage": "https://opsdroid.github.io",
+      "size": 677,
+      "stargazers_count": 199,
+      "watchers_count": 199,
+      "language": "Python",
+      "has_issues": true,
+      "has_projects": false,
+      "has_downloads": true,
+      "has_wiki": false,
+      "has_pages": false,
+      "forks_count": 100,
+      "mirror_url": null,
+      "archived": false,
+      "open_issues_count": 56,
+      "license": {
+        "key": "apache-2.0",
+        "name": "Apache License 2.0",
+        "spdx_id": "Apache-2.0",
+        "url": "https://api.github.com/licenses/apache-2.0",
+        "node_id": "MDc6TGljZW5zZTI="
+      },
+      "forks": 100,
+      "open_issues": 56,
+      "watchers": 199,
+      "default_branch": "master"
+    },
+    "organization": {
+      "login": "opsdroid",
+      "id": 20677702,
+      "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+      "url": "https://api.github.com/orgs/opsdroid",
+      "repos_url": "https://api.github.com/orgs/opsdroid/repos",
+      "events_url": "https://api.github.com/orgs/opsdroid/events",
+      "hooks_url": "https://api.github.com/orgs/opsdroid/hooks",
+      "issues_url": "https://api.github.com/orgs/opsdroid/issues",
+      "members_url": "https://api.github.com/orgs/opsdroid/members{/member}",
+      "public_members_url": "https://api.github.com/orgs/opsdroid/public_members{/member}",
+      "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+      "description": "An open source python chat-ops bot framework"
+    },
+    "sender": {
+      "login": "jacobtomlinson",
+      "id": 1610850,
+      "node_id": "MDQ6VXNlcjE2MTA4NTA=",
+      "avatar_url": "https://avatars3.githubusercontent.com/u/1610850?v=4",
+      "gravatar_id": "",
+      "url": "https://api.github.com/users/jacobtomlinson",
+      "html_url": "https://github.com/jacobtomlinson",
+      "followers_url": "https://api.github.com/users/jacobtomlinson/followers",
+      "following_url": "https://api.github.com/users/jacobtomlinson/following{/other_user}",
+      "gists_url": "https://api.github.com/users/jacobtomlinson/gists{/gist_id}",
+      "starred_url": "https://api.github.com/users/jacobtomlinson/starred{/owner}{/repo}",
+      "subscriptions_url": "https://api.github.com/users/jacobtomlinson/subscriptions",
+      "organizations_url": "https://api.github.com/users/jacobtomlinson/orgs",
+      "repos_url": "https://api.github.com/users/jacobtomlinson/repos",
+      "events_url": "https://api.github.com/users/jacobtomlinson/events{/privacy}",
+      "received_events_url": "https://api.github.com/users/jacobtomlinson/received_events",
+      "type": "User",
+      "site_admin": false
+    }
+  }
diff --git a/tests/responses/github_label_payload.json b/tests/responses/github_label_payload.json
new file mode 100644
--- /dev/null
+++ b/tests/responses/github_label_payload.json
@@ -0,0 +1,144 @@
+{
+    "action": "created",
+    "label": {
+      "id": 1130762664,
+      "node_id": "MDU6TGFiZWwxMTMwNzYyNjY0",
+      "url": "https://api.github.com/repos/opsdroid/opsdroid/labels/test",
+      "name": "test",
+      "color": "bfdadc",
+      "default": false
+    },
+    "repository": {
+      "id": 64034523,
+      "node_id": "MDEwOlJlcG9zaXRvcnk2NDAzNDUyMw==",
+      "name": "opsdroid",
+      "full_name": "opsdroid/opsdroid",
+      "private": false,
+      "owner": {
+        "login": "opsdroid",
+        "id": 20677702,
+        "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+        "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/opsdroid",
+        "html_url": "https://github.com/opsdroid",
+        "followers_url": "https://api.github.com/users/opsdroid/followers",
+        "following_url": "https://api.github.com/users/opsdroid/following{/other_user}",
+        "gists_url": "https://api.github.com/users/opsdroid/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/opsdroid/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/opsdroid/subscriptions",
+        "organizations_url": "https://api.github.com/users/opsdroid/orgs",
+        "repos_url": "https://api.github.com/users/opsdroid/repos",
+        "events_url": "https://api.github.com/users/opsdroid/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/opsdroid/received_events",
+        "type": "Organization",
+        "site_admin": false
+      },
+      "html_url": "https://github.com/opsdroid/opsdroid",
+      "description": "🤖 An open source chat-ops bot framework",
+      "fork": false,
+      "url": "https://api.github.com/repos/opsdroid/opsdroid",
+      "forks_url": "https://api.github.com/repos/opsdroid/opsdroid/forks",
+      "keys_url": "https://api.github.com/repos/opsdroid/opsdroid/keys{/key_id}",
+      "collaborators_url": "https://api.github.com/repos/opsdroid/opsdroid/collaborators{/collaborator}",
+      "teams_url": "https://api.github.com/repos/opsdroid/opsdroid/teams",
+      "hooks_url": "https://api.github.com/repos/opsdroid/opsdroid/hooks",
+      "issue_events_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/events{/number}",
+      "events_url": "https://api.github.com/repos/opsdroid/opsdroid/events",
+      "assignees_url": "https://api.github.com/repos/opsdroid/opsdroid/assignees{/user}",
+      "branches_url": "https://api.github.com/repos/opsdroid/opsdroid/branches{/branch}",
+      "tags_url": "https://api.github.com/repos/opsdroid/opsdroid/tags",
+      "blobs_url": "https://api.github.com/repos/opsdroid/opsdroid/git/blobs{/sha}",
+      "git_tags_url": "https://api.github.com/repos/opsdroid/opsdroid/git/tags{/sha}",
+      "git_refs_url": "https://api.github.com/repos/opsdroid/opsdroid/git/refs{/sha}",
+      "trees_url": "https://api.github.com/repos/opsdroid/opsdroid/git/trees{/sha}",
+      "statuses_url": "https://api.github.com/repos/opsdroid/opsdroid/statuses/{sha}",
+      "languages_url": "https://api.github.com/repos/opsdroid/opsdroid/languages",
+      "stargazers_url": "https://api.github.com/repos/opsdroid/opsdroid/stargazers",
+      "contributors_url": "https://api.github.com/repos/opsdroid/opsdroid/contributors",
+      "subscribers_url": "https://api.github.com/repos/opsdroid/opsdroid/subscribers",
+      "subscription_url": "https://api.github.com/repos/opsdroid/opsdroid/subscription",
+      "commits_url": "https://api.github.com/repos/opsdroid/opsdroid/commits{/sha}",
+      "git_commits_url": "https://api.github.com/repos/opsdroid/opsdroid/git/commits{/sha}",
+      "comments_url": "https://api.github.com/repos/opsdroid/opsdroid/comments{/number}",
+      "issue_comment_url": "https://api.github.com/repos/opsdroid/opsdroid/issues/comments{/number}",
+      "contents_url": "https://api.github.com/repos/opsdroid/opsdroid/contents/{+path}",
+      "compare_url": "https://api.github.com/repos/opsdroid/opsdroid/compare/{base}...{head}",
+      "merges_url": "https://api.github.com/repos/opsdroid/opsdroid/merges",
+      "archive_url": "https://api.github.com/repos/opsdroid/opsdroid/{archive_format}{/ref}",
+      "downloads_url": "https://api.github.com/repos/opsdroid/opsdroid/downloads",
+      "issues_url": "https://api.github.com/repos/opsdroid/opsdroid/issues{/number}",
+      "pulls_url": "https://api.github.com/repos/opsdroid/opsdroid/pulls{/number}",
+      "milestones_url": "https://api.github.com/repos/opsdroid/opsdroid/milestones{/number}",
+      "notifications_url": "https://api.github.com/repos/opsdroid/opsdroid/notifications{?since,all,participating}",
+      "labels_url": "https://api.github.com/repos/opsdroid/opsdroid/labels{/name}",
+      "releases_url": "https://api.github.com/repos/opsdroid/opsdroid/releases{/id}",
+      "deployments_url": "https://api.github.com/repos/opsdroid/opsdroid/deployments",
+      "created_at": "2016-07-23T20:18:56Z",
+      "updated_at": "2018-11-15T08:44:25Z",
+      "pushed_at": "2018-11-16T12:16:50Z",
+      "git_url": "git://github.com/opsdroid/opsdroid.git",
+      "ssh_url": "git@github.com:opsdroid/opsdroid.git",
+      "clone_url": "https://github.com/opsdroid/opsdroid.git",
+      "svn_url": "https://github.com/opsdroid/opsdroid",
+      "homepage": "https://opsdroid.github.io",
+      "size": 677,
+      "stargazers_count": 199,
+      "watchers_count": 199,
+      "language": "Python",
+      "has_issues": true,
+      "has_projects": false,
+      "has_downloads": true,
+      "has_wiki": false,
+      "has_pages": false,
+      "forks_count": 100,
+      "mirror_url": null,
+      "archived": false,
+      "open_issues_count": 55,
+      "license": {
+        "key": "apache-2.0",
+        "name": "Apache License 2.0",
+        "spdx_id": "Apache-2.0",
+        "url": "https://api.github.com/licenses/apache-2.0",
+        "node_id": "MDc6TGljZW5zZTI="
+      },
+      "forks": 100,
+      "open_issues": 55,
+      "watchers": 199,
+      "default_branch": "master"
+    },
+    "organization": {
+      "login": "opsdroid",
+      "id": 20677702,
+      "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+      "url": "https://api.github.com/orgs/opsdroid",
+      "repos_url": "https://api.github.com/orgs/opsdroid/repos",
+      "events_url": "https://api.github.com/orgs/opsdroid/events",
+      "hooks_url": "https://api.github.com/orgs/opsdroid/hooks",
+      "issues_url": "https://api.github.com/orgs/opsdroid/issues",
+      "members_url": "https://api.github.com/orgs/opsdroid/members{/member}",
+      "public_members_url": "https://api.github.com/orgs/opsdroid/public_members{/member}",
+      "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+      "description": "An open source python chat-ops bot framework"
+    },
+    "sender": {
+      "login": "jacobtomlinson",
+      "id": 1610850,
+      "node_id": "MDQ6VXNlcjE2MTA4NTA=",
+      "avatar_url": "https://avatars3.githubusercontent.com/u/1610850?v=4",
+      "gravatar_id": "",
+      "url": "https://api.github.com/users/jacobtomlinson",
+      "html_url": "https://github.com/jacobtomlinson",
+      "followers_url": "https://api.github.com/users/jacobtomlinson/followers",
+      "following_url": "https://api.github.com/users/jacobtomlinson/following{/other_user}",
+      "gists_url": "https://api.github.com/users/jacobtomlinson/gists{/gist_id}",
+      "starred_url": "https://api.github.com/users/jacobtomlinson/starred{/owner}{/repo}",
+      "subscriptions_url": "https://api.github.com/users/jacobtomlinson/subscriptions",
+      "organizations_url": "https://api.github.com/users/jacobtomlinson/orgs",
+      "repos_url": "https://api.github.com/users/jacobtomlinson/repos",
+      "events_url": "https://api.github.com/users/jacobtomlinson/events{/privacy}",
+      "received_events_url": "https://api.github.com/users/jacobtomlinson/received_events",
+      "type": "User",
+      "site_admin": false
+    }
+  }
diff --git a/tests/responses/github_pr_payload.json b/tests/responses/github_pr_payload.json
new file mode 100644
--- /dev/null
+++ b/tests/responses/github_pr_payload.json
@@ -0,0 +1,482 @@
+{
+    "action": "opened",
+    "number": 175,
+    "pull_request": {
+      "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls/175",
+      "id": 231512167,
+      "node_id": "MDExOlB1bGxSZXF1ZXN0MjMxNTEyMTY3",
+      "html_url": "https://github.com/opsdroid/opsdroid-audio/pull/175",
+      "diff_url": "https://github.com/opsdroid/opsdroid-audio/pull/175.diff",
+      "patch_url": "https://github.com/opsdroid/opsdroid-audio/pull/175.patch",
+      "issue_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/175",
+      "number": 175,
+      "state": "open",
+      "locked": false,
+      "title": "Update pytest-timeout to 1.3.3",
+      "user": {
+        "login": "pyup-bot",
+        "id": 16239342,
+        "node_id": "MDQ6VXNlcjE2MjM5MzQy",
+        "avatar_url": "https://avatars0.githubusercontent.com/u/16239342?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/pyup-bot",
+        "html_url": "https://github.com/pyup-bot",
+        "followers_url": "https://api.github.com/users/pyup-bot/followers",
+        "following_url": "https://api.github.com/users/pyup-bot/following{/other_user}",
+        "gists_url": "https://api.github.com/users/pyup-bot/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/pyup-bot/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/pyup-bot/subscriptions",
+        "organizations_url": "https://api.github.com/users/pyup-bot/orgs",
+        "repos_url": "https://api.github.com/users/pyup-bot/repos",
+        "events_url": "https://api.github.com/users/pyup-bot/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/pyup-bot/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "body": "hello world",
+      "created_at": "2018-11-16T12:17:49Z",
+      "updated_at": "2018-11-16T12:17:49Z",
+      "closed_at": null,
+      "merged_at": null,
+      "merge_commit_sha": null,
+      "assignee": null,
+      "assignees": [
+
+      ],
+      "requested_reviewers": [
+
+      ],
+      "requested_teams": [
+
+      ],
+      "labels": [
+
+      ],
+      "milestone": null,
+      "commits_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls/175/commits",
+      "review_comments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls/175/comments",
+      "review_comment_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls/comments{/number}",
+      "comments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/175/comments",
+      "statuses_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/statuses/e9e14486799f07449f1e0c6dd1c7601f74ea529d",
+      "head": {
+        "label": "opsdroid:pyup-update-pytest-timeout-1.2.1-to-1.3.3",
+        "ref": "pyup-update-pytest-timeout-1.2.1-to-1.3.3",
+        "sha": "e9e14486799f07449f1e0c6dd1c7601f74ea529d",
+        "user": {
+          "login": "opsdroid",
+          "id": 20677702,
+          "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+          "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+          "gravatar_id": "",
+          "url": "https://api.github.com/users/opsdroid",
+          "html_url": "https://github.com/opsdroid",
+          "followers_url": "https://api.github.com/users/opsdroid/followers",
+          "following_url": "https://api.github.com/users/opsdroid/following{/other_user}",
+          "gists_url": "https://api.github.com/users/opsdroid/gists{/gist_id}",
+          "starred_url": "https://api.github.com/users/opsdroid/starred{/owner}{/repo}",
+          "subscriptions_url": "https://api.github.com/users/opsdroid/subscriptions",
+          "organizations_url": "https://api.github.com/users/opsdroid/orgs",
+          "repos_url": "https://api.github.com/users/opsdroid/repos",
+          "events_url": "https://api.github.com/users/opsdroid/events{/privacy}",
+          "received_events_url": "https://api.github.com/users/opsdroid/received_events",
+          "type": "Organization",
+          "site_admin": false
+        },
+        "repo": {
+          "id": 83927663,
+          "node_id": "MDEwOlJlcG9zaXRvcnk4MzkyNzY2Mw==",
+          "name": "opsdroid-audio",
+          "full_name": "opsdroid/opsdroid-audio",
+          "private": false,
+          "owner": {
+            "login": "opsdroid",
+            "id": 20677702,
+            "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+            "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+            "gravatar_id": "",
+            "url": "https://api.github.com/users/opsdroid",
+            "html_url": "https://github.com/opsdroid",
+            "followers_url": "https://api.github.com/users/opsdroid/followers",
+            "following_url": "https://api.github.com/users/opsdroid/following{/other_user}",
+            "gists_url": "https://api.github.com/users/opsdroid/gists{/gist_id}",
+            "starred_url": "https://api.github.com/users/opsdroid/starred{/owner}{/repo}",
+            "subscriptions_url": "https://api.github.com/users/opsdroid/subscriptions",
+            "organizations_url": "https://api.github.com/users/opsdroid/orgs",
+            "repos_url": "https://api.github.com/users/opsdroid/repos",
+            "events_url": "https://api.github.com/users/opsdroid/events{/privacy}",
+            "received_events_url": "https://api.github.com/users/opsdroid/received_events",
+            "type": "Organization",
+            "site_admin": false
+          },
+          "html_url": "https://github.com/opsdroid/opsdroid-audio",
+          "description": "🗣 A companion application for opsdroid which adds hotwords, speech recognition and audio responses.",
+          "fork": false,
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio",
+          "forks_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/forks",
+          "keys_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/keys{/key_id}",
+          "collaborators_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/collaborators{/collaborator}",
+          "teams_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/teams",
+          "hooks_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/hooks",
+          "issue_events_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/events{/number}",
+          "events_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/events",
+          "assignees_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/assignees{/user}",
+          "branches_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/branches{/branch}",
+          "tags_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/tags",
+          "blobs_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/blobs{/sha}",
+          "git_tags_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/tags{/sha}",
+          "git_refs_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/refs{/sha}",
+          "trees_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/trees{/sha}",
+          "statuses_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/statuses/{sha}",
+          "languages_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/languages",
+          "stargazers_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/stargazers",
+          "contributors_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/contributors",
+          "subscribers_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/subscribers",
+          "subscription_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/subscription",
+          "commits_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits{/sha}",
+          "git_commits_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/commits{/sha}",
+          "comments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/comments{/number}",
+          "issue_comment_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/comments{/number}",
+          "contents_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/contents/{+path}",
+          "compare_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/compare/{base}...{head}",
+          "merges_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/merges",
+          "archive_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/{archive_format}{/ref}",
+          "downloads_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/downloads",
+          "issues_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues{/number}",
+          "pulls_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls{/number}",
+          "milestones_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/milestones{/number}",
+          "notifications_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/notifications{?since,all,participating}",
+          "labels_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/labels{/name}",
+          "releases_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/releases{/id}",
+          "deployments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/deployments",
+          "created_at": "2017-03-04T22:04:15Z",
+          "updated_at": "2018-05-21T17:47:36Z",
+          "pushed_at": "2018-11-16T12:17:48Z",
+          "git_url": "git://github.com/opsdroid/opsdroid-audio.git",
+          "ssh_url": "git@github.com:opsdroid/opsdroid-audio.git",
+          "clone_url": "https://github.com/opsdroid/opsdroid-audio.git",
+          "svn_url": "https://github.com/opsdroid/opsdroid-audio",
+          "homepage": null,
+          "size": 2453,
+          "stargazers_count": 3,
+          "watchers_count": 3,
+          "language": "Python",
+          "has_issues": true,
+          "has_projects": true,
+          "has_downloads": true,
+          "has_wiki": true,
+          "has_pages": false,
+          "forks_count": 2,
+          "mirror_url": null,
+          "archived": false,
+          "open_issues_count": 28,
+          "license": {
+            "key": "apache-2.0",
+            "name": "Apache License 2.0",
+            "spdx_id": "Apache-2.0",
+            "url": "https://api.github.com/licenses/apache-2.0",
+            "node_id": "MDc6TGljZW5zZTI="
+          },
+          "forks": 2,
+          "open_issues": 28,
+          "watchers": 3,
+          "default_branch": "master"
+        }
+      },
+      "base": {
+        "label": "opsdroid:master",
+        "ref": "master",
+        "sha": "b32a39d57d34422362c06346220069b196e00f62",
+        "user": {
+          "login": "opsdroid",
+          "id": 20677702,
+          "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+          "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+          "gravatar_id": "",
+          "url": "https://api.github.com/users/opsdroid",
+          "html_url": "https://github.com/opsdroid",
+          "followers_url": "https://api.github.com/users/opsdroid/followers",
+          "following_url": "https://api.github.com/users/opsdroid/following{/other_user}",
+          "gists_url": "https://api.github.com/users/opsdroid/gists{/gist_id}",
+          "starred_url": "https://api.github.com/users/opsdroid/starred{/owner}{/repo}",
+          "subscriptions_url": "https://api.github.com/users/opsdroid/subscriptions",
+          "organizations_url": "https://api.github.com/users/opsdroid/orgs",
+          "repos_url": "https://api.github.com/users/opsdroid/repos",
+          "events_url": "https://api.github.com/users/opsdroid/events{/privacy}",
+          "received_events_url": "https://api.github.com/users/opsdroid/received_events",
+          "type": "Organization",
+          "site_admin": false
+        },
+        "repo": {
+          "id": 83927663,
+          "node_id": "MDEwOlJlcG9zaXRvcnk4MzkyNzY2Mw==",
+          "name": "opsdroid-audio",
+          "full_name": "opsdroid/opsdroid-audio",
+          "private": false,
+          "owner": {
+            "login": "opsdroid",
+            "id": 20677702,
+            "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+            "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+            "gravatar_id": "",
+            "url": "https://api.github.com/users/opsdroid",
+            "html_url": "https://github.com/opsdroid",
+            "followers_url": "https://api.github.com/users/opsdroid/followers",
+            "following_url": "https://api.github.com/users/opsdroid/following{/other_user}",
+            "gists_url": "https://api.github.com/users/opsdroid/gists{/gist_id}",
+            "starred_url": "https://api.github.com/users/opsdroid/starred{/owner}{/repo}",
+            "subscriptions_url": "https://api.github.com/users/opsdroid/subscriptions",
+            "organizations_url": "https://api.github.com/users/opsdroid/orgs",
+            "repos_url": "https://api.github.com/users/opsdroid/repos",
+            "events_url": "https://api.github.com/users/opsdroid/events{/privacy}",
+            "received_events_url": "https://api.github.com/users/opsdroid/received_events",
+            "type": "Organization",
+            "site_admin": false
+          },
+          "html_url": "https://github.com/opsdroid/opsdroid-audio",
+          "description": "🗣 A companion application for opsdroid which adds hotwords, speech recognition and audio responses.",
+          "fork": false,
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio",
+          "forks_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/forks",
+          "keys_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/keys{/key_id}",
+          "collaborators_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/collaborators{/collaborator}",
+          "teams_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/teams",
+          "hooks_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/hooks",
+          "issue_events_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/events{/number}",
+          "events_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/events",
+          "assignees_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/assignees{/user}",
+          "branches_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/branches{/branch}",
+          "tags_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/tags",
+          "blobs_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/blobs{/sha}",
+          "git_tags_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/tags{/sha}",
+          "git_refs_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/refs{/sha}",
+          "trees_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/trees{/sha}",
+          "statuses_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/statuses/{sha}",
+          "languages_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/languages",
+          "stargazers_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/stargazers",
+          "contributors_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/contributors",
+          "subscribers_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/subscribers",
+          "subscription_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/subscription",
+          "commits_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits{/sha}",
+          "git_commits_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/commits{/sha}",
+          "comments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/comments{/number}",
+          "issue_comment_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/comments{/number}",
+          "contents_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/contents/{+path}",
+          "compare_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/compare/{base}...{head}",
+          "merges_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/merges",
+          "archive_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/{archive_format}{/ref}",
+          "downloads_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/downloads",
+          "issues_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues{/number}",
+          "pulls_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls{/number}",
+          "milestones_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/milestones{/number}",
+          "notifications_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/notifications{?since,all,participating}",
+          "labels_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/labels{/name}",
+          "releases_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/releases{/id}",
+          "deployments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/deployments",
+          "created_at": "2017-03-04T22:04:15Z",
+          "updated_at": "2018-05-21T17:47:36Z",
+          "pushed_at": "2018-11-16T12:17:48Z",
+          "git_url": "git://github.com/opsdroid/opsdroid-audio.git",
+          "ssh_url": "git@github.com:opsdroid/opsdroid-audio.git",
+          "clone_url": "https://github.com/opsdroid/opsdroid-audio.git",
+          "svn_url": "https://github.com/opsdroid/opsdroid-audio",
+          "homepage": null,
+          "size": 2453,
+          "stargazers_count": 3,
+          "watchers_count": 3,
+          "language": "Python",
+          "has_issues": true,
+          "has_projects": true,
+          "has_downloads": true,
+          "has_wiki": true,
+          "has_pages": false,
+          "forks_count": 2,
+          "mirror_url": null,
+          "archived": false,
+          "open_issues_count": 28,
+          "license": {
+            "key": "apache-2.0",
+            "name": "Apache License 2.0",
+            "spdx_id": "Apache-2.0",
+            "url": "https://api.github.com/licenses/apache-2.0",
+            "node_id": "MDc6TGljZW5zZTI="
+          },
+          "forks": 2,
+          "open_issues": 28,
+          "watchers": 3,
+          "default_branch": "master"
+        }
+      },
+      "_links": {
+        "self": {
+          "href": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls/175"
+        },
+        "html": {
+          "href": "https://github.com/opsdroid/opsdroid-audio/pull/175"
+        },
+        "issue": {
+          "href": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/175"
+        },
+        "comments": {
+          "href": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/175/comments"
+        },
+        "review_comments": {
+          "href": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls/175/comments"
+        },
+        "review_comment": {
+          "href": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls/comments{/number}"
+        },
+        "commits": {
+          "href": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls/175/commits"
+        },
+        "statuses": {
+          "href": "https://api.github.com/repos/opsdroid/opsdroid-audio/statuses/e9e14486799f07449f1e0c6dd1c7601f74ea529d"
+        }
+      },
+      "author_association": "CONTRIBUTOR",
+      "merged": false,
+      "mergeable": null,
+      "rebaseable": null,
+      "mergeable_state": "unknown",
+      "merged_by": null,
+      "comments": 0,
+      "review_comments": 0,
+      "maintainer_can_modify": false,
+      "commits": 1,
+      "additions": 1,
+      "deletions": 1,
+      "changed_files": 1
+    },
+    "repository": {
+      "id": 83927663,
+      "node_id": "MDEwOlJlcG9zaXRvcnk4MzkyNzY2Mw==",
+      "name": "opsdroid-audio",
+      "full_name": "opsdroid/opsdroid-audio",
+      "private": false,
+      "owner": {
+        "login": "opsdroid",
+        "id": 20677702,
+        "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+        "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/opsdroid",
+        "html_url": "https://github.com/opsdroid",
+        "followers_url": "https://api.github.com/users/opsdroid/followers",
+        "following_url": "https://api.github.com/users/opsdroid/following{/other_user}",
+        "gists_url": "https://api.github.com/users/opsdroid/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/opsdroid/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/opsdroid/subscriptions",
+        "organizations_url": "https://api.github.com/users/opsdroid/orgs",
+        "repos_url": "https://api.github.com/users/opsdroid/repos",
+        "events_url": "https://api.github.com/users/opsdroid/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/opsdroid/received_events",
+        "type": "Organization",
+        "site_admin": false
+      },
+      "html_url": "https://github.com/opsdroid/opsdroid-audio",
+      "description": "🗣 A companion application for opsdroid which adds hotwords, speech recognition and audio responses.",
+      "fork": false,
+      "url": "https://api.github.com/repos/opsdroid/opsdroid-audio",
+      "forks_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/forks",
+      "keys_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/keys{/key_id}",
+      "collaborators_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/collaborators{/collaborator}",
+      "teams_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/teams",
+      "hooks_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/hooks",
+      "issue_events_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/events{/number}",
+      "events_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/events",
+      "assignees_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/assignees{/user}",
+      "branches_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/branches{/branch}",
+      "tags_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/tags",
+      "blobs_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/blobs{/sha}",
+      "git_tags_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/tags{/sha}",
+      "git_refs_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/refs{/sha}",
+      "trees_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/trees{/sha}",
+      "statuses_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/statuses/{sha}",
+      "languages_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/languages",
+      "stargazers_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/stargazers",
+      "contributors_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/contributors",
+      "subscribers_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/subscribers",
+      "subscription_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/subscription",
+      "commits_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits{/sha}",
+      "git_commits_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/commits{/sha}",
+      "comments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/comments{/number}",
+      "issue_comment_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/comments{/number}",
+      "contents_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/contents/{+path}",
+      "compare_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/compare/{base}...{head}",
+      "merges_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/merges",
+      "archive_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/{archive_format}{/ref}",
+      "downloads_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/downloads",
+      "issues_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues{/number}",
+      "pulls_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls{/number}",
+      "milestones_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/milestones{/number}",
+      "notifications_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/notifications{?since,all,participating}",
+      "labels_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/labels{/name}",
+      "releases_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/releases{/id}",
+      "deployments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/deployments",
+      "created_at": "2017-03-04T22:04:15Z",
+      "updated_at": "2018-05-21T17:47:36Z",
+      "pushed_at": "2018-11-16T12:17:48Z",
+      "git_url": "git://github.com/opsdroid/opsdroid-audio.git",
+      "ssh_url": "git@github.com:opsdroid/opsdroid-audio.git",
+      "clone_url": "https://github.com/opsdroid/opsdroid-audio.git",
+      "svn_url": "https://github.com/opsdroid/opsdroid-audio",
+      "homepage": null,
+      "size": 2453,
+      "stargazers_count": 3,
+      "watchers_count": 3,
+      "language": "Python",
+      "has_issues": true,
+      "has_projects": true,
+      "has_downloads": true,
+      "has_wiki": true,
+      "has_pages": false,
+      "forks_count": 2,
+      "mirror_url": null,
+      "archived": false,
+      "open_issues_count": 28,
+      "license": {
+        "key": "apache-2.0",
+        "name": "Apache License 2.0",
+        "spdx_id": "Apache-2.0",
+        "url": "https://api.github.com/licenses/apache-2.0",
+        "node_id": "MDc6TGljZW5zZTI="
+      },
+      "forks": 2,
+      "open_issues": 28,
+      "watchers": 3,
+      "default_branch": "master"
+    },
+    "organization": {
+      "login": "opsdroid",
+      "id": 20677702,
+      "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+      "url": "https://api.github.com/orgs/opsdroid",
+      "repos_url": "https://api.github.com/orgs/opsdroid/repos",
+      "events_url": "https://api.github.com/orgs/opsdroid/events",
+      "hooks_url": "https://api.github.com/orgs/opsdroid/hooks",
+      "issues_url": "https://api.github.com/orgs/opsdroid/issues",
+      "members_url": "https://api.github.com/orgs/opsdroid/members{/member}",
+      "public_members_url": "https://api.github.com/orgs/opsdroid/public_members{/member}",
+      "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+      "description": "An open source python chat-ops bot framework"
+    },
+    "sender": {
+      "login": "pyup-bot",
+      "id": 16239342,
+      "node_id": "MDQ6VXNlcjE2MjM5MzQy",
+      "avatar_url": "https://avatars0.githubusercontent.com/u/16239342?v=4",
+      "gravatar_id": "",
+      "url": "https://api.github.com/users/pyup-bot",
+      "html_url": "https://github.com/pyup-bot",
+      "followers_url": "https://api.github.com/users/pyup-bot/followers",
+      "following_url": "https://api.github.com/users/pyup-bot/following{/other_user}",
+      "gists_url": "https://api.github.com/users/pyup-bot/gists{/gist_id}",
+      "starred_url": "https://api.github.com/users/pyup-bot/starred{/owner}{/repo}",
+      "subscriptions_url": "https://api.github.com/users/pyup-bot/subscriptions",
+      "organizations_url": "https://api.github.com/users/pyup-bot/orgs",
+      "repos_url": "https://api.github.com/users/pyup-bot/repos",
+      "events_url": "https://api.github.com/users/pyup-bot/events{/privacy}",
+      "received_events_url": "https://api.github.com/users/pyup-bot/received_events",
+      "type": "User",
+      "site_admin": false
+    }
+  }
diff --git a/tests/responses/github_status_payload.json b/tests/responses/github_status_payload.json
new file mode 100644
--- /dev/null
+++ b/tests/responses/github_status_payload.json
@@ -0,0 +1,295 @@
+{
+    "id": 5815600009,
+    "sha": "b32a39d57d34422362c06346220069b196e00f62",
+    "name": "opsdroid/opsdroid-audio",
+    "target_url": "https://travis-ci.org/opsdroid/opsdroid-audio/builds/455948125?utm_source=github_status&utm_medium=notification",
+    "context": "continuous-integration/travis-ci/push",
+    "description": "The Travis CI build is in progress",
+    "state": "pending",
+    "commit": {
+      "sha": "b32a39d57d34422362c06346220069b196e00f62",
+      "node_id": "MDY6Q29tbWl0ODM5Mjc2NjM6YjMyYTM5ZDU3ZDM0NDIyMzYyYzA2MzQ2MjIwMDY5YjE5NmUwMGY2Mg==",
+      "commit": {
+        "author": {
+          "name": "pyup.io bot",
+          "email": "github-bot@pyup.io",
+          "date": "2018-04-25T14:55:42Z"
+        },
+        "committer": {
+          "name": "Jacob Tomlinson",
+          "email": "jacobtomlinson@users.noreply.github.com",
+          "date": "2018-04-25T14:55:42Z"
+        },
+        "message": "Update pytest from 3.5.0 to 3.5.1 (#109)",
+        "tree": {
+          "sha": "b28528bd5d8c9660a23ef969486303a75b5100c5",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/trees/b28528bd5d8c9660a23ef969486303a75b5100c5"
+        },
+        "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/commits/b32a39d57d34422362c06346220069b196e00f62",
+        "comment_count": 0,
+        "verification": {
+          "verified": false,
+          "reason": "unsigned",
+          "signature": null,
+          "payload": null
+        }
+      },
+      "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/b32a39d57d34422362c06346220069b196e00f62",
+      "html_url": "https://github.com/opsdroid/opsdroid-audio/commit/b32a39d57d34422362c06346220069b196e00f62",
+      "comments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/b32a39d57d34422362c06346220069b196e00f62/comments",
+      "author": {
+        "login": "pyup-bot",
+        "id": 16239342,
+        "node_id": "MDQ6VXNlcjE2MjM5MzQy",
+        "avatar_url": "https://avatars0.githubusercontent.com/u/16239342?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/pyup-bot",
+        "html_url": "https://github.com/pyup-bot",
+        "followers_url": "https://api.github.com/users/pyup-bot/followers",
+        "following_url": "https://api.github.com/users/pyup-bot/following{/other_user}",
+        "gists_url": "https://api.github.com/users/pyup-bot/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/pyup-bot/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/pyup-bot/subscriptions",
+        "organizations_url": "https://api.github.com/users/pyup-bot/orgs",
+        "repos_url": "https://api.github.com/users/pyup-bot/repos",
+        "events_url": "https://api.github.com/users/pyup-bot/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/pyup-bot/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "committer": {
+        "login": "jacobtomlinson",
+        "id": 1610850,
+        "node_id": "MDQ6VXNlcjE2MTA4NTA=",
+        "avatar_url": "https://avatars3.githubusercontent.com/u/1610850?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/jacobtomlinson",
+        "html_url": "https://github.com/jacobtomlinson",
+        "followers_url": "https://api.github.com/users/jacobtomlinson/followers",
+        "following_url": "https://api.github.com/users/jacobtomlinson/following{/other_user}",
+        "gists_url": "https://api.github.com/users/jacobtomlinson/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/jacobtomlinson/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/jacobtomlinson/subscriptions",
+        "organizations_url": "https://api.github.com/users/jacobtomlinson/orgs",
+        "repos_url": "https://api.github.com/users/jacobtomlinson/repos",
+        "events_url": "https://api.github.com/users/jacobtomlinson/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/jacobtomlinson/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "parents": [
+        {
+          "sha": "6c79a4a8e0f1b65a39941a7ef736804b08c92a2c",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/6c79a4a8e0f1b65a39941a7ef736804b08c92a2c",
+          "html_url": "https://github.com/opsdroid/opsdroid-audio/commit/6c79a4a8e0f1b65a39941a7ef736804b08c92a2c"
+        }
+      ]
+    },
+    "branches": [
+      {
+        "name": "master",
+        "commit": {
+          "sha": "b32a39d57d34422362c06346220069b196e00f62",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/b32a39d57d34422362c06346220069b196e00f62"
+        }
+      },
+      {
+        "name": "pyup-update-astroid-1.5.3-to-2.0.4",
+        "commit": {
+          "sha": "d1842000c15200910e30806d3d90cd7597377a18",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/d1842000c15200910e30806d3d90cd7597377a18"
+        }
+      },
+      {
+        "name": "pyup-update-coveralls-1.3.0-to-1.5.1",
+        "commit": {
+          "sha": "362867f61a0e1d49310731d72a6116daf1100ef8",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/362867f61a0e1d49310731d72a6116daf1100ef8"
+        }
+      },
+      {
+        "name": "pyup-update-flake8-3.5.0-to-3.6.0",
+        "commit": {
+          "sha": "77d305afa6e7da4a1c6da1b96ceeea52eb439a9d",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/77d305afa6e7da4a1c6da1b96ceeea52eb439a9d"
+        }
+      },
+      {
+        "name": "pyup-update-google-api-python-client-1.6.6-to-1.7.4",
+        "commit": {
+          "sha": "955d578ce3ba1c6d4548c34d64fd16682b36258e",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/955d578ce3ba1c6d4548c34d64fd16682b36258e"
+        }
+      },
+      {
+        "name": "pyup-update-gtts-1.2.2-to-2.0.1",
+        "commit": {
+          "sha": "408df3a2cb290e2815a04d78a1dff878910fc25e",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/408df3a2cb290e2815a04d78a1dff878910fc25e"
+        }
+      },
+      {
+        "name": "pyup-update-pydocstyle-2.1.1-to-3.0.0",
+        "commit": {
+          "sha": "d1e4b25ad3c34222b1e54d43d541348a3b49b0f7",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/d1e4b25ad3c34222b1e54d43d541348a3b49b0f7"
+        }
+      },
+      {
+        "name": "pyup-update-pylint-1.7.5-to-2.1.1",
+        "commit": {
+          "sha": "226e0db99dc353f6dc7b7e63700bbedb13af5751",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/226e0db99dc353f6dc7b7e63700bbedb13af5751"
+        }
+      },
+      {
+        "name": "pyup-update-pytest-3.5.1-to-4.0.0",
+        "commit": {
+          "sha": "56efcde3bb35c4c9e488146d1964e3e78e45b673",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/56efcde3bb35c4c9e488146d1964e3e78e45b673"
+        }
+      },
+      {
+        "name": "pyup-update-pytest-cov-2.5.1-to-2.6.0",
+        "commit": {
+          "sha": "d7dbd635df656c868452678644d5e9b3b9ef7033",
+          "url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits/d7dbd635df656c868452678644d5e9b3b9ef7033"
+        }
+      }
+    ],
+    "created_at": "2018-11-16T12:17:49+00:00",
+    "updated_at": "2018-11-16T12:17:49+00:00",
+    "repository": {
+      "id": 83927663,
+      "node_id": "MDEwOlJlcG9zaXRvcnk4MzkyNzY2Mw==",
+      "name": "opsdroid-audio",
+      "full_name": "opsdroid/opsdroid-audio",
+      "private": false,
+      "owner": {
+        "login": "opsdroid",
+        "id": 20677702,
+        "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+        "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/opsdroid",
+        "html_url": "https://github.com/opsdroid",
+        "followers_url": "https://api.github.com/users/opsdroid/followers",
+        "following_url": "https://api.github.com/users/opsdroid/following{/other_user}",
+        "gists_url": "https://api.github.com/users/opsdroid/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/opsdroid/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/opsdroid/subscriptions",
+        "organizations_url": "https://api.github.com/users/opsdroid/orgs",
+        "repos_url": "https://api.github.com/users/opsdroid/repos",
+        "events_url": "https://api.github.com/users/opsdroid/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/opsdroid/received_events",
+        "type": "Organization",
+        "site_admin": false
+      },
+      "html_url": "https://github.com/opsdroid/opsdroid-audio",
+      "description": "🗣 A companion application for opsdroid which adds hotwords, speech recognition and audio responses.",
+      "fork": false,
+      "url": "https://api.github.com/repos/opsdroid/opsdroid-audio",
+      "forks_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/forks",
+      "keys_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/keys{/key_id}",
+      "collaborators_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/collaborators{/collaborator}",
+      "teams_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/teams",
+      "hooks_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/hooks",
+      "issue_events_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/events{/number}",
+      "events_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/events",
+      "assignees_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/assignees{/user}",
+      "branches_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/branches{/branch}",
+      "tags_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/tags",
+      "blobs_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/blobs{/sha}",
+      "git_tags_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/tags{/sha}",
+      "git_refs_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/refs{/sha}",
+      "trees_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/trees{/sha}",
+      "statuses_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/statuses/{sha}",
+      "languages_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/languages",
+      "stargazers_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/stargazers",
+      "contributors_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/contributors",
+      "subscribers_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/subscribers",
+      "subscription_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/subscription",
+      "commits_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/commits{/sha}",
+      "git_commits_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/git/commits{/sha}",
+      "comments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/comments{/number}",
+      "issue_comment_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues/comments{/number}",
+      "contents_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/contents/{+path}",
+      "compare_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/compare/{base}...{head}",
+      "merges_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/merges",
+      "archive_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/{archive_format}{/ref}",
+      "downloads_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/downloads",
+      "issues_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/issues{/number}",
+      "pulls_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/pulls{/number}",
+      "milestones_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/milestones{/number}",
+      "notifications_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/notifications{?since,all,participating}",
+      "labels_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/labels{/name}",
+      "releases_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/releases{/id}",
+      "deployments_url": "https://api.github.com/repos/opsdroid/opsdroid-audio/deployments",
+      "created_at": "2017-03-04T22:04:15Z",
+      "updated_at": "2018-05-21T17:47:36Z",
+      "pushed_at": "2018-11-16T12:17:48Z",
+      "git_url": "git://github.com/opsdroid/opsdroid-audio.git",
+      "ssh_url": "git@github.com:opsdroid/opsdroid-audio.git",
+      "clone_url": "https://github.com/opsdroid/opsdroid-audio.git",
+      "svn_url": "https://github.com/opsdroid/opsdroid-audio",
+      "homepage": null,
+      "size": 2453,
+      "stargazers_count": 3,
+      "watchers_count": 3,
+      "language": "Python",
+      "has_issues": true,
+      "has_projects": true,
+      "has_downloads": true,
+      "has_wiki": true,
+      "has_pages": false,
+      "forks_count": 2,
+      "mirror_url": null,
+      "archived": false,
+      "open_issues_count": 27,
+      "license": {
+        "key": "apache-2.0",
+        "name": "Apache License 2.0",
+        "spdx_id": "Apache-2.0",
+        "url": "https://api.github.com/licenses/apache-2.0",
+        "node_id": "MDc6TGljZW5zZTI="
+      },
+      "forks": 2,
+      "open_issues": 27,
+      "watchers": 3,
+      "default_branch": "master"
+    },
+    "organization": {
+      "login": "opsdroid",
+      "id": 20677702,
+      "node_id": "MDEyOk9yZ2FuaXphdGlvbjIwNjc3NzAy",
+      "url": "https://api.github.com/orgs/opsdroid",
+      "repos_url": "https://api.github.com/orgs/opsdroid/repos",
+      "events_url": "https://api.github.com/orgs/opsdroid/events",
+      "hooks_url": "https://api.github.com/orgs/opsdroid/hooks",
+      "issues_url": "https://api.github.com/orgs/opsdroid/issues",
+      "members_url": "https://api.github.com/orgs/opsdroid/members{/member}",
+      "public_members_url": "https://api.github.com/orgs/opsdroid/public_members{/member}",
+      "avatar_url": "https://avatars2.githubusercontent.com/u/20677702?v=4",
+      "description": "An open source python chat-ops bot framework"
+    },
+    "sender": {
+      "login": "jacobtomlinson",
+      "id": 1610850,
+      "node_id": "MDQ6VXNlcjE2MTA4NTA=",
+      "avatar_url": "https://avatars3.githubusercontent.com/u/1610850?v=4",
+      "gravatar_id": "",
+      "url": "https://api.github.com/users/jacobtomlinson",
+      "html_url": "https://github.com/jacobtomlinson",
+      "followers_url": "https://api.github.com/users/jacobtomlinson/followers",
+      "following_url": "https://api.github.com/users/jacobtomlinson/following{/other_user}",
+      "gists_url": "https://api.github.com/users/jacobtomlinson/gists{/gist_id}",
+      "starred_url": "https://api.github.com/users/jacobtomlinson/starred{/owner}{/repo}",
+      "subscriptions_url": "https://api.github.com/users/jacobtomlinson/subscriptions",
+      "organizations_url": "https://api.github.com/users/jacobtomlinson/orgs",
+      "repos_url": "https://api.github.com/users/jacobtomlinson/repos",
+      "events_url": "https://api.github.com/users/jacobtomlinson/events{/privacy}",
+      "received_events_url": "https://api.github.com/users/jacobtomlinson/received_events",
+      "type": "User",
+      "site_admin": false
+    }
+  }
diff --git a/tests/test_connector_github.py b/tests/test_connector_github.py
new file mode 100644
--- /dev/null
+++ b/tests/test_connector_github.py
@@ -0,0 +1,212 @@
+"""Tests for the RocketChat class."""
+
+import os.path
+
+import asyncio
+import unittest
+import unittest.mock as mock
+import asynctest
+import asynctest.mock as amock
+
+from opsdroid.__main__ import configure_lang
+from opsdroid.core import OpsDroid
+from opsdroid.connector.github import ConnectorGitHub
+from opsdroid.message import Message
+
+
+class TestConnectorGitHub(unittest.TestCase):
+    """Test the opsdroid github connector class."""
+
+    def setUp(self):
+        self.loop = asyncio.new_event_loop()
+
+    def test_init(self):
+        """Test that the connector is initialised properly."""
+        connector = ConnectorGitHub({
+            'name': 'github',
+            'token': 'test'
+        })
+        self.assertEqual(None, connector.default_room)
+        self.assertEqual("github", connector.name)
+
+    def test_missing_token(self):
+        """Test that attempt to connect without info raises an error."""
+        with mock.patch('opsdroid.connector.github._LOGGER.error') \
+                as logmock:
+            ConnectorGitHub({})
+            self.assertTrue(logmock.called)
+
+
+class TestConnectorGitHubAsync(asynctest.TestCase):
+    """Test the async methods of the opsdroid github connector class."""
+
+    def setUp(self):
+        configure_lang({})
+        self.connector = ConnectorGitHub({
+            'name': 'github',
+            'token': 'test'
+        })
+
+    async def test_connect(self):
+        opsdroid_mock = amock.CoroutineMock()
+        with amock.patch('aiohttp.ClientSession.get') as patched_request:
+            mockresponse = amock.CoroutineMock()
+            mockresponse.status = 200
+            mockresponse.json = amock.CoroutineMock(return_value={
+                "login": 'opsdroid'
+            })
+            patched_request.return_value = asyncio.Future()
+            patched_request.return_value.set_result(mockresponse)
+            await self.connector.connect(opsdroid_mock)
+            self.assertEqual(self.connector.github_username, "opsdroid")
+            self.assertTrue(opsdroid_mock.web_server.web_app.router.add_post.called)
+
+    async def test_connect_failure(self):
+        result = amock.MagicMock()
+        result.status = 401
+
+        with OpsDroid() as opsdroid, \
+            amock.patch('aiohttp.ClientSession.get') as patched_request, \
+            amock.patch('opsdroid.connector.github._LOGGER.error',) \
+                as logmock:
+
+            patched_request.return_value = asyncio.Future()
+            patched_request.return_value.set_result(result)
+
+            await self.connector.connect(opsdroid)
+            self.assertTrue(logmock.called)
+
+    async def test_disconnect(self):
+        self.assertEqual(await self.connector.disconnect(None), None)
+
+    async def test_get_comment(self):
+        """Test a comment create event creates a message and parses it."""
+        with open(os.path.join(os.path.dirname(__file__),
+                               'responses',
+                               'github_comment_payload.json'), 'r') as f:
+            mock_request = amock.CoroutineMock()
+            mock_request.post = amock.CoroutineMock(return_value={
+                'payload': f.read()
+            })
+            self.connector.opsdroid = amock.CoroutineMock()
+            self.connector.opsdroid.parse = amock.CoroutineMock()
+            await self.connector.github_message_handler(mock_request)
+            message = self.connector.opsdroid.parse.call_args[0][0]
+            self.assertEqual(message.connector.name, 'github')
+            self.assertEqual(message.text, 'hello')
+            self.assertEqual(message.room, 'opsdroid/opsdroid#237')
+            self.assertTrue(self.connector.opsdroid.parse.called)
+
+    async def test_get_pr(self):
+        """Test a PR create event creates a message and parses it."""
+        with open(os.path.join(os.path.dirname(__file__),
+                               'responses',
+                               'github_pr_payload.json'), 'r') as f:
+            mock_request = amock.CoroutineMock()
+            mock_request.post = amock.CoroutineMock(return_value={
+                'payload': f.read()
+            })
+            self.connector.opsdroid = amock.CoroutineMock()
+            self.connector.opsdroid.parse = amock.CoroutineMock()
+            await self.connector.github_message_handler(mock_request)
+            message = self.connector.opsdroid.parse.call_args[0][0]
+            self.assertEqual(message.connector.name, 'github')
+            self.assertEqual(message.text, 'hello world')
+            self.assertEqual(message.room, 'opsdroid/opsdroid-audio#175')
+            self.assertTrue(self.connector.opsdroid.parse.called)
+
+    async def test_get_issue(self):
+        """Test an issue create event creates a message and parses it."""
+        with open(os.path.join(os.path.dirname(__file__),
+                               'responses',
+                               'github_issue_payload.json'), 'r') as f:
+            mock_request = amock.CoroutineMock()
+            mock_request.post = amock.CoroutineMock(return_value={
+                'payload': f.read()
+            })
+            self.connector.opsdroid = amock.CoroutineMock()
+            self.connector.opsdroid.parse = amock.CoroutineMock()
+            await self.connector.github_message_handler(mock_request)
+            message = self.connector.opsdroid.parse.call_args[0][0]
+            self.assertEqual(message.connector.name, 'github')
+            self.assertEqual(message.text, 'test')
+            self.assertEqual(message.room, 'opsdroid/opsdroid#740')
+            self.assertTrue(self.connector.opsdroid.parse.called)
+
+    async def test_get_label(self):
+        """Test a label create event doesn't create a message and parse it."""
+        with open(os.path.join(os.path.dirname(__file__),
+                               'responses',
+                               'github_label_payload.json'), 'r') as f:
+            mock_request = amock.CoroutineMock()
+            mock_request.post = amock.CoroutineMock(return_value={
+                'payload': f.read()
+            })
+            self.connector.opsdroid = amock.CoroutineMock()
+            self.connector.opsdroid.parse = amock.CoroutineMock()
+            await self.connector.github_message_handler(mock_request)
+            self.assertFalse(self.connector.opsdroid.parse.called)
+
+    async def test_get_no_action(self):
+        """Test a status event doesn't create a message and parse it."""
+        with open(os.path.join(os.path.dirname(__file__),
+                               'responses',
+                               'github_status_payload.json'), 'r') as f:
+            mock_request = amock.CoroutineMock()
+            mock_request.post = amock.CoroutineMock(return_value={
+                'payload': f.read()
+            })
+            self.connector.opsdroid = amock.CoroutineMock()
+            self.connector.opsdroid.parse = amock.CoroutineMock()
+            await self.connector.github_message_handler(mock_request)
+            self.assertFalse(self.connector.opsdroid.parse.called)
+
+    async def test_listen(self):
+        """Test the listen method.
+
+        The GitHub connector listens using an API endoint and so the listen
+        method should just pass and do nothing. We just need to test that it
+        does not block.
+
+        """
+        self.assertEqual(await self.connector.listen(None), None)
+
+    async def test_respond(self):
+        with amock.patch('aiohttp.ClientSession.post') as patched_request:
+            mockresponse = amock.CoroutineMock()
+            mockresponse.status = 201
+            patched_request.return_value = asyncio.Future()
+            patched_request.return_value.set_result(mockresponse)
+            resp = await self.connector.respond(
+                Message('test', 'jacobtomlinson',
+                        'opsdroid/opsdroid#1', self.connector))
+            self.assertTrue(patched_request.called)
+            self.assertTrue(resp)
+
+    async def test_respond_bot_short(self):
+        with amock.patch('aiohttp.ClientSession.post') as patched_request:
+            mockresponse = amock.CoroutineMock()
+            mockresponse.status = 201
+            patched_request.return_value = asyncio.Future()
+            patched_request.return_value.set_result(mockresponse)
+            self.connector.github_username = 'opsdroid-bot'
+            resp = await self.connector.respond(
+                Message('test', 'opsdroid-bot',
+                        'opsdroid/opsdroid#1', self.connector))
+            self.assertFalse(patched_request.called)
+            self.assertTrue(resp)
+
+    async def test_respond_failure(self):
+        with amock.patch('aiohttp.ClientSession.post') as patched_request:
+            mockresponse = amock.CoroutineMock()
+            mockresponse.status = 400
+            mockresponse.json = amock.CoroutineMock(return_value={
+                "error": 'some error'
+            })
+            patched_request.return_value = asyncio.Future()
+            patched_request.return_value.set_result(mockresponse)
+            resp = await self.connector.respond(
+                Message('test', 'opsdroid-bot',
+                        'opsdroid/opsdroid#1', self.connector))
+            self.assertTrue(patched_request.called)
+            self.assertFalse(resp)