packages feed

darcsden-1.1: src/Test.hs

{-# LANGUAGE OverloadedStrings #-}

import Control.Monad.Trans
import Test.HUnit
import Test.WebDriver
import System.Environment

import DarcsDen.State.Util(resetAllState, repoDir)

import Test.User
import Test.Repository

import Test.Google
import Test.Github

createUserTest :: Assertion
createUserTest = do
    em <- getEnv "GOOGLE_USERNAME"
    resetAllState
    (runSession defaultSession defaultCaps $ do
       (na, _) <- createAccount em
       Just na' <- getUser
       return $ na' == na) >>= assertBool "Failed create user test!"

createAccountUsingOAuthTest :: String -> (String -> String -> WD String) -> Assertion
createAccountUsingOAuthTest ev ca = do
    em <- getEnv $ ev ++ "_USERNAME"
    pw <- getEnv $ ev ++ "_PASSWORD"
    resetAllState
    (runSession defaultSession defaultCaps $ do
      na <- ca em pw
      Just na' <- getUser
      return $ na == na') >>= (assertBool $ "Failed createAccountUsingOAuth: " ++ ev)

loginOAuthAccountTest :: String -> (String -> String -> WD String) -> WD () -> Assertion
loginOAuthAccountTest ev ca login = do
    em <- getEnv $ ev ++ "_USERNAME"
    pw <- getEnv $ ev ++ "_PASSWORD"
    resetAllState
    (runSession defaultSession defaultCaps $ do
       na <- ca em pw
       logout
       login
       Just na' <- getUser
       return $ na' == na) >>= (assertBool $ "Failed loginOAuthAccountTest: " ++ ev)

syncOAuthAccountTest :: String -> (String -> String -> WD ()) -> WD () -> Assertion
syncOAuthAccountTest ev sa login = do
    em <- getEnv $ ev ++ "_USERNAME"
    pw <- getEnv $ ev ++ "_PASSWORD"
    resetAllState
    (runSession defaultSession defaultCaps $ do
       (na,_) <- createAccount em
       sa em pw
       logout
       login
       Just na' <- getUser
       return $ na' == na) >>= (assertBool $ "Failed syncOAuthAccountTest: " ++ ev)

editFileTest :: Assertion
editFileTest = do
    em <- getEnv "GOOGLE_USERNAME"
    resetAllState
    (runSession defaultSession defaultCaps $ do
       (u, _) <- createAccount em
       r <- createRepository
       (d, f) <- createDirAndFile
       val <- editFile
       val' <- liftIO $ readFile (repoDir u r ++ "/" ++ d ++ "/" ++ f)
       return $ val == val') >>= assertBool "Failed edit file test!"

main :: IO Counts
main = runTestTT.TestList $ [
    TestCase createUserTest,
    TestLabel "OAuth" $ TestList [
        TestLabel "Google" $ TestList [
	    TestCase $ createAccountUsingOAuthTest "GOOGLE" goc,
	    TestCase $ loginOAuthAccountTest "GOOGLE" goc gol,
	    TestCase $ syncOAuthAccountTest "GOOGLE" gos gol
	],
	TestLabel "Github" $ TestList [
	    TestCase $ createAccountUsingOAuthTest "GITHUB" gic,
	    TestCase $ loginOAuthAccountTest "GITHUB" gic gil,
	    TestCase $ syncOAuthAccountTest "GITHUB" gis gil
	]
    ],
    TestCase editFileTest
    ]
  where
    goc = createOAuthAccount googleRegSelector googleLogin
    gos = syncOAuthAccount googleSyncSelector googleLogin
    gol = loginOAuthAccount googleLoginSelector (ById "submit_approve_access")
    gic = createOAuthAccount githubRegSelector githubLogin
    gis = syncOAuthAccount githubSyncSelector githubLogin
    gil = loginOAuthAccount githubLoginSelector (ByName "authorize")