packages feed

ReviewBoard-0.2: Tests/TestsWithServer.hs

-----------------------------------------------------------------------------
-- | 
-- This tests require ReviewBoard server
--
-- POC test with server. More to come...
--
-----------------------------------------------------------------------------
module Tests.TestsWithServer (

  apiServerTests

  ) where

import Test.HUnit
import ReviewBoard.Api
import qualified ReviewBoard.Response as R
import Control.Monad.Trans
import Control.Monad.Error

apiServerTests url user passwd = TestList
    [ TestLabel "Test repositoryList"       $ runServerTest url user passwd repositoryListAction

    -- User tests
    ,  TestLabel "Test userList"            $ runServerTest url user passwd (userListAction user)
    ,  TestLabel "Test userList search"     $ runServerTest url user passwd (userListSearchAction user)

    ]

-- Test repositoryList
repositoryListAction :: RBAction ()
repositoryListAction = do
    setErrorHandler error 
    r <- repositoryList >>= return . jsValue
    assertTrue "Repository list empty" ((length . R.repositories $ r) > 0)
    return ()

-- ---------------------------------------------------------------------------
-- User API tests

-- Test userList
userListAction :: String -> RBAction ()
userListAction user = do
    setErrorHandler error 
    r <- userList Nothing >>= return . jsValue
    let users = R.users r
    assertTrue "User list empty" (length users > 0)
    assertTrue "Login user does not exist" ((length . filter (==user) . map R.username) users > 0)
    return ()

-- Test userList search
userListSearchAction :: String -> RBAction ()
userListSearchAction user = do
    setErrorHandler error 
    vr <- userList (Just user) >>= return . jsValue
    assertTrue "User list is not empty" (length (R.users vr) == 1)
    assertTrue "No login user found" (((R.username . (!!0) . R.users) vr) == user)
    ir <- userList (Just "not_a_user_2345234") >>= return . jsValue
    assertTrue "User list is not empty" (length (R.users ir) == 0)
    return ()

-- ---------------------------------------------------------------------------
-- Util function

-- | General test action runner
--
runServerTest :: String -> String -> String -> RBAction () -> Test
runServerTest url user passwd action = TestCase ( execRBAction url user passwd action )

-- | Assert for RBAction
--
assertTrue :: String -> Bool -> RBAction()
assertTrue s True = return ()
assertTrue s False = throwError $ "Assertion: " ++ s

-- | Get JSValue from respnse
--
jsValue (RBok r)  = r
jsValue (RBerr e) = error e