on master help sign in
wai-test: Add setPath (sets request path + query string)
7216f9dSimon Hengel
wai-test/Network/Wai/Test.hs+13
@@ -10,6 +10,7 @@ module Network.Wai.Test
10 , SRequest (..)
10 , SRequest (..)
11 , SResponse (..)
11 , SResponse (..)
12 , defaultRequest
12 , defaultRequest
13+ , setPath
13 , setRawPathInfo
14 , setRawPathInfo
14 -- * Assertions
15 -- * Assertions
15 , assertStatus
16 , assertStatus
@@ -30,6 +31,7 @@ import Data.ByteString (ByteString)
30import qualified Data.ByteString.Char8 as S8
31import qualified Data.ByteString.Char8 as S8
31import Data.Conduit.Blaze (builderToByteString)
32import Data.Conduit.Blaze (builderToByteString)
32import Blaze.ByteString.Builder (flush)
33import Blaze.ByteString.Builder (flush)
34+import qualified Blaze.ByteString.Builder as B
33import qualified Data.ByteString.Lazy as L
35import qualified Data.ByteString.Lazy as L
34import qualified Data.ByteString.Lazy.Char8 as L8
36import qualified Data.ByteString.Lazy.Char8 as L8
35import qualified Network.HTTP.Types as H
37import qualified Network.HTTP.Types as H
@@ -87,6 +89,17 @@ defaultRequest = Request
87#endif
89#endif
88 }
90 }
89
91
92+-- | Set whole path (request path + query string).
93+setPath :: Request -> S8.ByteString -> Request
94+setPath req path = req {
95+ pathInfo = segments
96+ , rawPathInfo = B.toByteString (H.encodePathSegments segments)
97+ , queryString = query
98+ , rawQueryString = (H.renderQuery True query)
99+ }
100+ where
101+ (segments, query) = H.decodePath path
102+
90setRawPathInfo :: Request -> S8.ByteString -> Request
103setRawPathInfo :: Request -> S8.ByteString -> Request
91setRawPathInfo r rawPinfo =
104setRawPathInfo r rawPinfo =
92 let pInfo = T.split (== '/') $ TE.decodeUtf8 rawPinfo
105 let pInfo = T.split (== '/') $ TE.decodeUtf8 rawPinfo
wai-test/test/Network/Wai/TestSpec.hsnew file+32
@@ -0,0 +1,32 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+module Network.Wai.TestSpec (main, spec) where
3+
4+import Test.Hspec
5+
6+import Network.Wai
7+import Network.Wai.Test
8+
9+main :: IO ()
10+main = hspec spec
11+
12+spec :: Spec
13+spec = do
14+ describe "setPath" $ do
15+
16+ let req = setPath defaultRequest "/foo/bar/baz?foo=23&bar=42&baz"
17+
18+ it "sets pathInfo" $ do
19+ pathInfo req `shouldBe` ["foo", "bar", "baz"]
20+
21+ it "sets rawPathInfo" $ do
22+ rawPathInfo req `shouldBe` "/foo/bar/baz"
23+
24+ it "sets queryString" $ do
25+ queryString req `shouldBe` [("foo", Just "23"), ("bar", Just "42"), ("baz", Nothing)]
26+
27+ it "sets rawQueryString" $ do
28+ rawQueryString req `shouldBe` "?foo=23&bar=42&baz"
29+
30+ context "when path has no query string" $ do
31+ it "sets rawQueryString to empty string" $ do
32+ rawQueryString (setPath defaultRequest "/foo/bar/baz") `shouldBe` ""
wai-test/test/Spec.hsnew file+1
@@ -0,0 +1 @@
1+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
wai-test/wai-test.cabal+12−1
@@ -7,7 +7,7 @@ maintainer: Michael Snoyman <michael@snoyman.com>
7synopsis: Unit test framework (built on HUnit) for WAI applications.
7synopsis: Unit test framework (built on HUnit) for WAI applications.
8category: Testing, Web, Yesod
8category: Testing, Web, Yesod
9stability: Stable
9stability: Stable
10−cabal-version: >= 1.6
10+cabal-version: >= 1.8
11build-type: Simple
11build-type: Simple
12homepage: http://www.yesodweb.com/book/web-application-interface
12homepage: http://www.yesodweb.com/book/web-application-interface
13description: Unit test framework (built on HUnit) for WAI applications.
13description: Unit test framework (built on HUnit) for WAI applications.
@@ -30,6 +30,17 @@ library
30 exposed-modules: Network.Wai.Test
30 exposed-modules: Network.Wai.Test
31 ghc-options: -Wall
31 ghc-options: -Wall
32
32
33+test-suite spec
34+ type: exitcode-stdio-1.0
35+ hs-source-dirs: test
36+ main-is: Spec.hs
37+ other-modules: Network.Wai.TestSpec
38+ build-depends: base >= 4 && < 5
39+ , wai-test
40+ , wai
41+ , hspec >= 1.3
42+ ghc-options: -Wall -Werror
43+
33source-repository head
44source-repository head
34 type: git
45 type: git
35 location: git://github.com/yesodweb/wai.git
46 location: git://github.com/yesodweb/wai.git