packages feed

drifter-postgresql-0.2.0: test/Main.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
module Main
    ( main
    ) where


-------------------------------------------------------------------------------
import           Control.Applicative              as A
import           Control.Monad
import           Data.IORef
import           Data.Text                        (Text)
import           Database.PostgreSQL.Simple
import           Database.PostgreSQL.Simple.SqlQQ
import           Drifter
import           Test.Tasty
import           Test.Tasty.HUnit
-------------------------------------------------------------------------------
import           Drifter.PostgreSQL
-------------------------------------------------------------------------------


main :: IO ()
main = defaultMain $ testGroup "drifter-postgresql"
  [
    withResource setup teardown $ \getConn -> testCase "migrations" $ do
       c <- getConn
       c2Calls <- newIORef 0
       let migrate' = runMigrations c
       res <- migrate' [c1]
       res @?= Right ()
       rows <- query_ c "SELECT x FROM c1;"
       rows @?= ([Only "c1"] :: [Only Text])

       res' <- migrate' [c1, c2 c2Calls]
       res' @?= Right ()
       calls <- readIORef c2Calls
       calls @?= 1

       res'' <- migrate' [c1, c2 c2Calls]
       res'' @?= Right ()

       calls' <- readIORef c2Calls
       calls' @?= 1
  ]

-------------------------------------------------------------------------------
c1 :: Change PGMigration
c1 = Change (ChangeName "c1") (Just "c1 migration") [] meth
  where
    meth = MigrationQuery q
    q = [sql|
          CREATE TABLE c1 (
            id serial NOT NULL,
            x text NOT NULL,

            PRIMARY KEY (id)
          );

          INSERT INTO c1 (x) VALUES ('c1');
        |]


-------------------------------------------------------------------------------
c2 :: IORef Int -> Change PGMigration
c2 ref = Change (ChangeName "c2") (Just "c2 migration") [changeName c1] meth
  where
    meth = MigrationCode (\_ -> Right A.<$> modifyIORef' ref succ)


-------------------------------------------------------------------------------
setup :: IO Connection
setup = do
    c <- connect defaultConnectInfo
    void $ execute_ c "DROP DATABASE IF EXISTS drifter_test;"
    void $ execute_ c "CREATE DATABASE drifter_test;"
    close c
    c' <- connect defaultConnectInfo { connectDatabase = "drifter_test" }
    return c'


-------------------------------------------------------------------------------
teardown :: Connection -> IO ()
teardown = close