ReviewBoard-0.2.1: Tests/TestsWithServer.hs
-----------------------------------------------------------------------------
-- |
-- This tests require ReviewBoard server
--
-- POC test with server. More to come...
--
-- TODO: Add negative tests
--
-----------------------------------------------------------------------------
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
import System.Environment
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)
-- Review request tests
, TestLabel "Test create/delete rr" $ runServerTest url user passwd (createDeleteRR user)
, TestLabel "Test set rr fields" $ runServerTest url user passwd (setFieldsRR user)
]
-- Test repositoryList
repositoryListAction :: RBAction ()
repositoryListAction = do
setErrorHandler error
r <- repositoryList >>= return . assertOkStatus
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 . assertOkStatus
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 . assertOkStatus
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 . assertOkStatus
assertTrue "User list is not empty" (length (R.users ir) == 0)
return ()
-- ---------------------------------------------------------------------------
-- Revire request tests
-- Plain create/delete review request
createDeleteRR :: String -> RBAction ()
createDeleteRR user = do
setErrorHandler error
id <- createRR user
deleteRR id
return ()
-- Set fields to RR tests
setFieldsRR :: String -> RBAction ()
setFieldsRR user = do
setErrorHandler error
id <- createRR user
-- Single fields
let summary = "Test summary"
sf <- reviewRequestSetField id SUMMARY summary >>= return . assertOkStatus
assertTrue "Summary not set" (R.summary sf == summary)
-- Multiple fields
let description = "Test description"
branch = "branches/test"
sfs <- reviewRequestSet id [(DESCRIPTION, description), (BRANCH, branch)] >>= return . assertOkStatus
assertTrue "Description not set" ((R.description . R.draft) sfs == description)
assertTrue "Branch not set" ((R.branch . R.draft) sfs == branch)
deleteRR id
return ()
-- Create review request
createRR :: String -> RBAction Integer
createRR user = do
rep <- liftIO $ getEnv "RB_REPOSITORY"
rr <- reviewRequestNew rep Nothing >>= return . assertOkStatus
-- Check some response values
assertTrue "Review request not created" ((R.id . R.review_request) rr > 0)
assertTrue "Status not pending" ((R.status . R.review_request) rr == "pending")
assertTrue "Not the submitting user" ((R.username . R.submitter . R.review_request) rr == user)
return $ (R.id . R.review_request) rr
-- Delete review request
deleteRR :: Integer -> RBAction ()
deleteRR id = do
reviewRequestDelete id >>= return . assertOkStatus
ls <- reviewRequestListAll Nothing >>= return . assertOkStatus
let ids = map R.id $ (R.review_requests) ls
assertTrue "Request not deleted" (null $ filter (==id) ids)
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 response, ensures request was successful
--
assertOkStatus (RBok r) = r
assertOkStatus (RBerr e) = error e