packages feed

freckle-app-1.0.2.7: tests/Freckle/App/HttpSpec.hs

module Freckle.App.HttpSpec
  ( spec
  ) where

import Prelude

import Control.Lens (_Left, _Right, to, (^?))
import Data.Aeson
import Data.Aeson.Lens
import qualified Data.List.NonEmpty as NE
import Freckle.App.Http
import Network.HTTP.Types.Status (status200)
import Test.Hspec

spec :: Spec
spec = do
  describe "httpJson" $ do
    it "fetches JSON via HTTP" $ do
      resp <- httpJson @_ @Value
        $ parseRequest_ "https://www.stackage.org/lts-17.10"

      getResponseStatus resp `shouldBe` status200
      getResponseBody resp
        ^? _Right
        . key "snapshot"
        . key "ghc"
        . _String
        `shouldBe` Just "8.10.4"

    it "places JSON parse errors in a Left body" $ do
      resp <- httpJson @_ @[()]
        $ parseRequest_ "https://www.stackage.org/lts-17.10"

      let
        expectedErrorMessages =
          [ "Error in $: expected [a], encountered Object"
          , "Error in $: parsing [] failed, expected Array, but encountered Object"
          ]

      getResponseStatus resp `shouldBe` status200
      getResponseBody resp
        ^? _Left
        . to hdeErrors
        . to NE.head
        `shouldSatisfy` maybe False (`elem` expectedErrorMessages)