packages feed

freckle-app-1.6.0.0: tests/Freckle/App/Bugsnag/MetaDataSpec.hs

module Freckle.App.Bugsnag.MetaDataSpec
  ( spec
  ) where

import Freckle.App.Test

import Blammo.Logging
import Data.Aeson
import Data.Bugsnag
import Freckle.App.Bugsnag
import Freckle.App.Bugsnag.MetaData
import Freckle.App.Stats
import qualified Freckle.App.Stats as Stats
import UnliftIO.Exception (SomeException)

spec :: Spec
spec = do
  describe "collectMetaData" $ do
    it "collects from StatsClient and myThreadContext" $ example $ do
      let settings = setStatsSettingsTags [("foo", "bar")] defaultStatsSettings

      withStatsClient settings $ \client -> flip runReaderT client $ do
        Stats.tagged [("baz", "bat")] $ do
          withThreadContext ["quix" .= ("quip" :: Text)] $ do
            collected <- collectMetaData

            let
              expected = mconcat
                [ metaData
                  "tags"
                  ["foo" .= ("bar" :: Text), "baz" .= ("bat" :: Text)]
                , metaData "context" ["quix" .= ("quip" :: Text)]
                ]

            runMergeMetaData Nothing collected `shouldBe` Just expected

  describe "mergeMetaData" $ do
    it "adds metadata to an empty Event" $ example $ do
      let incoming = metaData "test" ["foo" .= ("bar" :: Text)]

      runMergeMetaData Nothing incoming `shouldBe` Just incoming

    it "preserves new metadata on collisions" $ example $ do
      let
        existing = metaData
          "test"
          [ "foo" .= ("bar1" :: Text)
          , "baz" .= object ["bat" .= ("quix1" :: Text)]
          , "keep" .= ("me" :: Text)
          ]
        incoming = metaData
          "test"
          [ "foo" .= ("bar2" :: Text)
          , "baz" .= object ["bat" .= ("quix2" :: Text)]
          , "add" .= ("me" :: Text)
          ]
        expected = metaData
          "test"
          [ "foo" .= ("bar2" :: Text)
          , "baz" .= object ["bat" .= ("quix2" :: Text)]
          , "keep" .= ("me" :: Text)
          , "add" .= ("me" :: Text)
          ]


      runMergeMetaData (Just existing) incoming `shouldBe` Just expected

runMergeMetaData :: Maybe MetaData -> MetaData -> Maybe MetaData
runMergeMetaData mExisting incoming = MetaData <$> event_metaData event
 where
  event = runBeforeNotify (mergeMetaData incoming) someException
    $ defaultEvent { event_metaData = unMetaData <$> mExisting }

someException :: SomeException
someException = undefined