packages feed

hs-opentelemetry-awsxray-0.1.0.0: tests/OpenTelemetry/AWSXRay/TraceInfoSpec.hs

module OpenTelemetry.AWSXRay.TraceInfoSpec
  ( spec
  ) where

import Prelude

import Data.Either (isLeft)
import qualified Data.HashMap.Strict as HashMap
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import OpenTelemetry.AWSXRay.TraceInfo
import OpenTelemetry.Baggage (Token)
import qualified OpenTelemetry.Baggage as Baggage
import OpenTelemetry.Trace.Core (isSampled, traceFlags)
import Test.Hspec

spec :: Spec
spec = do
  it "round trips an example" $ do
    let
      h =
        "Root=1-5759e988-bd862e3fe1be46a994272793"
          <> ";Parent=53995c3f42cd8ad8"
          <> ";Sampled=1"

    fmap toXRayHeader (fromXRayHeader h) `shouldBe` Right h

  it "round trips an example with baggage" $ do
    let
      h =
        "Root=1-5759e988-bd862e3fe1be46a994272793"
          <> ";Parent=53995c3f42cd8ad8"
          <> ";Sampled=1"
          <> ";baz=bat" -- order matters due to HashMap
          <> ";foo=bar"

    fmap toXRayHeader (fromXRayHeader h) `shouldBe` Right h

  describe "fromXRayHeader" $ do
    it "requires Parent" $ do
      fromXRayHeader "Root=1-5759e988-bd862e3fe1be46a994272793"
        `shouldSatisfy` isLeft

    context "Sampled" $ do
      it "defaults False" $ do
        let
          eInfo =
            fromXRayHeader
              $ "Root=1-5759e988-bd862e3fe1be46a994272793"
              <> ";Parent=53995c3f42cd8ad8"

        fmap (isSampled . traceFlags . spanContext) eInfo `shouldBe` Right False

      it "interprets =1 as True" $ do
        let
          eInfo =
            fromXRayHeader
              $ "Root=1-5759e988-bd862e3fe1be46a994272793"
              <> ";Parent=53995c3f42cd8ad8"
              <> ";Sampled=1"

        fmap (isSampled . traceFlags . spanContext) eInfo `shouldBe` Right True

      it "interprets other values as as False" $ do
        let
          eInfo =
            fromXRayHeader
              $ "Root=1-5759e988-bd862e3fe1be46a994272793"
              <> ";Parent=53995c3f42cd8ad8"
              <> ";Sampled=flipFlop"

        fmap (isSampled . traceFlags . spanContext) eInfo `shouldBe` Right False

    it "grabs all other values as Baggage" $ do
      let
        eInfo =
          fromXRayHeader
            $ "Root=1-5759e988-bd862e3fe1be46a994272793"
            <> ";Parent=53995c3f42cd8ad8"
            <> ";foo=bar;baz=bat"

      fmap baggage eInfo `shouldBe` Right
        (Just $ Baggage.fromHashMap $ HashMap.fromList
          [ (mkTokenUnsafe "foo", Baggage.element "bar")
          , (mkTokenUnsafe "baz", Baggage.element "bat")
          ]
        )

mkTokenUnsafe :: Text -> Token
mkTokenUnsafe = fromMaybe (error "not a valid Token") . Baggage.mkToken