packages feed

hs-opentelemetry-sdk-1.0.0.0: test/OpenTelemetry/BaggageSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module OpenTelemetry.BaggageSpec where

import qualified Data.HashMap.Strict as HM
import Data.Maybe (isJust)
import qualified Data.Text as T
import OpenTelemetry.Baggage (Element (..), element, insert, mkToken, values)
import qualified OpenTelemetry.Baggage as Baggage
import OpenTelemetry.Context (empty)
import qualified OpenTelemetry.Context as Ctxt
import OpenTelemetry.Propagator (Propagator (..), emptyTextMap, inject, textMapLookup)
import OpenTelemetry.Propagator.W3CBaggage (w3cBaggagePropagator)
import Test.Hspec


spec :: Spec
spec = describe "Baggage" $ do
  -- Baggage API §Baggage Operations
  -- https://opentelemetry.io/docs/specs/otel/baggage/api/#operations
  specify "Basic support" $ do
    let Just k1 = mkToken "key1"
        Just k2 = mkToken "key2"
        b =
          insert k2 (element "two") $
            insert k1 (element "one") $
              Baggage.empty
    HM.lookup k1 (values b) `shouldBe` Just (element "one")
    HM.lookup k2 (values b) `shouldBe` Just (element "two")

  -- Baggage API §Propagating baggage (W3C Baggage header name)
  -- https://opentelemetry.io/docs/specs/otel/baggage/api/#propagating-baggage
  specify "User official header name `baggage`" $ do
    propagatorFields w3cBaggagePropagator `shouldBe` ["baggage"]
    let Just k = mkToken "userid"
        baggage = insert k (element "alice") Baggage.empty
        ctxt = Ctxt.insertBaggage baggage Ctxt.empty
    headers <- inject w3cBaggagePropagator ctxt emptyTextMap
    textMapLookup "baggage" headers `shouldSatisfy` isJust
    case textMapLookup "baggage" headers of
      Nothing -> expectationFailure "missing baggage header"
      Just v -> T.unpack v `shouldContain` "userid=alice"