packages feed

hasql-queue-1.2.0.0: test/Hasql/Queue/High/AtMostOnceSpec.hs

module Hasql.Queue.High.AtMostOnceSpec where
import           Hasql.Queue.High.AtMostOnce
import qualified Hasql.Encoders as E
import qualified Hasql.Decoders as D
import           Test.Hspec                     (Spec, describe, parallel, it)
import           Test.Hspec.Expectations.Lifted
import           Test.Hspec.Core.Spec (sequential)
import           Hasql.Queue.TestUtils

spec :: Spec
spec = describe "Hasql.Queue.High.AtMostOnce" $ parallel $ do
  sequential $ aroundAll withSetup $ describe "enqueue/dequeue" $ do
    it "enqueue nothing gives nothing" $ withConnection $ \conn -> do
      enqueue conn E.int4 []
      dequeue conn D.int4 1 `shouldReturn` []

    it "enqueue 1 gives 1" $ withConnection $ \conn -> do
      enqueue conn E.int4 [1]
      dequeue conn D.int4 1 `shouldReturn` [1]

    it "dequeue give nothing after enqueueing everything" $ withConnection $ \conn -> do
      dequeue conn D.int4 1 `shouldReturn` []

    it "dequeueing is in FIFO order" $ withConnection $ \conn -> do
      enqueue conn E.int4 [1]
      enqueue conn E.int4 [2]
      dequeue conn D.int4 1 `shouldReturn` [1]
      dequeue conn D.int4 1 `shouldReturn` [2]

    it "dequeueing a batch of elements works" $ withConnection $ \conn -> do
      enqueue conn E.int4 [1, 2, 3]
      dequeue conn D.int4 2 `shouldReturn` [1, 2]

      dequeue conn D.int4 2 `shouldReturn` [3]