diff --git a/yesod-core/test/Test/ErrorHandling.hs b/yesod-core/test/Test/ErrorHandling.hs new file mode 100644 index 00000000..4d7761e0 --- /dev/null +++ b/yesod-core/test/Test/ErrorHandling.hs @@ -0,0 +1,98 @@ +{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-} +module Test.ErrorHandling + ( errorHandlingTest + , Widget + ) where +import Yesod.Core +import Test.Hspec +import Test.Hspec.HUnit() +import Network.Wai +import Network.Wai.Test +import Text.Hamlet (hamlet) +import qualified Data.ByteString.Lazy as L +import qualified Data.ByteString.Char8 as S8 + +data App = App + +mkYesod "App" [parseRoutes| +/ HomeR GET +/not_found NotFoundR POST +/first_thing FirstThingR POST +/after_runRequestBody AfterRunRequestBodyR POST +|] + +instance Yesod App where approot _ = "" + +getHomeR :: Handler RepHtml +getHomeR = defaultLayout $ toWidget [hamlet| +!!! + + + +
+ + + + + +|] + +postNotFoundR, postFirstThingR, postAfterRunRequestBodyR :: Handler RepHtml +postNotFoundR = do + (_, _files) <- runRequestBody + _ <- notFound + getHomeR + +postFirstThingR = do + _ <- error "There was an error 3.14159" + getHomeR + +postAfterRunRequestBodyR = do + x <- runRequestBody + _ <- error $ show x + getHomeR + +errorHandlingTest :: [Spec] +errorHandlingTest = describe "Test.ErrorHandling" + [ it "says not found" caseNotFound + , it "says 'There was an error' before runRequestBody" caseBefore + , it "says 'There was an error' after runRequestBody" caseAfter + ] + +runner :: Session () -> IO () +runner f = toWaiApp App >>= runSession f + +caseNotFound :: IO () +caseNotFound = runner $ do + res <- request defaultRequest + { pathInfo = ["not_found"] + , requestMethod = "POST" + } + assertStatus 404 res + assertBodyContains "Not Found" res + +caseBefore :: IO () +caseBefore = runner $ do + res <- request defaultRequest + { pathInfo = ["first_thing"] + , requestMethod = "POST" + } + assertStatus 500 res + assertBodyContains "There was an error 3.14159" res + +caseAfter :: IO () +caseAfter = runner $ do + let content = "foo=bar&baz=bin12345" + res <- srequest SRequest + { simpleRequest = defaultRequest + { pathInfo = ["after_runRequestBody"] + , requestMethod = "POST" + , requestHeaders = + [ ("content-type", "application/x-www-form-urlencoded") + , ("content-length", S8.pack $ show $ L.length content) + ] + } + , simpleRequestBody = content + } + assertStatus 500 res + assertBodyContains "There was an error 2.71828" res diff --git a/yesod-core/test/main.hs b/yesod-core/test/main.hs index 00cff379..2afdda64 100644 --- a/yesod-core/test/main.hs +++ b/yesod-core/test/main.hs @@ -7,6 +7,7 @@ import Test.Media import Test.Links import Test.NoOverloadedStrings import Test.InternalRequest +import Test.ErrorHandling main :: IO () main = hspecX $ descriptions $ @@ -17,4 +18,5 @@ main = hspecX $ descriptions $ , linksTest , noOverloadedTest , internalRequestTest + , errorHandlingTest ] diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index 361eb4ff..e3d3bbaa 100644 --- a/yesod-core/yesod-core.cabal +++ b/yesod-core/yesod-core.cabal @@ -23,6 +23,7 @@ extra-source-files: test/Test/CleanPath.hs test/Test/Links.hs test/Test/InternalRequest.hs + test/Test/ErrorHandling.hs test/main.hs flag test @@ -107,8 +108,8 @@ test-suite runtests build-depends: base >= 4 && < 4.3 main-is: main.hs cpp-options: -DTEST - build-depends: hspec >= 0.8 && < 0.9 - ,wai-test + build-depends: hspec >= 0.8 && < 0.10 + ,wai-test >= 0.1.2 && < 0.2 ,wai ,yesod-core ,bytestring