@@ -44,7 +44,7 @@ import Servant.API ((:<|>) (..), (:>), AuthProtect,
4444 NoContent (.. ), Patch , PlainText ,
4545 Post , Put ,
4646 QueryFlag , QueryParam , QueryParams ,
47- Raw , RemoteHost , ReqBody ,
47+ QueryParamForm , Raw , RemoteHost , ReqBody ,
4848 StdMethod (.. ), Verb , addHeader )
4949import Servant.API.Internal.Test.ComprehensiveAPI
5050import Servant.Server (Server , Handler , err401 , err403 ,
@@ -64,6 +64,7 @@ import Servant.Server.Experimental.Auth
6464 mkAuthHandler )
6565import Servant.Server.Internal.Context
6666 (NamedContext (.. ))
67+ import Web.FormUrlEncoded (FromForm )
6768
6869-- * comprehensive api test
6970
@@ -277,12 +278,13 @@ type QueryParamApi = QueryParam "name" String :> Get '[JSON] Person
277278 :<|> " b" :> QueryFlag " capitalize" :> Get '[JSON ] Person
278279 :<|> " param" :> QueryParam " age" Integer :> Get '[JSON ] Person
279280 :<|> " multiparam" :> QueryParams " ages" Integer :> Get '[JSON ] Person
281+ :<|> " paramform" :> QueryParamForm Person :> Get '[JSON ] Person
280282
281283queryParamApi :: Proxy QueryParamApi
282284queryParamApi = Proxy
283285
284286qpServer :: Server QueryParamApi
285- qpServer = queryParamServer :<|> qpNames :<|> qpCapitalize :<|> qpAge :<|> qpAges
287+ qpServer = queryParamServer :<|> qpNames :<|> qpCapitalize :<|> qpAge :<|> qpAges :<|> qpPerson
286288
287289 where qpNames (_: name2: _) = return alice { name = name2 }
288290 qpNames _ = return alice
@@ -295,6 +297,8 @@ qpServer = queryParamServer :<|> qpNames :<|> qpCapitalize :<|> qpAge :<|> qpAge
295297
296298 qpAges ages = return alice{ age = sum ages}
297299
300+ qpPerson person = return person
301+
298302 queryParamServer (Just name_) = return alice{name = name_}
299303 queryParamServer Nothing = return alice
300304
@@ -410,6 +414,28 @@ queryParamSpec = do
410414 name = " Alice"
411415 }
412416
417+ it " parses query form" $
418+ (flip runSession) (serve queryParamApi qpServer) $ do
419+ let params = " ?name=Alice&age=42"
420+ response <- Network.Wai.Test. request defaultRequest{
421+ rawQueryString = params,
422+ queryString = parseQuery params,
423+ pathInfo = [" paramform" ]
424+ }
425+ liftIO $
426+ decode' (simpleBody response) `shouldBe` Just alice
427+
428+ it " generates an error on parse failures of query form" $
429+ (flip runSession) (serve queryParamApi qpServer) $ do
430+ let params = " ?name=Alice"
431+ response <- Network.Wai.Test. request defaultRequest{
432+ rawQueryString = params,
433+ queryString = parseQuery params,
434+ pathInfo = [" paramform" ]
435+ }
436+ liftIO $ statusCode (simpleStatus response) `shouldBe` 400
437+ return ()
438+
413439-- }}}
414440------------------------------------------------------------------------------
415441-- * reqBodySpec {{{
@@ -732,6 +758,7 @@ data Person = Person {
732758
733759instance ToJSON Person
734760instance FromJSON Person
761+ instance FromForm Person
735762
736763alice :: Person
737764alice = Person " Alice" 42
0 commit comments