packages feed

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