packages feed

faktory-1.0.3.0: tests/Faktory/Ent/TrackingSpec.hs

{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}

module Faktory.Ent.TrackingSpec
  ( spec
  ) where

import Faktory.Test

import Control.Concurrent.MVar
import Faktory.Ent.Tracking

spec :: Spec
spec = do
  describe "trackPerform" $ do
    it "enqueues with TRACK so we can get details" $ do
      var <- newMVar []
      void $ workerTestCase $ \producer -> do
        a <- trackPerform @Text mempty producer "a"
        modifyMVar_ var $ pure . (<> [a])
        b <- trackPerform @Text mempty producer "BOOM"
        modifyMVar_ var $ pure . (<> [b])

      enqueuedJobIds <- readMVar var
      enqueuedJobIds `shouldSatisfy` (== 2) . length

      let [aJid, bJid] = enqueuedJobIds

      (aDetails, bDetails, cDetails) <-
        bracket newProducerEnv closeProducer $ \producer ->
          (,,)
            <$> trackGetHush producer aJid
            <*> trackGetHush producer bJid
            <*> trackGetHush producer "madeUp"

      jdState aDetails `shouldBe` JobStateSuccess
      jdState bDetails `shouldBe` JobStateFailed
      jdState cDetails `shouldBe` JobStateUnknown

  describe "trackSet" $ do
    it "updates Job Details" $ do
      var <- newMVar []
      void $ workerTestCase $ \producer -> do
        a <- trackPerform @Text mempty producer "a"
        modifyMVar_ var $ pure . (<> [a])

      enqueuedJobIds <- readMVar var
      enqueuedJobIds `shouldSatisfy` (== 1) . length

      let [aJid] = enqueuedJobIds

      aDetails <- bracket newProducerEnv closeProducer $ \producer -> do
        trackSet producer $ SetJobDetails
          { sjdJid = aJid
          , sjdPercent = Just 100
          , sjdDesc = Just "Updated"
          , sjdReserveUntil = Nothing
          }

        trackGetHush producer aJid

      jdPercent aDetails `shouldBe` Just 100
      jdDesc aDetails `shouldBe` Just "Updated"