packages feed

google-cloud-common-1.1.0.0: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson (decode)
import qualified Data.ByteString.Lazy.Char8 as BSL
import Data.Maybe (isJust)
import Google.Cloud.Common.Core
import Test.Hspec

main :: IO ()
main = hspec spec

spec :: Spec
spec = do
  describe "Google.Cloud.Common.Core" $ do
    context "RequestMethod Show/Eq" $ do
      it "shows constructors as HTTP verbs" $ do
        show GET `shouldBe` "GET"
        show POST `shouldBe` "POST"
        show PATCH `shouldBe` "PATCH"
        show DELETE `shouldBe` "DELETE"
        show PUT `shouldBe` "PUT"
      it "equality works for same constructor" $ do
        (GET == GET) `shouldBe` True
        (POST == GET) `shouldBe` False
    context "AccessTokenResp JSON parsing" $ do
      it "successfully parses valid JSON" $ do
        let json = "{\"access_token\":\"ya29.a0AfH6SM...\",\"expires_in\":3599,\"token_type\":\"Bearer\"}"
        let parsed = decode (BSL.pack json) :: Maybe AccessTokenResp
        parsed `shouldSatisfy` isJust

      it "fails to parse invalid JSON" $ do
        let json = "{\"invalid_json\":\"...\"}"
        let parsed = decode (BSL.pack json) :: Maybe AccessTokenResp
        parsed `shouldBe` Nothing

    context "GoogleApplicationCred JSON parsing" $ do
      it "successfully parses valid JSON" $ do
        let json =
              "{\"type\":\"service_account\",\"project_id\":\"my-project\",\"private_key_id\":\"1234\",\"private_key\":\"-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n\",\"client_email\":\"my-email@my-project.iam.gserviceaccount.com\",\"client_id\":\"123456789\",\"auth_uri\":\"https://accounts.google.com/o/oauth2/auth\",\"token_uri\":\"https://oauth2.googleapis.com/token\",\"auth_provider_x509_cert_url\":\"https://www.googleapis.com/oauth2/v1/certs\",\"client_x509_cert_url\":\"https://www.googleapis.com/robot/v1/metadata/x509/my-email%40my-project.iam.gserviceaccount.com\",\"universe_domain\":\"googleapis.com\"}"
        let parsed = decode (BSL.pack json) :: Maybe GoogleApplicationCred
        parsed `shouldSatisfy` isJust

      it "fails to parse invalid JSON" $ do
        let json = "{\"invalid_json\":\"...\"}"
        let parsed = decode (BSL.pack json) :: Maybe GoogleApplicationCred
        parsed `shouldBe` Nothing

    context "toPath" $ do
      it "concatenates parts with slashes" $ do
        toPath ["part1", "part2", "part3"] `shouldBe` "/part1/part2/part3"

      it "returns empty string for empty list" $ do
        toPath [] `shouldBe` ""