content: module OpenTelemetry.SemanticsConfigSpec where
  
  import OpenTelemetry.SemanticsConfig
  import System.Environment
  import Test.Hspec
  
  
  envVarName :: String
  envVarName = "OTEL_SEMCONV_STABILITY_OPT_IN"
  
  
  spec :: Spec
  spec = do
    describe "SemanticsConfig" $ do
      describe "HttpOption" $ do
        it "defaults to 'Old' when env var has no value" $ do
          unsetEnv envVarName
          semanticsOptions <- getSemanticsOptions'
          httpOption semanticsOptions `shouldBe` Old
        mapM_
          ( \(envVarVal, expectedVal) ->
              it ("returns " ++ show expectedVal ++ " when env var is " ++ show envVarVal) $ do
                setEnv envVarName envVarVal
                semanticsOptions <- getSemanticsOptions'
                httpOption semanticsOptions `shouldBe` expectedVal
          )
          [ ("http", Stable)
          , ("http/du", Old) -- intentionally similar to both "http/dup" and "http"
          , ("http/dup", StableAndOld)
          , ("http/dup,http", StableAndOld)
          , ("http,http/dup", StableAndOld)
          , ("http,something-random,http/dup", StableAndOld)
          ]
      context "memoization" $ do
        it "works" $ do
          setEnv envVarName "http"
          semanticsOptions <- getSemanticsOptions
          httpOption semanticsOptions `shouldBe` Stable
        it ("does not change when " ++ envVarName ++ " changes") $ do
          setEnv envVarName "http"
          semanticsOptions <- getSemanticsOptions
          setEnv envVarName "http/dup"
          semanticsOptions <- getSemanticsOptions
          httpOption semanticsOptions `shouldBe` Stable -- and not StableAndOld because of memoization
  