module Spec.Segment (allTests) where
import Test.HUnit
import Data.Aeson.Types (Value(..))
import Data.Function ((&))
import qualified Data.HashSet as HS
import LaunchDarkly.Server.Client
import LaunchDarkly.Server.Features
import LaunchDarkly.Server.User
import LaunchDarkly.Server.User.Internal
import LaunchDarkly.Server.Operators
import LaunchDarkly.Server.Evaluate
testExplicitIncludeUser :: Test
testExplicitIncludeUser = True ~=? (segmentContainsUser segment user) where
segment = Segment
{ key = "test"
, included = HS.fromList ["foo"]
, excluded = HS.empty
, salt = "abcdef"
, rules = []
, version = 1
, deleted = False
}
user = unwrapUser $ makeUser "foo"
testExplicitExcludeUser :: Test
testExplicitExcludeUser = False ~=? (segmentContainsUser segment user) where
segment = Segment
{ key = "test"
, included = HS.empty
, excluded = HS.fromList ["foo"]
, salt = "abcdef"
, rules = []
, version = 1
, deleted = False
}
user = unwrapUser $ makeUser "foo"
testExplicitIncludeHasPrecedence :: Test
testExplicitIncludeHasPrecedence = True ~=? (segmentContainsUser segment user) where
segment = Segment
{ key = "test"
, included = HS.fromList ["foo"]
, excluded = HS.fromList ["foo"]
, salt = "abcdef"
, rules = []
, version = 1
, deleted = False
}
user = unwrapUser $ makeUser "foo"
testNeitherIncludedNorExcluded :: Test
testNeitherIncludedNorExcluded = False ~=? (segmentContainsUser segment user) where
segment = Segment
{ key = "test"
, included = HS.fromList [""]
, excluded = HS.fromList [""]
, salt = "abcdef"
, rules = []
, version = 1
, deleted = False
}
user = unwrapUser $ makeUser "foo"
testMatchingRuleWithFullRollout :: Test
testMatchingRuleWithFullRollout = True ~=? (segmentContainsUser segment user) where
segment = Segment
{ key = "test"
, included = HS.empty
, excluded = HS.empty
, salt = "abcdef"
, rules =
[ SegmentRule
{ id = "rule"
, clauses =
[ Clause
{ attribute = "email"
, negate = False
, op = OpIn
, values = [String "test@example.com"]
}
]
, weight = Just 100000
, bucketBy = Nothing
}
]
, version = 1
, deleted = False
}
user = unwrapUser $ (makeUser "foo") & userSetEmail (pure "test@example.com")
testMatchingRuleWithZeroRollout :: Test
testMatchingRuleWithZeroRollout = False ~=? (segmentContainsUser segment user) where
segment = Segment
{ key = "test"
, included = HS.empty
, excluded = HS.empty
, salt = "abcdef"
, rules =
[ SegmentRule
{ id = "rule"
, clauses =
[ Clause
{ attribute = "email"
, negate = False
, op = OpIn
, values = [String "test@example.com"]
}
]
, weight = Just 0
, bucketBy = Nothing
}
]
, version = 1
, deleted = False
}
user = unwrapUser $ (makeUser "foo") & userSetEmail (pure "test@example.com")
testMatchingRuleWithMultipleClauses :: Test
testMatchingRuleWithMultipleClauses = True ~=? (segmentContainsUser segment user) where
segment = Segment
{ key = "test"
, included = HS.empty
, excluded = HS.empty
, salt = "abcdef"
, rules =
[ SegmentRule
{ id = "rule"
, clauses =
[ Clause
{ attribute = "email"
, negate = False
, op = OpIn
, values = [String "test@example.com"]
}
, Clause
{ attribute = "name"
, negate = False
, op = OpIn
, values = ["bob"]
}
]
, weight = Nothing
, bucketBy = Nothing
}
]
, version = 1
, deleted = False
}
user = unwrapUser $ (makeUser "foo")
& userSetEmail (pure "test@example.com")
& userSetName (pure "bob")
testNonMatchingRuleWithMultipleClauses :: Test
testNonMatchingRuleWithMultipleClauses = False ~=? (segmentContainsUser segment user) where
segment = Segment
{ key = "test"
, included = HS.empty
, excluded = HS.empty
, salt = "abcdef"
, rules =
[ SegmentRule
{ id = "rule"
, clauses =
[ Clause
{ attribute = "email"
, negate = False
, op = OpIn
, values = [String "test@example.com"]
}
, Clause
{ attribute = "name"
, negate = False
, op = OpIn
, values = ["bill"]
}
]
, weight = Nothing
, bucketBy = Nothing
}
]
, version = 1
, deleted = False
}
user = unwrapUser $ (makeUser "foo")
& userSetEmail (pure "test@example.com")
& userSetName (pure "bob")
allTests :: Test
allTests = TestList
[ testExplicitIncludeUser
, testExplicitExcludeUser
, testExplicitIncludeHasPrecedence
, testNeitherIncludedNorExcluded
, testMatchingRuleWithFullRollout
, testMatchingRuleWithZeroRollout
, testMatchingRuleWithMultipleClauses
, testNonMatchingRuleWithMultipleClauses
]