module Spec.Store (allTests, testWithStore) where
import Test.HUnit
import Util.Features (makeTestFlag, makeTestSegment)
import LaunchDarkly.AesonCompat (emptyObject, singleton)
import LaunchDarkly.Server.Store.Internal
testInitializationEmpty :: IO (StoreHandle IO) -> Test
testInitializationEmpty makeStore = TestCase $ do
store <- makeStore
getInitializedC store >>= (pure False @=?)
storeHandleInitialize store emptyObject emptyObject >>= (pure () @=?)
getInitializedC store >>= (pure True @=?)
testInitializationWithFeatures :: IO (StoreHandle IO) -> Test
testInitializationWithFeatures makeStore = TestCase $ do
store <- makeStore
getInitializedC store >>= (pure False @=?)
storeHandleInitialize store flagsV segmentsV >>= (pure () @=?)
getInitializedC store >>= (pure True @=?)
storeHandleGetFlag store "a" >>= (pure (pure flagA) @=?)
storeHandleAllFlags store >>= (pure flagsR @=?)
storeHandleGetSegment store "a" >>= (pure (pure segmentA) @=?)
where
segmentA = makeTestSegment "a" 50
flagA = makeTestFlag "a" 52
flagsR = singleton "a" flagA
flagsV = singleton "a" (ItemDescriptor flagA 52)
segmentsV = singleton "a" (ItemDescriptor segmentA 50)
testGetAndUpsertAndGetAndGetAllFlags :: IO (StoreHandle IO) -> Test
testGetAndUpsertAndGetAndGetAllFlags makeStore = TestCase $ do
store <- makeStore
getFlagC store "a" >>= (pure Nothing @=?)
upsertFlagC store "a" (ItemDescriptor (pure flag) 52) >>= (pure () @=?)
getFlagC store "a" >>= (pure (pure flag) @=?)
getAllFlagsC store >>= (pure (singleton "a" flag) @=?)
where
flag = makeTestFlag "a" 52
testGetAndUpsertAndGetSegment :: IO (StoreHandle IO) -> Test
testGetAndUpsertAndGetSegment makeStore = TestCase $ do
store <- makeStore
getSegmentC store "a" >>= (pure Nothing @=?)
upsertSegmentC store "a" (ItemDescriptor (pure segment) 52) >>= (pure () @=?)
getSegmentC store "a" >>= (pure (pure segment) @=?)
where
segment = makeTestSegment "a" 52
testUpsertRespectsVersion :: IO (StoreHandle IO) -> Test
testUpsertRespectsVersion makeStore = TestCase $ do
store <- makeStore
upsertFlagC store "a" (ItemDescriptor (pure $ makeTestFlag "a" 1) 1) >>= (pure () @=?)
upsertFlagC store "a" (ItemDescriptor (pure $ makeTestFlag "a" 2) 2) >>= (pure () @=?)
getFlagC store "a" >>= (pure (pure $ makeTestFlag "a" 2) @=?)
getAllFlagsC store >>= (pure (singleton "a" $ makeTestFlag "a" 2) @=?)
upsertFlagC store "a" (ItemDescriptor (pure $ makeTestFlag "a" 1) 1) >>= (pure () @=?)
getFlagC store "a" >>= (pure (pure $ makeTestFlag "a" 2) @=?)
getAllFlagsC store >>= (pure (singleton "a" $ makeTestFlag "a" 2) @=?)
upsertFlagC store "a" (ItemDescriptor Nothing 3) >>= (pure () @=?)
getFlagC store "a" >>= (pure Nothing @=?)
getAllFlagsC store >>= (pure mempty @=?)
testWithStore :: IO (StoreHandle IO) -> Test
testWithStore makeStore =
TestList $
map
(\f -> f makeStore)
[ testInitializationEmpty
, testInitializationWithFeatures
, testGetAndUpsertAndGetAndGetAllFlags
, testUpsertRespectsVersion
, testGetAndUpsertAndGetSegment
]
allTests :: Test
allTests =
TestList
[ testWithStore $ makeStoreIO Nothing 0
]