packages feed

atlassian-connect-descriptor-0.4.7.0: tests/ModulesTest.hs

{-# LANGUAGE OverloadedStrings #-}
module ModulesTest (moduleTests) where

import           AssertionHelpers
import           Control.Applicative
import           Data.Aeson
import           Data.Connect.Descriptor
import qualified Data.HashMap.Strict     as HM
import           Test.HUnit
import           ValueExtractors

moduleTests :: Test
moduleTests = TestList
    [ testWebPanelCorrectFormat
    , testGeneralPageCorrectFormat
    , testEmptyModulesAreNotShown
    , testIssueGlanceCorrectFormat
    , testIssueContentCorrectFormat
    ]

testIssueGlanceCorrectFormat :: Test
testIssueGlanceCorrectFormat = TestCase $ do
    let jig = JIRAIssueGlance
                { jigKey = "jira-issue-glance-module"
                , jigName = simpleText "My glance"
                , jigContent = JIRAIssueGlanceContentLabel (simpleText "my label")
                , jigIcon = IconDetails
                    { iconUrl = "my_icon.svg"
                    , iconWidth = Just 24
                    , iconHeight = Just 25
                    }
                , jigTarget = JIRAIssueGlanceTargetWebPanel ("/panel_url")
                , jigConditions = []
                }
    let jv = toJSON jig
    isObject jv @? "Expected the issue glance to be an object"
    (getString =<< get "key" jv) `isEqualTo` "jira-issue-glance-module"
    (getString =<< get "value" =<< get "name" jv) `isEqualTo` "My glance"
    (getString =<< get "type" =<< get "target" jv) `isEqualTo` "web_panel"
    (getString =<< get "url" =<< get "target" jv) `isEqualTo` "/panel_url"
    (getString =<< get "type" =<< get "content" jv) `isEqualTo` "label"
    (getString =<< get "value" =<< get "label" =<< get "content" jv) `isEqualTo` "my label"
    (get "url" =<< get "icon" jv) `isEqualTo` "my_icon.svg"
    (getNumber =<< get "width" =<< get "icon" jv) `isEqualTo` 24
    (getNumber =<< get "height" =<< get "icon" jv) `isEqualTo` 25

testIssueContentCorrectFormat :: Test
testIssueContentCorrectFormat = TestCase $ do
    let jic = JIRAIssueContent
                { jicKey = "jira-issue-content-module"
                , jicName = simpleText "My content"
                , jicTooltip = simpleText "My tooltip"
                , jicIcon = IconDetails
                    { iconUrl = "my_icon.svg"
                    , iconWidth = Just 24
                    , iconHeight = Just 25
                    }
                , jicTarget = JIRAIssueContentTargetWebPanel "/panel_url"
                , jicConditions = []
                }
    let jv = toJSON jic
    isObject jv @? "Expected the issue glance to be an object"
    (getString =<< get "key" jv) `isEqualTo` "jira-issue-content-module"
    (getString =<< get "value" =<< get "name" jv) `isEqualTo` "My content"
    (getString =<< get "value" =<< get "tooltip" jv) `isEqualTo` "My tooltip"
    (getString =<< get "type" =<< get "target" jv) `isEqualTo` "web_panel"
    (getString =<< get "url" =<< get "target" jv) `isEqualTo` "/panel_url"
    (get "url" =<< get "icon" jv) `isEqualTo` "my_icon.svg"
    (getNumber =<< get "width" =<< get "icon" jv) `isEqualTo` 24
    (getNumber =<< get "height" =<< get "icon" jv) `isEqualTo` 25

testWebPanelCorrectFormat :: Test
testWebPanelCorrectFormat = TestCase $ do
    let wp = WebPanel
              { wpKey = "web-panel-key"
              , wpName = simpleText "My web panel"
              , wpUrl = "/panel/my-panel?issue_key={issue.key}"
              , wpLocation = "atl.jira.view.issue.right.context"
              , wpConditions = [staticJiraCondition UserIsAdminJiraCondition]
              , wpTooltip = Just . simpleText $ "A tooltip for the web panel..."
              , wpWeight = Just 1234
              , wpLayout = Just $ WebPanelLayout (Pixels 321) (Percentage 80)
              , wpParams = HM.fromList [("one", "1"), ("two", "2")]
              }
    let jv = toJSON wp
    isObject jv @? "Expected the web panel to be an object"
    (getString =<< get "key" jv) `isEqualTo` "web-panel-key"
    (getString =<< get "value" =<< get "name" jv) `isEqualTo` "My web panel"
    (getString =<< get "url" jv) `isEqualTo` "/panel/my-panel?issue_key={issue.key}"
    (getString =<< get "location" jv) `isEqualTo` "atl.jira.view.issue.right.context"
    (isArray <$> get "conditions" jv) @? "Expected the conditions to be an array"

testGeneralPageCorrectFormat :: Test
testGeneralPageCorrectFormat = TestCase $ do
    let gp = JIRAPage
              { jiraPageKey = "general-page-key"
              , jiraPageName = simpleText "General Page Name"
              , jiraPageUrl = "/panel/page-panel-name?page_id={page.id}"
              , jiraPageLocation = Just "some-confluence-location"
              , jiraPageIcon = Just $ IconDetails "/path/to/icon" (Just 10) (Just 20)
              , jiraPageWeight = Just 10000
              , jiraPageConditions = [staticJiraCondition IsIssueReportedByCurrentUserJiraCondition]
              , jiraPageParams = HM.fromList [("gpOne", "gp1"), ("gpTwo", "gp2")]
              }
    let jv = toJSON gp
    isObject jv @? "Expected the web panel to be an object"
    get "key" jv `isEqualTo` "general-page-key"
    (get "value" =<< get "name" jv) `isEqualTo` "General Page Name"
    get "url" jv `isEqualTo` "/panel/page-panel-name?page_id={page.id}"
    get "location" jv `isEqualTo` "some-confluence-location"
    (isObject <$> get "icon" jv) @? "Expected an icon to be present"
    (get "url" =<< get "icon" jv) `isEqualTo` "/path/to/icon"
    (getNumber =<< get "width" =<< get "icon" jv) `isEqualTo` 10
    (getNumber =<< get "height" =<< get "icon" jv) `isEqualTo` 20
    (getNumber =<< get "weight" jv) `isEqualTo` 10000
    (isArray <$> get "conditions" jv) @? "Expected the conditions to be present."

testEmptyModulesAreNotShown :: Test
testEmptyModulesAreNotShown = TestCase $ do
    let modules = Modules emptyJIRAModules emptyConfluenceModules
    let jv = toJSON modules
    fieldIsNotPresent "webPanels" jv @? "Expected the field webPanels to be present"
    fieldIsNotPresent "generalPages" jv @? "Expected the field webPanels to be present"