{-# LANGUAGE OverloadedStrings #-}
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, prognameandversion )
import Hledger.Web.Import hiding (get, j)
import Hledger.Cli hiding (prognameandversion)
runHspecTestsWith :: AppConfig DefaultEnv Extra -> WebOpts -> Journal -> YesodSpec App -> IO ()
runHspecTestsWith :: AppConfig DefaultEnv Extra
-> WebOpts -> Journal -> YesodSpec App -> IO ()
runHspecTestsWith AppConfig DefaultEnv Extra
yesodconf WebOpts
hledgerwebopts Journal
j YesodSpec App
specs = do
App
app <- Journal -> AppConfig DefaultEnv Extra -> WebOpts -> IO App
makeFoundationWith Journal
j AppConfig DefaultEnv Extra
yesodconf WebOpts
hledgerwebopts
Spec -> IO ()
hspec (Spec -> IO ()) -> Spec -> IO ()
forall a b. (a -> b) -> a -> b
$ App -> YesodSpec App -> Spec
forall site. YesodDispatch site => site -> YesodSpec site -> Spec
yesodSpec App
app YesodSpec App
specs
hledgerWebTest :: IO ()
hledgerWebTest :: IO ()
hledgerWebTest = do
[Char] -> IO ()
putStrLn ([Char] -> IO ()) -> [Char] -> IO ()
forall a b. (a -> b) -> a -> b
$ [Char]
"Running tests for " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
prognameandversion
let conf :: AppConfig DefaultEnv Extra
conf = AppConfig{
appEnv :: DefaultEnv
appEnv = DefaultEnv
Testing
,appPort :: Int
appPort = Int
3000
,appRoot :: Text
appRoot = Text
"http://localhost:3000"
,appHost :: HostPreference
appHost = HostPreference
"*4"
,appExtra :: Extra
appExtra = Extra
{ extraCopyright :: Text
extraCopyright = Text
""
, extraAnalytics :: Maybe Text
extraAnalytics = Maybe Text
forall a. Maybe a
Nothing
, extraStaticRoot :: Maybe Text
extraStaticRoot = Maybe Text
forall a. Maybe a
Nothing
}
}
AppConfig DefaultEnv Extra
-> WebOpts -> Journal -> YesodSpec App -> IO ()
runHspecTestsWith AppConfig DefaultEnv Extra
conf WebOpts
defwebopts Journal
nulljournal (YesodSpec App -> IO ()) -> YesodSpec App -> IO ()
forall a b. (a -> b) -> a -> b
$ do
[Char] -> YesodSpec App -> YesodSpec App
forall site. [Char] -> YesodSpec site -> YesodSpec site
ydescribe [Char]
"hledger-web" (YesodSpec App -> YesodSpec App) -> YesodSpec App -> YesodSpec App
forall a b. (a -> b) -> a -> b
$ do
[Char] -> YesodExample App () -> YesodSpec App
forall site. [Char] -> YesodExample site () -> YesodSpec site
yit [Char]
"serves a reasonable-looking journal page" (YesodExample App () -> YesodSpec App)
-> YesodExample App () -> YesodSpec App
forall a b. (a -> b) -> a -> b
$ do
Route App -> YesodExample App ()
forall site url.
(Yesod site, RedirectUrl site url) =>
url -> YesodExample site ()
get Route App
JournalR
Int -> YesodExample App ()
forall site. HasCallStack => Int -> YesodExample site ()
statusIs Int
200
[Char] -> YesodExample App ()
forall site. HasCallStack => [Char] -> YesodExample site ()
bodyContains [Char]
"Add a transaction"
[Char] -> YesodExample App () -> YesodSpec App
forall site. [Char] -> YesodExample site () -> YesodSpec site
yit [Char]
"serves a reasonable-looking register page" (YesodExample App () -> YesodSpec App)
-> YesodExample App () -> YesodSpec App
forall a b. (a -> b) -> a -> b
$ do
Route App -> YesodExample App ()
forall site url.
(Yesod site, RedirectUrl site url) =>
url -> YesodExample site ()
get Route App
RegisterR
Int -> YesodExample App ()
forall site. HasCallStack => Int -> YesodExample site ()
statusIs Int
200
[Char] -> YesodExample App ()
forall site. HasCallStack => [Char] -> YesodExample site ()
bodyContains [Char]
"accounts"
let
iopts :: InputOpts
iopts = InputOpts
definputopts{forecast_ :: Maybe DateSpan
forecast_=DateSpan -> Maybe DateSpan
forall a. a -> Maybe a
Just DateSpan
nulldatespan}
copts :: CliOpts
copts = CliOpts
defcliopts{inputopts_ :: InputOpts
inputopts_=InputOpts
iopts, file_ :: [[Char]]
file_=[[Char]
""]}
wopts :: WebOpts
wopts = WebOpts
defwebopts{cliopts_ :: CliOpts
cliopts_=CliOpts
copts}
Journal
pj <- Text -> IO Journal
readJournal' ([Char] -> Text
T.pack ([Char] -> Text) -> [Char] -> Text
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
unlines
[[Char]
"~ monthly"
,[Char]
" assets 10"
,[Char]
" income"
])
Journal
j <- (Either [Char] Journal -> Journal)
-> IO (Either [Char] Journal) -> IO Journal
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (([Char] -> Journal)
-> (Journal -> Journal) -> Either [Char] Journal -> Journal
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either [Char] -> Journal
forall a. HasCallStack => [Char] -> a
error Journal -> Journal
forall a. a -> a
id) (IO (Either [Char] Journal) -> IO Journal)
-> (ExceptT [Char] IO Journal -> IO (Either [Char] Journal))
-> ExceptT [Char] IO Journal
-> IO Journal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExceptT [Char] IO Journal -> IO (Either [Char] Journal)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT [Char] IO Journal -> IO Journal)
-> ExceptT [Char] IO Journal -> IO Journal
forall a b. (a -> b) -> a -> b
$ InputOpts -> [Char] -> Text -> Journal -> ExceptT [Char] IO Journal
journalFinalise InputOpts
iopts [Char]
"fake" Text
"" Journal
pj
AppConfig DefaultEnv Extra
-> WebOpts -> Journal -> YesodSpec App -> IO ()
runHspecTestsWith AppConfig DefaultEnv Extra
conf WebOpts
wopts Journal
j (YesodSpec App -> IO ()) -> YesodSpec App -> IO ()
forall a b. (a -> b) -> a -> b
$ do
[Char] -> YesodSpec App -> YesodSpec App
forall site. [Char] -> YesodSpec site -> YesodSpec site
ydescribe [Char]
"hledger-web --forecast" (YesodSpec App -> YesodSpec App) -> YesodSpec App -> YesodSpec App
forall a b. (a -> b) -> a -> b
$ do
[Char] -> YesodExample App () -> YesodSpec App
forall site. [Char] -> YesodExample site () -> YesodSpec site
yit [Char]
"serves a journal page showing forecasted transactions" (YesodExample App () -> YesodSpec App)
-> YesodExample App () -> YesodSpec App
forall a b. (a -> b) -> a -> b
$ do
Route App -> YesodExample App ()
forall site url.
(Yesod site, RedirectUrl site url) =>
url -> YesodExample site ()
get Route App
JournalR
Int -> YesodExample App ()
forall site. HasCallStack => Int -> YesodExample site ()
statusIs Int
200
[Char] -> YesodExample App ()
forall site. HasCallStack => [Char] -> YesodExample site ()
bodyContains [Char]
"id=\"transaction-2-1\""
[Char] -> YesodExample App ()
forall site. HasCallStack => [Char] -> YesodExample site ()
bodyContains [Char]
"id=\"transaction-2-2\""