packages feed

atlassian-connect-descriptor-0.4.4.1: tests/ConditionsTest.hs

{-# LANGUAGE OverloadedStrings #-}
module ConditionsTest (conditionsTests) where

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

conditionsTests :: Test
conditionsTests = TestList
    [ invertConditionSimple
    , invertConditionAndType
    , invertConditionOrType
    , invertConditionNested
    , jiraConditionJsonCorrect
    , confluenceConditionJsonCorrect
    , remoteConditionJsonCorrect
    , compositeAndConditionConnect
    , conditionParamsTest
    ]

-- Inverting conditions works correctly
invertConditionSimple :: Test
invertConditionSimple = TestCase $ do
    let originalCondition = staticJiraCondition UserIsAdminJiraCondition
    (not . conditionInverted $ originalCondition) @? "Expected the condition to not be inverted on creation."
    let invertedCondition = invertCondition originalCondition
    conditionInverted invertedCondition @? "Expected the condition to be inverted."

threeChildConditions :: [Condition]
threeChildConditions =
    [ invertCondition $ staticJiraCondition UserHasIssueHistoryJiraCondition
    , staticJiraCondition IsWatchingIssueJiraCondition
    , staticJiraCondition HasVotedForIssueJiraCondition
    ]

invertConditionAndType :: Test
invertConditionAndType = TestCase $ do
    let invertedCondition = invertCondition $ CompositeCondition threeChildConditions AndCondition
    OrCondition @=? conditionType invertedCondition
    [False, True, True] @=? (fmap conditionInverted . subConditions $ invertedCondition)

invertConditionOrType :: Test
invertConditionOrType = TestCase $ do
    let invertedCondition = invertCondition $ CompositeCondition threeChildConditions OrCondition
    AndCondition @=? conditionType invertedCondition
    [False, True, True] @=? (fmap conditionInverted . subConditions $ invertedCondition)

invertConditionNested :: Test
invertConditionNested = TestCase $ do
    let child1 = invertCondition $ CompositeCondition threeChildConditions OrCondition
    let child2 = CompositeCondition threeChildConditions OrCondition
    let child3 = CompositeCondition threeChildConditions AndCondition
    let invertedCondition = invertCondition $ CompositeCondition [child1, child2, child3] AndCondition
    OrCondition @=? conditionType invertedCondition
    [OrCondition, AndCondition, OrCondition] @=? (fmap conditionType . subConditions $ invertedCondition)
    [[True, False, False], [False, True, True], [False, True, True]] @=? (fmap (fmap conditionInverted . subConditions) . subConditions $ invertedCondition)

-- JIRA Conditions come out correctly
jiraConditionJsonCorrect :: Test
jiraConditionJsonCorrect = TestCase $ do
    let condition = staticJiraCondition UserIsAdminJiraCondition
    let jsonValue = toJSON condition
    isObject jsonValue @? "Expect the result to be an object"
    (getString =<< get "condition" jsonValue) `isEqualTo` "user_is_admin"
    (return . not =<< getBool =<< get "invert" jsonValue) @? "Expected the condition to not be inverted"

-- Confluence Conditions come out correctly
confluenceConditionJsonCorrect :: Test
confluenceConditionJsonCorrect = TestCase $ do
    let condition = invertCondition $ staticConfluenceCondition HasAttachmentConfluenceCondition
    let jsonValue = toJSON condition
    isObject jsonValue @? "Expect the result to be an object"
    (getString =<< get "condition" jsonValue) `isEqualTo` "has_attachment"
    (getBool =<< get "invert" jsonValue) @? "Expect the condition to be inverted"

-- Remote conditions come out correctly
remoteConditionJsonCorrect :: Test
remoteConditionJsonCorrect = TestCase $ do
    let remoteUrl = "/rest/condition/is-awesome"
    let condition = invertCondition $ remoteCondition remoteUrl
    let jsonValue = toJSON condition
    isObject jsonValue @? "Expect the remote condition to come out as an object."
    (getString =<< get "condition" jsonValue) `isEqualTo` T.pack remoteUrl
    (getBool =<< get "invert" jsonValue) @? "Expect the condition to be inverted"

-- CompositeCondition's are rendered correctly
compositeAndConditionConnect :: Test
compositeAndConditionConnect = TestCase $ do
    let condition = CompositeCondition threeChildConditions OrCondition
    let jsonValue = toJSON condition
    isObject jsonValue @? "Expect the conditions in an object."
    conditions <- getArray =<< get "or" jsonValue
    sequence (fmap (getString <=< get "condition") conditions) `isEqualTo` ["user_has_issue_history","is_watching_issue","has_voted_for_issue"]

conditionParamsTest :: Test
conditionParamsTest = TestCase $ do
    let condition = staticJiraCondition UserIsAdminJiraCondition
    let conditionWithParams = condition { conditionParams = HM.fromList [("param-one", "value-one"), ("param-two", "value-two")] }
    let jv = toJSON conditionWithParams
    (getString =<< get "param-one" =<< get "params" jv) `isEqualTo` "value-one"
    (getString =<< get "param-two" =<< get "params" jv) `isEqualTo` "value-two"