Skip to content

Commit

Permalink
Use bracket for allocating test database
Browse files Browse the repository at this point in the history
  • Loading branch information
mpscholten committed Oct 21, 2021
1 parent 995ec62 commit 6dd1b6e
Showing 1 changed file with 20 additions and 17 deletions.
37 changes: 20 additions & 17 deletions IHP/Test/Mocking.hs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import qualified IHP.Controller.Session as Session
import qualified IHP.LoginSupport.Helper.Controller as Session
import qualified Network.Wai.Session
import qualified Data.Serialize as Serialize
import qualified Control.Exception as Exception

type ContextParameters application = (?applicationContext :: ApplicationContext, ?context :: RequestContext, ?modelContext :: ModelContext, ?application :: application, InitControllerContext application, ?mocking :: MockContext application)

Expand All @@ -48,28 +49,30 @@ data MockContext application = InitControllerContext application => MockContext
-- | Create contexts that can be used for mocking
withIHPApp :: (InitControllerContext application) => application -> ConfigBuilder -> (MockContext application -> IO ()) -> IO ()
withIHPApp application configBuilder hspecAction = do
frameworkConfig@(FrameworkConfig {dbPoolMaxConnections, dbPoolIdleTime, databaseUrl}) <- FrameworkConfig.buildFrameworkConfig configBuilder

testDatabase <- Database.createTestDatabase databaseUrl
frameworkConfig@(FrameworkConfig {dbPoolMaxConnections, dbPoolIdleTime, databaseUrl}) <- FrameworkConfig.buildFrameworkConfig configBuilder

logger <- newLogger def { level = Warn } -- don't log queries
modelContext <- createModelContext dbPoolIdleTime dbPoolMaxConnections (get #url testDatabase) logger
logger <- newLogger def { level = Warn } -- don't log queries

autoRefreshServer <- newIORef AutoRefresh.newAutoRefreshServer
session <- Vault.newKey
let sessionVault = Vault.insert session mempty Vault.empty
let applicationContext = ApplicationContext { modelContext = modelContext, session, autoRefreshServer, frameworkConfig }
let initTestDatabase = Database.createTestDatabase databaseUrl
let cleanupTestDatabase testDatabase = Database.deleteDatabase databaseUrl testDatabase

let requestContext = RequestContext
{ request = defaultRequest {vault = sessionVault}
, requestBody = FormBody [] []
, respond = const (pure ResponseReceived)
, vault = session
, frameworkConfig = frameworkConfig }
Exception.bracket initTestDatabase cleanupTestDatabase \testDatabase -> do
modelContext <- createModelContext dbPoolIdleTime dbPoolMaxConnections (get #url testDatabase) logger

autoRefreshServer <- newIORef AutoRefresh.newAutoRefreshServer
session <- Vault.newKey
let sessionVault = Vault.insert session mempty Vault.empty
let applicationContext = ApplicationContext { modelContext = modelContext, session, autoRefreshServer, frameworkConfig }

hspecAction MockContext { .. }
let requestContext = RequestContext
{ request = defaultRequest {vault = sessionVault}
, requestBody = FormBody [] []
, respond = const (pure ResponseReceived)
, vault = session
, frameworkConfig = frameworkConfig }

Database.deleteDatabase databaseUrl testDatabase
(hspecAction MockContext { .. })


mockContextNoDatabase :: (InitControllerContext application) => application -> ConfigBuilder -> IO (MockContext application)
mockContextNoDatabase application configBuilder = do
Expand Down

0 comments on commit 6dd1b6e

Please sign in to comment.