packages feed

patrol-1.0.1.0: source/test-suite/Patrol/Type/ItemSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Patrol.Type.ItemSpec where

import qualified Data.Aeson as Aeson
import qualified Data.Aeson.KeyMap as KeyMap
import qualified Data.ByteString as ByteString
import qualified Data.ByteString.Builder as Builder
import qualified Patrol.Type.Event as Event
import qualified Patrol.Type.Headers as Headers
import qualified Patrol.Type.Item as Item
import qualified Test.Hspec as Hspec

spec :: Hspec.Spec
spec = Hspec.describe "Patrol.Type.Item" $ do
  Hspec.describe "serialize" $ do
    Hspec.it "works with an empty payload" $ do
      let actual =
            Builder.toLazyByteString $
              Item.serialize
                Item.Item
                  { Item.headers = Headers.empty,
                    Item.payload = ""
                  }
      actual `Hspec.shouldBe` "{}\n"

    Hspec.it "works with a non-empty payload" $ do
      let actual =
            Builder.toLazyByteString $
              Item.serialize
                Item.Item
                  { Item.headers = Headers.empty,
                    Item.payload = "x"
                  }
      actual `Hspec.shouldBe` "{}\nx"

    Hspec.it "allows newlines in the payload" $ do
      -- <https://develop.sentry.dev/sdk/data-model/envelopes/#items>
      -- If no `length` is specified, the payload implicitly goes to the next
      -- newline. For payloads containing newline characters, the `length` must
      -- be specified.
      let actual =
            Builder.toLazyByteString $
              Item.serialize
                Item.Item
                  { Item.headers =
                      Headers.fromObject
                        . KeyMap.singleton "length"
                        $ Aeson.toJSON (3 :: Int),
                    Item.payload = "a\nb"
                  }
      actual `Hspec.shouldBe` "{\"length\":3}\na\nb"

  Hspec.describe "fromEvent" $ do
    Hspec.it "sets the headers" $ do
      let event = Event.empty
      let actual = Item.fromEvent event
      let expected =
            Headers.fromObject $
              KeyMap.fromList
                [ ("type", "event"),
                  ("length", Aeson.toJSON (47 :: Int)),
                  ("event_id", Aeson.toJSON $ Event.eventId event)
                ]
      Item.headers actual `Hspec.shouldBe` expected

    Hspec.it "sets the payload" $ do
      let event = Event.empty
      let actual = Item.fromEvent event
      let expected = "{\"event_id\":\"00000000000000000000000000000000\"}" :: ByteString.ByteString
      Item.payload actual `Hspec.shouldBe` expected