diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,4 @@
+# 0.9.0
+
+* This is an alpha testing release with an incomplete feature set to recieve feedback on the API.
+* The API may change in the recent future. When alpha testing has commenced, the version will start at `1.0.0`.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 OnRock Engineering (https://onrock.engineering)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/github-webhooks.cabal b/github-webhooks.cabal
new file mode 100644
--- /dev/null
+++ b/github-webhooks.cabal
@@ -0,0 +1,74 @@
+-- This file has been generated from package.yaml by hpack version 0.21.2.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: f7a90de8da51ba7bfe8b932cd2e197309c530257d3ed031c1d776ccb5cd7f39e
+
+name:           github-webhooks
+version:        0.9.0
+synopsis:       Aeson instances for GitHub Webhook payloads.
+description:    Complete instances for decoding GitHub Webhook payloads (using @aeson@). See the README at <https://github.com/onrock-eng/github-webhooks#readme> for examples.
+category:       GitHub
+homepage:       https://github.com/onrock-eng/github-webhooks#readme
+bug-reports:    https://github.com/onrock-eng/github-webhooks/issues
+author:         Kyle Van Berendonck <kyle.vanberendonck@onrock.engineering>
+maintainer:     Kyle Van Berendonck <foss@onrock.engineering>
+copyright:      (c) 2017-2018 OnRock Engineering
+license:        MIT
+license-file:   LICENSE
+build-type:     Simple
+cabal-version:  >= 1.10
+
+extra-source-files:
+    CHANGELOG.md
+    package.yaml
+    stack.yaml
+
+source-repository head
+  type: git
+  location: https://github.com/onrock-eng/github-webhooks
+
+library
+  hs-source-dirs:
+      src
+  default-extensions: DeriveDataTypeable DeriveGeneric OverloadedStrings
+  ghc-options: -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates
+  build-depends:
+      aeson
+    , base ==4.*
+    , base16-bytestring
+    , bytestring
+    , cryptonite
+    , deepseq
+    , deepseq-generics
+    , memory
+    , text
+    , time
+    , vector
+  exposed-modules:
+      GitHub.Data.Webhooks.Events
+      GitHub.Data.Webhooks.Payload
+      GitHub.Data.Webhooks.Secure
+  other-modules:
+      Paths_github_webhooks
+  default-language: Haskell2010
+
+test-suite spec
+  type: exitcode-stdio-1.0
+  main-is: Spec.hs
+  hs-source-dirs:
+      spec
+  default-extensions: DeriveDataTypeable DeriveGeneric OverloadedStrings ScopedTypeVariables
+  ghc-options: -Wall -Wincomplete-uni-patterns -Wincomplete-record-updates
+  build-depends:
+      aeson
+    , base ==4.*
+    , bytestring
+    , github-webhooks
+    , hspec ==2.*
+    , text
+    , vector
+  other-modules:
+      DecodeEventsSpec
+      Paths_github_webhooks
+  default-language: Haskell2010
diff --git a/package.yaml b/package.yaml
new file mode 100644
--- /dev/null
+++ b/package.yaml
@@ -0,0 +1,54 @@
+name: github-webhooks
+version: 0.9.0
+
+category: GitHub
+license: MIT
+extra-source-files:
+  - package.yaml
+  - stack.yaml
+  - CHANGELOG.md
+synopsis: Aeson instances for GitHub Webhook payloads.
+copyright: (c) 2017-2018 OnRock Engineering
+author: Kyle Van Berendonck <kyle.vanberendonck@onrock.engineering>
+maintainer: Kyle Van Berendonck <foss@onrock.engineering>
+github: onrock-eng/github-webhooks
+description:
+    Complete instances for decoding GitHub Webhook payloads (using @aeson@).
+    See the README at <https://github.com/onrock-eng/github-webhooks#readme> for examples.
+
+ghc-options:
+  - -Wall
+  - -Wincomplete-uni-patterns
+  - -Wincomplete-record-updates
+
+default-extensions:
+  - DeriveDataTypeable
+  - DeriveGeneric
+  - OverloadedStrings
+
+dependencies:
+ - base == 4.*
+ - aeson
+ - bytestring
+ - text
+ - vector
+
+library:
+  source-dirs: src
+  dependencies:
+    - base16-bytestring
+    - cryptonite
+    - deepseq
+    - deepseq-generics
+    - memory
+    - time
+
+tests:
+  spec:
+    source-dirs: spec
+    main: Spec.hs
+    dependencies:
+      - github-webhooks
+      - hspec == 2.*
+    default-extensions:
+      - ScopedTypeVariables
diff --git a/spec/DecodeEventsSpec.hs b/spec/DecodeEventsSpec.hs
new file mode 100644
--- /dev/null
+++ b/spec/DecodeEventsSpec.hs
@@ -0,0 +1,4316 @@
+-- | Smoke tests to make sure that the Aeson FromJSON instances work as expected.
+module DecodeEventsSpec
+    ( spec
+    ) where
+
+import           Test.Hspec
+import           Control.Monad               ( void )
+import           Data.Aeson                  ( FromJSON, eitherDecode' )
+import qualified Data.Text                   as T
+import qualified Data.ByteString.Lazy        as BSL
+import qualified Data.Vector                 as V
+
+import           GitHub.Data.Webhooks.Events
+import           GitHub.Data.Webhooks.Payload
+
+
+-- Run GHCi:
+-- $ stack install pretty-show
+-- $ stack ghci --test pretty-show
+
+-- Paste:
+{-
+import Data.Aeson
+import qualified Data.ByteString.Lazy as BSL
+import GitHub.Data.Webhooks.Events
+import Text.Show.Pretty
+import Text.PrettyPrint.HughesPJ
+-}
+
+-- Use:
+-- do { x <- BSL.readFile "fixtures/watch-event.json";
+--      putStrLn $ renderStyle (style {lineLength=200}) . ppDoc $ either error id (eitherDecode' x :: Either String WatchEvent) }
+
+fixtureShouldMatch :: (FromJSON a, Show a, Eq a) => String -> a -> IO ()
+fixtureShouldMatch path expected = do
+  str <- BSL.readFile path
+  let output = eitherDecode' str
+  void $ output `shouldBe` Right expected
+
+spec :: Spec
+spec = do
+  it "can decode CommitCommentEvent"      $ fixtureShouldMatch "fixtures/commit-comment-event.json" commitCommentEventFixture
+  it "can decode CreateEvent"             $ fixtureShouldMatch "fixtures/create-event.json" createEventFixture
+  it "can decode DeleteEvent"             $ fixtureShouldMatch "fixtures/delete-event.json" deleteEventFixture
+  it "can decode DeploymentEvent"         $ fixtureShouldMatch "fixtures/deployment-event.json" deploymentEventFixture
+  it "can decode DeploymentStatusEvent"   $ fixtureShouldMatch "fixtures/deployment-status-event.json" deploymentStatusEventFixture
+  it "can decode ForkEvent"               $ fixtureShouldMatch "fixtures/fork-event.json" forkEventFixture
+  it "can decode GollumEvent"             $ fixtureShouldMatch "fixtures/gollum-event.json" gollumEventFixture
+  it "can decode InstallationEvent"       $ fixtureShouldMatch "fixtures/installation-event.json" installationEventFixture
+  it "can decode InstallationRepositoriesEvent" $ fixtureShouldMatch "fixtures/installation-repo-event.json" installationRepoEventFixture
+  it "can decode IssueCommentEvent"       $ fixtureShouldMatch "fixtures/issue-comment-event.json" issueCommentEventFixture
+  it "can decode IssuesEvent"             $ fixtureShouldMatch "fixtures/issues-event.json" issuesEventFixture
+  it "can decode LabelEvent"              $ fixtureShouldMatch "fixtures/label-event.json" labelEventFixture
+  it "can decode MemberEvent"             $ fixtureShouldMatch "fixtures/member-event.json" memberEventFixture
+  it "can decode MembershipEvent"         $ fixtureShouldMatch "fixtures/membership-event.json" membershipEventFixture
+  it "can decode MilestoneEvent"          $ fixtureShouldMatch "fixtures/milestone-event.json" milestoneEventFixture
+  it "can decode OrgBlockEvent"           $ fixtureShouldMatch "fixtures/org-block-event.json" orgBlockEventFixture
+  it "can decode OrganizationEvent"       $ fixtureShouldMatch "fixtures/organization-event.json" organizationEventFixture
+  it "can decode PageBuildEvent"          $ fixtureShouldMatch "fixtures/page-build-event.json" pageBuildEventFixture
+  it "can decode ProjectCardEvent"        $ fixtureShouldMatch "fixtures/project-card-event.json" projectCardEventFixture
+  it "can decode ProjectColumnEvent"      $ fixtureShouldMatch "fixtures/project-column-event.json" projectColumnEventFixture
+  it "can decode ProjectEvent"            $ fixtureShouldMatch "fixtures/project-event.json" projectEventFixture
+  it "can decode PublicEvent"             $ fixtureShouldMatch "fixtures/public-event.json" publicEventFixture
+  it "can decode PullRequestEvent"        $ fixtureShouldMatch "fixtures/pull-request-event.json" pullRequestEventFixture
+  it "can decode PullRequestReviewCommentEvent" $ fixtureShouldMatch  "fixtures/pull-request-review-comment-event.json" pullRequestReviewCommentEventFixture
+  it "can decode PullRequestReviewEvent"  $ fixtureShouldMatch "fixtures/pull-request-review-event.json" pullRequestReviewEventFixture
+  it "can decode PushEvent"               $ fixtureShouldMatch "fixtures/push-event.json" pushEventFixture
+  it "can decode ReleaseEvent"            $ fixtureShouldMatch "fixtures/release-event.json" releaseEventFixture
+  it "can decode RepositoryEvent"         $ fixtureShouldMatch "fixtures/repository-event.json" repositoryEventFixture
+  it "can decode StatusEvent"             $ fixtureShouldMatch "fixtures/status-event.json" statusEventFixture
+  it "can decode TeamAddEvent"            $ fixtureShouldMatch "fixtures/team-add-event.json" teamAddEventFixture
+  it "can decode TeamEvent"               $ fixtureShouldMatch "fixtures/team-event.json" teamEventFixture
+  it "can decode WatchEvent"              $ fixtureShouldMatch "fixtures/watch-event.json" watchEventFixture
+
+
+-- Fixtures
+-- These correspond to the expected decoded output of the above JSON files.
+
+commitCommentEventFixture :: CommitCommentEvent
+commitCommentEventFixture = CommitCommentEvent
+    { evCommitCommentAction = CommitCommentActionCreated
+    , evCommitCommentPayload =
+        HookCommitComment
+          { whCommitCommentUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments/11056394"
+          , whCommitCommentHtmlUrl =
+              URL "https://github.com/baxterthehacker/public-repo/commit/9049f1265b7d61be4a8904a9a27120d2064dab3b#commitcomment-11056394"
+          , whCommitCommentId = 11056394
+          , whCommitCommentUser =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whCommitCommentPos = Nothing
+          , whCommitCommentLine = Nothing
+          , whCommitCommentPath = Nothing
+          , whCommitCommentCommitSha = "9049f1265b7d61be4a8904a9a27120d2064dab3b"
+          , whCommitCommentCreatedAt = read "2015-05-05 23:40:29"
+          , whCommitCommentUpdatedAt = read "2015-05-05 23:40:29"
+          , whCommitCommentBody = "This is a really good change! :+1:"
+          }
+    , evCommitCommentRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evCommitCommentSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+createEventFixture :: CreateEvent
+createEventFixture = CreateEvent
+    { evCreateRef = "0.0.1"
+    , evCreateRefType = "tag"
+    , evCreateMasterBranch = "master"
+    , evCreateDescription = ""
+    , evCreatePusherType = OwnerUser
+    , evCreateRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:38"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evCreateSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+deleteEventFixture :: DeleteEvent
+deleteEventFixture = DeleteEvent
+    { evDeleteRef = "simple-tag"
+    , evDeleteRefType = "tag"
+    , evDeletePusherType = OwnerUser
+    , evDeleteRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:40"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evDeleteSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+deploymentEventFixture :: DeploymentEvent
+deploymentEventFixture = DeploymentEvent
+    { evDeploymentInfo =
+        HookDeployment
+          { whDeploymentUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692"
+          , whDeploymentId = 710692
+          , whDeploymentSha = "9049f1265b7d61be4a8904a9a27120d2064dab3b"
+          , whDeploymentRef = "master"
+          , whDeploymentTask = "deploy"
+          , whDeploymentEnv = "production"
+          , whDeploymentDescription = Nothing
+          , whDeploymentCreator =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whDeploymentCreatedAt = read "2015-05-05 23:40:38"
+          , whDeploymentUpdatedAt = read "2015-05-05 23:40:38"
+          , whDeploymentStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692/statuses"
+          , whDeploymentRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          }
+    , evDeploymentRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:38"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evDeploymentSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+deploymentStatusEventFixture :: DeploymentStatusEvent
+deploymentStatusEventFixture = DeploymentStatusEvent
+    { evDeplStatusInfo =
+        HookDeploymentStatus
+          { whDeploymentStatusUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692/statuses/1115122"
+          , whDeploymentStatusId = 1115122
+          , whDeploymentStatusState = "success"
+          , whDeploymentStatusCreator =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whDeploymentStatusDesc = Nothing
+          , whDeploymentStatusTargetUrl = Nothing
+          , whDeploymentStatusCreatedAt = read "2015-05-05 23:40:39"
+          , whDeploymentStatusUpdatedAt = read "2015-05-05 23:40:39"
+          , whDeploymentStatusDeplUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692"
+          , whDeploymentStatusRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          }
+    , evDeplStatusDeployment =
+        HookDeployment
+          { whDeploymentUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692"
+          , whDeploymentId = 710692
+          , whDeploymentSha = "9049f1265b7d61be4a8904a9a27120d2064dab3b"
+          , whDeploymentRef = "master"
+          , whDeploymentTask = "deploy"
+          , whDeploymentEnv = "production"
+          , whDeploymentDescription = Nothing
+          , whDeploymentCreator =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whDeploymentCreatedAt = read "2015-05-05 23:40:38"
+          , whDeploymentUpdatedAt = read "2015-05-05 23:40:38"
+          , whDeploymentStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/deployments/710692/statuses"
+          , whDeploymentRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          }
+    , evDeplStatusRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:38"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evDeplStatusSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+forkEventFixture :: ForkEvent
+forkEventFixture = ForkEvent
+    { evForkDestination =
+        HookRepository
+          { whRepoId = 35129393
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterandthehackers/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterandthehackers"
+                , whUserId = 7649605
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterandthehackers"
+                , whUserHtmlUrl = URL "https://github.com/baxterandthehackers"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterandthehackers/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterandthehackers/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterandthehackers/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterandthehackers/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterandthehackers/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterandthehackers/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterandthehackers/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterandthehackers/received_events"
+                , whUserType = OwnerOrganization
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterandthehackers/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = True
+          , whRepoUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:30"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterandthehackers/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterandthehackers/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterandthehackers/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterandthehackers/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = False
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 0
+          , whRepoDefaultBranchName = "master"
+          }
+    , evForkSource =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 1
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evForkSender =
+        HookUser
+          { whUserLogin = "baxterandthehackers"
+          , whUserId = 7649605
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterandthehackers"
+          , whUserHtmlUrl = URL "https://github.com/baxterandthehackers"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterandthehackers/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterandthehackers/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterandthehackers/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterandthehackers/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterandthehackers/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterandthehackers/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterandthehackers/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterandthehackers/received_events"
+          , whUserType = OwnerOrganization
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+gollumEventFixture :: GollumEvent
+gollumEventFixture = GollumEvent
+    { evGollumPages = V.fromList
+        [ HookWikiPage
+            { whWikiPageName = "Home"
+            , whWikiPageTitle = "Home"
+            , whWikiPageSummary = Nothing
+            , wkWikiPageAction = "created"
+            , whWikiPageSha = "91ea1bd42aa2ba166b86e8aefe049e9837214e67"
+            , whWikiPageHtmlUrl = URL "https://github.com/baxterthehacker/public-repo/wiki/Home"
+            }
+        ]
+    , evGollumRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:17"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 0
+          , whRepoDefaultBranchName = "master"
+          }
+    , evGollumSender =
+        HookUser
+          { whUserLogin = "jasonrudolph"
+          , whUserId = 2988
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/2988?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/jasonrudolph"
+          , whUserHtmlUrl = URL "https://github.com/jasonrudolph"
+          , whUserFollowersUrl = URL "https://api.github.com/users/jasonrudolph/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/jasonrudolph/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/jasonrudolph/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/jasonrudolph/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/jasonrudolph/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/jasonrudolph/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/jasonrudolph/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/jasonrudolph/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/jasonrudolph/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = True
+          }
+    }
+
+installationEventFixture :: InstallationEvent
+installationEventFixture = InstallationEvent
+    { evInstallationAction = InstallationDeletedAction
+    , evInstallationInfo =
+        HookInstallation
+          { whInstallationId = 2
+          , whInstallationAccount =
+              HookUser
+                { whUserLogin = "octocat"
+                , whUserId = 1
+                , whUserAvatarUrl = URL "https://github.com/images/error/octocat_happy.gif"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/octocat"
+                , whUserHtmlUrl = URL "https://github.com/octocat"
+                , whUserFollowersUrl = URL "https://api.github.com/users/octocat/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/octocat/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/octocat/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/octocat/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/octocat/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/octocat/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/octocat/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/octocat/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/octocat/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whInstallationRepoSel = "selected"
+          , whInstallationTokenUrl = URL "https://api.github.com/installations/2/access_tokens"
+          , whInstallationRepoUrl = URL "https://api.github.com/installation/repositories"
+          }
+    , evInstallationSender =
+        HookUser
+          { whUserLogin = "octocat"
+          , whUserId = 1
+          , whUserAvatarUrl = URL "https://github.com/images/error/octocat_happy.gif"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/octocat"
+          , whUserHtmlUrl = URL "https://github.com/octocat"
+          , whUserFollowersUrl = URL "https://api.github.com/users/octocat/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/octocat/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/octocat/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/octocat/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/octocat/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/octocat/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/octocat/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/octocat/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/octocat/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+installationRepoEventFixture :: InstallationRepositoriesEvent
+installationRepoEventFixture = InstallationRepositoriesEvent
+    { evInstallationRepoAction = InstallationRepoRemovedAction
+    , evInstallationRepoInfo =
+        HookInstallation
+          { whInstallationId = 2
+          , whInstallationAccount =
+              HookUser
+                { whUserLogin = "octocat"
+                , whUserId = 1
+                , whUserAvatarUrl = URL "https://github.com/images/error/octocat_happy.gif"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/octocat"
+                , whUserHtmlUrl = URL "https://github.com/octocat"
+                , whUserFollowersUrl = URL "https://api.github.com/users/octocat/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/octocat/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/octocat/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/octocat/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/octocat/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/octocat/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/octocat/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/octocat/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/octocat/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whInstallationRepoSel = "selected"
+          , whInstallationTokenUrl = URL "https://api.github.com/installations/2/access_tokens"
+          , whInstallationRepoUrl = URL "https://api.github.com/installation/repositories"
+          }
+    , evInstallationRepoSel = "selected"
+    , evInstallationReposAdd = V.empty
+    , evInstallationReposRemove = V.fromList
+        [ HookRepositorySimple { whSimplRepoId = 1296269 , whSimplRepoName = "Hello-World" , whSimplRepoFullName = "octocat/Hello-World" } ]
+    , evInstallationReposSender =
+        HookUser
+          { whUserLogin = "octocat"
+          , whUserId = 1
+          , whUserAvatarUrl = URL "https://github.com/images/error/octocat_happy.gif"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/octocat"
+          , whUserHtmlUrl = URL "https://github.com/octocat"
+          , whUserFollowersUrl = URL "https://api.github.com/users/octocat/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/octocat/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/octocat/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/octocat/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/octocat/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/octocat/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/octocat/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/octocat/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/octocat/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+issueCommentEventFixture :: IssueCommentEvent
+issueCommentEventFixture = IssueCommentEvent
+    { evIssueCommentAction = IssueCommentCreatedAction
+    , evIssueCommentIssue =
+        HookIssue
+          { whIssueUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/2"
+          , whIssueLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/labels{/name}"
+          , whIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/comments"
+          , whIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/events"
+          , whIssueHtmlUrl = URL "https://github.com/baxterthehacker/public-repo/issues/2"
+          , whIssueId = 73464126
+          , whIssueNumber = 2
+          , whIssueTitle = "Spelling error in the README file"
+          , whIssueUser =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whIssueLabels = V.fromList
+              [ HookIssueLabels
+                  { whIssueLabelId = Nothing
+                  , whIssueLabelUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels/bug"
+                  , whIssueLabelName = "bug"
+                  , whIssueLabelColor = "fc2929"
+                  , whIssueLabelIsDefault = False
+                  }
+              ]
+          , whIssueState = "open"
+          , whIssueIsLocked = False
+          , whIssueAssignee = Nothing
+          , whIssueMilestone = Nothing
+          , whIssueCommentCount = 1
+          , whIssueCreatedAt = read "2015-05-05 23:40:28"
+          , whIssueUpdatedAt = read "2015-05-05 23:40:28"
+          , whIssueClosedAt = Nothing
+          , whIssueBody = "It looks like you accidently spelled 'commit' with two 't's."
+          }
+    , evIssueCommentPayload =
+        HookIssueComment
+          { whIssueCommentUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments/99262140"
+          , whIssueCommentHtmlUrl = URL "https://github.com/baxterthehacker/public-repo/issues/2#issuecomment-99262140"
+          , whIssueCommentIssueUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/2"
+          , whIssueCommentId = 99262140
+          , whIssueCommentUser =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whIssueCommentCreatedAt = read "2015-05-05 23:40:28"
+          , whIssueCommentUpdatedAt = read "2015-05-05 23:40:28"
+          , whIssueCommentBody = "You are totally right! I'll get this fixed right away."
+          }
+    , evIssueCommentRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evIssueCommentSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+issuesEventFixture :: IssuesEvent
+issuesEventFixture = IssuesEvent
+    { evIssuesEventAction = IssuesOpenedAction
+    , evIssuesEventIssue =
+        HookIssue
+          { whIssueUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/2"
+          , whIssueLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/labels{/name}"
+          , whIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/comments"
+          , whIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/2/events"
+          , whIssueHtmlUrl = URL "https://github.com/baxterthehacker/public-repo/issues/2"
+          , whIssueId = 73464126
+          , whIssueNumber = 2
+          , whIssueTitle = "Spelling error in the README file"
+          , whIssueUser =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whIssueLabels = V.fromList
+              [ HookIssueLabels
+                  { whIssueLabelId = Just 208045946
+                  , whIssueLabelUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels/bug"
+                  , whIssueLabelName = "bug"
+                  , whIssueLabelColor = "fc2929"
+                  , whIssueLabelIsDefault = True
+                  }
+              ]
+          , whIssueState = "open"
+          , whIssueIsLocked = False
+          , whIssueAssignee = Nothing
+          , whIssueMilestone = Nothing
+          , whIssueCommentCount = 0
+          , whIssueCreatedAt = read "2015-05-05 23:40:28"
+          , whIssueUpdatedAt = read "2015-05-05 23:40:28"
+          , whIssueClosedAt = Nothing
+          , whIssueBody = "It looks like you accidently spelled 'commit' with two 't's."
+          }
+    , evIssuesEventRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evIssuesEventSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+labelEventFixture :: LabelEvent
+labelEventFixture = LabelEvent
+    { evLabelEventAction = LabelCreatedAction
+    , evLabelEventPayload =
+        HookRepositoryLabel
+          { whRepoLabelUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/labels/blocked"
+          , whRepoLabelName = "blocked"
+          , whRepoLabelColor = "ff0000"
+          }
+    , evLabelEventRepo =
+        HookRepository
+          { whRepoId = 67075329
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterandthehackers/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterandthehackers"
+                , whUserId = 4312013
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/4312013?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterandthehackers"
+                , whUserHtmlUrl = URL "https://github.com/baxterandthehackers"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterandthehackers/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterandthehackers/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterandthehackers/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterandthehackers/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterandthehackers/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterandthehackers/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterandthehackers/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterandthehackers/received_events"
+                , whUserType = OwnerOrganization
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = True
+          , whRepoHtmlUrl = URL "https://github.com/baxterandthehackers/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2016-08-31 21:38:51"
+          , whRepoUpdatedAt = read "2016-08-31 21:38:51"
+          , whRepoPushedAt = read "2016-08-31 21:38:51"
+          , whRepoGitUrl = URL "git://github.com/baxterandthehackers/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterandthehackers/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterandthehackers/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterandthehackers/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = False
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evLabelEventOrganization =
+        Just
+          HookOrganization
+            { whOrgLogin = "baxterandthehackers"
+            , whOrgId = 4312013
+            , whOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+            , whOrgReposUrl = URL "https://api.github.com/orgs/baxterandthehackers/repos"
+            , whOrgEventsUrl = URL "https://api.github.com/orgs/baxterandthehackers/events"
+            , whOrgHooksUrl = Just (URL "https://api.github.com/orgs/baxterandthehackers/hooks")
+            , whOrgIssuesUrl = Just (URL "https://api.github.com/orgs/baxterandthehackers/issues")
+            , whOrgMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/members{/member}"
+            , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/public_members{/member}"
+            , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/4312013?v=3"
+            , whOrgDescription = T.empty
+            }
+    , evLabelEventSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 7649605
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = True
+          }
+    }
+
+memberEventFixture :: MemberEvent
+memberEventFixture = MemberEvent
+    { evMemberAction = MemberAddedAction
+    , evMemberUser =
+        HookUser
+          { whUserLogin = "octocat"
+          , whUserId = 583231
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/583231?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/octocat"
+          , whUserHtmlUrl = URL "https://github.com/octocat"
+          , whUserFollowersUrl = URL "https://api.github.com/users/octocat/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/octocat/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/octocat/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/octocat/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/octocat/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/octocat/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/octocat/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/octocat/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/octocat/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    , evMemberRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:40"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evMemberSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+membershipEventFixture :: MembershipEvent
+membershipEventFixture = MembershipEvent
+    { evMembershipAction = MembershipAddedAction
+    , evMembershipScope = "team"
+    , evMembershipUser =
+        HookUser
+          { whUserLogin = "kdaigle"
+          , whUserId = 2501
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/2501?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/kdaigle"
+          , whUserHtmlUrl = URL "https://github.com/kdaigle"
+          , whUserFollowersUrl = URL "https://api.github.com/users/kdaigle/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/kdaigle/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/kdaigle/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/kdaigle/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/kdaigle/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/kdaigle/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/kdaigle/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/kdaigle/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/kdaigle/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = True
+          }
+    , evMembershipTeam =
+        HookTeam
+          { whTeamName = "Contractors"
+          , whTeamId = 123456
+          , whTeamSlug = "contractors"
+          , whTeamPermission = "admin"
+          , whTeamUrl = URL "https://api.github.com/teams/123456"
+          , whTeamMembersUrl = URL "https://api.github.com/teams/123456/members{/member}"
+          , whTeamRepositoriesUrl = URL "https://api.github.com/teams/123456/repos"
+          }
+    , evMembershipOrg =
+        HookOrganization
+          { whOrgLogin = "baxterandthehackers"
+          , whOrgId = 7649605
+          , whOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+          , whOrgReposUrl = URL "https://api.github.com/orgs/baxterandthehackers/repos"
+          , whOrgEventsUrl = URL "https://api.github.com/orgs/baxterandthehackers/events"
+          , whOrgHooksUrl = Nothing
+          , whOrgIssuesUrl = Nothing
+          , whOrgMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/members{/member}"
+          , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/public_members{/member}"
+          , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=2"
+          , whOrgDescription = T.empty
+          }
+    , evMembershipSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=2"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+milestoneEventFixture :: MilestoneEvent
+milestoneEventFixture = MilestoneEvent
+    { evMilestoneAction = MilestoneCreatedAction
+    , evMilestoenPayload =
+        HookMilestone
+          { whMilestoneUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/milestones/3"
+          , whMilestoneHtmlUrl =
+              URL "https://github.com/baxterandthehackers/public-repo/milestones/Test%20milestone%20creation%20webhook%20from%20command%20line2"
+          , whMilestoneLabelsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/milestones/3/labels"
+          , whMilestoneId = 2055681
+          , whMilestoneNumber = 3
+          , whMilestoneTitle = "I am a milestone"
+          , whMilestoneDescription = Nothing
+          , whMilestoneCreator =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 7649605
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = True
+                }
+          , whMilestoneOpenIssues = 0
+          , whMilestoneClosedIssues = 0
+          , whMilestoneState = "open"
+          , whMilestoneCreatedAt = read "2016-10-07 19:26:08"
+          , whMilestoneUpdatedAt = read "2016-10-07 19:26:08"
+          , whMilestoneDueOn = Nothing
+          , whMilestoneClosedAt = Nothing
+          }
+    , evMilestoneRepo =
+        HookRepository
+          { whRepoId = 70275481
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterandthehackers/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterandthehackers"
+                , whUserId = 4312013
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/4312013?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterandthehackers"
+                , whUserHtmlUrl = URL "https://github.com/baxterandthehackers"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterandthehackers/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterandthehackers/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterandthehackers/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterandthehackers/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterandthehackers/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterandthehackers/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterandthehackers/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterandthehackers/received_events"
+                , whUserType = OwnerOrganization
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = True
+          , whRepoHtmlUrl = URL "https://github.com/baxterandthehackers/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2016-10-07 19:10:12"
+          , whRepoUpdatedAt = read "2016-10-07 19:10:12"
+          , whRepoPushedAt = read "2016-10-07 19:10:13"
+          , whRepoGitUrl = URL "git://github.com/baxterandthehackers/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterandthehackers/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterandthehackers/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterandthehackers/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = False
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 0
+          , whRepoDefaultBranchName = "master"
+          }
+    , evMilestoneOrg =
+        HookOrganization
+          { whOrgLogin = "baxterandthehackers"
+          , whOrgId = 4312013
+          , whOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+          , whOrgReposUrl = URL "https://api.github.com/orgs/baxterandthehackers/repos"
+          , whOrgEventsUrl = URL "https://api.github.com/orgs/baxterandthehackers/events"
+          , whOrgHooksUrl = Just (URL "https://api.github.com/orgs/baxterandthehackers/hooks")
+          , whOrgIssuesUrl = Just (URL "https://api.github.com/orgs/baxterandthehackers/issues")
+          , whOrgMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/members{/member}"
+          , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/public_members{/member}"
+          , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/4312013?v=3"
+          , whOrgDescription = T.empty
+          }
+    , evMilestoneSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 7649605
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = True
+          }
+    }
+
+orgBlockEventFixture :: OrgBlockEvent
+orgBlockEventFixture = OrgBlockEvent
+    { evOrgBlockAction = OrgBlockBlockedAction
+    , evOrgBlockUser =
+        HookUser
+          { whUserLogin = "octocat"
+          , whUserId = 583231
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/583231?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/octocat"
+          , whUserHtmlUrl = URL "https://github.com/octocat"
+          , whUserFollowersUrl = URL "https://api.github.com/users/octocat/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/octocat/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/octocat/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/octocat/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/octocat/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/octocat/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/octocat/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/octocat/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/octocat/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    , evOrgBlockOrg =
+        HookOrganization
+          { whOrgLogin = "github"
+          , whOrgId = 4366038
+          , whOrgUrl = URL "https://api.github.com/orgs/github"
+          , whOrgReposUrl = URL "https://api.github.com/orgs/github/repos"
+          , whOrgEventsUrl = URL "https://api.github.com/orgs/github/events"
+          , whOrgHooksUrl = Just $ URL "https://api.github.com/orgs/github/hooks"
+          , whOrgIssuesUrl = Just $ URL "https://api.github.com/orgs/github/issues"
+          , whOrgMembersUrl = URL "https://api.github.com/orgs/github/members{/member}"
+          , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/github/public_members{/member}"
+          , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/4366038?v=3"
+          , whOrgDescription = T.empty
+          }
+    , evOrgBlockSender =
+        HookUser
+          { whUserLogin = "octodocs"
+          , whUserId = 25781999
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/25781999?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/octodocs"
+          , whUserHtmlUrl = URL "https://github.com/octodocs"
+          , whUserFollowersUrl = URL "https://api.github.com/users/octodocs/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/octodocs/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/octodocs/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/octodocs/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/octodocs/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/octodocs/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/octodocs/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/octodocs/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/octodocs/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+organizationEventFixture :: OrganizationEvent
+organizationEventFixture = OrganizationEvent
+    { evOrganizationAction = OrgMemberInvitedAction
+    , evOrganizationInvitation =
+        HookOrganizationInvitation
+          { whOrgInvitationId = 3294302
+          , whOrgInvitationLogin = "baxterthehacker"
+          , whOrgInvitationEmail = Nothing
+          , whOrgInvitationRole = "direct_member"
+          }
+    , evOrganizationMembership =
+        HookOrganizationMembership
+          { whOrgMembershipUrl = URL "https://api.github.com/orgs/baxterandthehackers/memberships/baxterthehacker"
+          , whOrgMembershipState = "active"
+          , whOrgMembershipRole = "member"
+          , whOrgMembershipOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+          , whOrgMembershipUser =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 7649605
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/17085448?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          }
+    , evOrganizationOrg =
+        HookOrganization
+          { whOrgLogin = "baxterandthehackers"
+          , whOrgId = 4312013
+          , whOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+          , whOrgReposUrl = URL "https://api.github.com/orgs/baxterandthehackers/repos"
+          , whOrgEventsUrl = URL "https://api.github.com/orgs/baxterandthehackers/events"
+          , whOrgHooksUrl = Just $ URL "https://api.github.com/orgs/baxterandthehackers/hooks"
+          , whOrgIssuesUrl = Just $ URL "https://api.github.com/orgs/baxterandthehackers/issues"
+          , whOrgMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/members{/member}"
+          , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/public_members{/member}"
+          , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/4312013?v=3"
+          , whOrgDescription = T.empty
+          }
+    , evOrganizationSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 7649605
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = True
+          }
+    }
+
+pageBuildEventFixture :: PageBuildEvent
+pageBuildEventFixture = PageBuildEvent
+    { evPageBuildId = 15995382
+    , evPageBuildResult =
+        HookPageBuildResult
+          { whPageBuildUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pages/builds/15995382"
+          , whPageBuildStatus = "built"
+          , whPageBuildError = Nothing
+          , whPageBuildPusher =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whPageBuildCommitSha = "053b99542c83021d6b202d1a1f5ecd5ef7084e55"
+          , whPageBuildDuration = 3790
+          , whPageBuildCreatedAt = read "2015-05-05 23:40:13"
+          , whPageBuildUpdatedAt = read "2015-05-05 23:40:17"
+          }
+    , evPageBuildRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:17"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 0
+          , whRepoDefaultBranchName = "master"
+          }
+    , evPageBuildSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+projectCardEventFixture :: ProjectCardEvent
+projectCardEventFixture = ProjectCardEvent
+    { evProjectCardAction = ProjectCardCreatedAction
+    , evProjectCardPayload =
+        HookProjectCard
+          { whProjectCardUrl = URL "https://api.github.com/projects/columns/cards/1266091"
+          , whProjectCardColumnUrl = URL "https://api.github.com/projects/columns/515520"
+          , whProjectCardColumnId = 515520
+          , whProjectCardId = 1266091
+          , whProjectCardNote = Nothing
+          , whProjectCardCreator =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=2"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whProjectCardCreatedAt = read "2017-09-27 23:37:43"
+          , whProjectCardUpdatedAt = read "2017-09-27 23:39:09"
+          , whProjectCardContentUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/2"
+          }
+    , evProjectCardRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evProjectCardOrg =
+        HookOrganization
+          { whOrgLogin = "baxterandthehackers"
+          , whOrgId = 7649605
+          , whOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+          , whOrgReposUrl = URL "https://api.github.com/orgs/baxterandthehackers/repos"
+          , whOrgEventsUrl = URL "https://api.github.com/orgs/baxterandthehackers/events"
+          , whOrgHooksUrl = Nothing
+          , whOrgIssuesUrl = Nothing
+          , whOrgMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/members{/member}"
+          , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/public_members{/member}"
+          , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=2"
+          , whOrgDescription = T.empty
+          }
+    , evProjectCardSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=2"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+projectColumnEventFixture :: ProjectColumnEvent
+projectColumnEventFixture = ProjectColumnEvent
+    { evProjectColumnAction = ProjectColumnCreatedAction
+    , evProjectColumnPayload =
+        HookProjectColumn
+          { whProjectColumnUrl = URL "https://api.github.com/projects/columns/515520"
+          , whProjectColumnProjUrl = URL "https://api.github.com/projects/288065"
+          , whProjectColumnCardsUrl = URL "https://api.github.com/projects/columns/515520/cards"
+          , whProjectColumnId = 515520
+          , whProjectColumnName = "High Priority"
+          , whProjectColumnCreatedAt = read "2017-09-27 23:37:43"
+          , whProjectColumnUpdatedAt = read "2017-09-27 23:39:09"
+          }
+    , evProjectColumnRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evProjectColumnOrg =
+        HookOrganization
+          { whOrgLogin = "baxterandthehackers"
+          , whOrgId = 7649605
+          , whOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+          , whOrgReposUrl = URL "https://api.github.com/orgs/baxterandthehackers/repos"
+          , whOrgEventsUrl = URL "https://api.github.com/orgs/baxterandthehackers/events"
+          , whOrgHooksUrl = Nothing
+          , whOrgIssuesUrl = Nothing
+          , whOrgMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/members{/member}"
+          , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/public_members{/member}"
+          , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=2"
+          , whOrgDescription = T.empty
+          }
+    , evProjectColumnSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=2"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+projectEventFixture :: ProjectEvent
+projectEventFixture = ProjectEvent
+    { evProjectEventAction = ProjectCreatedAction
+    , evProjectPayload =
+        HookProject
+          { whProjectOwnerUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whProjectUrl = URL "https://api.github.com/projects/288065"
+          , whProjectColumnsUrl = URL "https://api.github.com/projects/288065/columns"
+          , whProjectId = 288065
+          , whProjectName = "2017"
+          , whProjectBody = "Roadmap for work to be done in 2017"
+          , whProjectNumber = 10
+          , whProjectState = "open"
+          , whProjectCreator =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=2"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whProjectCreatedAt = read "2017-09-27 23:37:43"
+          , whProjectUpdatedAt = read "2017-09-27 23:39:09"
+          }
+    , evProjectRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evProjectOrganization =
+        HookOrganization
+          { whOrgLogin = "baxterandthehackers"
+          , whOrgId = 7649605
+          , whOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+          , whOrgReposUrl = URL "https://api.github.com/orgs/baxterandthehackers/repos"
+          , whOrgEventsUrl = URL "https://api.github.com/orgs/baxterandthehackers/events"
+          , whOrgHooksUrl = Nothing
+          , whOrgIssuesUrl = Nothing
+          , whOrgMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/members{/member}"
+          , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/public_members{/member}"
+          , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=2"
+          , whOrgDescription = T.empty
+          }
+    , evProjectSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=2"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+publicEventFixture :: PublicEvent
+publicEventFixture = PublicEvent
+    { evPublicEventRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:41"
+          , whRepoPushedAt = read "2015-05-05 23:40:40"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evPublicEventSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+pullRequestEventFixture :: PullRequestEvent
+pullRequestEventFixture = PullRequestEvent
+    { evPullReqAction = PullRequestOpenedAction
+    , evPullReqNumber = 1
+    , evPullReqPayload =
+        HookPullRequest
+          { whPullReqUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1"
+          , whPullReqId = 34778301
+          , whPullReqHtmlUrl = URL "https://github.com/baxterthehacker/public-repo/pull/1"
+          , whPullReqDiffUrl = URL "https://github.com/baxterthehacker/public-repo/pull/1.diff"
+          , whPullReqPatchUrl = URL "https://github.com/baxterthehacker/public-repo/pull/1.patch"
+          , whPullReqIssueUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/1"
+          , whPullReqNumber = 1
+          , whPullReqState = "open"
+          , whPullReqIsLocked = False
+          , whPullReqTitle = "Update the README with new information"
+          , whPullReqUser =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whPullReqBody = "This is a pretty simple change that we need to pull into master."
+          , whPullReqCreatedAt = read "2015-05-05 23:40:27"
+          , whPullReqUpdatedAt = read "2015-05-05 23:40:27"
+          , whPullReqClosedAt = Nothing
+          , whPullReqMergedAt = Nothing
+          , whPullReqMergeCommitSha = Nothing
+          , whPullReqAssignee = Nothing
+          , whPullReqMilestone = Nothing
+          , whPullReqCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits"
+          , whPullReqRevCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments"
+          , whPullReqRevCommentUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}"
+          , whPullReqCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/1/comments"
+          , whPullReqStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"
+          , whPullReqCommentCount = Just 0
+          , whPullReqRevCommentCount = Just 0
+          , whPullReqCommitCount = Just 1
+          , whPullReqAdditionsCount = Just 1
+          , whPullReqDeletionsCount = Just 1
+          , whPullReqFileChangeCount = Just 1
+          }
+    , evPullReqRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:26"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 1
+          , whRepoDefaultBranchName = "master"
+          }
+    , evPullReqSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    , evPullReqInstallationId = 234
+    }
+
+pullRequestReviewCommentEventFixture :: PullRequestReviewCommentEvent
+pullRequestReviewCommentEventFixture = PullRequestReviewCommentEvent
+    { evPullReqRevComAction = PullRequestReviewCommentCreatedAction
+    , evPullReqRevComment =
+        HookPullRequestReviewComment
+          { whPullReqRevComUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments/29724692"
+          , whPullReqRevComId = 29724692
+          , whPullReqRevComDiffHunk = "@@ -1 +1 @@\n-# public-repo"
+          , whPullReqRevComPath = "README.md"
+          , whPullReqRevComPos = 1
+          , whPullReqRevComOrigPos = 1
+          , whPullReqRevComCommitSha = "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"
+          , whPullReqRevComOrigSha = "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"
+          , whPullReqRevComUser =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whPullReqRevComBody = "Maybe you should use more emojji on this line."
+          , whPullReqRevComCreatedAt = read "2015-05-05 23:40:27"
+          , whPullReqRevComUpdatedAt = read "2015-05-05 23:40:27"
+          , whPullReqRevComHtmlUrl = URL "https://github.com/baxterthehacker/public-repo/pull/1#discussion_r29724692"
+          , whPullReqRevComPullReqUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1"
+          }
+    , evPullReqRevTarget =
+        HookPullRequest
+          { whPullReqUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1"
+          , whPullReqId = 34778301
+          , whPullReqHtmlUrl = URL "https://github.com/baxterthehacker/public-repo/pull/1"
+          , whPullReqDiffUrl = URL "https://github.com/baxterthehacker/public-repo/pull/1.diff"
+          , whPullReqPatchUrl = URL "https://github.com/baxterthehacker/public-repo/pull/1.patch"
+          , whPullReqIssueUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/1"
+          , whPullReqNumber = 1
+          , whPullReqState = "open"
+          , whPullReqIsLocked = False
+          , whPullReqTitle = "Update the README with new information"
+          , whPullReqUser =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whPullReqBody = "This is a pretty simple change that we need to pull into master."
+          , whPullReqCreatedAt = read "2015-05-05 23:40:27"
+          , whPullReqUpdatedAt = read "2015-05-05 23:40:27"
+          , whPullReqClosedAt = Nothing
+          , whPullReqMergedAt = Nothing
+          , whPullReqMergeCommitSha = Just "18721552ba489fb84e12958c1b5694b5475f7991"
+          , whPullReqAssignee = Nothing
+          , whPullReqMilestone = Nothing
+          , whPullReqCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/commits"
+          , whPullReqRevCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/1/comments"
+          , whPullReqRevCommentUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}"
+          , whPullReqCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/1/comments"
+          , whPullReqStatusesUrl =
+              URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"
+          , whPullReqCommentCount = Nothing
+          , whPullReqRevCommentCount = Nothing
+          , whPullReqCommitCount = Nothing
+          , whPullReqAdditionsCount = Nothing
+          , whPullReqDeletionsCount = Nothing
+          , whPullReqFileChangeCount = Nothing
+          }
+    , evPullReqRevRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 1
+          , whRepoDefaultBranchName = "master"
+          }
+    , evPullReqRevSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+pullRequestReviewEventFixture :: PullRequestReviewEvent
+pullRequestReviewEventFixture = PullRequestReviewEvent
+    { evPullReqReviewAction = PullRequestReviewSubmittedAction
+    , evPullReqReviewPayload =
+        HookPullRequestReview
+          { whPullReqReviewId = 2626884
+          , whPullReqReviewUser =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whPullReqReviewBody = "Looks great!"
+          , whPullReqReviewSubmittedAt = read "2016-10-03 23:39:09"
+          , whPullReqReviewState = "approved"
+          , whPullReqReviewHtmlUrl = URL "https://github.com/baxterthehacker/public-repo/pull/8#pullrequestreview-2626884"
+          , whPullReqReviewPullUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/8"
+          }
+    , evPullReqReviewTarget =
+        HookPullRequest
+          { whPullReqUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/8"
+          , whPullReqId = 87811438
+          , whPullReqHtmlUrl = URL "https://github.com/baxterthehacker/public-repo/pull/8"
+          , whPullReqDiffUrl = URL "https://github.com/baxterthehacker/public-repo/pull/8.diff"
+          , whPullReqPatchUrl = URL "https://github.com/baxterthehacker/public-repo/pull/8.patch"
+          , whPullReqIssueUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/8"
+          , whPullReqNumber = 8
+          , whPullReqState = "open"
+          , whPullReqIsLocked = False
+          , whPullReqTitle = "Add a README description"
+          , whPullReqUser =
+              HookUser
+                { whUserLogin = "skalnik"
+                , whUserId = 2546
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/2546?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/skalnik"
+                , whUserHtmlUrl = URL "https://github.com/skalnik"
+                , whUserFollowersUrl = URL "https://api.github.com/users/skalnik/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/skalnik/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/skalnik/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/skalnik/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/skalnik/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/skalnik/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/skalnik/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/skalnik/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/skalnik/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = True
+                }
+          , whPullReqBody = "Just a few more details"
+          , whPullReqCreatedAt = read "2016-10-03 23:37:43"
+          , whPullReqUpdatedAt = read "2016-10-03 23:39:09"
+          , whPullReqClosedAt = Nothing
+          , whPullReqMergedAt = Nothing
+          , whPullReqMergeCommitSha = Just "faea154a7decef6819754aab0f8c0e232e6c8b4f"
+          , whPullReqAssignee = Nothing
+          , whPullReqMilestone = Nothing
+          , whPullReqCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/8/commits"
+          , whPullReqRevCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/8/comments"
+          , whPullReqRevCommentUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls/comments{/number}"
+          , whPullReqCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/8/comments"
+          , whPullReqStatusesUrl =
+              URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/b7a1f9c27caa4e03c14a88feb56e2d4f7500aa63"
+          , whPullReqCommentCount = Nothing
+          , whPullReqRevCommentCount = Nothing
+          , whPullReqCommitCount = Nothing
+          , whPullReqAdditionsCount = Nothing
+          , whPullReqDeletionsCount = Nothing
+          , whPullReqFileChangeCount = Nothing
+          }
+    , evPullReqReviewRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2016-08-15 17:19:01"
+          , whRepoPushedAt = read "2016-10-03 23:37:43"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 233
+          , whRepoStargazersCount = 2
+          , whRepoWatchersCount = 2
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 2
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 5
+          , whRepoDefaultBranchName = "master"
+          }
+    , evPullReqReviewSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+pushEventFixture :: PushEvent
+pushEventFixture = PushEvent
+    { evPushRef = "refs/heads/changes"
+    , evPushHeadSha = Just "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"
+    , evPushBeforeSha = Just "9049f1265b7d61be4a8904a9a27120d2064dab3b"
+    , evPushCreated = False
+    , evPushDeleted = False
+    , evPushForced = False
+    , evPushBaseRef = Nothing
+    , evPushCompareUrl = URL "https://github.com/baxterthehacker/public-repo/compare/9049f1265b7d...0d1a26e67d8f"
+    , evPushCommits =
+        Just $ V.fromList
+          [ HookCommit
+              { whCommitSha = "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"
+              , whCommitUrl = URL "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"
+              , whCommitHtmlUrl = Nothing
+              , whCommitCommentsUrl = Nothing
+              , whCommitAuthor =
+                  Left
+                    HookSimpleUser
+                      { whSimplUserName = "baxterthehacker"
+                      , whSimplUserEmail = "baxterthehacker@users.noreply.github.com"
+                      , whSimplUserLogin = Just "baxterthehacker"
+                      }
+              , whCommitCommitter =
+                  Left
+                    HookSimpleUser
+                      { whSimplUserName = "baxterthehacker"
+                      , whSimplUserEmail = "baxterthehacker@users.noreply.github.com"
+                      , whSimplUserLogin = Just "baxterthehacker"
+                      }
+              }
+          ]
+    , evPushHeadCommit =
+        Just
+          HookCommit
+            { whCommitSha = "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"
+            , whCommitUrl = URL "https://github.com/baxterthehacker/public-repo/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"
+            , whCommitHtmlUrl = Nothing
+            , whCommitCommentsUrl = Nothing
+            , whCommitAuthor =
+                Left
+                  HookSimpleUser
+                    { whSimplUserName = "baxterthehacker"
+                    , whSimplUserEmail = "baxterthehacker@users.noreply.github.com"
+                    , whSimplUserLogin = Just "baxterthehacker"
+                    }
+            , whCommitCommitter =
+                Left
+                  HookSimpleUser
+                    { whSimplUserName = "baxterthehacker"
+                    , whSimplUserEmail = "baxterthehacker@users.noreply.github.com"
+                    , whSimplUserLogin = Just "baxterthehacker"
+                    }
+            }
+    , evPushRepository =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Left
+                HookSimpleUser
+                  { whSimplUserName = "baxterthehacker" , whSimplUserEmail = "baxterthehacker@users.noreply.github.com" , whSimplUserLogin = Nothing }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:12"
+          , whRepoPushedAt = read "2015-05-05 23:40:17"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 0
+          , whRepoDefaultBranchName = "master"
+          }
+    , evPushOrganization = Nothing
+    , evPushSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+releaseEventFixture :: ReleaseEvent
+releaseEventFixture = ReleaseEvent
+    { evReleaseEventAction = ReleasePublishedAction
+    , evReleaseEventPayload =
+        HookRelease
+          { whReleaseUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases/1261438"
+          , whReleaseAssetsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases/1261438/assets"
+          , whReleaseUploadUrl = URL "https://uploads.github.com/repos/baxterthehacker/public-repo/releases/1261438/assets{?name}"
+          , whReleaseHtmlUrl = URL "https://github.com/baxterthehacker/public-repo/releases/tag/0.0.1"
+          , whReleaseId = 1261438
+          , whReleaseTagName = "0.0.1"
+          , whReleaseTargetCommitish = "master"
+          , whReleaseName = Nothing
+          , whReleaseIsDraft = False
+          , whReleaseAuthor =
+              HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whReleaseIsPreRelease = False
+          , whReleaseCreatedAt = read "2015-05-05 23:40:12"
+          , whReleasePublishedAt = Just $ read "2015-05-05 23:40:38"
+          , whReleaseTarballUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tarball/0.0.1"
+          , whReleaseZipballUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/zipball/0.0.1"
+          , whReleaseBody = Nothing
+          }
+    , evReleaseEventRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:38"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evReleaseEventSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+repositoryEventFixture :: RepositoryEvent
+repositoryEventFixture = RepositoryEvent
+    { evRepositoryAction = RepositoryCreatedAction
+    , evRepositoryTarget =
+        HookRepository
+          { whRepoId = 27496774
+          , whRepoName = "new-repository"
+          , whRepoFullName = "baxterandthehackers/new-repository"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterandthehackers"
+                , whUserId = 7649605
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterandthehackers"
+                , whUserHtmlUrl = URL "https://github.com/baxterandthehackers"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterandthehackers/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterandthehackers/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterandthehackers/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterandthehackers/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterandthehackers/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterandthehackers/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterandthehackers/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterandthehackers/received_events"
+                , whUserType = OwnerOrganization
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = True
+          , whRepoHtmlUrl = URL "https://github.com/baxterandthehackers/new-repository"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/issues/comments/{number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/milestones{/number}"
+          , whRepoNotificationsUrl =
+              URL "https://api.github.com/repos/baxterandthehackers/new-repository/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterandthehackers/new-repository/releases{/id}"
+          , whRepoCreatedAt = read "2014-12-03 16:39:25"
+          , whRepoUpdatedAt = read "2014-12-03 16:39:25"
+          , whRepoPushedAt = read "2014-12-03 16:39:25"
+          , whRepoGitUrl = URL "git://github.com/baxterandthehackers/new-repository.git"
+          , whRepoSshUrl = URL "git@github.com:baxterandthehackers/new-repository.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterandthehackers/new-repository.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterandthehackers/new-repository"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = False
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 0
+          , whRepoDefaultBranchName = "master"
+          }
+    , evRepositoryOrg =
+        Just
+          HookOrganization
+            { whOrgLogin = "baxterandthehackers"
+            , whOrgId = 7649605
+            , whOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+            , whOrgReposUrl = URL "https://api.github.com/orgs/baxterandthehackers/repos"
+            , whOrgEventsUrl = URL "https://api.github.com/orgs/baxterandthehackers/events"
+            , whOrgHooksUrl = Nothing
+            , whOrgIssuesUrl = Nothing
+            , whOrgMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/members{/member}"
+            , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/public_members{/member}"
+            , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=2"
+            , whOrgDescription = T.empty
+            }
+    , evRepositorySender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=2"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+statusEventFixture :: StatusEvent
+statusEventFixture = StatusEvent
+    { evStatusId = 214015194
+    , evStatusCommitSha = "9049f1265b7d61be4a8904a9a27120d2064dab3b"
+    , evStatusCommitName = "baxterthehacker/public-repo"
+    , evStatusTargetUrl = Nothing
+    , evStatusContext = "default"
+    , evStatusDescription = Nothing
+    , evStatusState = StatusSuccessState
+    , evStatusCommit =
+        HookCommit
+          { whCommitSha = "9049f1265b7d61be4a8904a9a27120d2064dab3b"
+          , whCommitUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits/9049f1265b7d61be4a8904a9a27120d2064dab3b"
+          , whCommitHtmlUrl = Just $ URL "https://github.com/baxterthehacker/public-repo/commit/9049f1265b7d61be4a8904a9a27120d2064dab3b"
+          , whCommitCommentsUrl =
+              Just $ URL "https://api.github.com/repos/baxterthehacker/public-repo/commits/9049f1265b7d61be4a8904a9a27120d2064dab3b/comments"
+          , whCommitAuthor =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whCommitCommitter =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          }
+    , evStatusCreatedAt = read "2015-05-05 23:40:39"
+    , evStatusUpdatedAt = read "2015-05-05 23:40:39"
+    , evStatusRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:39"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evStatusSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+teamAddEventFixture :: TeamAddEvent
+teamAddEventFixture = TeamAddEvent
+    { evTeamAddTarget =
+        Just
+          HookTeam
+            { whTeamName = "github"
+            , whTeamId = 836012
+            , whTeamSlug = "github"
+            , whTeamPermission = "pull"
+            , whTeamUrl = URL "https://api.github.com/teams/836012"
+            , whTeamMembersUrl = URL "https://api.github.com/teams/836012/members{/member}"
+            , whTeamRepositoriesUrl = URL "https://api.github.com/teams/836012/repos"
+            }
+    , evTeamAddRepo =
+        HookRepository
+          { whRepoId = 35129393
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterandthehackers/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterandthehackers"
+                , whUserId = 7649605
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterandthehackers"
+                , whUserHtmlUrl = URL "https://github.com/baxterandthehackers"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterandthehackers/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterandthehackers/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterandthehackers/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterandthehackers/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterandthehackers/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterandthehackers/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterandthehackers/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterandthehackers/received_events"
+                , whUserType = OwnerOrganization
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterandthehackers/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = True
+          , whRepoUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterandthehackers/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:30"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterandthehackers/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterandthehackers/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterandthehackers/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterandthehackers/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = False
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 0
+          , whRepoDefaultBranchName = "master"
+          }
+    , evTeamAddOrg =
+        HookOrganization
+          { whOrgLogin = "baxterandthehackers"
+          , whOrgId = 7649605
+          , whOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+          , whOrgReposUrl = URL "https://api.github.com/orgs/baxterandthehackers/repos"
+          , whOrgEventsUrl = URL "https://api.github.com/orgs/baxterandthehackers/events"
+          , whOrgHooksUrl = Nothing
+          , whOrgIssuesUrl = Nothing
+          , whOrgMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/members{/member}"
+          , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/public_members{/member}"
+          , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=3"
+          , whOrgDescription = T.empty
+          }
+    , evTeamAddSender =
+        HookUser
+          { whUserLogin = "baxterandthehackers"
+          , whUserId = 7649605
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/7649605?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterandthehackers"
+          , whUserHtmlUrl = URL "https://github.com/baxterandthehackers"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterandthehackers/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterandthehackers/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterandthehackers/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterandthehackers/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterandthehackers/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterandthehackers/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterandthehackers/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterandthehackers/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterandthehackers/received_events"
+          , whUserType = OwnerOrganization
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+teamEventFixture :: TeamEvent
+teamEventFixture = TeamEvent
+    { evTeamAction = TeamCreatedAction
+    , evTeamTarget =
+        HookTeam
+          { whTeamName = "team baxter"
+          , whTeamId = 2175394
+          , whTeamSlug = "team-baxter"
+          , whTeamPermission = "pull"
+          , whTeamUrl = URL "https:/api.github.com/teams/2175394"
+          , whTeamMembersUrl = URL "https:/api.github.com/teams/2175394/members{/member}"
+          , whTeamRepositoriesUrl = URL "https:/api.github.com/teams/2175394/repos"
+          }
+    , evTeamOrganization =
+        HookOrganization
+          { whOrgLogin = "baxterandthehackers"
+          , whOrgId = 4312013
+          , whOrgUrl = URL "https://api.github.com/orgs/baxterandthehackers"
+          , whOrgReposUrl = URL "https://api.github.com/orgs/baxterandthehackers/repos"
+          , whOrgEventsUrl = URL "https://api.github.com/orgs/baxterandthehackers/events"
+          , whOrgHooksUrl = Just $ URL "https://api.github.com/orgs/baxterandthehackers/hooks"
+          , whOrgIssuesUrl = Just $ URL "https://api.github.com/orgs/baxterandthehackers/issues"
+          , whOrgMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/members{/member}"
+          , whOrgPublicMembersUrl = URL "https://api.github.com/orgs/baxterandthehackers/public_members{/member}"
+          , whOrgAvatarUrl = URL "https://avatars.githubusercontent.com/u/4312013?v=3"
+          , whOrgDescription = T.empty
+          }
+    , evTeamSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
+
+watchEventFixture :: WatchEvent
+watchEventFixture = WatchEvent
+    { evWatchAction = WatchStartedAction
+    , evWatchRepo =
+        HookRepository
+          { whRepoId = 35129377
+          , whRepoName = "public-repo"
+          , whRepoFullName = "baxterthehacker/public-repo"
+          , whRepoOwner =
+              Right HookUser
+                { whUserLogin = "baxterthehacker"
+                , whUserId = 6752317
+                , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+                , whUserGravatarId = URL ""
+                , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+                , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+                , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+                , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+                , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+                , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+                , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+                , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+                , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+                , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+                , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+                , whUserType = OwnerUser
+                , whUserIsAdminOfSite = False
+                }
+          , whRepoIsPrivate = False
+          , whRepoHtmlUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoDescription = ""
+          , whRepoIsAFork = False
+          , whRepoUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo"
+          , whRepoForksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/forks"
+          , whRepoKeysUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/keys{/key_id}"
+          , whRepoCollaboratorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/collaborators{/collaborator}"
+          , whRepoTeamsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/teams"
+          , whRepoHooksUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/hooks"
+          , whRepoIssueEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/events{/number}"
+          , whRepoEventsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/events"
+          , whRepoAssigneesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/assignees{/user}"
+          , whRepoBranchesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/branches{/branch}"
+          , whRepoTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/tags"
+          , whRepoBlobsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/blobs{/sha}"
+          , whRepoGitTagsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/tags{/sha}"
+          , whRepoGitRefsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/refs{/sha}"
+          , whRepoTreesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/trees{/sha}"
+          , whRepoStatusesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/statuses/{sha}"
+          , whRepoLanguagesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/languages"
+          , whRepoStargazersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/stargazers"
+          , whRepoContributorsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contributors"
+          , whRepoSubscribersUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscribers"
+          , whRepoSubscriptionUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/subscription"
+          , whRepoCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/commits{/sha}"
+          , whRepoGitCommitsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/git/commits{/sha}"
+          , whRepoCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/comments{/number}"
+          , whRepoIssueCommentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues/comments{/number}"
+          , whRepoContentsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/contents/{+path}"
+          , whRepoCompareUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/compare/{base}...{head}"
+          , whRepoMergesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/merges"
+          , whRepoArchiveUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/{archive_format}{/ref}"
+          , whRepoDownloadsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/downloads"
+          , whRepoIssuesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/issues{/number}"
+          , whRepoPullsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/pulls{/number}"
+          , whRepoMilestonesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/milestones{/number}"
+          , whRepoNotificationsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/notifications{?since,all,participating}"
+          , whRepoLabelsUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/labels{/name}"
+          , whRepoReleasesUrl = URL "https://api.github.com/repos/baxterthehacker/public-repo/releases{/id}"
+          , whRepoCreatedAt = read "2015-05-05 23:40:12"
+          , whRepoUpdatedAt = read "2015-05-05 23:40:30"
+          , whRepoPushedAt = read "2015-05-05 23:40:27"
+          , whRepoGitUrl = URL "git://github.com/baxterthehacker/public-repo.git"
+          , whRepoSshUrl = URL "git@github.com:baxterthehacker/public-repo.git"
+          , whRepoCloneUrl = URL "https://github.com/baxterthehacker/public-repo.git"
+          , whRepoSvnUrl = URL "https://github.com/baxterthehacker/public-repo"
+          , whRepoHomepage = Nothing
+          , whRepoSize = 0
+          , whRepoStargazersCount = 0
+          , whRepoWatchersCount = 0
+          , whRepoLanguage = Nothing
+          , whRepoHasIssues = True
+          , whRepoHasDownloads = True
+          , whRepoHasWiki = True
+          , whRepoHasPages = True
+          , whRepoForkCount = 0
+          , whRepoMirrorUrl = Nothing
+          , whRepoOpenIssuesCount = 2
+          , whRepoDefaultBranchName = "master"
+          }
+    , evWatchSender =
+        HookUser
+          { whUserLogin = "baxterthehacker"
+          , whUserId = 6752317
+          , whUserAvatarUrl = URL "https://avatars.githubusercontent.com/u/6752317?v=3"
+          , whUserGravatarId = URL ""
+          , whUserUrl = URL "https://api.github.com/users/baxterthehacker"
+          , whUserHtmlUrl = URL "https://github.com/baxterthehacker"
+          , whUserFollowersUrl = URL "https://api.github.com/users/baxterthehacker/followers"
+          , whUserFollowingUrl = URL "https://api.github.com/users/baxterthehacker/following{/other_user}"
+          , whUserGistsUrl = URL "https://api.github.com/users/baxterthehacker/gists{/gist_id}"
+          , whUserStarredUrl = URL "https://api.github.com/users/baxterthehacker/starred{/owner}{/repo}"
+          , whUserSubscriptionsUrl = URL "https://api.github.com/users/baxterthehacker/subscriptions"
+          , whUserOrganizationsUrl = URL "https://api.github.com/users/baxterthehacker/orgs"
+          , whUserReposUrl = URL "https://api.github.com/users/baxterthehacker/repos"
+          , whUserEventsUrl = URL "https://api.github.com/users/baxterthehacker/events{/privacy}"
+          , whUserReceivedEventsUrl = URL "https://api.github.com/users/baxterthehacker/received_events"
+          , whUserType = OwnerUser
+          , whUserIsAdminOfSite = False
+          }
+    }
diff --git a/spec/Spec.hs b/spec/Spec.hs
new file mode 100644
--- /dev/null
+++ b/spec/Spec.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
diff --git a/src/GitHub/Data/Webhooks/Events.hs b/src/GitHub/Data/Webhooks/Events.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Webhooks/Events.hs
@@ -0,0 +1,1434 @@
+--
+module GitHub.Data.Webhooks.Events
+    ( EventHasSender(..)
+    , EventHasRepo(..)
+      --
+    , CommitCommentEvent(..)
+    , CommitCommentEventAction(..)
+      --
+    , CreateEvent(..)
+      --
+    , DeleteEvent(..)
+      --
+    , DeploymentEvent(..)
+      --
+    , DeploymentStatusEvent(..)
+      -- Deprecated events
+    , DownloadEvent(..)
+    , FollowEvent(..)
+    , ForkEvent(..)
+    , ForkApplyEvent(..)
+    , GistEvent(..)
+      --
+    , GollumEvent(..)
+      --
+    , InstallationEvent(..)
+    , InstallationEventAction(..)
+      --
+    , InstallationRepositoriesEvent(..)
+    , InstallationRepoEventAction(..)
+      --
+    , IssueCommentEvent(..)
+    , IssueCommentEventAction(..)
+      --
+    , IssuesEvent(..)
+    , IssuesEventAction(..)
+      --
+    , LabelEvent(..)
+    , LabelEventAction(..)
+      --
+    , MemberEvent(..)
+    , MemberEventAction(..)
+      --
+    , MembershipEvent(..)
+    , MembershipEventAction(..)
+      --
+    , MilestoneEvent(..)
+    , MilestoneEventAction(..)
+      --
+    , OrganizationEvent(..)
+    , OrganizationEventAction(..)
+      --
+    , OrgBlockEvent(..)
+    , OrgBlockEventAction(..)
+      --
+    , PageBuildEvent(..)
+      --
+    , ProjectCardEvent(..)
+    , ProjectCardEventAction(..)
+      --
+    , ProjectColumnEvent(..)
+    , ProjectColumnEventAction(..)
+      --
+    , ProjectEvent(..)
+    , ProjectEventAction(..)
+      --
+    , PublicEvent(..)
+      --
+    , PullRequestEvent(..)
+    , PullRequestEventAction(..)
+      --
+    , PullRequestReviewEvent(..)
+    , PullRequestReviewEventAction(..)
+      --
+    , PullRequestReviewCommentEvent(..)
+    , PullRequestReviewCommentEventAction(..)
+      --
+    , PushEvent(..)
+      --
+    , ReleaseEvent(..)
+    , ReleaseEventAction(..)
+      --
+    , RepositoryEvent(..)
+    , RepositoryEventAction(..)
+      --
+    , StatusEvent(..)
+    , StatusEventState(..)
+      --
+    , TeamEvent(..)
+    , TeamEventAction(..)
+      --
+    , TeamAddEvent(..)
+      --
+    , WatchEvent(..)
+    , WatchEventAction(..)
+    ) where
+
+import           Data.Aeson               (FromJSON(..), withObject, withText, (.:), (.:?))
+import           Control.DeepSeq          (NFData(..))
+import           Control.DeepSeq.Generics (genericRnf)
+import           Data.Data                (Data, Typeable)
+import           Data.Time                (UTCTime)
+import           Data.Text                (Text)
+import           Data.Vector              (Vector)
+import           GHC.Generics             (Generic)
+
+import           GitHub.Data.Webhooks.Payload
+
+
+class EventHasSender eventKind where
+    -- | Provides the sender context of a Webhook event.
+    senderOfEvent :: eventKind -> HookUser
+
+class EventHasRepo eventKind where
+    -- | Provides the repository context of a Webhook event.
+    repoForEvent :: eventKind -> HookRepository
+
+
+data CommitCommentEventAction
+    -- | Decodes from "created"
+    = CommitCommentActionCreated
+    -- | The result of decoding an unknown commit comment event action type
+    | CommitCommentActionOther !Text
+    deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData CommitCommentEventAction where rnf = genericRnf
+
+instance FromJSON CommitCommentEventAction where
+  parseJSON = withText "Commit comment event action" $ \t ->
+      case t of
+          "created"       -> pure CommitCommentActionCreated
+          _               -> pure (CommitCommentActionOther t)
+
+-- | Triggered when a commit comment is created.
+-- See <https://developer.github.com/v3/activity/events/types/#commitcommentevent>.
+data CommitCommentEvent = CommitCommentEvent
+    { evCommitCommentAction     :: !CommitCommentEventAction
+    , evCommitCommentPayload    :: !HookCommitComment
+    , evCommitCommentRepo       :: !HookRepository
+    , evCommitCommentSender     :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender CommitCommentEvent where senderOfEvent = evCommitCommentSender
+instance EventHasRepo CommitCommentEvent where repoForEvent = evCommitCommentRepo
+instance NFData CommitCommentEvent where rnf = genericRnf
+
+
+-- | Represents a created repository, branch, or tag.
+-- Note: webhooks will not receive this event for created repositories.
+-- Additionally, webhooks will not receive this event for tags if more than three tags are pushed at once.
+-- See <https://developer.github.com/v3/activity/events/types/#createevent>.
+data CreateEvent = CreateEvent
+    { evCreateRef               :: !Text
+    , evCreateRefType           :: !Text
+    , evCreateMasterBranch      :: !Text
+    , evCreateDescription       :: !Text
+    , evCreatePusherType        :: !OwnerType
+    , evCreateRepo              :: !HookRepository
+    , evCreateSender            :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender CreateEvent where senderOfEvent = evCreateSender
+instance EventHasRepo CreateEvent where repoForEvent = evCreateRepo
+instance NFData CreateEvent where rnf = genericRnf
+
+
+-- | Represents a deleted branch or tag.
+-- Note: webhooks will not receive this event for tags if more than three tags are deleted at once.
+-- See <https://developer.github.com/v3/activity/events/types/#deleteevent>.
+data DeleteEvent = DeleteEvent
+    { evDeleteRef               :: !Text
+    , evDeleteRefType           :: !Text
+    , evDeletePusherType        :: !OwnerType
+    , evDeleteRepo              :: !HookRepository
+    , evDeleteSender            :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender DeleteEvent where senderOfEvent = evDeleteSender
+instance EventHasRepo DeleteEvent where repoForEvent = evDeleteRepo
+instance NFData DeleteEvent where rnf = genericRnf
+
+
+-- | Represents a deployment.
+-- Events of this type are not visible in timelines. These events are only used to trigger hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#deploymentevent>.
+data DeploymentEvent = DeploymentEvent
+    { evDeploymentInfo          :: !HookDeployment
+    , evDeploymentRepo          :: !HookRepository
+    , evDeploymentSender        :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender DeploymentEvent where senderOfEvent = evDeploymentSender
+instance EventHasRepo DeploymentEvent where repoForEvent = evDeploymentRepo
+instance NFData DeploymentEvent where rnf = genericRnf
+
+
+-- | Represents a deployment status.
+-- Events of this type are not visible in timelines. These events are only used to trigger hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#deploymentstatusevent>.
+data DeploymentStatusEvent = DeploymentStatusEvent
+    { evDeplStatusInfo          :: !HookDeploymentStatus
+    , evDeplStatusDeployment    :: !HookDeployment
+    , evDeplStatusRepo          :: !HookRepository
+    , evDeplStatusSender        :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender DeploymentStatusEvent where senderOfEvent = evDeplStatusSender
+instance EventHasRepo DeploymentStatusEvent where repoForEvent = evDeplStatusRepo
+instance NFData DeploymentStatusEvent where rnf = genericRnf
+
+
+-- | Triggered when a new download is created.
+-- Events of this kind are no longer delivered.
+-- See <https://developer.github.com/v3/activity/events/types/#downloadevent>.
+data DownloadEvent = DownloadEvent
+
+-- | Triggered when a user follows another user.
+-- Events of this kind are no longer delivered.
+-- See <https://developer.github.com/v3/activity/events/types/#downloadevent>.
+data FollowEvent = FollowEvent
+
+-- | Triggered when a user forks a repository.
+-- See <https://developer.github.com/v3/activity/events/types/#forkevent>.
+data ForkEvent = ForkEvent
+    { evForkDestination         :: !HookRepository
+    , evForkSource              :: !HookRepository
+    , evForkSender              :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender ForkEvent where senderOfEvent = evForkSender
+instance EventHasRepo ForkEvent where repoForEvent = evForkSource
+instance NFData ForkEvent where rnf = genericRnf
+
+
+-- | Triggered when a patch is applied in the Fork Queue.
+-- Events of this kind are no longer delivered.
+-- See <https://developer.github.com/v3/activity/events/types/#forkapplyevent>.
+data ForkApplyEvent = ForkApplyEvent
+
+
+-- | Triggered when a Gist is created or updated.
+-- Events of this kind are no longer delivered.
+-- See <https://developer.github.com/v3/activity/events/types/#gistevent>.
+data GistEvent = GistEvent
+
+
+-- | Triggered when a Wiki page is created or updated.
+-- See <https://developer.github.com/v3/activity/events/types/#gollumevent>.
+data GollumEvent = GollumEvent
+    { evGollumPages             :: !(Vector HookWikiPage)
+    , evGollumRepo              :: !HookRepository
+    , evGollumSender            :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender GollumEvent where senderOfEvent = evGollumSender
+instance EventHasRepo GollumEvent where repoForEvent = evGollumRepo
+instance NFData GollumEvent where rnf = genericRnf
+
+
+data InstallationEventAction
+  -- | Decodes from "created"
+  = InstallationCreatedAction
+  -- | Decodes from "deleted"
+  | InstallationDeletedAction
+  -- | The result of decoding an unknown installation event action type
+  | InstallationActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData InstallationEventAction where rnf = genericRnf
+
+instance FromJSON InstallationEventAction where
+  parseJSON = withText "Installation event action" $ \t ->
+    case t of
+        "created"       -> pure InstallationCreatedAction
+        "deleted"       -> pure InstallationDeletedAction
+        _               -> pure (InstallationActionOther t)
+
+-- | Triggered when a GitHub App has been installed or uninstalled.
+-- See <https://developer.github.com/v3/activity/events/types/#installationevent>.
+data InstallationEvent = InstallationEvent
+    { evInstallationAction      :: !InstallationEventAction
+    , evInstallationInfo        :: !HookInstallation
+    , evInstallationSender      :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender InstallationEvent where senderOfEvent = evInstallationSender
+instance NFData InstallationEvent where rnf = genericRnf
+
+
+data InstallationRepoEventAction
+  -- | Decodes from "created"
+  = InstallationRepoCreatedAction
+  -- | Decodes from "removed"
+  | InstallationRepoRemovedAction
+  -- | The result of decoding an unknown installation repo event action type
+  | InstallationRepoActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData InstallationRepoEventAction where rnf = genericRnf
+
+instance FromJSON InstallationRepoEventAction where
+  parseJSON = withText "Installation repo event action" $ \t ->
+    case t of
+        "created"       -> pure InstallationRepoCreatedAction
+        "removed"       -> pure InstallationRepoRemovedAction
+        _               -> pure (InstallationRepoActionOther t)
+
+-- | Triggered when a repository is added or removed from an installation.
+-- See <https://developer.github.com/v3/activity/events/types/#installationrepositoriesevent>.
+data InstallationRepositoriesEvent = InstallationRepositoriesEvent
+    { evInstallationRepoAction  :: !InstallationRepoEventAction
+    , evInstallationRepoInfo    :: !HookInstallation
+    , evInstallationRepoSel     :: !Text
+    , evInstallationReposAdd    :: !(Vector HookRepositorySimple)
+    , evInstallationReposRemove :: !(Vector HookRepositorySimple)
+    , evInstallationReposSender :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender InstallationRepositoriesEvent where senderOfEvent = evInstallationReposSender
+instance NFData InstallationRepositoriesEvent where rnf = genericRnf
+
+
+data IssueCommentEventAction
+  -- | Decodes from "created"
+  = IssueCommentCreatedAction
+  -- | Decodes from "edited"
+  | IssueCommentEditedAction
+  -- | Decodes from "deleted"
+  | IssueCommentDeletedAction
+  -- | The result of decoding an unknown issue comment event action type
+  | IssueCommentActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData IssueCommentEventAction where rnf = genericRnf
+
+instance FromJSON IssueCommentEventAction where
+  parseJSON = withText "Issue comment event action" $ \t ->
+    case t of
+        "created"       -> pure IssueCommentCreatedAction
+        "edited"        -> pure IssueCommentEditedAction
+        "deleted"       -> pure IssueCommentDeletedAction
+        _               -> pure (IssueCommentActionOther t)
+
+-- | Triggered when an issue comment is created, edited, or deleted.
+-- See <https://developer.github.com/v3/activity/events/types/#issuecommentevent>.
+data IssueCommentEvent = IssueCommentEvent
+    { evIssueCommentAction      :: !IssueCommentEventAction
+    , evIssueCommentIssue       :: !HookIssue
+    , evIssueCommentPayload     :: !HookIssueComment
+    , evIssueCommentRepo        :: !HookRepository
+    , evIssueCommentSender      :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender IssueCommentEvent where senderOfEvent = evIssueCommentSender
+instance EventHasRepo IssueCommentEvent where repoForEvent = evIssueCommentRepo
+instance NFData IssueCommentEvent where rnf = genericRnf
+
+
+data IssuesEventAction
+  -- | Decodes from "assigned"
+  = IssuesAssignedAction
+  -- | Decodes from "unassigned"
+  | IssuesUnassignedAction
+  -- | Decodes from "labeled"
+  | IssuesLabeledAction
+  -- | Decodes from "unlabeled"
+  | IssuesUnlabeledAction
+  -- | Decodes from "opened"
+  | IssuesOpenedAction
+  -- | Decodes from "edited"
+  | IssuesEditedAction
+  -- | Decodes from "milestoned"
+  | IssuesMilestonedAction
+  -- | Decodes from "demilestoned"
+  | IssuesDemilestonedAction
+  -- | Decodes from "closed"
+  | IssuesClosedAction
+  -- | Decodes from "reopened"
+  | IssuesReopenedAction
+  -- | The result of decoding an unknown issue comment event action type
+  | IssuesActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData IssuesEventAction where rnf = genericRnf
+
+instance FromJSON IssuesEventAction where
+  parseJSON = withText "Issue comment event action" $ \t ->
+    case t of
+        "assigned"      -> pure IssuesAssignedAction
+        "unassigned"    -> pure IssuesUnassignedAction
+        "labeled"       -> pure IssuesLabeledAction
+        "unlabeled"     -> pure IssuesUnlabeledAction
+        "opened"        -> pure IssuesOpenedAction
+        "edited"        -> pure IssuesEditedAction
+        "milestoned"    -> pure IssuesMilestonedAction
+        "demilestoned"  -> pure IssuesDemilestonedAction
+        "closed"        -> pure IssuesClosedAction
+        "reopened"      -> pure IssuesReopenedAction
+        _               -> pure (IssuesActionOther t)
+
+-- | Triggered when an issue is assigned, unassigned, labeled,
+--  unlabeled, opened, edited, milestoned, demilestoned, closed, or reopened.
+-- See <https://developer.github.com/v3/activity/events/types/#issuesevent>.
+data IssuesEvent = IssuesEvent
+    { evIssuesEventAction       :: !IssuesEventAction
+    , evIssuesEventIssue        :: !HookIssue
+    , evIssuesEventRepo         :: !HookRepository
+    , evIssuesEventSender       :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender IssuesEvent where senderOfEvent = evIssuesEventSender
+instance EventHasRepo IssuesEvent where repoForEvent = evIssuesEventRepo
+instance NFData IssuesEvent where rnf = genericRnf
+
+
+data LabelEventAction
+  -- | Decodes from "created"
+  = LabelCreatedAction
+  -- | Decodes from "edited"
+  | LabelEditedAction
+  -- | Decodes from "deleted"
+  | LabelDeletedAction
+  -- | The result of decoding an unknown label event action type
+  | LabelActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData LabelEventAction where rnf = genericRnf
+
+instance FromJSON LabelEventAction where
+  parseJSON = withText "Label event action" $ \t ->
+    case t of
+        "created"       -> pure LabelCreatedAction
+        "edited"        -> pure LabelEditedAction
+        "deleted"       -> pure LabelDeletedAction
+        _               -> pure (LabelActionOther t)
+
+-- | Triggered when a repository's label is created, edited, or deleted.
+-- Events of this type are not visible in timelines. These events are only used to trigger hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#labelevent>.
+data LabelEvent = LabelEvent
+    { evLabelEventAction        :: !LabelEventAction
+    , evLabelEventPayload       :: !HookRepositoryLabel
+    , evLabelEventRepo          :: !HookRepository
+    , evLabelEventOrganization  :: !(Maybe HookOrganization)
+    , evLabelEventSender        :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender LabelEvent where senderOfEvent = evLabelEventSender
+instance EventHasRepo LabelEvent where repoForEvent = evLabelEventRepo
+instance NFData LabelEvent where rnf = genericRnf
+
+
+data MemberEventAction
+  -- | Decodes from "added"
+  = MemberAddedAction
+  -- | Decodes from "edited"
+  | MemberEditedAction
+  -- | Decodes from "deleted"
+  | MemberDeletedAction
+  -- | The result of decoding an unknown label event action type
+  | MemberActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData MemberEventAction where rnf = genericRnf
+
+instance FromJSON MemberEventAction where
+  parseJSON = withText "Member event action" $ \t ->
+    case t of
+        "added"         -> pure MemberAddedAction
+        "edited"        -> pure MemberEditedAction
+        "deleted"       -> pure MemberDeletedAction
+        _               -> pure (MemberActionOther t)
+
+-- | Triggered when a user is added or removed as a collaborator to a repository, or has their permissions changed.
+-- See <https://developer.github.com/v3/activity/events/types/#memberevent>.
+data MemberEvent = MemberEvent
+    { evMemberAction            :: !MemberEventAction
+    , evMemberUser              :: !HookUser
+    , evMemberRepo              :: !HookRepository
+    , evMemberSender            :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender MemberEvent where senderOfEvent = evMemberSender
+instance EventHasRepo MemberEvent where repoForEvent = evMemberRepo
+instance NFData MemberEvent where rnf = genericRnf
+
+
+data MembershipEventAction
+  -- | Decodes from "added"
+  = MembershipAddedAction
+  -- | Decodes from "removed"
+  | MembershipRemovedAction
+  -- | The result of decoding an unknown label event action type
+  | MembershipActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData MembershipEventAction where rnf = genericRnf
+
+instance FromJSON MembershipEventAction where
+  parseJSON = withText "Membership event action" $ \t ->
+    case t of
+        "added"         -> pure MembershipAddedAction
+        "removed"       -> pure MembershipRemovedAction
+        _               -> pure (MembershipActionOther t)
+
+-- | Triggered when a user is added or removed from a team.
+-- Events of this type are not visible in timelines. These events are only used to trigger hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#membershipevent>.
+data MembershipEvent = MembershipEvent
+    { evMembershipAction        :: !MembershipEventAction
+    , evMembershipScope         :: !Text        -- ^ Current can only be "team"
+    , evMembershipUser          :: !HookUser
+    , evMembershipTeam          :: !HookTeam
+    , evMembershipOrg           :: !HookOrganization
+    , evMembershipSender        :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender MembershipEvent where senderOfEvent = evMembershipSender
+instance NFData MembershipEvent where rnf = genericRnf
+
+
+data MilestoneEventAction
+  -- | Decodes from "created"
+  = MilestoneCreatedAction
+  -- | Decodes from "closed"
+  | MilestoneClosedAction
+  -- | Decodes from "opened"
+  | MilestoneOpenedAction
+  -- | Decodes from "edited"
+  | MilestoneEditedAction
+  -- | Decodes from "deleted"
+  | MilestoneDeletedAction
+  -- | The result of decoding an unknown label event action type
+  | MilestoneActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData MilestoneEventAction where rnf = genericRnf
+
+instance FromJSON MilestoneEventAction where
+  parseJSON = withText "Milestone event action" $ \t ->
+    case t of
+        "created"       -> pure MilestoneCreatedAction
+        "closed"        -> pure MilestoneClosedAction
+        "opened"        -> pure MilestoneOpenedAction
+        "edited"        -> pure MilestoneEditedAction
+        "deleted"       -> pure MilestoneDeletedAction
+        _               -> pure (MilestoneActionOther t)
+
+-- | Triggered when a milestone is created, closed, opened, edited, or deleted.
+-- Events of this type are not visible in timelines. These events are only used to trigger hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#milestoneevent>.
+data MilestoneEvent = MilestoneEvent
+    { evMilestoneAction         :: !MilestoneEventAction
+    , evMilestoenPayload        :: !HookMilestone
+    , evMilestoneRepo           :: !HookRepository
+    , evMilestoneOrg            :: !HookOrganization
+    , evMilestoneSender         :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender MilestoneEvent where senderOfEvent = evMilestoneSender
+instance EventHasRepo MilestoneEvent where repoForEvent = evMilestoneRepo
+instance NFData MilestoneEvent where rnf = genericRnf
+
+
+data OrganizationEventAction
+  -- | Decodes from "member_added"
+  = OrgMemberAddedAction
+  -- | Decodes from "member_removed"
+  | OrgMemberRemovedAction
+  -- | Decodes from "member_invited"
+  | OrgMemberInvitedAction
+  -- | The result of decoding an unknown label event action type
+  | OrgActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData OrganizationEventAction where rnf = genericRnf
+
+instance FromJSON OrganizationEventAction where
+  parseJSON = withText "Organization event action" $ \t ->
+    case t of
+        "member_added"   -> pure OrgMemberAddedAction
+        "member_removed" -> pure OrgMemberRemovedAction
+        "member_invited" -> pure OrgMemberInvitedAction
+        _                -> pure (OrgActionOther t)
+
+-- | Triggered when a user is added, removed, or invited to an Organization.
+-- Events of this type are not visible in timelines. These events are only used to trigger organization hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#organizationevent>.
+data OrganizationEvent = OrganizationEvent
+    { evOrganizationAction      :: !OrganizationEventAction
+    , evOrganizationInvitation  :: !HookOrganizationInvitation
+    , evOrganizationMembership  :: !HookOrganizationMembership
+    , evOrganizationOrg         :: !HookOrganization
+    , evOrganizationSender      :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender OrganizationEvent where senderOfEvent = evOrganizationSender
+instance NFData OrganizationEvent where rnf = genericRnf
+
+
+data OrgBlockEventAction
+  -- | Decodes from "blocked"
+  = OrgBlockBlockedAction
+  -- | Decodes from "unblocked"
+  | OrgBlockUnblockedAction
+  -- | The result of decoding an unknown org block event action type
+  | OrgBlockActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData OrgBlockEventAction where rnf = genericRnf
+
+instance FromJSON OrgBlockEventAction where
+  parseJSON = withText "Organization event action" $ \t ->
+    case t of
+        "blocked"       -> pure OrgBlockBlockedAction
+        "unblocked"     -> pure OrgBlockUnblockedAction
+        _               -> pure (OrgBlockActionOther t)
+
+-- | Triggered when an organization blocks or unblocks a user.
+-- See <https://developer.github.com/v3/activity/events/types/#orgblockevent>.
+data OrgBlockEvent = OrgBlockEvent
+    { evOrgBlockAction          :: !OrgBlockEventAction
+    , evOrgBlockUser            :: !HookUser
+    , evOrgBlockOrg             :: !HookOrganization
+    , evOrgBlockSender          :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender OrgBlockEvent where senderOfEvent = evOrgBlockSender
+instance NFData OrgBlockEvent where rnf = genericRnf
+
+
+-- | Represents an attempted build of a GitHub Pages site, whether successful or not.
+-- Triggered on push to a GitHub Pages enabled branch (gh-pages for project pages, master for user and organization pages).
+-- Events of this type are not visible in timelines. These events are only used to trigger hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#pagebuildevent>.
+data PageBuildEvent = PageBuildEvent
+    { evPageBuildId             :: !Int
+    , evPageBuildResult         :: !HookPageBuildResult
+    , evPageBuildRepo           :: !HookRepository
+    , evPageBuildSender         :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender PageBuildEvent where senderOfEvent = evPageBuildSender
+instance EventHasRepo PageBuildEvent where repoForEvent = evPageBuildRepo
+instance NFData PageBuildEvent where rnf = genericRnf
+
+
+data ProjectCardEventAction
+  -- | Decodes from "created"
+  = ProjectCardCreatedAction
+  -- | Decodes from "edited"
+  | ProjectCardEditedAction
+  -- | Decodes from "converted"
+  | ProjectCardConvertedAction
+  -- | Decodes from "moved"
+  | ProjectCardMovedAction
+  -- | Decodes from "deleted"
+  | ProjectCardDeletedAction
+  -- | The result of decoding an unknown project card event action type
+  | ProjectCardActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData ProjectCardEventAction where rnf = genericRnf
+
+instance FromJSON ProjectCardEventAction where
+  parseJSON = withText "Project card event action" $ \t ->
+    case t of
+        "created"       -> pure ProjectCardCreatedAction
+        "edited"        -> pure ProjectCardEditedAction
+        "converted"     -> pure ProjectCardConvertedAction
+        "moved"         -> pure ProjectCardMovedAction
+        "deleted"       -> pure ProjectCardDeletedAction
+        _               -> pure (ProjectCardActionOther t)
+
+-- | Triggered when a project card is created, updated, moved, converted to an issue, or deleted.
+-- See <https://developer.github.com/v3/activity/events/types/#projectcardevent>.
+data ProjectCardEvent = ProjectCardEvent
+    { evProjectCardAction       :: !ProjectCardEventAction
+    , evProjectCardPayload      :: !HookProjectCard
+    , evProjectCardRepo         :: !HookRepository
+    , evProjectCardOrg          :: !HookOrganization
+    , evProjectCardSender       :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender ProjectCardEvent where senderOfEvent = evProjectCardSender
+instance EventHasRepo ProjectCardEvent where repoForEvent = evProjectCardRepo
+instance NFData ProjectCardEvent where rnf = genericRnf
+
+
+data ProjectColumnEventAction
+  -- | Decodes from "created"
+  = ProjectColumnCreatedAction
+  -- | Decodes from "edited"
+  | ProjectColumnEditedAction
+  -- | Decodes from "moved"
+  | ProjectColumnMovedAction
+  -- | Decodes from "deleted"
+  | ProjectColumnDeletedAction
+  -- | The result of decoding an unknown project card event action type
+  | ProjectColumnActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData ProjectColumnEventAction where rnf = genericRnf
+
+instance FromJSON ProjectColumnEventAction where
+  parseJSON = withText "Project column event action" $ \t ->
+    case t of
+        "created"       -> pure ProjectColumnCreatedAction
+        "edited"        -> pure ProjectColumnEditedAction
+        "moved"         -> pure ProjectColumnMovedAction
+        "deleted"       -> pure ProjectColumnDeletedAction
+        _               -> pure (ProjectColumnActionOther t)
+
+-- | Triggered when a project column is created, updated, moved, or deleted.
+-- See <https://developer.github.com/v3/activity/events/types/#projectcolumnevent>.
+data ProjectColumnEvent = ProjectColumnEvent
+    { evProjectColumnAction     :: !ProjectColumnEventAction
+    , evProjectColumnPayload    :: !HookProjectColumn
+    , evProjectColumnRepo       :: !HookRepository
+    , evProjectColumnOrg        :: !HookOrganization
+    , evProjectColumnSender     :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender ProjectColumnEvent where senderOfEvent = evProjectColumnSender
+instance EventHasRepo ProjectColumnEvent where repoForEvent = evProjectColumnRepo
+instance NFData ProjectColumnEvent where rnf = genericRnf
+
+
+data ProjectEventAction
+  -- | Decodes from "created"
+  = ProjectCreatedAction
+  -- | Decodes from "edited"
+  | ProjectEditedAction
+  -- | Decodes from "closed"
+  | ProjectClosedAction
+  -- | Decodes from "reopened"
+  | ProjectReopenedAction
+  -- | Decodes from "deleted"
+  | ProjectDeletedAction
+  -- | The result of decoding an unknown project event action type
+  | ProjectActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData ProjectEventAction where rnf = genericRnf
+
+instance FromJSON ProjectEventAction where
+  parseJSON = withText "Project event action" $ \t ->
+    case t of
+        "created"       -> pure ProjectCreatedAction
+        "edited"        -> pure ProjectEditedAction
+        "closed"        -> pure ProjectClosedAction
+        "reopened"      -> pure ProjectReopenedAction
+        "deleted"       -> pure ProjectDeletedAction
+        _               -> pure (ProjectActionOther t)
+
+-- | Triggered when a project is created, updated, closed, reopened, or deleted.
+-- See <https://developer.github.com/v3/activity/events/types/#projectevent>.
+data ProjectEvent = ProjectEvent
+    { evProjectEventAction      :: !ProjectEventAction
+    , evProjectPayload          :: !HookProject
+    , evProjectRepo             :: !HookRepository
+    , evProjectOrganization     :: !HookOrganization
+    , evProjectSender           :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender ProjectEvent where senderOfEvent = evProjectSender
+instance EventHasRepo ProjectEvent where repoForEvent = evProjectRepo
+instance NFData ProjectEvent where rnf = genericRnf
+
+
+-- | Triggered when a private repository is open sourced. Without a doubt: the best GitHub event.
+-- See <https://developer.github.com/v3/activity/events/types/#publicevent>.
+data PublicEvent = PublicEvent
+    { evPublicEventRepo         :: !HookRepository
+    , evPublicEventSender       :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender PublicEvent where senderOfEvent = evPublicEventSender
+instance EventHasRepo PublicEvent where repoForEvent = evPublicEventRepo
+instance NFData PublicEvent where rnf = genericRnf
+
+
+data PullRequestEventAction
+  -- | Decodes from "assigned"
+  = PullRequestAssignedAction
+  -- | Decodes from "unassigned"
+  | PullRequestUnassignedAction
+  -- | Decodes from "review_requsted"
+  | PullRequestReviewRequestedAction
+  -- | Decodes from "review_request_removed"
+  | PullRequestReviewRequestRemovedAction
+  -- | Decodes from "labeled"
+  | PullRequestLabeledAction
+  -- | Decodes from "unlabeled"
+  | PullRequestUnlabeledAction
+  -- | Decodes from "opened"
+  | PullRequestOpenedAction
+  -- | Decodes from "edited"
+  | PullRequestEditedAction
+  -- | Decodes from "closed"
+  | PullRequestClosedAction
+  -- | Decodes from "reopened"
+  | PullRequestReopenedAction
+  -- | The result of decoding an unknown pull request event action type
+  | PullRequestActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData PullRequestEventAction where rnf = genericRnf
+
+instance FromJSON PullRequestEventAction where
+  parseJSON = withText "Pull request event action" $ \t ->
+    case t of
+        "assigned"      -> pure PullRequestAssignedAction
+        "unassigned"    -> pure PullRequestUnassignedAction
+        "review_requsted" -> pure PullRequestReviewRequestedAction
+        "review_request_removed" -> pure PullRequestReviewRequestRemovedAction
+        "labeled"       -> pure PullRequestLabeledAction
+        "unlabeled"     -> pure PullRequestUnlabeledAction
+        "opened"        -> pure PullRequestOpenedAction
+        "edited"        -> pure PullRequestEditedAction
+        "closed"        -> pure PullRequestClosedAction
+        "reopened"      -> pure PullRequestReopenedAction
+        _               -> pure (PullRequestActionOther t)
+
+-- | Triggered when a pull request is assigned, unassigned, labeled, unlabeled, opened, edited,
+-- closed, reopened, or synchronized. Also triggered when a pull request review is requested,
+-- or when a review request is removed.
+-- See <https://developer.github.com/v3/activity/events/types/#pullrequestevent>.
+data PullRequestEvent = PullRequestEvent
+    { evPullReqAction           :: !PullRequestEventAction
+    , evPullReqNumber           :: !Int
+    , evPullReqPayload          :: !HookPullRequest
+    , evPullReqRepo             :: !HookRepository
+    , evPullReqSender           :: !HookUser
+    , evPullReqInstallationId   :: !Int
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender PullRequestEvent where senderOfEvent = evPullReqSender
+instance EventHasRepo PullRequestEvent where repoForEvent = evPullReqRepo
+instance NFData PullRequestEvent where rnf = genericRnf
+
+
+data PullRequestReviewEventAction
+  -- | Decodes from "submitted"
+  = PullRequestReviewSubmittedAction
+  -- | Decodes from "edited"
+  | PullRequestReviewEditedAction
+  -- | Decodes from "dismissed"
+  | PullRequestReviewDismissedAction
+  -- | The result of decoding an unknown pull request review event action type
+  | PullRequestReviewActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData PullRequestReviewEventAction where rnf = genericRnf
+
+instance FromJSON PullRequestReviewEventAction where
+  parseJSON = withText "Pull request review event action" $ \t ->
+    case t of
+        "submitted"     -> pure PullRequestReviewSubmittedAction
+        "edited"        -> pure PullRequestReviewEditedAction
+        "dismissed"     -> pure PullRequestReviewDismissedAction
+        _               -> pure (PullRequestReviewActionOther t)
+
+-- | Triggered when a pull request review is submitted into a non-pending state,
+-- the body is edited, or the review is dismissed.
+-- See <https://developer.github.com/v3/activity/events/types/#pullrequestreviewevent>.
+data PullRequestReviewEvent = PullRequestReviewEvent
+    { evPullReqReviewAction     :: !PullRequestReviewEventAction
+    , evPullReqReviewPayload    :: !HookPullRequestReview
+    , evPullReqReviewTarget     :: !HookPullRequest
+    , evPullReqReviewRepo       :: !HookRepository
+    , evPullReqReviewSender     :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender PullRequestReviewEvent where senderOfEvent = evPullReqReviewSender
+instance EventHasRepo PullRequestReviewEvent where repoForEvent = evPullReqReviewRepo
+instance NFData PullRequestReviewEvent where rnf = genericRnf
+
+
+data PullRequestReviewCommentEventAction
+  -- | Decodes from "created"
+  = PullRequestReviewCommentCreatedAction
+  -- | Decodes from "edited"
+  | PullRequestReviewCommentEditedAction
+  -- | Decodes from "deleted"
+  | PullRequestReviewCommentDeletedAction
+  -- | The result of decoding an unknown pull request review comment event action type
+  | PullRequestReviewCommentActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData PullRequestReviewCommentEventAction where rnf = genericRnf
+
+instance FromJSON PullRequestReviewCommentEventAction where
+  parseJSON = withText "Pull request review comment event action" $ \t ->
+    case t of
+        "created"       -> pure PullRequestReviewCommentCreatedAction
+        "edited"        -> pure PullRequestReviewCommentEditedAction
+        "deleted"       -> pure PullRequestReviewCommentDeletedAction
+        _               -> pure (PullRequestReviewCommentActionOther t)
+
+-- | Triggered when a comment on a pull request's unified diff is created,
+-- edited, or deleted (in the Files Changed tab).
+-- See <https://developer.github.com/v3/activity/events/types/#pullrequestreviewcommentevent>.
+data PullRequestReviewCommentEvent = PullRequestReviewCommentEvent
+    { evPullReqRevComAction     :: !PullRequestReviewCommentEventAction
+    , evPullReqRevComment       :: !HookPullRequestReviewComment
+    , evPullReqRevTarget        :: !HookPullRequest
+    , evPullReqRevRepo          :: !HookRepository
+    , evPullReqRevSender        :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender PullRequestReviewCommentEvent where senderOfEvent = evPullReqRevSender
+instance EventHasRepo PullRequestReviewCommentEvent where repoForEvent = evPullReqRevRepo
+instance NFData PullRequestReviewCommentEvent where rnf = genericRnf
+
+
+-- | Triggered on a push to a repository branch. Branch pushes and repository tag
+-- pushes also trigger webhook push events.
+-- See <https://developer.github.com/v3/activity/events/types/#pushevent>.
+data PushEvent = PushEvent
+    { evPushRef                 :: !Text
+    , evPushHeadSha             :: !(Maybe Text)
+    , evPushBeforeSha           :: !(Maybe Text)
+    , evPushCreated             :: !Bool
+    , evPushDeleted             :: !Bool
+    , evPushForced              :: !Bool
+    , evPushBaseRef             :: !(Maybe Text)
+    , evPushCompareUrl          :: !URL
+    , evPushCommits             :: !(Maybe (Vector HookCommit))
+    , evPushHeadCommit          :: !(Maybe HookCommit)
+    , evPushRepository          :: !HookRepository
+    , evPushOrganization        :: !(Maybe HookOrganization)
+    , evPushSender              :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender PushEvent where senderOfEvent = evPushSender
+instance EventHasRepo PushEvent where repoForEvent = evPushRepository
+instance NFData PushEvent where rnf = genericRnf
+
+
+data ReleaseEventAction
+  -- | Decodes from "published"
+  = ReleasePublishedAction
+  -- | The result of decoding an unknown release event action type
+  | ReleaseActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData ReleaseEventAction where rnf = genericRnf
+
+instance FromJSON ReleaseEventAction where
+  parseJSON = withText "Release event action" $ \t ->
+    case t of
+        "published"     -> pure ReleasePublishedAction
+        _               -> pure (ReleaseActionOther t)
+
+-- | Triggered when a release is published.
+-- See <https://developer.github.com/v3/activity/events/types/#releaseevent>.
+data ReleaseEvent = ReleaseEvent
+    { evReleaseEventAction      :: !ReleaseEventAction      -- ^ Currently only releasePublished.
+    , evReleaseEventPayload     :: !HookRelease
+    , evReleaseEventRepo        :: !HookRepository
+    , evReleaseEventSender      :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender ReleaseEvent where senderOfEvent = evReleaseEventSender
+instance EventHasRepo ReleaseEvent where repoForEvent = evReleaseEventRepo
+instance NFData ReleaseEvent where rnf = genericRnf
+
+
+data RepositoryEventAction
+  -- | Decodes from "created"
+  = RepositoryCreatedAction
+  -- | Decodes from "deleted"
+  | RepositoryDeletedAction
+  -- | Decodes from "archived"
+  | RepositoryArchivedAction
+  -- | Decodes from "unarchived"
+  | RepositoryUnarchivedAction
+  -- | Decodes from "publicized"
+  | RepositoryPublicizedAction
+  -- | Decodes from "privatized"
+  | RepositoryPrivatizedAction
+  -- | The result of decoding an unknown repository event action type
+  | RepositoryActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData RepositoryEventAction where rnf = genericRnf
+
+instance FromJSON RepositoryEventAction where
+  parseJSON = withText "Repository event action" $ \t ->
+    case t of
+        "created"       -> pure RepositoryCreatedAction
+        "deleted"       -> pure RepositoryDeletedAction
+        "archived"      -> pure RepositoryArchivedAction
+        "unarchived"    -> pure RepositoryUnarchivedAction
+        "publicized"    -> pure RepositoryPublicizedAction
+        "privatized"    -> pure RepositoryPrivatizedAction
+        _               -> pure (RepositoryActionOther t)
+
+-- | Triggered when a repository is created, archived, unarchived, made public, or made private.
+-- Organization hooks are also triggered when a repository is deleted.
+-- Events of this type are not visible in timelines. These events are only used to trigger hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#repositoryevent>.
+data RepositoryEvent = RepositoryEvent
+    { evRepositoryAction        :: !RepositoryEventAction
+    , evRepositoryTarget        :: !HookRepository
+    , evRepositoryOrg           :: !(Maybe HookOrganization)
+    , evRepositorySender        :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender RepositoryEvent where senderOfEvent = evRepositorySender
+instance EventHasRepo RepositoryEvent where repoForEvent = evRepositoryTarget
+instance NFData RepositoryEvent where rnf = genericRnf
+
+
+data StatusEventState
+  -- | Decodes from "pending"
+  = StatusPendingState
+  -- | Decodes from "success"
+  | StatusSuccessState
+  -- | Decodes from "failure"
+  | StatusFailureState
+  -- | Decodes from "error"
+  | StatusErrorState
+  -- | The result of decoding an unknown status event state
+  | StatusStateOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData StatusEventState where rnf = genericRnf
+
+instance FromJSON StatusEventState where
+  parseJSON = withText "Status event state" $ \t ->
+    case t of
+        "pending"       -> pure StatusPendingState
+        "success"       -> pure StatusSuccessState
+        "failure"       -> pure StatusFailureState
+        "error"         -> pure StatusErrorState
+        _               -> pure (StatusStateOther t)
+
+-- | Triggered when the status of a Git commit changes.
+-- Events of this type are not visible in timelines. These events are only used to trigger hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#statusevent>.
+data StatusEvent = StatusEvent
+    { evStatusId                :: !Int
+    , evStatusCommitSha         :: !Text
+    , evStatusCommitName        :: !Text
+    , evStatusTargetUrl         :: !(Maybe URL)
+    , evStatusContext           :: !Text
+    , evStatusDescription       :: !(Maybe Text)
+    , evStatusState             :: !StatusEventState
+    , evStatusCommit            :: !HookCommit
+    -- FIXME: Branches are missing here
+    , evStatusCreatedAt         :: !UTCTime
+    , evStatusUpdatedAt         :: !UTCTime
+    , evStatusRepo              :: !HookRepository
+    , evStatusSender            :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender StatusEvent where senderOfEvent = evStatusSender
+instance EventHasRepo StatusEvent where repoForEvent = evStatusRepo
+instance NFData StatusEvent where rnf = genericRnf
+
+
+data TeamEventAction
+  -- | Decodes from "created"
+  = TeamCreatedAction
+  -- | Decodes from "deleted"
+  | TeamDeletedAction
+  -- | Decodes from "edited"
+  | TeamEditedAction
+  -- | Decodes from "added_to_repository"
+  | TeamAddedToRepoAction
+  -- | Decodes from "removed_from_repository"
+  | TeamRemovedFromRepoAction
+  -- | The result of decoding an unknown team event action type
+  | TeamActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData TeamEventAction where rnf = genericRnf
+
+instance FromJSON TeamEventAction where
+  parseJSON = withText "Team event action" $ \t ->
+    case t of
+        "created"       -> pure TeamCreatedAction
+        "deleted"       -> pure TeamDeletedAction
+        "edited"        -> pure TeamEditedAction
+        "added_to_repository"     -> pure TeamAddedToRepoAction
+        "removed_from_repository" -> pure TeamRemovedFromRepoAction
+        _               -> pure (TeamActionOther t)
+
+-- | Triggered when an organization's team is created or deleted.
+-- Events of this type are not visible in timelines. These events are only used to trigger organization hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#teamevent>.
+data TeamEvent = TeamEvent
+    { evTeamAction              :: !TeamEventAction
+    , evTeamTarget              :: !HookTeam
+    , evTeamOrganization        :: !HookOrganization
+    , evTeamSender              :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender TeamEvent where senderOfEvent = evTeamSender
+instance NFData TeamEvent where rnf = genericRnf
+
+
+-- | Triggered when a repository is added to a team.
+-- Events of this type are not visible in timelines. These events are only used to trigger hooks.
+-- See <https://developer.github.com/v3/activity/events/types/#teamaddevent>.
+data TeamAddEvent = TeamAddEvent
+    { evTeamAddTarget           :: !(Maybe HookTeam) -- ^ Older events may not include this in the payload.
+    , evTeamAddRepo             :: !HookRepository
+    , evTeamAddOrg              :: !HookOrganization
+    , evTeamAddSender           :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender TeamAddEvent where senderOfEvent = evTeamAddSender
+instance EventHasRepo TeamAddEvent where repoForEvent = evTeamAddRepo
+instance NFData TeamAddEvent where rnf = genericRnf
+
+
+data WatchEventAction
+  -- | Decodes from "started"
+  = WatchStartedAction
+  -- | The result of decoding an unknown watch event action type
+  | WatchActionOther !Text
+  deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData WatchEventAction where rnf = genericRnf
+
+instance FromJSON WatchEventAction where
+  parseJSON = withText "Watch event action" $ \t ->
+    case t of
+        "started"       -> pure WatchStartedAction
+        _               -> pure (WatchActionOther t)
+
+-- | The WatchEvent is related to starring a repository, not watching.
+-- The event’s actor is the user who starred a repository, and the event’s
+-- repository is the repository that was starred.
+-- See <https://developer.github.com/v3/activity/events/types/#watchevent>.
+data WatchEvent = WatchEvent
+    { evWatchAction             :: !WatchEventAction
+    , evWatchRepo               :: !HookRepository
+    , evWatchSender             :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance EventHasSender WatchEvent where senderOfEvent = evWatchSender
+instance EventHasRepo WatchEvent where repoForEvent = evWatchRepo
+instance NFData WatchEvent where rnf = genericRnf
+
+
+-- Aeson Instances
+
+instance FromJSON CommitCommentEvent where
+    parseJSON = withObject "CommitCommentEvent" $ \o -> CommitCommentEvent
+        <$> o .: "action"
+        <*> o .: "comment"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON CreateEvent where
+    parseJSON = withObject "CreateEvent" $ \o -> CreateEvent
+        <$> o .: "ref"
+        <*> o .: "ref_type"
+        <*> o .: "master_branch"
+        <*> o .: "description"
+        <*> o .: "pusher_type"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON DeleteEvent where
+    parseJSON = withObject "DeleteEvent" $ \o -> DeleteEvent
+        <$> o .: "ref"
+        <*> o .: "ref_type"
+        <*> o .: "pusher_type"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON DeploymentEvent where
+    parseJSON = withObject "DeploymentEvent" $ \o -> DeploymentEvent
+        <$> o .: "deployment"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON DeploymentStatusEvent where
+    parseJSON = withObject "DeploymentStatusEvent" $ \o -> DeploymentStatusEvent
+        <$> o .: "deployment_status"
+        <*> o .: "deployment"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON ForkEvent where
+    parseJSON = withObject "ForkEvent" $ \o -> ForkEvent
+        <$> o .: "forkee"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON GollumEvent where
+    parseJSON = withObject "GollumEvent" $ \o -> GollumEvent
+        <$> o .: "pages"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON InstallationEvent where
+    parseJSON = withObject "InstallationEvent" $ \o -> InstallationEvent
+        <$> o .: "action"
+        <*> o .: "installation"
+        <*> o .: "sender"
+
+instance FromJSON InstallationRepositoriesEvent where
+    parseJSON = withObject "InstallationRepositoriesEvent" $ \o -> InstallationRepositoriesEvent
+        <$> o .: "action"
+        <*> o .: "installation"
+        <*> o .: "repository_selection"
+        <*> o .: "repositories_added"
+        <*> o .: "repositories_removed"
+        <*> o .: "sender"
+
+instance FromJSON IssueCommentEvent where
+    parseJSON = withObject "IssueCommentEvent" $ \o -> IssueCommentEvent
+        <$> o .: "action"
+        <*> o .: "issue"
+        <*> o .: "comment"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON IssuesEvent where
+    parseJSON = withObject "IssuesEvent" $ \o -> IssuesEvent
+        <$> o .: "action"
+        <*> o .: "issue"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON LabelEvent where
+    parseJSON = withObject "LabelEvent" $ \o -> LabelEvent
+        <$> o .: "action"
+        <*> o .: "label"
+        <*> o .: "repository"
+        <*> o .:? "organization"
+        <*> o .: "sender"
+
+instance FromJSON MemberEvent where
+    parseJSON = withObject "MemberEvent" $ \o -> MemberEvent
+        <$> o .: "action"
+        <*> o .: "member"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON MembershipEvent where
+    parseJSON = withObject "MembershipEvent" $ \o -> MembershipEvent
+        <$> o .: "action"
+        <*> o .: "scope"
+        <*> o .: "member"
+        <*> o .: "team"
+        <*> o .: "organization"
+        <*> o .: "sender"
+
+instance FromJSON MilestoneEvent where
+    parseJSON = withObject "MilestoneEvent" $ \o -> MilestoneEvent
+        <$> o .: "action"
+        <*> o .: "milestone"
+        <*> o .: "repository"
+        <*> o .: "organization"
+        <*> o .: "sender"
+
+instance FromJSON OrganizationEvent where
+    parseJSON = withObject "OrganizationEvent" $ \o -> OrganizationEvent
+        <$> o .: "action"
+        <*> o .: "invitation"
+        <*> o .: "membership"
+        <*> o .: "organization"
+        <*> o .: "sender"
+
+instance FromJSON OrgBlockEvent where
+    parseJSON = withObject "OrgBlockEvent" $ \o -> OrgBlockEvent
+        <$> o .: "action"
+        <*> o .: "blocked_user"
+        <*> o .: "organization"
+        <*> o .: "sender"
+
+instance FromJSON PageBuildEvent where
+    parseJSON = withObject "PageBuildEvent" $ \o -> PageBuildEvent
+        <$> o .: "id"
+        <*> o .: "build"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON ProjectCardEvent where
+    parseJSON = withObject "ProjectCardEvent" $ \o -> ProjectCardEvent
+        <$> o .: "action"
+        <*> o .: "project_card"
+        <*> o .: "repository"
+        <*> o .: "organization"
+        <*> o .: "sender"
+
+instance FromJSON ProjectColumnEvent where
+    parseJSON = withObject "ProjectColumnEvent" $ \o -> ProjectColumnEvent
+        <$> o .: "action"
+        <*> o .: "project_column"
+        <*> o .: "repository"
+        <*> o .: "organization"
+        <*> o .: "sender"
+
+instance FromJSON ProjectEvent where
+    parseJSON = withObject "ProjectEvent" $ \o -> ProjectEvent
+        <$> o .: "action"
+        <*> o .: "project"
+        <*> o .: "repository"
+        <*> o .: "organization"
+        <*> o .: "sender"
+
+instance FromJSON PublicEvent where
+    parseJSON = withObject "PublicEvent" $ \o -> PublicEvent
+        <$> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON PullRequestEvent where
+    parseJSON = withObject "PullRequestEvent" $ \o -> PullRequestEvent
+        <$> o .: "action"
+        <*> o .: "number"
+        <*> o .: "pull_request"
+        <*> o .: "repository"
+        <*> o .: "sender"
+        <*> (o .: "installation" >>= \i -> i .: "id")
+
+instance FromJSON PullRequestReviewEvent where
+    parseJSON = withObject "PullRequestReviewEvent" $ \o -> PullRequestReviewEvent
+        <$> o .: "action"
+        <*> o .: "review"
+        <*> o .: "pull_request"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON PullRequestReviewCommentEvent where
+    parseJSON = withObject "PullRequestReviewCommentEvent" $ \o -> PullRequestReviewCommentEvent
+        <$> o .: "action"
+        <*> o .: "comment"
+        <*> o .: "pull_request"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON PushEvent where
+    parseJSON = withObject "PushEvent" $ \o -> PushEvent
+        <$> o .: "ref"
+        <*> o .:? "after"
+        <*> o .:? "before"
+        <*> o .: "created"
+        <*> o .: "deleted"
+        <*> o .: "forced"
+        <*> o .:? "base_ref"
+        <*> o .: "compare"
+        <*> o .:? "commits"
+        <*> o .:? "head_commit"
+        <*> o .: "repository"
+        <*> o .:? "organization"
+        <*> o .: "sender"
+
+instance FromJSON ReleaseEvent where
+    parseJSON = withObject "ReleaseEvent" $ \o -> ReleaseEvent
+        <$> o .: "action"
+        <*> o .: "release"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON RepositoryEvent where
+    parseJSON = withObject "RepositoryEvent" $ \o -> RepositoryEvent
+        <$> o .: "action"
+        <*> o .: "repository"
+        <*> o .: "organization"
+        <*> o .: "sender"
+
+instance FromJSON StatusEvent where
+    parseJSON = withObject "StatusEvent" $ \o -> StatusEvent
+        <$> o .: "id"
+        <*> o .: "sha"
+        <*> o .: "name"
+        <*> o .:? "target_url"
+        <*> o .: "context"
+        <*> o .:? "description"
+        <*> o .: "state"
+        <*> o .: "commit"
+        <*> o .: "created_at"
+        <*> o .: "updated_at"
+        <*> o .: "repository"
+        <*> o .: "sender"
+
+instance FromJSON TeamEvent where
+    parseJSON = withObject "TeamEvent" $ \o -> TeamEvent
+        <$> o .: "action"
+        <*> o .: "team"
+        <*> o .: "organization"
+        <*> o .: "sender"
+
+instance FromJSON TeamAddEvent where
+    parseJSON = withObject "TeamAddEvent" $ \o -> TeamAddEvent
+        <$> o .:? "team"
+        <*> o .: "repository"
+        <*> o .: "organization"
+        <*> o .: "sender"
+
+instance FromJSON WatchEvent where
+    parseJSON = withObject "WatchEvent" $ \o -> WatchEvent
+        <$> o .: "action"
+        <*> o .: "repository"
+        <*> o .: "sender"
diff --git a/src/GitHub/Data/Webhooks/Payload.hs b/src/GitHub/Data/Webhooks/Payload.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Webhooks/Payload.hs
@@ -0,0 +1,1027 @@
+--
+module GitHub.Data.Webhooks.Payload
+    ( -- * Construction Types
+      URL(..)
+    , getUrl
+    , OwnerType(..)
+      -- * Webhook Types
+    , HookIssue(..)
+    , HookRepository(..)
+    , HookRepositorySimple(..)
+    , HookRepositoryLabel(..)
+    , HookUser(..)
+    , HookSimpleUser(..)
+    , HookOrganization(..)
+    , HookOrganizationInvitation(..)
+    , HookOrganizationMembership(..)
+    , HookTeam(..)
+    , HookMilestone(..)
+    , HookMembership(..)
+    , HookProject(..)
+    , HookProjectCard(..)
+    , HookProjectColumn(..)
+    , HookIssueLabels(..)
+    , HookCommit(..)
+    , HookRelease(..)
+    , HookPullRequest(..)
+    , HookPullRequestReview(..)
+    , HookInstallation(..)
+    , HookDeployment(..)
+    , HookDeploymentStatus(..)
+    , HookWikiPage(..)
+    , HookPageBuildResult(..)
+    , HookIssueComment(..)
+    , HookCommitComment(..)
+    , HookPullRequestReviewComment(..)
+    ) where
+
+import           Data.Aeson               (FromJSON(..), withObject, withText, (.!=), (.:), (.:?))
+import           Control.DeepSeq          (NFData (..))
+import           Control.DeepSeq.Generics (genericRnf)
+import           Control.Applicative      ((<|>))
+import           Data.Data                (Data, Typeable)
+import           Data.Time                (UTCTime)
+import           Data.Time.Clock.POSIX    (posixSecondsToUTCTime)
+import           Data.Text                (Text)
+import qualified Data.Text                as T
+import           Data.Vector              (Vector)
+import           GHC.Generics             (Generic)
+
+
+-- Types lifted from the @github@ package.
+
+data OwnerType = OwnerUser | OwnerOrganization
+    deriving (Eq, Ord, Enum, Bounded, Show, Read, Generic, Typeable, Data)
+
+instance NFData OwnerType
+
+instance FromJSON OwnerType where
+  parseJSON = withText "Owner type" $ \t ->
+      case T.toLower t of
+          "user"          -> pure OwnerUser
+          "organization"  -> pure OwnerOrganization
+          _               -> fail $ "Unknown owner type: " ++ T.unpack t
+
+
+newtype URL = URL Text
+    deriving (Eq, Ord, Show, Generic, Typeable, Data)
+
+instance NFData URL where rnf = genericRnf
+
+instance FromJSON URL where
+  parseJSON = withText "URL" (pure . URL)
+
+getUrl :: URL -> Text
+getUrl (URL url) = url
+
+
+-- Hooks
+
+type IssueState = Text
+
+data HookIssue = HookIssue
+    { whIssueUrl                :: !URL
+    , whIssueLabelsUrl          :: !URL
+    , whIssueCommentsUrl        :: !URL
+    , whIssueEventsUrl          :: !URL
+    , whIssueHtmlUrl            :: !URL
+    , whIssueId                 :: !Int
+    , whIssueNumber             :: !Int
+    , whIssueTitle              :: !Text
+    , whIssueUser               :: !HookUser
+    , whIssueLabels             :: !(Vector HookIssueLabels)
+    , whIssueState              :: IssueState
+    , whIssueIsLocked           :: !Bool
+    , whIssueAssignee           :: !(Maybe HookUser)
+    , whIssueMilestone          :: !(Maybe HookMilestone)
+    , whIssueCommentCount       :: !Int
+    , whIssueCreatedAt          :: !UTCTime
+    , whIssueUpdatedAt          :: !UTCTime
+    , whIssueClosedAt           :: !(Maybe UTCTime)
+    , whIssueBody               :: !Text
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookIssue where rnf = genericRnf
+
+
+data HookRepository = HookRepository
+    { whRepoId                  :: !Int
+    , whRepoName                :: !Text
+    , whRepoFullName            :: !Text
+    , whRepoOwner               :: !(Either HookSimpleUser HookUser)
+    , whRepoIsPrivate           :: !Bool
+    , whRepoHtmlUrl             :: !URL
+    , whRepoDescription         :: !Text
+    , whRepoIsAFork             :: !Bool
+    , whRepoUrl                 :: !URL
+    , whRepoForksUrl            :: !URL
+    , whRepoKeysUrl             :: !URL
+    , whRepoCollaboratorsUrl    :: !URL
+    , whRepoTeamsUrl            :: !URL
+    , whRepoHooksUrl            :: !URL
+    , whRepoIssueEventsUrl      :: !URL
+    , whRepoEventsUrl           :: !URL
+    , whRepoAssigneesUrl        :: !URL
+    , whRepoBranchesUrl         :: !URL
+    , whRepoTagsUrl             :: !URL
+    , whRepoBlobsUrl            :: !URL
+    , whRepoGitTagsUrl          :: !URL
+    , whRepoGitRefsUrl          :: !URL
+    , whRepoTreesUrl            :: !URL
+    , whRepoStatusesUrl         :: !URL
+    , whRepoLanguagesUrl        :: !URL
+    , whRepoStargazersUrl       :: !URL
+    , whRepoContributorsUrl     :: !URL
+    , whRepoSubscribersUrl      :: !URL
+    , whRepoSubscriptionUrl     :: !URL
+    , whRepoCommitsUrl          :: !URL
+    , whRepoGitCommitsUrl       :: !URL
+    , whRepoCommentsUrl         :: !URL
+    , whRepoIssueCommentsUrl    :: !URL
+    , whRepoContentsUrl         :: !URL
+    , whRepoCompareUrl          :: !URL
+    , whRepoMergesUrl           :: !URL
+    , whRepoArchiveUrl          :: !URL
+    , whRepoDownloadsUrl        :: !URL
+    , whRepoIssuesUrl           :: !URL
+    , whRepoPullsUrl            :: !URL
+    , whRepoMilestonesUrl       :: !URL
+    , whRepoNotificationsUrl    :: !URL
+    , whRepoLabelsUrl           :: !URL
+    , whRepoReleasesUrl         :: !URL
+    , whRepoCreatedAt           :: !UTCTime
+    , whRepoUpdatedAt           :: !UTCTime
+    , whRepoPushedAt            :: !UTCTime
+    , whRepoGitUrl              :: !URL
+    , whRepoSshUrl              :: !URL
+    , whRepoCloneUrl            :: !URL
+    , whRepoSvnUrl              :: !URL
+    , whRepoHomepage            :: !(Maybe URL)
+    , whRepoSize                :: !Int
+    , whRepoStargazersCount     :: !Int
+    , whRepoWatchersCount       :: !Int
+    , whRepoLanguage            :: !(Maybe Text)
+    , whRepoHasIssues           :: !Bool
+    , whRepoHasDownloads        :: !Bool
+    , whRepoHasWiki             :: !Bool
+    , whRepoHasPages            :: !Bool
+    , whRepoForkCount           :: !Int
+    , whRepoMirrorUrl           :: !(Maybe URL)
+    , whRepoOpenIssuesCount     :: !Int
+    , whRepoDefaultBranchName   :: !Text
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookRepository where rnf = genericRnf
+
+
+data HookRepositorySimple = HookRepositorySimple
+  { whSimplRepoId               :: !Int
+  , whSimplRepoName             :: !Text
+  , whSimplRepoFullName         :: !Text
+  }
+  deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookRepositorySimple where rnf = genericRnf
+
+
+
+data HookRepositoryLabel = HookRepositoryLabel
+    { whRepoLabelUrl            :: !URL
+    , whRepoLabelName           :: !Text
+    , whRepoLabelColor          :: !Text
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookRepositoryLabel where rnf = genericRnf
+
+
+data HookUser = HookUser
+    { whUserLogin               :: !Text
+    , whUserId                  :: !Int
+    , whUserAvatarUrl           :: !URL
+    , whUserGravatarId          :: !URL
+    , whUserUrl                 :: !URL
+    , whUserHtmlUrl             :: !URL
+    , whUserFollowersUrl        :: !URL
+    , whUserFollowingUrl        :: !URL
+    , whUserGistsUrl            :: !URL
+    , whUserStarredUrl          :: !URL
+    , whUserSubscriptionsUrl    :: !URL
+    , whUserOrganizationsUrl    :: !URL
+    , whUserReposUrl            :: !URL
+    , whUserEventsUrl           :: !URL
+    , whUserReceivedEventsUrl   :: !URL
+    , whUserType                :: !OwnerType
+    , whUserIsAdminOfSite       :: !Bool
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookUser where rnf = genericRnf
+
+
+data HookSimpleUser = HookSimpleUser
+    { whSimplUserName           :: !Text
+    , whSimplUserEmail          :: !Text
+    , whSimplUserLogin          :: !(Maybe Text)
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookSimpleUser where rnf = genericRnf
+
+
+data HookOrganization = HookOrganization
+    { whOrgLogin                :: !Text
+    , whOrgId                   :: !Int
+    , whOrgUrl                  :: !URL
+    , whOrgReposUrl             :: !URL
+    , whOrgEventsUrl            :: !URL
+    , whOrgHooksUrl             :: !(Maybe URL)
+    , whOrgIssuesUrl            :: !(Maybe URL)
+    , whOrgMembersUrl           :: !URL
+    , whOrgPublicMembersUrl     :: !URL
+    , whOrgAvatarUrl            :: !URL
+    , whOrgDescription          :: !Text
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookOrganization where rnf = genericRnf
+
+
+data HookOrganizationInvitation = HookOrganizationInvitation
+    { whOrgInvitationId         :: !Int
+    , whOrgInvitationLogin      :: !Text
+    , whOrgInvitationEmail      :: !(Maybe Text)
+    , whOrgInvitationRole       :: !Text
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookOrganizationInvitation where rnf = genericRnf
+
+
+data HookOrganizationMembership = HookOrganizationMembership
+    { whOrgMembershipUrl        :: !URL
+    , whOrgMembershipState      :: !Text
+    , whOrgMembershipRole       :: !Text
+    , whOrgMembershipOrgUrl     :: !URL
+    , whOrgMembershipUser       :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookOrganizationMembership where rnf = genericRnf
+
+
+data HookTeam = HookTeam
+    { whTeamName                :: !Text
+    , whTeamId                  :: !Int
+    , whTeamSlug                :: !Text
+    , whTeamPermission          :: !Text
+    , whTeamUrl                 :: !URL
+    , whTeamMembersUrl          :: !URL
+    , whTeamRepositoriesUrl     :: !URL
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookTeam where rnf = genericRnf
+
+
+type MilestoneState = Text
+
+data HookMilestone = HookMilestone
+    { whMilestoneUrl            :: !URL
+    , whMilestoneHtmlUrl        :: !URL
+    , whMilestoneLabelsUrl      :: !URL
+    , whMilestoneId             :: !Int
+    , whMilestoneNumber         :: !Int
+    , whMilestoneTitle          :: !Text
+    , whMilestoneDescription    :: !(Maybe Text)
+    , whMilestoneCreator        :: !HookUser
+    , whMilestoneOpenIssues     :: !Int
+    , whMilestoneClosedIssues   :: !Int
+    , whMilestoneState          :: !MilestoneState
+    , whMilestoneCreatedAt      :: !UTCTime
+    , whMilestoneUpdatedAt      :: !UTCTime
+    , whMilestoneDueOn          :: !(Maybe UTCTime)
+    , whMilestoneClosedAt       :: !(Maybe UTCTime)
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookMilestone where rnf = genericRnf
+
+
+type MembershipState = Text
+type MembershipRole = Text
+
+data HookMembership = HookMembership
+    { whMembershipUrl           :: !URL
+    , whMembershipState         :: !MembershipState
+    , whMembershipRole          :: !MembershipRole
+    , whMembershipOrgUrl        :: !URL
+    , whMembershipUser          :: !HookUser
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookMembership where rnf = genericRnf
+
+
+type ProjectState = Text
+
+data HookProject = HookProject
+    { whProjectOwnerUrl         :: !URL
+    , whProjectUrl              :: !URL
+    , whProjectColumnsUrl       :: !URL
+    , whProjectId               :: !Int
+    , whProjectName             :: !Text
+    , whProjectBody             :: !Text
+    , whProjectNumber           :: !Int
+    , whProjectState            :: !ProjectState
+    , whProjectCreator          :: !HookUser
+    , whProjectCreatedAt        :: !UTCTime
+    , whProjectUpdatedAt        :: !UTCTime
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookProject where rnf = genericRnf
+
+
+data HookProjectCard = HookProjectCard
+    { whProjectCardUrl          :: !URL
+    , whProjectCardColumnUrl    :: !URL
+    , whProjectCardColumnId     :: !Int
+    , whProjectCardId           :: !Int
+    , whProjectCardNote         :: !(Maybe Text)
+    , whProjectCardCreator      :: !HookUser
+    , whProjectCardCreatedAt    :: !UTCTime
+    , whProjectCardUpdatedAt    :: !UTCTime
+    , whProjectCardContentUrl   :: !URL
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookProjectCard where rnf = genericRnf
+
+
+data HookProjectColumn = HookProjectColumn
+    { whProjectColumnUrl        :: !URL
+    , whProjectColumnProjUrl    :: !URL
+    , whProjectColumnCardsUrl   :: !URL
+    , whProjectColumnId         :: !Int
+    , whProjectColumnName       :: !Text
+    , whProjectColumnCreatedAt  :: !UTCTime
+    , whProjectColumnUpdatedAt  :: !UTCTime
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookProjectColumn where rnf = genericRnf
+
+
+data HookIssueLabels = HookIssueLabels
+    { whIssueLabelId            :: !(Maybe Int)   -- ^ Not always sent.
+    , whIssueLabelUrl           :: !URL
+    , whIssueLabelName          :: !Text
+    , whIssueLabelColor         :: !Text
+    , whIssueLabelIsDefault     :: !Bool          -- ^ Defaults to false when not present.
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookIssueLabels where rnf = genericRnf
+
+
+-- FIXME: Missing nested metadata that provides commit description
+-- FIXME: Missing property "parent" (no examples provided)
+data HookCommit = HookCommit
+    { whCommitSha               :: !Text          -- ^ Sometimes called the commit 'id'.
+    , whCommitUrl               :: !URL
+    , whCommitHtmlUrl           :: !(Maybe URL)   -- ^ Not always sent.
+    , whCommitCommentsUrl       :: !(Maybe URL)   -- ^ Not always sent.
+    , whCommitAuthor            :: !(Either HookSimpleUser HookUser)
+    , whCommitCommitter         :: !(Either HookSimpleUser HookUser)
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookCommit where rnf = genericRnf
+
+
+-- FIXME: Missing property "assets" (no examples provided)
+data HookRelease = HookRelease
+    { whReleaseUrl              :: !URL
+    , whReleaseAssetsUrl        :: !URL
+    , whReleaseUploadUrl        :: !URL
+    , whReleaseHtmlUrl          :: !URL
+    , whReleaseId               :: !Int
+    , whReleaseTagName          :: !Text
+    , whReleaseTargetCommitish  :: !Text
+    , whReleaseName             :: !(Maybe Text)
+    , whReleaseIsDraft          :: !Bool
+    , whReleaseAuthor           :: !HookUser
+    , whReleaseIsPreRelease     :: !Bool
+    , whReleaseCreatedAt        :: !UTCTime
+    , whReleasePublishedAt      :: !(Maybe UTCTime)
+    , whReleaseTarballUrl       :: !URL
+    , whReleaseZipballUrl       :: !URL
+    , whReleaseBody             :: !(Maybe Text)
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookRelease where rnf = genericRnf
+
+
+-- FIXME: Property "head" missing (not sure)
+-- FIXME: Property "base" missing (not sure)
+data HookPullRequest = HookPullRequest
+    { whPullReqUrl              :: !URL
+    , whPullReqId               :: !Int
+    , whPullReqHtmlUrl          :: !URL
+    , whPullReqDiffUrl          :: !URL
+    , whPullReqPatchUrl         :: !URL
+    , whPullReqIssueUrl         :: !URL
+    , whPullReqNumber           :: !Int
+    , whPullReqState            :: !Text -- FIXME: Smart constructor?
+    , whPullReqIsLocked         :: !Bool
+    , whPullReqTitle            :: !Text
+    , whPullReqUser             :: !HookUser
+    , whPullReqBody             :: !Text
+    , whPullReqCreatedAt        :: !UTCTime
+    , whPullReqUpdatedAt        :: !UTCTime
+    , whPullReqClosedAt         :: !(Maybe UTCTime)
+    , whPullReqMergedAt         :: !(Maybe UTCTime)
+    , whPullReqMergeCommitSha   :: !(Maybe Text)
+    , whPullReqAssignee         :: !(Maybe HookUser)
+    , whPullReqMilestone        :: !(Maybe HookMilestone)
+    , whPullReqCommitsUrl       :: !URL
+    , whPullReqRevCommentsUrl   :: !URL
+    , whPullReqRevCommentUrl    :: !URL
+    , whPullReqCommentsUrl      :: !URL
+    , whPullReqStatusesUrl      :: !URL
+    -- , whPullReqIsMerged         :: !Bool
+    -- , whPullReqIsMergeable      :: !Bool
+    -- , whPullReqMergeableState   :: !Text
+    -- , whPullReqMergedBy         :: !(Maybe HookUser)
+    , whPullReqCommentCount     :: !(Maybe Int)               -- ^ Not sent with all events.
+    , whPullReqRevCommentCount  :: !(Maybe Int)               -- ^ Not sent with all events.
+    , whPullReqCommitCount      :: !(Maybe Int)               -- ^ Not sent with all events.
+    , whPullReqAdditionsCount   :: !(Maybe Int)               -- ^ Not sent with all events.
+    , whPullReqDeletionsCount   :: !(Maybe Int)               -- ^ Not sent with all events.
+    , whPullReqFileChangeCount  :: !(Maybe Int)               -- ^ Not sent with all events.
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookPullRequest where rnf = genericRnf
+
+
+data HookPullRequestReview = HookPullRequestReview
+    { whPullReqReviewId         :: !Int
+    , whPullReqReviewUser       :: !HookUser
+    , whPullReqReviewBody       :: !Text
+    , whPullReqReviewSubmittedAt :: !UTCTime
+    , whPullReqReviewState      :: !Text
+    , whPullReqReviewHtmlUrl    :: !URL
+    , whPullReqReviewPullUrl    :: !URL
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookPullRequestReview where rnf = genericRnf
+
+
+data HookInstallation = HookInstallation
+    { whInstallationId          :: !Int
+    , whInstallationAccount     :: !HookUser
+    , whInstallationRepoSel     :: !Text
+    , whInstallationTokenUrl    :: !URL
+    , whInstallationRepoUrl     :: !URL
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookInstallation where rnf = genericRnf
+
+
+data HookDeployment = HookDeployment
+    { whDeploymentUrl           :: !URL
+    , whDeploymentId            :: !Int
+    , whDeploymentSha           :: !Text
+    , whDeploymentRef           :: !Text
+    , whDeploymentTask          :: !Text
+    -- , whDeploymentPayload
+    , whDeploymentEnv           :: !Text
+    , whDeploymentDescription   :: !(Maybe Text)
+    , whDeploymentCreator       :: !HookUser
+    , whDeploymentCreatedAt     :: !UTCTime
+    , whDeploymentUpdatedAt     :: !UTCTime
+    , whDeploymentStatusesUrl   :: !URL
+    , whDeploymentRepoUrl       :: !URL
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookDeployment where rnf = genericRnf
+
+
+data HookDeploymentStatus = HookDeploymentStatus
+    { whDeploymentStatusUrl     :: !URL
+    , whDeploymentStatusId      :: !Int
+    , whDeploymentStatusState   :: !Text
+    , whDeploymentStatusCreator :: !HookUser
+    , whDeploymentStatusDesc    :: !(Maybe Text)
+    , whDeploymentStatusTargetUrl :: !(Maybe URL)
+    , whDeploymentStatusCreatedAt :: !UTCTime
+    , whDeploymentStatusUpdatedAt :: !UTCTime
+    , whDeploymentStatusDeplUrl   :: !URL
+    , whDeploymentStatusRepoUrl   :: !URL
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookDeploymentStatus where rnf = genericRnf
+
+
+data HookWikiPage = HookWikiPage
+    { whWikiPageName            :: !Text
+    , whWikiPageTitle           :: !Text
+    , whWikiPageSummary         :: !(Maybe Text)
+    , wkWikiPageAction          :: !Text
+    , whWikiPageSha             :: !Text
+    , whWikiPageHtmlUrl         :: URL
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookWikiPage where rnf = genericRnf
+
+
+data HookPageBuildResult = HookPageBuildResult
+    { whPageBuildUrl            :: !URL
+    , whPageBuildStatus         :: !Text
+    , whPageBuildError          :: !(Maybe Text)
+    , whPageBuildPusher         :: !HookUser
+    , whPageBuildCommitSha      :: !Text
+    , whPageBuildDuration       :: !Int
+    , whPageBuildCreatedAt      :: !UTCTime
+    , whPageBuildUpdatedAt      :: !UTCTime
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookPageBuildResult where rnf = genericRnf
+
+
+data HookIssueComment = HookIssueComment
+    { whIssueCommentUrl         :: !URL
+    , whIssueCommentHtmlUrl     :: !URL
+    , whIssueCommentIssueUrl    :: !URL
+    , whIssueCommentId          :: !Int
+    , whIssueCommentUser        :: !HookUser
+    , whIssueCommentCreatedAt   :: !UTCTime
+    , whIssueCommentUpdatedAt   :: !UTCTime
+    , whIssueCommentBody        :: !Text
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookIssueComment where rnf = genericRnf
+
+
+data HookCommitComment = HookCommitComment
+    { whCommitCommentUrl        :: !URL
+    , whCommitCommentHtmlUrl    :: !URL
+    , whCommitCommentId         :: !Int
+    , whCommitCommentUser       :: !HookUser
+    , whCommitCommentPos        :: !(Maybe Int)
+    , whCommitCommentLine       :: !(Maybe Int)
+    , whCommitCommentPath       :: !(Maybe Text)
+    , whCommitCommentCommitSha  :: !Text
+    , whCommitCommentCreatedAt  :: !UTCTime
+    , whCommitCommentUpdatedAt  :: !UTCTime
+    , whCommitCommentBody       :: !Text
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookCommitComment where rnf = genericRnf
+
+
+data HookPullRequestReviewComment = HookPullRequestReviewComment
+    { whPullReqRevComUrl        :: !URL
+    , whPullReqRevComId         :: !Int
+    , whPullReqRevComDiffHunk   :: !Text
+    , whPullReqRevComPath       :: !Text
+    , whPullReqRevComPos        :: !Int
+    , whPullReqRevComOrigPos    :: !Int
+    , whPullReqRevComCommitSha  :: !Text
+    , whPullReqRevComOrigSha    :: !Text
+    , whPullReqRevComUser       :: !HookUser
+    , whPullReqRevComBody       :: !Text
+    , whPullReqRevComCreatedAt  :: !UTCTime
+    , whPullReqRevComUpdatedAt  :: !UTCTime
+    , whPullReqRevComHtmlUrl    :: !URL
+    , whPullReqRevComPullReqUrl :: !URL
+    }
+    deriving (Eq, Show, Typeable, Data, Generic)
+
+instance NFData HookPullRequestReviewComment where rnf = genericRnf
+
+
+-- Aeson Instances
+
+instance FromJSON HookIssue where
+  parseJSON = withObject "HookIssue" $ \o -> HookIssue
+      <$> o .: "url"
+      <*> o .: "labels_url"
+      <*> o .: "comments_url"
+      <*> o .: "events_url"
+      <*> o .: "html_url"
+      <*> o .: "id"
+      <*> o .: "number"
+      <*> o .: "title"
+      <*> o .: "user"
+      <*> o .: "labels"
+      <*> o .: "state"
+      <*> o .: "locked"
+      <*> o .: "assignee"
+      <*> o .: "milestone"
+      <*> o .: "comments"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+      <*> o .:? "closed_at"
+      <*> o .: "body"
+
+instance FromJSON HookRepository where
+  parseJSON = withObject "HookRepository" $ \o -> HookRepository
+      <$> o .: "id"
+      <*> o .: "name"
+      <*> o .: "full_name"
+      <*> ((Right <$> o .: "owner") <|> (Left <$> o .: "owner")) -- try complex form first
+      <*> o .: "private"
+      <*> o .: "html_url"
+      <*> o .:? "description" .!= T.empty
+      <*> o .: "fork"
+      <*> o .: "url"
+      <*> o .: "forks_url"
+      <*> o .: "keys_url"
+      <*> o .: "collaborators_url"
+      <*> o .: "teams_url"
+      <*> o .: "hooks_url"
+      <*> o .: "issue_events_url"
+      <*> o .: "events_url"
+      <*> o .: "assignees_url"
+      <*> o .: "branches_url"
+      <*> o .: "tags_url"
+      <*> o .: "blobs_url"
+      <*> o .: "git_tags_url"
+      <*> o .: "git_refs_url"
+      <*> o .: "trees_url"
+      <*> o .: "statuses_url"
+      <*> o .: "languages_url"
+      <*> o .: "stargazers_url"
+      <*> o .: "contributors_url"
+      <*> o .: "subscribers_url"
+      <*> o .: "subscription_url"
+      <*> o .: "commits_url"
+      <*> o .: "git_commits_url"
+      <*> o .: "comments_url"
+      <*> o .: "issue_comment_url"
+      <*> o .: "contents_url"
+      <*> o .: "compare_url"
+      <*> o .: "merges_url"
+      <*> o .: "archive_url"
+      <*> o .: "downloads_url"
+      <*> o .: "issues_url"
+      <*> o .: "pulls_url"
+      <*> o .: "milestones_url"
+      <*> o .: "notifications_url"
+      <*> o .: "labels_url"
+      <*> o .: "releases_url"
+      -- FIXME: Wrap optional number/stringified UTCTime in a helper function? See PushEvent fixture
+      <*> ((o .: "created_at")  <|> (posixSecondsToUTCTime <$> o .: "created_at"))
+      <*> ((o .: "updated_at")  <|> (posixSecondsToUTCTime <$> o .: "updated_at"))
+      <*> ((o .: "pushed_at")   <|> (posixSecondsToUTCTime <$> o .: "pushed_at"))
+      <*> o .: "git_url"
+      <*> o .: "ssh_url"
+      <*> o .: "clone_url"
+      <*> o .: "svn_url"
+      <*> o .:? "homepage"
+      <*> o .: "size"
+      <*> o .: "stargazers_count"
+      <*> o .: "watchers_count"
+      <*> o .: "language"
+      <*> o .: "has_issues"
+      <*> o .: "has_downloads"
+      <*> o .: "has_wiki"
+      <*> o .: "has_pages"
+      <*> o .: "forks_count"
+      <*> o .:? "mirror_url"
+      <*> o .: "open_issues_count"
+      <*> o .: "default_branch"
+
+instance FromJSON HookRepositorySimple where
+  parseJSON = withObject "HookRepositorySimple" $ \o -> HookRepositorySimple
+      <$> o .: "id"
+      <*> o .: "name"
+      <*> o .: "full_name"
+
+instance FromJSON HookRepositoryLabel where
+  parseJSON = withObject "HookRepositoryLabel" $ \o -> HookRepositoryLabel
+      <$> o .: "url"
+      <*> o .: "name"
+      <*> o .: "color"
+
+instance FromJSON HookUser where
+  parseJSON = withObject "HookUser" $ \o -> HookUser
+      <$> o .: "login"
+      <*> o .: "id"
+      <*> o .: "avatar_url"
+      <*> o .: "gravatar_id"
+      <*> o .: "url"
+      <*> o .: "html_url"
+      <*> o .: "followers_url"
+      <*> o .: "following_url"
+      <*> o .: "gists_url"
+      <*> o .: "starred_url"
+      <*> o .: "subscriptions_url"
+      <*> o .: "organizations_url"
+      <*> o .: "repos_url"
+      <*> o .: "events_url"
+      <*> o .: "received_events_url"
+      <*> o .: "type"
+      <*> o .: "site_admin"
+
+instance FromJSON HookSimpleUser where
+  parseJSON = withObject "HookSimpleUser" $ \o -> HookSimpleUser
+      <$> o .: "name"
+      <*> o .: "email"
+      <*> o .:? "username"
+
+instance FromJSON HookOrganization where
+  parseJSON = withObject "HookOrganization" $ \o -> HookOrganization
+      <$> o .: "login"
+      <*> o .: "id"
+      <*> o .: "url"
+      <*> o .: "repos_url"
+      <*> o .: "events_url"
+      <*> o .:? "hooks_url"
+      <*> o .:? "issues_url"
+      <*> o .: "members_url"
+      <*> o .: "public_members_url"
+      <*> o .: "avatar_url"
+      <*> o .:? "description" .!= T.empty
+
+instance FromJSON HookOrganizationInvitation where
+  parseJSON = withObject "HookOrganizationInvitation" $ \o -> HookOrganizationInvitation
+      <$> o .: "id"
+      <*> o .: "login"
+      <*> o .: "email"
+      <*> o .: "role"
+
+instance FromJSON HookOrganizationMembership where
+  parseJSON = withObject "HookOrganizationMembership" $ \o -> HookOrganizationMembership
+      <$> o .: "url"
+      <*> o .: "state"
+      <*> o .: "role"
+      <*> o .: "organization_url"
+      <*> o .: "user"
+
+instance FromJSON HookTeam where
+  parseJSON = withObject "HookTeam" $ \o -> HookTeam
+      <$> o .: "name"
+      <*> o .: "id"
+      <*> o .: "slug"
+      <*> o .: "permission"
+      <*> o .: "url"
+      <*> o .: "members_url"
+      <*> o .: "repositories_url"
+
+instance FromJSON HookMilestone where
+  parseJSON = withObject "HookMilestone" $ \o -> HookMilestone
+      <$> o .: "url"
+      <*> o .: "html_url"
+      <*> o .: "labels_url"
+      <*> o .: "id"
+      <*> o .: "number"
+      <*> o .: "title"
+      <*> o .: "description"
+      <*> o .: "creator"
+      <*> o .: "open_issues"
+      <*> o .: "closed_issues"
+      <*> o .: "state"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+      <*> o .: "due_on"
+      <*> o .: "closed_at"
+
+instance FromJSON HookMembership where
+  parseJSON = withObject "HookMembership" $ \o -> HookMembership
+      <$> o .: "url"
+      <*> o .: "state"
+      <*> o .: "role"
+      <*> o .: "organization_url"
+      <*> o .: "user"
+
+instance FromJSON HookProject where
+  parseJSON = withObject "HookProject" $ \o -> HookProject
+      <$> o .: "owner_url"
+      <*> o .: "url"
+      <*> o .: "columns_url"
+      <*> o .: "id"
+      <*> o .: "name"
+      <*> o .: "body"
+      <*> o .: "number"
+      <*> o .: "state"
+      <*> o .: "creator"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+
+instance FromJSON HookProjectCard where
+  parseJSON = withObject "HookProjectCard" $ \o -> HookProjectCard
+      <$> o .: "url"
+      <*> o .: "column_url"
+      <*> o .: "column_id"
+      <*> o .: "id"
+      <*> o .:? "note"
+      <*> o .: "creator"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+      <*> o .: "content_url"
+
+instance FromJSON HookProjectColumn where
+  parseJSON = withObject "HookProjectColumn" $ \o -> HookProjectColumn
+      <$> o .: "url"
+      <*> o .: "project_url"
+      <*> o .: "cards_url"
+      <*> o .: "id"
+      <*> o .: "name"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+
+instance FromJSON HookIssueLabels where
+  parseJSON = withObject "HookIssueLabels" $ \o -> HookIssueLabels
+      <$> o .:? "id"
+      <*> o .: "url"
+      <*> o .: "name"
+      <*> o .: "color"
+      <*> o .:? "default" .!= False
+
+instance FromJSON HookCommit where
+  parseJSON = withObject "HookCommit" $ \o -> HookCommit
+      <$> (o .: "sha" <|> o .: "id")
+      <*> o .: "url"
+      <*> o .:? "html_url"
+      <*> o .:? "comments_url"
+      <*> ((Right <$> o .: "author")      <|> (Left <$> o .: "author"))       -- try complex form first
+      <*> ((Right <$> o .: "committer")   <|> (Left <$> o .: "committer"))    -- try complex form first
+
+instance FromJSON HookRelease where
+  parseJSON = withObject "HookRelease" $ \o -> HookRelease
+      <$> o .: "url"
+      <*> o .: "assets_url"
+      <*> o .: "upload_url"
+      <*> o .: "html_url"
+      <*> o .: "id"
+      <*> o .: "tag_name"
+      <*> o .: "target_commitish"
+      <*> o .:? "name"
+      <*> o .: "draft"
+      <*> o .: "author"
+      <*> o .: "prerelease"
+      <*> o .: "created_at"
+      <*> o .:? "published_at"
+      <*> o .: "tarball_url"
+      <*> o .: "zipball_url"
+      <*> o .:? "body"
+
+instance FromJSON HookPullRequest where
+  parseJSON = withObject "HookPullRequest" $ \o -> HookPullRequest
+      <$> o .: "url"
+      <*> o .: "id"
+      <*> o .: "html_url"
+      <*> o .: "diff_url"
+      <*> o .: "patch_url"
+      <*> o .: "issue_url"
+      <*> o .: "number"
+      <*> o .: "state"
+      <*> o .: "locked"
+      <*> o .: "title"
+      <*> o .: "user"
+      <*> o .: "body"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+      <*> o .:? "closed_at"
+      <*> o .:? "merged_at"
+      <*> o .:? "merge_commit_sha"
+      <*> o .:? "assignee"
+      <*> o .:? "milestone"
+      <*> o .: "commits_url"
+      <*> o .: "review_comments_url"
+      <*> o .: "review_comment_url"
+      <*> o .: "comments_url"
+      <*> o .: "statuses_url"
+      -- <*> o .: "merged"
+      -- <*> o .: "mergeable"
+      -- <*> o .: "mergeable_state"
+      -- <*> o .: "merged_by"
+      <*> o .:? "comments"
+      <*> o .:? "review_comments"
+      <*> o .:? "commits"
+      <*> o .:? "additions"
+      <*> o .:? "deletions"
+      <*> o .:? "changed_files"
+
+instance FromJSON HookPullRequestReview where
+  parseJSON = withObject "HookPullRequestReview" $ \o -> HookPullRequestReview
+      <$> o .: "id"
+      <*> o .: "user"
+      <*> o .: "body"
+      <*> o .: "submitted_at"
+      <*> o .: "state"
+      <*> o .: "html_url"
+      <*> o .: "pull_request_url"
+
+instance FromJSON HookInstallation where
+  parseJSON = withObject "HookInstallation" $ \o -> HookInstallation
+      <$> o .: "id"
+      <*> o .: "account"
+      <*> o .: "repository_selection"
+      <*> o .: "access_tokens_url"
+      <*> o .: "repositories_url"
+
+instance FromJSON HookDeployment where
+  parseJSON = withObject "HookDeployment" $ \o -> HookDeployment
+      <$> o .: "url"
+      <*> o .: "id"
+      <*> o .: "sha"
+      <*> o .: "ref"
+      <*> o .: "task"
+      <*> o .: "environment"
+      <*> o .:? "description"
+      <*> o .: "creator"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+      <*> o .: "statuses_url"
+      <*> o .: "repository_url"
+
+instance FromJSON HookDeploymentStatus where
+  parseJSON = withObject "HookDeploymentStatus" $ \o -> HookDeploymentStatus
+      <$> o .: "url"
+      <*> o .: "id"
+      <*> o .: "state"
+      <*> o .: "creator"
+      <*> o .:? "description"
+      <*> o .:? "target_url"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+      <*> o .: "deployment_url"
+      <*> o .: "repository_url"
+
+instance FromJSON HookWikiPage where
+  parseJSON = withObject "HookWikiPage" $ \o -> HookWikiPage
+      <$> o .: "page_name"
+      <*> o .: "title"
+      <*> o .:? "summary"
+      <*> o .: "action"
+      <*> o .: "sha"
+      <*> o .: "html_url"
+
+instance FromJSON HookPageBuildResult where
+  parseJSON = withObject "HookPageBuildResult" $ \o -> HookPageBuildResult
+      <$> o .: "url"
+      <*> o .: "status"
+      <*> (o .: "error" >>= \e -> e .:? "message")
+      <*> o .: "pusher"
+      <*> o .: "commit"
+      <*> o .: "duration"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+
+instance FromJSON HookIssueComment where
+  parseJSON = withObject "HookIssueComment" $ \o -> HookIssueComment
+      <$> o .: "url"
+      <*> o .: "html_url"
+      <*> o .: "issue_url"
+      <*> o .: "id"
+      <*> o .: "user"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+      <*> o .: "body"
+
+instance FromJSON HookCommitComment where
+  parseJSON = withObject "HookCommitComment" $ \o -> HookCommitComment
+      <$> o .: "url"
+      <*> o .: "html_url"
+      <*> o .: "id"
+      <*> o .: "user"
+      <*> o .:? "position"
+      <*> o .:? "line"
+      <*> o .:? "path"
+      <*> o .: "commit_id"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+      <*> o .: "body"
+
+instance FromJSON HookPullRequestReviewComment where
+  parseJSON = withObject "HookPullRequestReviewComment" $ \o -> HookPullRequestReviewComment
+      <$> o .: "url"
+      <*> o .: "id"
+      <*> o .: "diff_hunk"
+      <*> o .: "path"
+      <*> o .: "position"
+      <*> o .: "original_position"
+      <*> o .: "commit_id"
+      <*> o .: "original_commit_id"
+      <*> o .: "user"
+      <*> o .: "body"
+      <*> o .: "created_at"
+      <*> o .: "updated_at"
+      <*> o .: "html_url"
+      <*> o .: "pull_request_url"
diff --git a/src/GitHub/Data/Webhooks/Secure.hs b/src/GitHub/Data/Webhooks/Secure.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Webhooks/Secure.hs
@@ -0,0 +1,52 @@
+-- See <https://developer.github.com/webhooks/securing/>.
+module GitHub.Data.Webhooks.Secure
+    ( isSecurePayload
+    , assertSecurePayload
+    ) where
+
+import           Crypto.Hash.Algorithms   (SHA1)
+import           Crypto.MAC.HMAC          (HMAC(..), hmac)
+import           Control.Monad            (unless)
+import           Control.Exception        (Exception, throwIO)
+import           Data.ByteArray           (convert, constEq)
+import           Data.Monoid              ((<>))
+import           Data.ByteString          (ByteString)
+import           Data.Text                (Text)
+import qualified Data.ByteString.Base16   as B16
+import qualified Data.Text.Encoding       as E
+
+
+-- The implementation of this module is partially lifted from the @github@ package.
+
+
+-- | Returns 'True' if the given HMAC digest (passed in the @X-Hub-Signature@ header)
+-- agrees with the provided secret and request body. If not, this request may be forged.
+isSecurePayload
+    :: Text
+    -> Maybe Text
+    -> ByteString
+    -> Bool
+isSecurePayload secret shaOpt payload = maybe False (constEq ourSig) theirSig
+    where
+      hexDigest = B16.encode . convert . hmacGetDigest
+      theirSig = E.encodeUtf8 <$> shaOpt
+      ourSig = "sha1=" <> hexDigest (hmac (E.encodeUtf8 secret) payload :: HMAC SHA1)
+
+
+-- | An exception indicating that the given payload is not secure.
+data PayloadNotSecure = PayloadNotSecure
+
+instance Exception PayloadNotSecure
+
+instance Show PayloadNotSecure where
+    showsPrec _ PayloadNotSecure = showString "the origin of this request may not originate from GitHub"
+
+-- | Like 'isSecurePayload', but throws 'PayloadNotSecure' if the payload is not secure.
+assertSecurePayload
+    :: Text
+    -> Maybe Text
+    -> ByteString
+    -> IO ()
+assertSecurePayload secret shaOpt payload = do
+    let secure = isSecurePayload secret shaOpt payload
+    unless secure $! throwIO PayloadNotSecure
diff --git a/stack.yaml b/stack.yaml
new file mode 100644
--- /dev/null
+++ b/stack.yaml
@@ -0,0 +1,74 @@
+# This file was automatically generated by 'stack init'
+#
+# Some commonly used options have been documented as comments in this file.
+# For advanced use and comprehensive documentation of the format, please see:
+# https://docs.haskellstack.org/en/stable/yaml_configuration/
+
+# Resolver to choose a 'specific' stackage snapshot or a compiler version.
+# A snapshot resolver dictates the compiler version and the set of packages
+# to be used for project dependencies. For example:
+#
+# resolver: lts-3.5
+# resolver: nightly-2015-09-21
+# resolver: ghc-7.10.2
+# resolver: ghcjs-0.1.0_ghc-7.10.2
+# resolver:
+#  name: custom-snapshot
+#  location: "./custom-snapshot.yaml"
+resolver: lts-10.0
+
+# User packages to be built.
+# Various formats can be used as shown in the example below.
+#
+# packages:
+# - some-directory
+# - https://example.com/foo/bar/baz-0.0.2.tar.gz
+# - location:
+#    git: https://github.com/commercialhaskell/stack.git
+#    commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
+# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a
+#   extra-dep: true
+#  subdirs:
+#  - auto-update
+#  - wai
+#
+# A package marked 'extra-dep: true' will only be built if demanded by a
+# non-dependency (i.e. a user package), and its test suites and benchmarks
+# will not be run. This is useful for tweaking upstream packages.
+packages:
+- .
+- location: ./examples/servant-simple
+  extra-dep: true
+- location: ./examples/servant
+  extra-dep: true
+- location: ./examples/scotty
+  extra-dep: true
+
+# Dependency packages to be pulled from upstream that are not in the resolver
+# (e.g., acme-missiles-0.3)
+extra-deps:
+- servant-github-webhook-0.3.2.1 # for github-webhooks-servant-example
+
+# Override default flag values for local packages and extra-deps
+flags: {}
+
+# Extra package databases containing global packages
+extra-package-dbs: []
+
+# Control whether we use the GHC we find on the path
+# system-ghc: true
+#
+# Require a specific version of stack, using version ranges
+# require-stack-version: -any # Default
+# require-stack-version: ">=1.5"
+#
+# Override the architecture used by stack, especially useful on Windows
+# arch: i386
+# arch: x86_64
+#
+# Extra directories used by stack for building
+# extra-include-dirs: [/path/to/dir]
+# extra-lib-dirs: [/path/to/dir]
+#
+# Allow a newer minor version of GHC than the snapshot specifies
+# compiler-check: newer-minor
