packages feed

darcsden-1.1: src/Test/User.hs

{-# LANGUAGE OverloadedStrings #-}
module Test.User where

import Control.Monad
import Control.Monad.Trans
import qualified Data.Text as T
import Data.Maybe
import Test.WebDriver
import Test.WebDriver.Commands.Wait
import System.Random

import DarcsDen.Settings (baseUrl)

createAccount :: String -> WD (String, String)
createAccount email = do
    openPage (baseUrl++"register")
    [name, password] <- replicateM 2 g8
    elems <- mapM (findElem.ById) ["name", "email", "password1", "password2", "security_question"]
    mapM_ (uncurry sendKeys) (zip (map T.pack [name, email, password, password, "darcs"]) elems)
    (findElem.ByCSS $ ".buttons > input[value=\"sign me up\"]") >>= click
    return $ (name, password)
  where
    g8 = liftIO $ replicateM 8 $ getStdRandom $ randomR ('a', 'z')

createOAuthAccount :: T.Text -> (String -> String -> WD ()) -> String -> String -> WD String
createOAuthAccount buttonSelector oAuthLogin user pass = do
    openPage (baseUrl ++ "register")
    (findElem.ByCSS $ buttonSelector) >>= click
    oAuthLogin user pass
    name <- liftIO $ replicateM 8 $ getStdRandom $ randomR ('a', 'z')
    (findElem.ById $ "name") >>= clearInput
    (findElem.ById $ "name") >>= sendKeys (T.pack name) 
    (findElem.ByCSS $ ".buttons > input[value=\"sign me up\"]") >>= click
    return name

syncOAuthAccount :: T.Text -> (String -> String -> WD ()) -> String -> String -> WD ()
syncOAuthAccount buttonSelector oAuthLogin user pass = do
    openPage (baseUrl ++ "settings")
    (findElem.ByCSS $ buttonSelector) >>= click
    oAuthLogin user pass

loginOAuthAccount :: T.Text -> Selector -> WD ()
loginOAuthAccount buttonSelector approveSelector = do
    (waitUntil 10 (findElem.ByCSS $ "li.login > a")) >>= click
    (waitUntil 10 (findElem.ByCSS $ buttonSelector)) >>= click
    na <- fmap ((==baseUrl).take (length baseUrl)) getCurrentURL
    unless na $ findElem approveSelector >>= click

getUser :: WD (Maybe String)
getUser = fmap (fmap (drop (length baseUrl).T.unpack)) (fmap listToMaybe (findElems.ByCSS $ "li.home > a") >>= maybe (return Nothing) (flip attr "href"))

logout :: WD ()
logout = (findElem.ByCSS $ "li.logout > a") >>= click