packages feed

amazonka-core-1.4.0: test/Test/AWS/Util.hs

{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module      : Test.AWS.Util
-- Copyright   : (c) 2013-2016 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--
module Test.AWS.Util where

import           Data.Aeson
import qualified Data.ByteString.Lazy      as LBS
import           Language.Haskell.TH
import           Language.Haskell.TH.Quote
import           Network.AWS.Prelude
import           Test.Tasty
import           Test.Tasty.HUnit

doc :: QuasiQuoter
doc = QuasiQuoter
    { quoteExp  = stringE
    , quotePat  = const $ error "No quotePat  defined."
    , quoteType = const $ error "No quoteType defined."
    , quoteDec  = const $ error "No quoteDec  defined."
    }

-- | Dummy root element for testing nested structures.
newtype X a = X a
    deriving (Eq, Show)

instance ToQuery a => ToQuery (X a) where
    toQuery (X x) = "x" =: x

instance FromXML a => FromXML (X a) where
    parseXML = fmap X . parseXML

instance ToXML a => ToElement (X a) where
    toElement (X x) = mkElement "x" x

instance FromJSON a => FromJSON (X a) where
    parseJSON = withObject "X" (fmap X . (.: "x"))

instance ToJSON a => ToJSON (X a) where
    toJSON (X x) = object ["x" .= x]

testFromText :: (FromText a, Show a, Eq a)
             => TestName
             -> Text
             -> a
             -> TestTree
testFromText n t x = testCase n (Right x @?= fromText t)

testToText :: (ToText a, Show a, Eq a)
           => TestName
           -> Text
           -> a
           -> TestTree
testToText n t x = testCase n (t @?= toText x)

testToQuery :: (ToQuery a, Show a, Eq a)
            => TestName
            -> ByteString
            -> a
            -> TestTree
testToQuery n bs x = testCase n (bs @=? toBS (toQuery (X x)))

testFromXML :: (FromXML a, Show a, Eq a)
            => TestName
            -> LazyByteString
            -> a
            -> TestTree
testFromXML n bs x = testCase n $
     Right (X x) @?= (decodeXML (wrapXML bs) >>= parseXML)

testToXML :: (ToXML a, Show a, Eq a)
          => TestName
          -> LazyByteString
          -> a
          -> TestTree
testToXML n bs x = testCase n $ wrapXML bs @?= encodeXML (X x)

testFromJSON :: (FromJSON a, Show a, Eq a)
             => TestName
             -> LazyByteString
             -> a
             -> TestTree
testFromJSON n bs x = testCase n $
    Right (X x) @?= eitherDecode' ("{\"x\":" <> bs <> "}")

testToJSON :: (ToJSON a, Show a, Eq a)
           => TestName
           -> LazyByteString
           -> a
           -> TestTree
testToJSON n bs x = testCase n (bs @?= encode x)

str :: LazyByteString -> LazyByteString
str bs = "\"" <> bs <> "\""

wrapXML :: LazyByteString -> LazyByteString
wrapXML bs =
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" <> "<x>" <> bs <> "</x>"

maxInt :: Int
maxInt = maxBound

minInt :: Int
minInt = minBound

toLazyBS :: ToByteString a => a -> LazyByteString
toLazyBS = LBS.fromStrict . toBS