kiroku-store-0.11.0.0: test/Test/BrowseReadsMock.hs
module Test.BrowseReadsMock (spec) where
import Control.Monad.IO.Class (liftIO)
import Data.IORef (modifyIORef', newIORef, readIORef)
import Data.UUID qualified as UUID
import Data.Vector qualified as V
import Effectful (runEff)
import Effectful.Dispatch.Dynamic (interpret_)
import Kiroku.Store.Effect (Store (..))
import Kiroku.Store.Read
import Kiroku.Store.Types
import Test.Hspec
spec :: Spec
spec = describe "browse reads mock" $ it "dispatches each public wrapper exactly once with its parameters" $ do
calls <- newIORef ([] :: [String])
let page = either (error . show) (\size -> size) (mkBrowsePageSize 7)
runner = interpret_ $ \case
ListStreams category prefix cursor size -> do
liftIO $ (category, prefix, cursor, size) `shouldBe` (Just (CategoryName "orders"), Just "orders-", Just (StreamName "orders-1"), page)
liftIO $ modifyIORef' calls (<> ["streams"])
pure V.empty
ListCategories cursor size -> do
liftIO $ (cursor, size) `shouldBe` (Just (CategoryName "orders"), page)
liftIO $ modifyIORef' calls (<> ["categories"])
pure V.empty
GetEvent eid -> do
liftIO $ eid `shouldBe` EventId UUID.nil
liftIO $ modifyIORef' calls (<> ["event"])
pure Nothing
_ -> error "unexpected browse mock operation"
_ <- runEff $ runner $ do
_ <- listStreams (Just (CategoryName "orders")) (Just "orders-") (Just (StreamName "orders-1")) page
_ <- listCategories (Just (CategoryName "orders")) page
getEvent (EventId UUID.nil)
readIORef calls `shouldReturn` ["streams", "categories", "event"]