packages feed

webdriver-precore-0.2.0.0: test/HTTP/Actions.hs

module HTTP.Actions
  ( HttpActions (..),
    mkActions,
  )
where

import Data.Aeson (FromJSON, Value)
import Data.Text (Text)
import HTTP.Runner (HttpRunner (..))
import WebDriverPreCore.HTTP.API qualified as API
import WebDriverPreCore.HTTP.Protocol
  ( Actions (..),
    Cookie (..),
    ElementId (..),
    FrameReference (..),
    FullCapabilities (..),
    Handle (..),
    Script (..),
    Selector (..),
    Session (..),
    SessionResponse (..),
    ShadowRootElementId,
    Status (..),
    Timeouts (..),
    URL,
    WindowHandleSpec (..),
    WindowRect (..),
    Command
  )

_for_implementation_see_mkActions :: HttpRunner -> HttpActions
_for_implementation_see_mkActions = mkActions

data HttpActions = MkHttpActions
  { -- Root methods
    status :: IO Status,
    newSession :: FullCapabilities -> IO SessionResponse,
    -- Session methods
    deleteSession :: Session -> IO (),
    getTimeouts :: Session -> IO Timeouts,
    setTimeouts :: Session -> Timeouts -> IO (),
    navigateTo :: Session -> URL -> IO (),
    getCurrentUrl :: Session -> IO URL,
    back :: Session -> IO (),
    forward :: Session -> IO (),
    refresh :: Session -> IO (),
    getTitle :: Session -> IO Text,
    getWindowHandle :: Session -> IO Handle,
    newWindow :: Session -> IO WindowHandleSpec,
    closeWindow :: Session -> IO [Handle],
    switchToWindow :: Session -> Handle -> IO (),
    switchToFrame :: Session -> FrameReference -> IO (),
    getPageSource :: Session -> IO Text,
    executeScript :: Session -> Script -> IO Value,
    executeScriptAsync :: Session -> Script -> IO Value,
    addCookie :: Session -> Cookie -> IO (),
    getAllCookies :: Session -> IO [Cookie],
    getNamedCookie :: Session -> Text -> IO Cookie,
    deleteCookie :: Session -> Text -> IO (),
    deleteAllCookies :: Session -> IO (),
    performActions :: Session -> Actions -> IO (),
    releaseActions :: Session -> IO (),
    dismissAlert :: Session -> IO (),
    acceptAlert :: Session -> IO (),
    getAlertText :: Session -> IO Text,
    sendAlertText :: Session -> Text -> IO (),
    takeScreenshot :: Session -> IO Text,
    printPage :: Session -> IO Text,
    -- Window methods
    getWindowHandles :: Session -> IO [Handle],
    getWindowRect :: Session -> IO WindowRect,
    setWindowRect :: Session -> WindowRect -> IO WindowRect,
    maximizeWindow :: Session -> IO WindowRect,
    minimizeWindow :: Session -> IO WindowRect,
    fullScreenWindow :: Session -> IO WindowRect,
    -- Frame methods
    switchToParentFrame :: Session -> IO (),
    -- Element(s) methods
    getActiveElement :: Session -> IO ElementId,
    findElement :: Session -> Selector -> IO ElementId,
    findElements :: Session -> Selector -> IO [ElementId],
    -- Element instance methods
    findElementFromElement :: Session -> ElementId -> Selector -> IO ElementId,
    findElementsFromElement :: Session -> ElementId -> Selector -> IO [ElementId],
    isElementSelected :: Session -> ElementId -> IO Bool,
    getElementAttribute :: Session -> ElementId -> Text -> IO Text,
    getElementProperty :: Session -> ElementId -> Text -> IO Value,
    getElementCssValue :: Session -> ElementId -> Text -> IO Text,
    getElementShadowRoot :: Session -> ElementId -> IO ShadowRootElementId,
    getElementText :: Session -> ElementId -> IO Text,
    getElementTagName :: Session -> ElementId -> IO Text,
    getElementRect :: Session -> ElementId -> IO WindowRect,
    isElementEnabled :: Session -> ElementId -> IO Bool,
    getElementComputedRole :: Session -> ElementId -> IO Text,
    getElementComputedLabel :: Session -> ElementId -> IO Text,
    elementClick :: Session -> ElementId -> IO (),
    elementClear :: Session -> ElementId -> IO (),
    elementSendKeys :: Session -> ElementId -> Text -> IO (),
    takeElementScreenshot :: Session -> ElementId -> IO Text,
    -- Shadow DOM methods
    findElementFromShadowRoot :: Session -> ShadowRootElementId -> Selector -> IO ElementId,
    findElementsFromShadowRoot :: Session -> ShadowRootElementId -> Selector -> IO [ElementId],
    -- Fallback methods
    runCommand :: forall a. (FromJSON a) => Command a -> IO a,
    runCommand' ::forall a. (FromJSON a) => Command a -> IO Value
  }

mkActions :: HttpRunner -> HttpActions
mkActions MkHttpRunner {run,  fullResponse} =
  MkHttpActions
    { -- Root methods
      status = run API.status,
      newSession = run . API.newSession,
 
      -- Session methods
      deleteSession = run . API.deleteSession,
      getTimeouts = run . API.getTimeouts,
      setTimeouts = sessRun_ API.setTimeouts,
      navigateTo = sessRun_ API.navigateTo,
      getCurrentUrl = run . API.getCurrentUrl,
      back = run . API.back,
      forward = run . API.forward,
      refresh = run . API.refresh,
      getTitle = run . API.getTitle,
      getWindowHandle = run . API.getWindowHandle,
      newWindow = run . API.newWindow,
      closeWindow = run . API.closeWindow,
      switchToWindow = sessRun_ API.switchToWindow,
      switchToFrame = sessRun_ API.switchToFrame,
      getPageSource = run . API.getPageSource,
      executeScript = sessRun API.executeScript,
      executeScriptAsync = sessRun API.executeScriptAsync,
      addCookie = sessRun_ API.addCookie,
      getAllCookies = run . API.getAllCookies,
      getNamedCookie = sessRun API.getNamedCookie,
      deleteCookie = sessRun_ API.deleteCookie,
      deleteAllCookies = run . API.deleteAllCookies,
      performActions = sessRun_ API.performActions,
      releaseActions = run . API.releaseActions,
      dismissAlert = run . API.dismissAlert,
      acceptAlert = run . API.acceptAlert,
      getAlertText = run . API.getAlertText,
      sendAlertText = sessRun_ API.sendAlertText,
      takeScreenshot = run . API.takeScreenshot,
      printPage = run . API.printPage,
      -- Window methods
      getWindowHandles = run . API.getWindowHandles,
      getWindowRect = run . API.getWindowRect,
      setWindowRect = sessRun API.setWindowRect,
      maximizeWindow = run . API.maximizeWindow,
      minimizeWindow = run . API.minimizeWindow,
      fullScreenWindow = run . API.fullScreenWindow,
      -- Frame methods
      switchToParentFrame = run . API.switchToParentFrame,
      -- Element(s) methods
      getActiveElement = run . API.getActiveElement,
      findElement = sessRun API.findElement,
      findElements = sessRun API.findElements,
      -- Element instance methods
      findElementFromElement = sessRun2 API.findElementFromElement,
      findElementsFromElement = sessRun2 API.findElementsFromElement,
      isElementSelected = sessRun API.isElementSelected,
      getElementAttribute = sessRun2 API.getElementAttribute,
      getElementProperty = sessRun2 API.getElementProperty,
      getElementCssValue = sessRun2 API.getElementCssValue,
      getElementShadowRoot = sessRun API.getElementShadowRoot,
      getElementText = sessRun API.getElementText,
      getElementTagName = sessRun API.getElementTagName,
      getElementRect = sessRun API.getElementRect,
      isElementEnabled = sessRun API.isElementEnabled,
      getElementComputedRole = sessRun API.getElementComputedRole,
      getElementComputedLabel = sessRun API.getElementComputedLabel,
      elementClick = sessRun_ API.elementClick,
      elementClear = sessRun_ API.elementClear,
      elementSendKeys = sessRun2_ API.elementSendKeys,
      takeElementScreenshot = sessRun API.takeElementScreenshot,
      -- Shadow DOM methods
      findElementFromShadowRoot = sessRun2 API.findElementFromShadowRoot,
      findElementsFromShadowRoot = sessRun2 API.findElementsFromShadowRoot,
      --
      runCommand = run,
      runCommand' = fullResponse
    }
  where
    sessRun :: forall a r. (FromJSON r) => (Session -> a -> Command r) -> Session -> a -> IO r
    sessRun f s = run . f s

    sessRun_ :: forall a. (Session -> a -> Command ()) -> Session -> a -> IO ()
    sessRun_ f s = run . f s

    sessRun2 :: forall a b r. (FromJSON r) => (Session -> a -> b -> Command r) -> Session -> a -> b -> IO r
    sessRun2 f s a = run . f s a

    sessRun2_ :: forall a b. (Session -> a -> b -> Command ()) -> Session -> a -> b -> IO ()
    sessRun2_ f s a = run . f s a