{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Instana.SDK.SpanDataTest (allTests) where
import Data.Aeson ((.=))
import qualified Data.Aeson as Aeson
import Test.HUnit
import Instana.SDK.Span.SpanData (SpanData (SpanData))
import qualified Instana.SDK.Span.SpanData as SpanData
allTests :: Test
allTests =
TestList
[ TestLabel "shouldCreateEmpty" shouldCreateEmpty
, TestLabel "shouldSerializeNothingToNull" shouldSerializeNothingToNull
, TestLabel "shouldSerializeToJson" shouldSerializeToJson
, TestLabel "shouldMergeSimpleAnnotationIntoEmpty" shouldMergeSimpleAnnotationIntoEmpty
, TestLabel "shouldMergeObjectAnnotationIntoEmpty" shouldMergeObjectAnnotationIntoEmpty
, TestLabel "shouldMergeObjects" shouldMergeObjects
, TestLabel "shouldMergeNestedObjects" shouldMergeNestedObjects
, TestLabel "shouldOverwriteSingleAnnotation" shouldOverwriteSingleAnnotation
, TestLabel "shouldOverwriteWithSingleAnnotation" shouldOverwriteWithSingleAnnotation
, TestLabel "shouldMergeTwoAtDifferentPaths" shouldMergeTwoAtDifferentPaths
, TestLabel "shouldMergeListValues" shouldMergeListValues
]
shouldCreateEmpty :: Test
shouldCreateEmpty =
TestCase $
assertEqual "shouldCreateEmpty"
(SpanData []) SpanData.empty
shouldSerializeNothingToNull :: Test
shouldSerializeNothingToNull =
TestCase $
assertEqual "shouldSerializeNothingToNull"
(Aeson.object [])
(Aeson.toJSON
(SpanData [SpanData.optionalAnnotation "key" (Nothing :: Maybe String)])
)
shouldSerializeToJson :: Test
shouldSerializeToJson =
TestCase $
assertEqual "shouldSerializeToJson"
(Aeson.object
[ "sdk" .= (Aeson.object
[ "custom" .= (Aeson.object
[ "tags" .= (Aeson.object
[ "tag1" .= ("value1" :: String)
, "tag2" .= (["a", "b"] :: [String])
, "tag3" .= (16.04 :: Double)
, "nested" .= (Aeson.object
[ "nested1" .= ("value.n.1" :: String)
, "nested2" .= (2 :: Int)
, "nested3" .= (12.07 :: Double)
]
)]
)]
)]
)
, "simple" .= ("value" :: String)
, "list" .= ([1, 2, 3] :: [Int])
, "optional-exists" .= ("yes" :: String)
]
)
(Aeson.toJSON
(SpanData
[ SpanData.objectAnnotation "sdk"
[ SpanData.objectAnnotation "custom"
[ SpanData.objectAnnotation "tags"
[ SpanData.simpleAnnotation "tag1" ("value1" :: String)
, SpanData.listAnnotation "tag2" (["a", "b"] :: [String])
, SpanData.simpleAnnotation "tag3" (16.04 :: Double)
, SpanData.objectAnnotation "nested"
[ SpanData.simpleAnnotation "nested1" ("value.n.1" :: String)
, SpanData.simpleAnnotation "nested2" (2 :: Int)
, SpanData.simpleAnnotation "nested3" (12.07 :: Double)
]
]
]
]
, SpanData.simpleAnnotation "simple" ("value" :: String)
, SpanData.listAnnotation "list" ([1, 2, 3] :: [Int])
, SpanData.optionalAnnotation "optional-exists" (Just "yes" :: Maybe String)
, SpanData.optionalAnnotation "optional-does-not-exist" (Nothing :: Maybe String)
]
)
)
shouldMergeSimpleAnnotationIntoEmpty :: Test
shouldMergeSimpleAnnotationIntoEmpty =
let
spanData =
SpanData.merge
(SpanData.simpleAnnotation "path" ("value" :: String))
SpanData.empty
in
TestCase $
assertEqual "shouldMergeSimpleAnnotationIntoEmpty"
(SpanData [
SpanData.simpleAnnotation "path" ("value" :: String)
])
spanData
shouldMergeObjectAnnotationIntoEmpty :: Test
shouldMergeObjectAnnotationIntoEmpty =
let
spanData =
SpanData.merge
(SpanData.objectAnnotation "nested" [
SpanData.simpleAnnotation "path" ("value" :: String)
])
SpanData.empty
in
TestCase $
assertEqual "shouldMergeObjectAnnotationIntoEmpty"
(SpanData [
SpanData.objectAnnotation "nested" [
SpanData.simpleAnnotation "path" ("value" :: String)
]
])
spanData
shouldMergeObjects :: Test
shouldMergeObjects =
let
spanData =
SpanData.merge
( SpanData.objectAnnotation "nested"
[ SpanData.simpleAnnotation "key2" (2 :: Int) ]
) $
SpanData.merge
( SpanData.objectAnnotation "nested"
[ SpanData.simpleAnnotation "key1" (1 :: Int) ]
)
SpanData.empty
in
TestCase $
assertEqual "shouldMergeObjects"
(SpanData
[ SpanData.objectAnnotation "nested"
[ SpanData.simpleAnnotation "key1" (1 :: Int)
, SpanData.simpleAnnotation "key2" (2 :: Int)
]
]
)
spanData
shouldMergeNestedObjects :: Test
shouldMergeNestedObjects =
let
spanData =
SpanData.merge
( SpanData.objectAnnotation "nested"
[ SpanData.objectAnnotation "deeper"
[ SpanData.simpleAnnotation "key2" (2 :: Int) ]
]
) $
SpanData.merge
( SpanData.objectAnnotation "nested"
[ SpanData.objectAnnotation "deeper"
[ SpanData.simpleAnnotation "key1" (1 :: Int) ]
]
)
SpanData.empty
in
TestCase $
assertEqual "shouldMergeNestedObjects"
(SpanData
[ SpanData.objectAnnotation "nested"
[ SpanData.objectAnnotation "deeper"
[ SpanData.simpleAnnotation "key1" (1 :: Int)
, SpanData.simpleAnnotation "key2" (2 :: Int)
]
]
]
)
spanData
shouldOverwriteSingleAnnotation :: Test
shouldOverwriteSingleAnnotation =
let
spanData =
SpanData.merge
(SpanData.objectAnnotation "key"
[ SpanData.simpleAnnotation "value" (2 :: Int) ]
)
(SpanData [ SpanData.simpleAnnotation "key" (1 :: Int) ])
in
TestCase $
assertEqual "shouldOverwriteSingleAnnotation"
(SpanData
[ SpanData.objectAnnotation "key"
[ SpanData.simpleAnnotation "value" (2 :: Int) ]
]
)
spanData
shouldOverwriteWithSingleAnnotation :: Test
shouldOverwriteWithSingleAnnotation =
let
spanData =
SpanData.merge
(SpanData.simpleAnnotation "key" (2 :: Int))
(SpanData
[ SpanData.objectAnnotation "key"
[ SpanData.simpleAnnotation "value" (1 :: Int) ]
]
)
in
TestCase $
assertEqual "shouldOverwriteSingleAnnotation"
(SpanData [ SpanData.simpleAnnotation "key" (2 :: Int) ])
spanData
shouldMergeTwoAtDifferentPaths :: Test
shouldMergeTwoAtDifferentPaths =
let
spanData =
SpanData.merge
(SpanData.objectAnnotation "nested2"
[ SpanData.simpleAnnotation "key" (2 :: Int) ]) $
SpanData.merge
(SpanData.objectAnnotation "nested1"
[ SpanData.simpleAnnotation "key" (1 :: Int) ])
SpanData.empty
in
TestCase $
assertEqual "shouldMergeTwoAtDifferentPaths"
(SpanData
[ SpanData.objectAnnotation "nested1"
[ SpanData.simpleAnnotation "key" (1 :: Int) ]
, SpanData.objectAnnotation "nested2"
[ SpanData.simpleAnnotation "key" (2 :: Int) ]
]
)
spanData
shouldMergeListValues :: Test
shouldMergeListValues =
let
spanData =
SpanData.merge
(SpanData.listAnnotation "list" ([ "three", "four" ] :: [String])) $
SpanData.merge
(SpanData.listAnnotation "list" ([ "one", "two" ] :: [String]))
SpanData.empty
in
TestCase $
assertEqual "shouldMergeListValues"
(SpanData
[ SpanData.listAnnotation "list" (["one", "two", "three", "four"] :: [String]) ]
)
spanData