content: {-# LANGUAGE DataKinds #-}
  {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE TypeOperators #-}
  {-# OPTIONS_GHC -fno-warn-orphans #-}
  module Servant.Utils.StaticFilesSpec where
  
  import Control.Exception
  import Data.Proxy
  import Network.Wai
  import System.Directory
  import System.IO.Temp
  import Test.Hspec hiding (pending)
  import Test.Hspec.Wai
  
  import Servant.API.Alternative
  import Servant.API.Capture
  import Servant.API.Get
  import Servant.API.Raw
  import Servant.API.Sub
  import Servant.Server
  import Servant.ServerSpec
  import Servant.Utils.StaticFiles
  
  type Api =
         "dummy_api" :> Capture "person_name" String :> Get Person
    :<|> "static" :> Raw
  
  
  api :: Proxy Api
  api = Proxy
  
  app :: Application
  app = serve api server
  
  server :: Server Api
  server =
         (\ name -> return (Person name 42))
    :<|> serveDirectory "static"
  
  withStaticFiles :: IO () -> IO ()
  withStaticFiles action = withSystemTempDirectory "servant-test" $ \ tmpDir ->
    bracket (setup tmpDir) teardown (const action)
   where
    setup tmpDir = do
      outer <- getCurrentDirectory
      setCurrentDirectory tmpDir
      createDirectory "static"
      writeFile "static/foo.txt" "bar"
      writeFile "static/index.html" "index"
      return outer
  
    teardown outer = do
      setCurrentDirectory outer
  
  spec :: Spec
  spec = do
    around_ withStaticFiles $ with (return app) $ do
      describe "serveDirectory" $ do
        it "successfully serves files" $ do
          get "/static/foo.txt" `shouldRespondWith` "bar"
  
        it "serves the contents of index.html when requesting the root of a directory" $ do
          get "/static" `shouldRespondWith` "index"
  