----------------------------------------------------------------------------- -- | -- Main test module -- -- Execute 'runhaskell Tests/Tests.hs' -- from reviewboard dir -- ----------------------------------------------------------------------------- module Main where import Test.HUnit import Text.JSON import Data.Ratio import Control.Monad import System.Environment import ReviewBoard.Api import ReviewBoard.Core import qualified ReviewBoard.Response as R import Tests.TestsWithServer import Data.Maybe -- | Main test runner -- main = do -- Run default test runTestTT defaultTests -- Get ReviewBoard server credentials -- for server depended tests url <- getEnv "RB_URL" user <- getEnv "RB_USER" passwd <- getEnv "RB_PASSWD" -- Check if server is available avail <- serverAvailable url user passwd -- and run tests runServerTest avail $ apiServerTests url user passwd return () -- | Review board test suite -- defaultTests = TestList [ TestLabel "Test rrFieldMap" rrFieldMapTest , TestLabel "Test JSON util function" jsUtilTest , TestLabel "Test response DSL" responseDSLTest ] -- --------------------------------------------------------------------------- -- API tests -- Test rrFiledMap coverage for RRField -- TODO: do we really need a print test? rrFieldMapTest = TestCase ( do mapM (print . show) [(minBound::RRField)..maxBound] return () ) -- --------------------------------------------------------------------------- -- Tests JSon utils -- Helper function takes json value from result toJson :: Result (JSObject JSValue) -> JSValue toJson (Ok v) = JSObject v toJson (Error s) = error s -- Json test object testObject :: JSValue testObject = toJson $ decode "{ \"stat\" : \"fail\", \"err\" : { \"msg\" : \"test message\", \"code\" : 100 } }" statusErr :: JSValue statusErr = testObject statusOk :: JSValue statusOk = toJson $ decode "{ \"stat\" : \"ok\" }" -- Test value parsing -- TODO: old test, add more for new dsl jsUtilTest = TestCase ( do assertEqual "Empty path" (Just testObject) (R.js4path [] testObject) assertEqual "One level" (Just . JSString $ toJSString "fail") (R.js4name "stat" testObject) assertEqual "No path match" Nothing (R.js4name "no" testObject) assertEqual "Two levels" (Just $ JSRational (100%1)) (R.js4path ["err", "code"] testObject) assertEqual "One more" (Just . JSString $ toJSString "test message") (R.js4path ["err", "msg"] testObject) assertEqual "No path match" Nothing (R.js4name "noerr" testObject) assertEqual "js2v test 1" (100::Integer) (R.js2v $ fromJust $ R.js4path ["err", "code"] testObject) assertEqual "js2v test 2" "fail" (R.js2v $ fromJust $ R.js4name "stat" testObject) ) -- --------------------------------------------------------------------------- -- JSon response DLS tests dslObject :: JSValue dslObject = toJson $ decode "{ \"review_request\" : { \"id\" : 123 } }" responseDSLTest = TestCase ( do assertEqual "rb_review_request DSL" (toJson $ decode "{ \"id\" : 123 }") (R.review_request dslObject) assertEqual "rb_id DSL" 123 $ (R.id . R.review_request) dslObject ) -- --------------------------------------------------------------------------- -- Server test utils -- Perform a login to check if server is available serverAvailable :: String -> String -> String -> IO Bool serverAvailable url user passwd = do execRBAction url user passwd testLogin where testLogin :: RBAction Bool testLogin = return True runServerTest True test = runTestTT test >> return () runServerTest False _ = error "Server not available! Skipping tests..."