76 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
{-# LANGUAGE OverloadedStrings #-}
 | 
						|
{-# LANGUAGE NoMonomorphismRestriction #-}
 | 
						|
{-# OPTIONS_GHC -fno-warn-orphans #-}
 | 
						|
-- cabal missing-home-modules workaround from hledger-lib needed here ?
 | 
						|
-- {-# LANGUAGE PackageImports #-}
 | 
						|
 | 
						|
module Main where
 | 
						|
 | 
						|
import qualified Data.Text as T
 | 
						|
import Test.Hspec (hspec)
 | 
						|
import Yesod.Default.Config
 | 
						|
import Yesod.Test
 | 
						|
 | 
						|
import Hledger.Web
 | 
						|
import Hledger.Web.Application
 | 
						|
-- import Hledger.Web.Foundation
 | 
						|
import Hledger.Web.Import hiding (get, j)
 | 
						|
import Hledger.Cli hiding (tests)
 | 
						|
 | 
						|
 | 
						|
runTestsWith :: AppConfig DefaultEnv Extra -> WebOpts -> Journal -> YesodSpec App -> IO ()
 | 
						|
runTestsWith yesodconf hledgerwebopts j specs = do
 | 
						|
  app <- makeFoundationWith j yesodconf hledgerwebopts
 | 
						|
  hspec $ yesodSpec app specs
 | 
						|
 | 
						|
main :: IO ()
 | 
						|
main = do
 | 
						|
 | 
						|
  -- https://hackage.haskell.org/package/yesod-test-1.6.10/docs/Yesod-Test.html
 | 
						|
  -- http://hspec.github.io/writing-specs.html
 | 
						|
 | 
						|
  -- XXX these tests use makeFoundation, bypassing the startup code in Hledger.Web.Main
 | 
						|
  
 | 
						|
  -- Be careful about the opts/files provided here, unusual combinations might cause problems.
 | 
						|
  -- Eg journalReload can reload the user's default journal if cliopts{file_} is left empty.
 | 
						|
 | 
						|
  conf <- Yesod.Default.Config.loadConfig $ (configSettings Testing){ csParseExtra = parseExtra }
 | 
						|
 | 
						|
  -- basic tests
 | 
						|
  runTestsWith conf defwebopts nulljournal $ do
 | 
						|
    ydescribe "hledger-web" $ do
 | 
						|
 | 
						|
      yit "serves a reasonable-looking journal page" $ do
 | 
						|
        get JournalR
 | 
						|
        statusIs 200
 | 
						|
        bodyContains "Add a transaction"
 | 
						|
 | 
						|
      yit "serves a reasonable-looking register page" $ do
 | 
						|
        get RegisterR
 | 
						|
        statusIs 200
 | 
						|
        bodyContains "accounts"
 | 
						|
 | 
						|
  -- test with forecasted transactions
 | 
						|
  d <- getCurrentDay
 | 
						|
  let
 | 
						|
    ropts = defreportopts{forecast_=Just nulldatespan}
 | 
						|
    rspec = case reportOptsToSpec d ropts of
 | 
						|
              Left e   -> error $ "failed to set up report options for tests, shouldn't happen: " ++ show e
 | 
						|
              Right rs -> rs
 | 
						|
    copts = defcliopts{reportspec_=rspec, file_=[""]}  -- non-empty, see file_ note above
 | 
						|
    wopts = defwebopts{cliopts_=copts}
 | 
						|
  j <- fmap (journalTransform copts) $ readJournal' (T.unlines  -- PARTIAL: readJournal' should not fail
 | 
						|
    ["~ monthly"
 | 
						|
    ,"    assets    10"
 | 
						|
    ,"    income"
 | 
						|
    ])
 | 
						|
  runTestsWith conf wopts j $ do
 | 
						|
    ydescribe "hledger-web --forecast" $ do
 | 
						|
 | 
						|
      yit "serves a journal page showing forecasted transactions" $ do
 | 
						|
        get JournalR
 | 
						|
        statusIs 200
 | 
						|
        bodyContains "id=\"transaction-0-1\""  -- 0 indicates a fileless (forecasted) txn
 | 
						|
        bodyContains "id=\"transaction-0-2\""  -- etc.
 | 
						|
 |