packages feed

hledger-flow-0.17.0: test/TestHelpers.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}

module TestHelpers where

import Data.Maybe (fromMaybe)
import Hledger.Flow.Internals (SystemInfo (..), versionInfo)
import Hledger.Flow.PathHelpers (AbsDir, RelFile)
import Hledger.Flow.RuntimeOptions
import qualified Hledger.Flow.Types as FlowTypes
import Path
import qualified Path.IO as PathIO
import qualified System.Info as Sys

withTestDir :: (AbsDir -> IO ()) -> IO ()
withTestDir action = do
  cwd <- PathIO.getCurrentDir
  let tmpbase = cwd </> [reldir|test/tmp|]
  PathIO.createDirIfMissing True tmpbase
  PathIO.withTempDir tmpbase "hlflowtest" action

defaultHlInfo :: FlowTypes.HledgerInfo
defaultHlInfo = FlowTypes.HledgerInfo (testRoot </> [relfile|path/to/hledger|]) "1.2.3"

-- A fictional absolute root for fixtures; no files are created here.
testRoot :: Path Abs Dir
#ifdef mingw32_HOST_OS
testRoot = [absdir|C:/|]
#else
testRoot = [absdir|/|]
#endif

testSystemInfo :: SystemInfo
testSystemInfo =
  SystemInfo
    { os = Sys.os,
      arch = Sys.arch,
      compilerName = Sys.compilerName,
      compilerVersion = Sys.compilerVersion,
      cores = 1,
      availableCores = 1
    }

defaultOpts :: FlowTypes.BaseDir -> RuntimeOptions
defaultOpts bd =
  RuntimeOptions
    { baseDir = bd,
      importRunDir = [reldir|./|],
      importStartYear = Nothing,
      onlyNewFiles = False,
      hfVersion = versionInfo testSystemInfo,
      hledgerInfo = defaultHlInfo,
      hledgerConf = Nothing,
      sysInfo = testSystemInfo,
      verbose = False,
      showOptions = False,
      sequential = False,
      batchSize = 1,
      prettyReports = True
    }

toJournal :: RelFile -> RelFile
toJournal inFile = do
  let journalFile = fromMaybe [relfile|oops.err|] $ replaceExtension ".journal" inFile
  let journalName = filename journalFile
  let yearDir = dirname . parent $ inFile
  (parent . parent . parent) inFile </> [reldir|3-journal|] </> yearDir </> journalName

inputJohnSavings2017 :: [RelFile]
inputJohnSavings2017 =
  [ [relfile|import/john/bogartbank/savings/1-in/2017/2017-11-30.csv|],
    [relfile|import/john/bogartbank/savings/1-in/2017/2017-12-30.csv|]
  ]

johnSavingsJournals2017 :: [RelFile]
johnSavingsJournals2017 = map toJournal inputJohnSavings2017

inputJohnSavings2018 :: [RelFile]
inputJohnSavings2018 =
  [ [relfile|import/john/bogartbank/savings/1-in/2018/2018-02-30.csv|],
    [relfile|import/john/bogartbank/savings/1-in/2018/2018-01-30.csv|]
  ]

johnSavingsJournals2018 :: [RelFile]
johnSavingsJournals2018 = map toJournal inputJohnSavings2018

inputJohnChecking2018 :: [RelFile]
inputJohnChecking2018 =
  [ [relfile|import/john/bogartbank/checking/1-in/2018/2018-11-30.csv|],
    [relfile|import/john/bogartbank/checking/1-in/2018/2018-10-30.csv|],
    [relfile|import/john/bogartbank/checking/1-in/2018/2018-12-30.csv|]
  ]

johnCheckingJournals2018 :: [RelFile]
johnCheckingJournals2018 = map toJournal inputJohnChecking2018

inputJohnChecking2019 :: [RelFile]
inputJohnChecking2019 =
  [ [relfile|import/john/bogartbank/checking/1-in/2019/2019-01-30.csv|],
    [relfile|import/john/bogartbank/checking/1-in/2019/2019-02-30.csv|]
  ]

johnCheckingJournals2019 :: [RelFile]
johnCheckingJournals2019 = map toJournal inputJohnChecking2019

inputJohnBogart :: [RelFile]
inputJohnBogart = inputJohnSavings2017 <> inputJohnSavings2018 <> inputJohnChecking2018 <> inputJohnChecking2019

johnCC2017 :: RelFile
johnCC2017 = [relfile|import/john/otherbank/creditcard/1-in/2017/2017-12-30.csv|]

johnCCJournal2017 :: RelFile
johnCCJournal2017 = toJournal johnCC2017

johnCC2018 :: RelFile
johnCC2018 = [relfile|import/john/otherbank/creditcard/1-in/2018/2018-01-30.csv|]

johnCCJournal2018 :: RelFile
johnCCJournal2018 = toJournal johnCC2018

johnInvest2018 :: RelFile
johnInvest2018 = [relfile|import/john/otherbank/investments/1-in/2018/2018-12-30.csv|]

johnInvestJournal2018 :: RelFile
johnInvestJournal2018 = toJournal johnInvest2018

johnInvest2019 :: RelFile
johnInvest2019 = [relfile|import/john/otherbank/investments/1-in/2019/2019-01-30.csv|]

johnInvestJournal2019 :: RelFile
johnInvestJournal2019 = toJournal johnInvest2019

inputJohnOther :: [RelFile]
inputJohnOther = [johnCC2017, johnCC2018, johnInvest2018, johnInvest2019]

janeSavings2017 :: RelFile
janeSavings2017 = [relfile|import/jane/bogartbank/savings/1-in/2017/2017-12-30.csv|]

janeSavings2018 :: [RelFile]
janeSavings2018 =
  [ [relfile|import/jane/bogartbank/savings/1-in/2018/2018-01-30.csv|],
    [relfile|import/jane/bogartbank/savings/1-in/2018/2018-12-30.csv|]
  ]

janeSavings2019 :: RelFile
janeSavings2019 = [relfile|import/jane/bogartbank/savings/1-in/2019/2019-01-30.csv|]

inputJaneBogart :: [RelFile]
inputJaneBogart =
  [ janeSavings2017,
    [relfile|import/jane/bogartbank/savings/3-journals/2018/2018-01-30.journal|],
    [relfile|import/jane/bogartbank/savings/3-journals/2018/2018-12-30.journal|],
    janeSavings2019
  ]

janeSavingsJournal2017 :: RelFile
janeSavingsJournal2017 = toJournal janeSavings2017

janeSavingsJournals2018 :: [RelFile]
janeSavingsJournals2018 = map toJournal janeSavings2018

janeSavingsJournal2019 :: RelFile
janeSavingsJournal2019 = toJournal janeSavings2019

janeSavingsJournals :: [RelFile]
janeSavingsJournals = [janeSavingsJournal2017] ++ janeSavingsJournals2018 ++ [janeSavingsJournal2019]

janeCC2017 :: RelFile
janeCC2017 = [relfile|import/jane/otherbank/creditcard/1-in/2017/2017-12-30.csv|]

janeCCJournal2017 :: RelFile
janeCCJournal2017 = toJournal janeCC2017

janeCC2018 :: RelFile
janeCC2018 = [relfile|import/jane/otherbank/creditcard/1-in/2018/2018-01-30.csv|]

janeCCJournal2018 :: RelFile
janeCCJournal2018 = toJournal janeCC2018

janeInvest2018 :: RelFile
janeInvest2018 = [relfile|import/jane/otherbank/investments/1-in/2018/2018-12-30.csv|]

janeInvestJournal2018 :: RelFile
janeInvestJournal2018 = toJournal janeInvest2018

janeInvest2019 :: RelFile
janeInvest2019 = [relfile|import/jane/otherbank/investments/1-in/2019/2019-01-30.csv|]

janeInvestJournal2019 :: RelFile
janeInvestJournal2019 = toJournal janeInvest2019

inputJaneOther :: [RelFile]
inputJaneOther = [janeCC2017, janeCC2018, janeInvest2018, janeInvest2019]

inputFiles :: [RelFile]
inputFiles = inputJohnBogart <> inputJohnOther <> inputJaneBogart <> inputJaneOther

journalFiles :: [RelFile]
journalFiles = map toJournal inputFiles