{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
module TestImport
( module TestImport
, module X
) where
import ClassyPrelude as X hiding (Handler, delete, deleteBy)
import Control.Monad.Logger (runLoggingT)
import qualified Data.Map as M
import Database.Persist as X hiding (get)
import Database.Persist.Sql (runMigration, runSqlPool)
import Database.Persist.Sqlite (createSqlitePool)
import ExampleApp as X
import ExampleProvider as Broch
import ExampleProviderOpts as X
import Network.HTTP.Client
import Network.Wai.Handler.Warp
import Network.Wai.Middleware.RequestLogger (logStdoutDev)
import System.Directory
import System.Log.FastLogger (newStdoutLoggerSet)
import Test.Hspec as X
import Yesod hiding (get)
import Yesod.Auth.OIDC as X hiding (exp)
import Yesod.Core as X
import qualified Yesod.Core.Unsafe as Unsafe
import Yesod.Default.Config2 (makeYesodLogger)
import Yesod.Persist.Core as X
type TestArgs = (Async (), Async (), App, BrochOptions)
user1 :: (SubjectId, (Email, Password))
user1 = ("user1", ("user1@example.local", "password1"))
brochUsers :: Map SubjectId (Email, Password)
brochUsers = M.fromList
[ user1
, ("user2", ("user2@sub.example.local", "password2"))
]
withServers :: SpecWith TestArgs -> Spec
withServers = beforeAll runServers . afterAll stopServers
where
appPort = 4049
appHost = "http://localhost:" <> tshow appPort
boPort = 4050
boIssuerUri = "http://localhost:" <> tshow boPort
boUsers = brochUsers
appBrochClientId = ClientId "client1"
boClients = M.fromList
[ (appBrochClientId, ( fakeClientSecret appBrochClientId
, appHost
, appHost <> "/auth/page/oidc/callback"))
]
brochOptions = BrochOptions{..}
runServers = do
brochA <- async $ Broch.runBroch brochOptions
appLogger <- newStdoutLoggerSet 1 >>= makeYesodLogger
appHttpManager <- newManager defaultManagerSettings
let mkFoundation appConnPool = App {..}
tempFoundation = mkFoundation $ error "connPool forced in tempFoundation"
logFunc = messageLoggerSource tempFoundation appLogger
removeIfExists "auth.sqlite3"
pool <- flip runLoggingT logFunc $ createSqlitePool "auth.sqlite3" 10
runLoggingT (runSqlPool (runMigration migrateAll) pool) logFunc
let app = mkFoundation pool
waiApp <- toWaiAppPlain app
appA <- async $ run appPort $ logStdoutDev waiApp
pure (brochA, appA, app, brochOptions)
stopServers (brochA, appA, _, _) = do
cancel brochA
cancel appA
unsafeHandler :: App -> Handler a -> IO a
unsafeHandler = Unsafe.fakeHandlerGetLogger appLogger
removeIfExists :: FilePath -> IO ()
removeIfExists f = do
fileExists <- doesFileExist f
when fileExists (removeFile f)