@@ -62,6 +62,7 @@ spec = describe "Servant.Client" $ do
62 sucessSpec
62 sucessSpec
64 wrappedApiSpec
64 wrappedApiSpec
66-- * test data types
67-- * test data types
@@ -148,6 +149,29 @@ failServer = serve failApi (
148 :<|> (\_request respond -> respond $ responseLBS ok200 [("content-type", "fooooo")] "")
149 :<|> (\_request respond -> respond $ responseLBS ok200 [("content-type", "fooooo")] "")
156+ BasicAuth "foo-realm" () :> "private" :> "basic" :> Get '[JSON] Person
158+basicAuthAPI :: Proxy BasicAuthAPI
161+basicAuthHandler :: BasicAuthCheck ()
163+ let check (BasicAuthData username password) =
164+ if username == "servant" && password == "server"
165+ then return (Authorized ())
166+ else return Unauthorized
167+ in BasicAuthCheck check
169+serverConfig :: Config '[ BasicAuthCheck () ]
170+serverConfig = basicAuthHandler :. EmptyConfig
172+basicAuthServer :: Application
173+basicAuthServer = serve basicAuthAPI serverConfig (const (return alice))
151{-# NOINLINE manager #-}
175{-# NOINLINE manager #-}
152manager :: C.Manager
176manager :: C.Manager
153manager = unsafePerformIO $ C.newManager C.defaultManagerSettings
177manager = unsafePerformIO $ C.newManager C.defaultManagerSettings
@@ -292,6 +316,22 @@ data WrappedApi where
292 HasClient api, Client api ~ ExceptT ServantError IO ()) =>
316 HasClient api, Client api ~ ExceptT ServantError IO ()) =>
293 Proxy api -> WrappedApi
317 Proxy api -> WrappedApi
319+basicAuthSpec :: Spec
320+basicAuthSpec = beforeAll (startWaiApp basicAuthServer) $ afterAll endWaiApp $ do
321+ context "Authentication works when requests are properly authenticated" $ do
323+ it "Authenticates a BasicAuth protected server appropriately" $ \(_,baseUrl) -> do
324+ let getBasic = client basicAuthAPI baseUrl manager
325+ let basicAuthData = BasicAuthData "servant" "server"
326+ (left show <$> runExceptT (getBasic basicAuthData)) `shouldReturn` Right alice
328+ context "Authentication is rejected when requests are not authenticated properly" $ do
330+ it "Authenticates a BasicAuth protected server appropriately" $ \(_,baseUrl) -> do
331+ let getBasic = client basicAuthAPI baseUrl manager
332+ let basicAuthData = BasicAuthData "not" "password"
333+ Left FailureResponse{..} <- runExceptT (getBasic basicAuthData)
334+ responseStatus `shouldBe` Status 403 "Forbidden"
296-- * utils
336-- * utils