mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-07 21:15:19 +03:00
web: --test [-- HSPECARGS] runs the test suite
This commit is contained in:
parent
9428df4526
commit
ee73a6aabf
1
.gitignore
vendored
1
.gitignore
vendored
@ -70,7 +70,6 @@ old
|
||||
!/bin/*.sh
|
||||
!/bin/*.md
|
||||
/.latest.*
|
||||
test.hs
|
||||
hledger/test/addons/hledger-*
|
||||
tools/generatejournal
|
||||
tools/simplebench
|
||||
|
@ -1,12 +1,15 @@
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-|
|
||||
|
||||
hledger-web - a hledger add-on providing a web interface.
|
||||
Copyright (c) 2007-2012 Simon Michael <simon@joyful.com>
|
||||
Copyright (c) 2007-2020 Simon Michael <simon@joyful.com>
|
||||
Released under GPL version 3 or later.
|
||||
|
||||
-}
|
||||
|
||||
{-# LANGUAGE MultiWayIf #-}
|
||||
{-# LANGUAGE NamedFieldPuns #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module Hledger.Web.Main where
|
||||
|
||||
import Control.Exception (bracket)
|
||||
@ -19,6 +22,7 @@ import Network.Wai.Handler.Warp (runSettings, runSettingsSocket, defaultSettings
|
||||
import Network.Wai.Handler.Launch (runHostPortFullUrl)
|
||||
import Prelude hiding (putStrLn)
|
||||
import System.Directory (removeFile)
|
||||
import System.Environment ( getArgs, withArgs )
|
||||
import System.Exit (exitSuccess, exitFailure)
|
||||
import System.IO (hFlush, stdout)
|
||||
import System.PosixCompat.Files (getFileStatus, isSocket)
|
||||
@ -31,15 +35,10 @@ import Hledger.Cli hiding (progname,prognameandversion)
|
||||
import Hledger.Utils.UTF8IOCompat (putStrLn)
|
||||
import Hledger.Web.Application (makeApplication)
|
||||
import Hledger.Web.Settings (Extra(..), parseExtra)
|
||||
import Hledger.Web.Test (hledgerWebTest)
|
||||
import Hledger.Web.WebOptions
|
||||
|
||||
|
||||
hledgerWebMain :: IO ()
|
||||
hledgerWebMain = do
|
||||
opts <- getHledgerWebOpts
|
||||
when (debug_ (cliopts_ opts) > 0) $ printf "%s\n" prognameandversion >> printf "opts: %s\n" (show opts)
|
||||
runWith opts
|
||||
|
||||
-- Run in fast reloading mode for yesod devel.
|
||||
hledgerWebDev :: IO (Int, Application)
|
||||
hledgerWebDev =
|
||||
withJournalDo (cliopts_ defwebopts) (defaultDevelApp loader . makeApplication defwebopts)
|
||||
@ -48,14 +47,21 @@ hledgerWebDev =
|
||||
Yesod.Default.Config.loadConfig
|
||||
(configSettings Development) {csParseExtra = parseExtra}
|
||||
|
||||
runWith :: WebOpts -> IO ()
|
||||
runWith opts
|
||||
| "help" `inRawOpts` rawopts_ (cliopts_ opts) = putStr (showModeUsage webmode) >> exitSuccess
|
||||
| "version" `inRawOpts` rawopts_ (cliopts_ opts) = putStrLn prognameandversion >> exitSuccess
|
||||
| "binary-filename" `inRawOpts` rawopts_ (cliopts_ opts) = putStrLn (binaryfilename progname)
|
||||
| otherwise = withJournalDo (cliopts_ opts) (web opts)
|
||||
-- Run normally.
|
||||
hledgerWebMain :: IO ()
|
||||
hledgerWebMain = do
|
||||
wopts@WebOpts{cliopts_=copts@CliOpts{debug_, rawopts_}} <- getHledgerWebOpts
|
||||
when (debug_ > 0) $ printf "%s\n" prognameandversion >> printf "opts: %s\n" (show wopts)
|
||||
if
|
||||
| "help" `inRawOpts` rawopts_ -> putStr (showModeUsage webmode) >> exitSuccess
|
||||
| "version" `inRawOpts` rawopts_ -> putStrLn prognameandversion >> exitSuccess
|
||||
| "binary-filename" `inRawOpts` rawopts_ -> putStrLn (binaryfilename progname)
|
||||
| "test" `inRawOpts` rawopts_ -> do
|
||||
-- remove --test and --, leaving other args for hspec
|
||||
filter (not . (`elem` ["--test","--"])) <$> getArgs >>= flip withArgs hledgerWebTest
|
||||
| otherwise -> withJournalDo copts (web wopts)
|
||||
|
||||
-- | The web command.
|
||||
-- | The hledger web command.
|
||||
web :: WebOpts -> Journal -> IO ()
|
||||
web opts j = do
|
||||
let initq = rsQuery . reportspec_ $ cliopts_ opts
|
||||
|
72
hledger-web/Hledger/Web/Test.hs
Normal file
72
hledger-web/Hledger/Web/Test.hs
Normal file
@ -0,0 +1,72 @@
|
||||
module Hledger.Web.Test (
|
||||
hledgerWebTest
|
||||
) where
|
||||
|
||||
import qualified Data.Text as T
|
||||
import Test.Hspec (hspec)
|
||||
import Yesod.Default.Config
|
||||
import Yesod.Test
|
||||
|
||||
import Hledger.Web.Application ( makeFoundationWith )
|
||||
import Hledger.Web.WebOptions ( WebOpts(cliopts_), defwebopts )
|
||||
import Hledger.Web.Import hiding (get, j)
|
||||
import Hledger.Cli hiding (tests)
|
||||
|
||||
|
||||
runHspecTestsWith :: AppConfig DefaultEnv Extra -> WebOpts -> Journal -> YesodSpec App -> IO ()
|
||||
runHspecTestsWith yesodconf hledgerwebopts j specs = do
|
||||
app <- makeFoundationWith j yesodconf hledgerwebopts
|
||||
hspec $ yesodSpec app specs
|
||||
|
||||
-- Run hledger-web's built-in tests using the hspec test runner.
|
||||
hledgerWebTest :: IO ()
|
||||
hledgerWebTest = do
|
||||
putStrLn $ "Running tests for " ++ prognameandversion -- ++ " (--test --help for options)"
|
||||
|
||||
conf <- Yesod.Default.Config.loadConfig $ (configSettings Testing){ csParseExtra = parseExtra }
|
||||
|
||||
-- https://hackage.haskell.org/package/yesod-test-1.6.10/docs/Yesod-Test.html
|
||||
-- http://hspec.github.io/writing-specs.html
|
||||
--
|
||||
-- Since these tests use makeFoundation, the startup code in Hledger.Web.Main is not tested. XXX
|
||||
--
|
||||
-- Be aware that unusual combinations of opts/files here could cause problems,
|
||||
-- eg if cliopts{file_} is left empty journalReload might reload the user's default journal.
|
||||
|
||||
-- basic tests
|
||||
runHspecTestsWith 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.pack $ unlines -- PARTIAL: readJournal' should not fail
|
||||
["~ monthly"
|
||||
," assets 10"
|
||||
," income"
|
||||
])
|
||||
runHspecTestsWith 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.
|
||||
|
@ -1,5 +1,6 @@
|
||||
{-# LANGUAGE CPP #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module Hledger.Web.WebOptions where
|
||||
|
||||
import Data.ByteString (ByteString)
|
||||
@ -78,6 +79,10 @@ webflags =
|
||||
(\s opts -> Right $ setopt "capabilities-header" s opts)
|
||||
"HTTPHEADER"
|
||||
"read capabilities to enable from a HTTP header, like X-Sandstorm-Permissions (default: disabled)"
|
||||
, flagNone
|
||||
["test"]
|
||||
(setboolopt "test")
|
||||
"run hledger-web's tests and exit. hspec test runner args may follow a --, eg: hledger-web --test -- --help"
|
||||
]
|
||||
|
||||
webmode :: Mode RawOpts
|
||||
|
@ -4,7 +4,7 @@ cabal-version: 1.12
|
||||
--
|
||||
-- see: https://github.com/sol/hpack
|
||||
--
|
||||
-- hash: 0c023ce93e25342762ee67e15231e3d07bff45c813ae6ad729c8b3823ab45a3e
|
||||
-- hash: 08ced666fbf9ade30534a40547c91f9787478e157c9aa55c401e83aca852803e
|
||||
|
||||
name: hledger-web
|
||||
version: 1.19.99
|
||||
@ -143,6 +143,7 @@ library
|
||||
Hledger.Web.Main
|
||||
Hledger.Web.Settings
|
||||
Hledger.Web.Settings.StaticFiles
|
||||
Hledger.Web.Test
|
||||
Hledger.Web.WebOptions
|
||||
Hledger.Web.Widget.AddForm
|
||||
Hledger.Web.Widget.Common
|
||||
@ -172,6 +173,7 @@ library
|
||||
, hjsmin
|
||||
, hledger >=1.19.99 && <1.20
|
||||
, hledger-lib >=1.19.99 && <1.20
|
||||
, hspec
|
||||
, http-client
|
||||
, http-conduit
|
||||
, http-types
|
||||
@ -196,6 +198,7 @@ library
|
||||
, yesod-core >=1.4 && <1.7
|
||||
, yesod-form >=1.4 && <1.7
|
||||
, yesod-static >=1.4 && <1.7
|
||||
, yesod-test
|
||||
if (flag(dev)) || (flag(library-only))
|
||||
cpp-options: -DDEVELOPMENT
|
||||
if flag(dev)
|
||||
|
@ -91,6 +91,9 @@ serve them from another server for efficiency, you would set the url with this.
|
||||
`--capabilities-header=HTTPHEADER`
|
||||
: read capabilities to enable from a HTTP header, like X-Sandstorm-Permissions (default: disabled)
|
||||
|
||||
`--test`
|
||||
: run hledger-web's tests and exit. hspec test runner args may follow a --, eg: hledger-web --test -- --help
|
||||
|
||||
hledger input options:
|
||||
|
||||
_inputoptions_
|
||||
|
@ -96,6 +96,7 @@ library:
|
||||
- Hledger.Web.Main
|
||||
- Hledger.Web.Settings
|
||||
- Hledger.Web.Settings.StaticFiles
|
||||
- Hledger.Web.Test
|
||||
- Hledger.Web.WebOptions
|
||||
- Hledger.Web.Widget.AddForm
|
||||
- Hledger.Web.Widget.Common
|
||||
@ -143,6 +144,8 @@ library:
|
||||
- yesod-core >=1.4 && < 1.7
|
||||
- yesod-form >=1.4 && < 1.7
|
||||
- yesod-static >=1.4 && < 1.7
|
||||
- hspec
|
||||
- yesod-test
|
||||
|
||||
executables:
|
||||
hledger-web:
|
||||
|
@ -1,75 +1,8 @@
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
{-# LANGUAGE NoMonomorphismRestriction #-}
|
||||
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
||||
-- cabal missing-home-modules workaround from hledger-lib needed here ?
|
||||
-- {-# LANGUAGE PackageImports #-}
|
||||
-- hledger-web package test suite. Also runnable via hledger-web --test.
|
||||
|
||||
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
|
||||
import Hledger.Web.Test (hledgerWebTest)
|
||||
|
||||
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.
|
||||
|
||||
main = hledgerWebTest
|
||||
|
Loading…
Reference in New Issue
Block a user