packages feed

gtk-sni-tray-0.2.1.0: test/ContextMapSpec.hs

module ContextMapSpec (spec) where

import qualified Data.Map.Strict as Map
import StatusNotifier.Tray.ContextMap
import Test.Hspec

spec :: Spec
spec = describe "StatusNotifier.Tray.ContextMap" $ do
  it "reserves a new key once and blocks duplicates until ready" $ do
    let (reserved1, contexts1) = reserveContext "item-a" empty
        (reserved2, contexts2) = reserveContext "item-a" contexts1
    reserved1 `shouldSatisfy` (/= Nothing)
    reserved2 `shouldBe` Nothing
    lookupReadyContext "item-a" contexts2 `shouldBe` (Nothing :: Maybe String)

  it "exposes a value once the reservation is marked ready" $ do
    let (Just reservation, contexts1) = reserveContext "item-a" empty
        (didFinalize, contexts2) =
          setReadyContext "item-a" reservation ("ready" :: String) contexts1
    didFinalize `shouldBe` True
    lookupReadyContext "item-a" contexts2 `shouldBe` Just "ready"
    readyContexts contexts2 `shouldBe` Map.fromList [("item-a", "ready")]

  it "allows a fresh reservation after deleting a pending entry" $ do
    let (Just reservation1, contexts1) = reserveContext "item-a" empty
        contexts2 = deleteContext "item-a" contexts1
        contexts3 = cancelReservation "item-a" reservation1 contexts2
        (reservedAgain, _) = reserveContext "item-a" contexts3
    reservedAgain `shouldSatisfy` (/= Nothing)

  it "rejects a stale reservation after remove and re-add" $ do
    let (Just reservation1, contexts1) = reserveContext "item-a" empty
        contexts2 = deleteContext "item-a" contexts1
        (Just reservation2, contexts3) = reserveContext "item-a" contexts2
        (didFinalizeOld, contexts4) =
          setReadyContext "item-a" reservation1 ("stale" :: String) contexts3
        (didFinalizeNew, contexts5) =
          setReadyContext "item-a" reservation2 "fresh" contexts4
    didFinalizeOld `shouldBe` False
    didFinalizeNew `shouldBe` True
    lookupReadyContext "item-a" contexts5 `shouldBe` Just "fresh"