packages feed

instana-haskell-trace-sdk-0.8.0.0: test/integration/Instana/SDK/IntegrationTest/ExtraHttpHeaders.hs

{-# LANGUAGE OverloadedStrings #-}
module Instana.SDK.IntegrationTest.ExtraHttpHeaders
  ( shouldApplyExtraHeadersFromCommonTracerConfig
  , shouldApplyExtraHeadersFromLegacyConfig
  ) where


import           Data.Aeson                              ((.=))
import qualified Data.Aeson                              as Aeson
import           Instana.SDK.AgentStub.TraceRequest      (Span)
import qualified Instana.SDK.AgentStub.TraceRequest      as TraceRequest
import           Instana.SDK.IntegrationTest.HUnitExtra  (applyLabel)
import           Instana.SDK.IntegrationTest.HttpTracing (runHttpTest)
import           Test.HUnit


shouldApplyExtraHeadersFromCommonTracerConfig :: String -> IO Test
shouldApplyExtraHeadersFromCommonTracerConfig pid =
  applyLabel "shouldApplyExtraHeadersFromCommonTracerConfig" $
    runHttpTest
      pid
      "http/bracket/api"
      [("X-Request-Header-On-Entry", "request header on entry value")]
      entrySpanDataAsserts
      exitSpanDataAsserts


shouldApplyExtraHeadersFromLegacyConfig :: String -> IO Test
shouldApplyExtraHeadersFromLegacyConfig pid =
  applyLabel "shouldApplyExtraHeadersFromLegacyConfig" $
    runHttpTest
      pid
      "http/bracket/api"
      [("X-Request-Header-On-Entry", "request header on entry value")]
      entrySpanDataAsserts
      exitSpanDataAsserts


entrySpanDataAsserts :: Span -> [Assertion]
entrySpanDataAsserts entrySpan =
  [ assertEqual "entry data"
    ( Aeson.object
      [ "http"       .= (Aeson.object
          [ "method" .= ("GET" :: String)
          , "host"   .= ("127.0.0.1:1207" :: String)
          , "url"    .= ("/http/bracket/api" :: String)
          , "status" .= (200 :: Int)
          , "header" .= (
            [ ("X-Response-Header-On-Entry", "response header on entry value")
            , ("X-Request-Header-On-Entry", "request header on entry value")
            ] :: [(String, String)])
          ]
        )
      ]
    )
    (TraceRequest.spanData entrySpan)
  ]


exitSpanDataAsserts :: Span -> [Assertion]
exitSpanDataAsserts exitSpan =
  [ assertEqual "exit data"
    ( Aeson.object
      [ "http" .= (Aeson.object
          [ "method" .= ("GET" :: String)
          , "url"    .= ("http://127.0.0.1:1208/echo" :: String)
          , "status" .= (200 :: Int)
          , "params" .= ("some=query&parameters=2&pass=<redacted>" :: String)
          , "header" .= (
            [ ("X-Request-Header-On-Exit", "request header on exit value")
            , ("X-Response-Header-On-Exit", "response header on exit value")
            ] :: [(String, String)])
          ]
        )
      ]
    )
    (TraceRequest.spanData exitSpan)
  ]