packages feed

launchdarkly-server-sdk-1.0.0: test/Spec/Operators.hs

module Spec.Operators (allTests) where

import Test.HUnit
import Data.Aeson.Types              (Value(..))

import LaunchDarkly.Server.Operators

dateStr1 :: Value
dateStr1 = String "2017-12-06T00:00:00.000-07:00"

dateStr2 :: Value
dateStr2 = String "2017-12-06T00:01:01.000-07:00"

invalidDate :: Value
invalidDate = String "hey what's this?"

dateMs1 :: Value
dateMs1 = Number $ fromInteger 10000000

dateMs2 :: Value
dateMs2 = Number $ fromInteger 10000001

makeTest :: (Op, Value, Value, Bool) -> Test
makeTest f@(o, x, y, e) = TestCase $ assertEqual (show f) e $ (getOperation o) x y

allTests :: Test
allTests = TestList $ map makeTest
    -- numeric operators
    [ (OpIn, Number $ fromInteger 50, Number $ fromInteger 50, True)
    , (OpIn, Number $ fromRational 99.0001, Number $ fromRational 99.0001, True)
    , (OpLessThan, Number $ fromInteger 1, Number $ fromRational 1.99999, True)
    , (OpLessThan, Number $ fromRational 1.99999, Number $ fromInteger 1, False)
    , (OpLessThan, Number $ fromInteger 1, Number $ fromInteger 2, True)
    , (OpLessThanOrEqual, Number $ fromInteger 1, Number $ fromInteger 1, True)
    , (OpGreaterThan, Number $ fromInteger 2, Number $ fromRational 1.99999, True)
    , (OpGreaterThan, Number $ fromRational 1.99999, Number $ fromInteger 2, False)
    , (OpGreaterThan, Number $ fromInteger 2, Number $ fromInteger 1, True)
    , (OpGreaterThanOrEqual, Number $ fromInteger 1, Number $ fromInteger 1, True)
    -- string operators
    , (OpIn, String "x", String "x", True)
    , (OpIn, String "x", String "xyz", False)
    , (OpStartsWith, String "xyz", String "x", True)
    , (OpStartsWith, String "x", String "xyz", False)
    , (OpEndsWith, String "xyz", String "z", True)
    , (OpEndsWith, String "z", String "xyz", False)
    , (OpContains, String "xyz", String "y", True)
    , (OpContains, String "y", String "yz", False)
    -- mixed strings and numbers
    , (OpIn, String "99", Number $ fromInteger 99, False)
    , (OpIn, Number $ fromInteger 99, String "99", False)
    , (OpContains, String "99", Number $ fromInteger 99, False)
    , (OpStartsWith, String "99", Number $ fromInteger 99, False)
    , (OpEndsWith, String "99", Number $ fromInteger 99, False)
    , (OpLessThanOrEqual, String "99", Number $ fromInteger 99, False)
    , (OpLessThanOrEqual, Number $ fromInteger 99, String "99", False)
    , (OpGreaterThanOrEqual, String "99", Number $ fromInteger 99, False)
    , (OpGreaterThanOrEqual, Number $ fromInteger 99, String "99", False)
    -- date operators
    , (OpBefore, dateStr1, dateStr2, True)
    , (OpBefore, dateMs1, dateMs2, True)
    , (OpBefore, dateStr2, dateStr1, False)
    , (OpBefore, dateMs2, dateMs1, False)
    , (OpBefore, dateStr1, dateStr1, False)
    , (OpBefore, dateMs1, dateMs1, False)
    , (OpBefore, String "", dateStr1, False)
    , (OpBefore, dateStr1, invalidDate, False)
    , (OpAfter, dateStr2, dateStr1, True)
    , (OpAfter, dateMs2, dateMs1, True)
    , (OpAfter, dateStr1, dateStr2, False)
    , (OpAfter, dateMs1, dateMs2, False)
    , (OpAfter, dateStr1, dateStr1, False)
    , (OpAfter, dateMs1, dateMs1, False)
    , (OpAfter, String "", dateStr1, False)
    , (OpAfter, dateStr1, invalidDate, False)
    -- regex
    , (OpMatches, String "hello world", String "hello.*rld", True)
    , (OpMatches, String "hello world", String "hello.*orl", True)
    , (OpMatches, String "hello world", String "l+", True)
    , (OpMatches, String "hello world", String "(world|planet)", True)
    , (OpMatches, String "hello world", String "aloha", False)
    , (OpMatches, String "hello world", String "***bad rg", False)
    -- semver operators
    , (OpSemVerEqual, String "2.0.0", String "2.0.0", True)
    , (OpSemVerEqual, String "2.0", String "2.0.0", True)
    , (OpSemVerEqual, String "2.0-rc1", String "2.0.0-rc1", True)
    , (OpSemVerEqual, String "2+build2", String "2.0.0+build2", True)
    , (OpSemVerEqual, String "2.0.0", String "2.0.1", False)
    , (OpSemVerEqual, String "02.0.0", String "2.0.0", False)
    , (OpSemVerLessThan, String "2.0.0", String "2.0.1", True)
    , (OpSemVerLessThan, String "2.0", String "2.0.1", True)
    , (OpSemVerLessThan, String "2.0.1", String "2.0.0", False)
    , (OpSemVerLessThan, String "2.0.1", String "2.0", False)
    , (OpSemVerLessThan, String "2.0.1", String "xbad%ver", False)
    , (OpSemVerLessThan, String "2.0.0-rc", String "2.0.0-rc.beta", True)
    , (OpSemVerGreaterThan, String "2.0.1", String "2.0", True)
    , (OpSemVerGreaterThan, String "2.0.0", String "2.0.1", False)
    , (OpSemVerGreaterThan, String "2.0", String "2.0.1", False)
    , (OpSemVerGreaterThan, String "2.0.1", String "xbad%ver", False)
    , (OpSemVerGreaterThan, String "2.0.0-rc.1", String "2.0.0-rc.0", True)
    ]