{-# LANGUAGE OverloadedStrings #-}
module Hledger.Web.Test (
hledgerWebTest
) where
import Data.String (fromString)
import Data.Function ((&))
import qualified Data.Text as T
import Test.Hspec (hspec)
import Yesod.Default.Config
import Yesod.Test
import Hledger.Web.Application ( makeAppWith )
import Hledger.Web.WebOptions
import Hledger.Web.Import hiding (get, j)
import Hledger.Cli hiding (prognameandversion)
runTests :: String -> [(String,String)] -> Journal -> YesodSpec App -> IO ()
runTests :: [Char] -> [([Char], [Char])] -> Journal -> YesodSpec App -> IO ()
runTests [Char]
testsdesc [([Char], [Char])]
rawopts Journal
j YesodSpec App
tests = do
wopts <- RawOpts -> IO WebOpts
rawOptsToWebOpts (RawOpts -> IO WebOpts) -> RawOpts -> IO WebOpts
forall a b. (a -> b) -> a -> b
$ [([Char], [Char])] -> RawOpts
mkRawOpts [([Char], [Char])]
rawopts
let yconf = AppConfig{
appEnv :: DefaultEnv
appEnv = DefaultEnv
Testing
,appHost :: HostPreference
appHost = WebOpts -> [Char]
host_ WebOpts
wopts [Char] -> ([Char] -> HostPreference) -> HostPreference
forall a b. a -> (a -> b) -> b
& [Char] -> HostPreference
forall a. IsString a => [Char] -> a
fromString
,appPort :: Int
appPort = WebOpts -> Int
port_ WebOpts
wopts
,appRoot :: Text
appRoot = WebOpts -> [Char]
base_url_ WebOpts
wopts [Char] -> ([Char] -> Text) -> Text
forall a b. a -> (a -> b) -> b
& [Char] -> Text
T.pack
,appExtra :: Extra
appExtra = Extra
{ extraCopyright :: Text
extraCopyright = Text
""
, extraAnalytics :: Maybe Text
extraAnalytics = Maybe Text
forall a. Maybe a
Nothing
, extraStaticRoot :: Maybe Text
extraStaticRoot = [Char] -> Text
T.pack ([Char] -> Text) -> Maybe [Char] -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> WebOpts -> Maybe [Char]
file_url_ WebOpts
wopts
}
}
app <- makeAppWith j yconf wopts
hspec $ yesodSpec app $ ydescribe testsdesc tests
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 d :: Day
d = Year -> Int -> Int -> Day
fromGregorian Year
2000 Int
1 Int
1
[Char] -> [([Char], [Char])] -> Journal -> YesodSpec App -> IO ()
runTests [Char]
"hledger-web" [] Journal
nulljournal (YesodSpec App -> IO ()) -> YesodSpec App -> IO ()
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"
[Char] -> YesodExample App () -> YesodSpec App
forall site. [Char] -> YesodExample site () -> YesodSpec site
yit [Char]
"hyperlinks use a base url made from the default host and port" (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
let defaultbaseurl :: [Char]
defaultbaseurl = [Char] -> Int -> [Char]
defbaseurl [Char]
defhost Int
defport
[Char] -> YesodExample App ()
forall site. HasCallStack => [Char] -> YesodExample site ()
bodyContains ([Char]
"href=\"" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
defaultbaseurl)
[Char] -> YesodExample App ()
forall site. HasCallStack => [Char] -> YesodExample site ()
bodyContains ([Char]
"src=\"" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
defaultbaseurl)
usecolor <- IO Bool
useColorOnStdout
let
rawopts = [([Char]
"forecast",[Char]
"")]
iopts = Day -> Bool -> Bool -> RawOpts -> InputOpts
rawOptsToInputOpts Day
d Bool
usecolor Bool
True (RawOpts -> InputOpts) -> RawOpts -> InputOpts
forall a b. (a -> b) -> a -> b
$ [([Char], [Char])] -> RawOpts
mkRawOpts [([Char], [Char])]
rawopts
f = [Char]
"fake"
pj <- readJournal'' (T.pack $ unlines
["~ monthly"
," assets 10"
," income"
])
j <- fmap (either error' id) . runExceptT $ journalFinalise iopts f "" pj
runTests "hledger-web with --forecast" rawopts j $ do
yit "shows forecasted transactions" $ do
get JournalR
statusIs 200
bodyContains "id=\"transaction-2-1\""
bodyContains "id=\"transaction-2-2\""