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
]