packages feed

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

module Spec.Redis (allTests) where

import           Test.HUnit
import           Data.Text                                (Text)
import qualified Database.Redis as                        R
import           Data.HashMap.Strict                      (HashMap)
import qualified Data.HashMap.Strict as                   HM
import           Control.Monad                            (void)
import           GHC.Natural                              (Natural)
import           GHC.Int                                  (Int64)
import           System.Clock                             (TimeSpec(..))

import           Util.Features                            (makeTestFlag)

import           Spec.Store                               (testWithStore)

import           LaunchDarkly.Server.Features             (Flag(..), VariationOrRollout(..))
import           LaunchDarkly.Server.Store.Internal
import           LaunchDarkly.Server.Store.Redis.Internal

freshConnection :: IO R.Connection
freshConnection = do
    con <- R.checkedConnect R.defaultConnectInfo
    void $ R.runRedis con $ R.flushall
    pure con

testUpsertRace :: Test
testUpsertRace = TestCase $ do
    con <- freshConnection
    let config = makeRedisStoreConfig con
    backend <- makeRedisStore config
    store <- makeStoreIO (pure backend) $ TimeSpec 0 0
    let hook = (insertFlag store $ makeTestFlag "a" 2) >>= (Right () @=?)
    redisUpsertInternal hook config "flags" "a" (versionedToRaw $ Versioned (pure $ makeTestFlag "a" 1) 1)
        >>= (Right False @=?)
    getFlagC store "a" >>= (Right (pure $ makeTestFlag "a" 2) @=?)

prepareRedisStore :: Int64 -> IO (StoreHandle IO)
prepareRedisStore ttl = do
    con <- freshConnection
    backend <- makeRedisStore $ makeRedisStoreConfig con
    makeStoreIO (pure backend) $ TimeSpec ttl 0

allTests :: Test
allTests = TestList
    [ testWithStore $ prepareRedisStore 10
    , testWithStore $ prepareRedisStore 0
    , testUpsertRace
    ]