add test scaffold and first test

This commit is contained in:
nek0 2021-02-01 02:25:52 +01:00
parent 45629d0abb
commit 0669bf651c
6 changed files with 125 additions and 32 deletions

View file

@ -1,32 +1,23 @@
{ mkDerivation, aeson, base, base16-bytestring, base64-bytestring
, bytestring, case-insensitive, clock, containers, extra, HsYAML
, http-api-data, http-types, iproute, mtl, network, opaleye
, optparse-applicative, postgresql-simple
, postgresql-simple-migration, product-profunctors, profunctors
, pureMD5, random-bytestring, servant, servant-rawm, servant-server
, stdenv, stm, text, time, wai, wai-logger, wai-middleware-throttle
, warp
}:
mkDerivation {
pname = "mateamt";
version = "0.0.0.0";
{ # Fetch the latest haskell.nix and import its default.nix
haskellNix ? import (builtins.fetchTarball "https://github.com/input-output-hk/haskell.nix/archive/master.tar.gz") {}
# haskell.nix provides access to the nixpkgs pins which are used by our CI,
# hence you will be more likely to get cache hits when using these.
# But you can also just use your own, e.g. '<nixpkgs>'.
, nixpkgsSrc ? haskellNix.sources.nixpkgs-2009
# haskell.nix provides some arguments to be passed to nixpkgs, including some
# patches and also the haskell.nix functionality itself as an overlay.
, nixpkgsArgs ? haskellNix.nixpkgsArgs
# import nixpkgs with overlays
, pkgs ? import nixpkgsSrc nixpkgsArgs
}: pkgs.haskell-nix.project {
# 'cleanGit' cleans a source directory based on the files known by git
src = pkgs.haskell-nix.haskellLib.cleanGit {
name = "mateamt";
src = ./.;
isLibrary = true;
isExecutable = true;
libraryHaskellDepends = [
aeson base base16-bytestring base64-bytestring bytestring
containers extra http-api-data http-types mtl opaleye
postgresql-simple product-profunctors profunctors pureMD5
random-bytestring servant servant-rawm servant-server stm text time
wai wai-logger warp
];
executableHaskellDepends = [
base base16-bytestring bytestring case-insensitive clock containers
HsYAML iproute mtl network opaleye optparse-applicative
postgresql-simple postgresql-simple-migration servant
servant-server stm text time wai wai-logger wai-middleware-throttle
warp
];
description = "A whole new matemat";
license = stdenv.lib.licenses.agpl3;
};
# Specify the GHC version to use.
compiler-nix-name = "ghc8103"; # Not required for `stack.yaml` based projects.
}

View file

@ -19,7 +19,7 @@ flag develop
manual: True
executable mateamt
main-is: Main.hs
main-is: AppMain.hs
other-modules: AppTypes
, AppTypes.Configuration
, Janitor
@ -120,3 +120,26 @@ library
ghc-options: -Wall
if flag(develop)
cpp-options: -DDEVELOP
test-suite spec
type: exitcode-stdio-1.0
main-is: Main.hs
hs-source-dirs: test
ghc-options: -Wall
build-depends: base
, mateamt
, hspec
, hspec-wai
, hspec-wai-json
, warp
, wai
, pg-transact
, tmp-postgres
, bytestring
, resource-pool
, postgresql-simple
other-modules: TestUtil
, Spec
, MainSpec
default-language: Haskell2010
build-tool-depends: hspec-discover:hspec-discover

8
test/Main.hs Normal file
View file

@ -0,0 +1,8 @@
{-# LANGUAGE PackageImports #-}
module Main where
import Test.Hspec
import qualified Spec
main :: IO ()
main = hspec Spec.spec

20
test/MainSpec.hs Normal file
View file

@ -0,0 +1,20 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PackageImports #-}
module MainSpec where
import Database.PostgreSQL.Transact
import Database.PostgreSQL.Simple (Only(..))
import Test.Hspec
import Control.Monad.IO.Class (liftIO)
-- internal imports
import qualified "mateamt" Util as LibUtil
import TestUtil
spec = describeDB (const $ return ()) "Initialize DB" $
itDB "call initialization script" $ do
conn <- getConnection
liftIO $ shouldReturn (LibUtil.initDB conn) ()

1
test/Spec.hs Normal file
View file

@ -0,0 +1 @@
{-# OPTIONS_GHC -F -pgmF hspec-discover -optF --module-name=Spec #-}

50
test/TestUtil.hs Normal file
View file

@ -0,0 +1,50 @@
{-# LANGUAGE RecordWildCards #-}
module TestUtil where
import Control.Exception
import Control.Monad
import qualified Data.ByteString.Char8 as BSC
import Data.Pool
import qualified Database.Postgres.Temp as Temp
import Database.PostgreSQL.Simple
import Database.PostgreSQL.Transact
import Test.Hspec
describeDB :: (Connection -> IO ()) -> String -> SpecWith TestDB -> Spec
describeDB migrate str =
beforeAll (setupDB migrate) . afterAll teardownDB . describe str
setupDB :: (Connection -> IO ()) -> IO TestDB
setupDB migrate = do
tempDB <- either throwIO return =<< Temp.start
putStrLn $ BSC.unpack $ Temp.toConnectionString tempDB
pool <- createPool
(connectPostgreSQL (Temp.toConnectionString tempDB))
close
1
100000000
50
withResource pool migrate
return TestDB {..}
teardownDB :: TestDB -> IO ()
teardownDB TestDB {..} = do
destroyAllResources pool
void $ Temp.stop tempDB
withPool :: TestDB -> (Connection -> IO a) -> IO a
withPool testDB = withResource (pool testDB)
itDB :: String -> DB a -> SpecWith TestDB
itDB msg action = it msg $ void . withDB action
withDB :: DB a -> TestDB -> IO a
withDB action testDB =
withResource (pool testDB) (runDBTSerializable action)
data TestDB = TestDB
{ tempDB :: Temp.DB
-- ^ Handle for temporary @postgres@ process
, pool :: Pool Connection
-- ^ Pool of 50 connections to the temporary @postgres@
}