amazonka-core-0.2.3: test/Test/AWS/Data/Time.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RecordWildCards #-}
-- Module : Test.AWS.Data.Time
-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
-- License : This Source Code Form is subject to the terms of
-- the Mozilla Public License, v. 2.0.
-- A copy of the MPL can be found in the LICENSE file or
-- you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability : experimental
-- Portability : non-portable (GHC extensions)
module Test.AWS.Data.Time (tests) where
import Data.Aeson
import Data.Time
import Network.AWS.Prelude
import Test.AWS.Types
import Test.Tasty
import Test.Tasty.HUnit
tests :: TestTree
tests = testGroup "time"
[ testGroup "deserialise xml"
[ testCase "RFC822" $
assertXML "<T>Fri, 07 Nov 2014 04:42:13 GMT</T>" (ref :: RFC822)
, testCase "ISO8601" $
assertXML "<T>2014-11-07T04:42:13.000Z</T>" (ref :: ISO8601)
, testCase "AWS" $
assertXML "<T>20141107T044213Z</T>" (ref :: AWSTime)
, testCase "POSIX integer" $
assertXML "<T>1415335333</T>" (ref :: POSIX)
, testCase "POSIX scientific" $
assertXML "<T>1.415335333E9</T>" (ref :: POSIX)
]
, testGroup "deserialise json"
[ testCase "RFC822" $
assertJSON "{\"time_rfc\":\"Fri, 07 Nov 2014 04:42:13 GMT\"}"
(defaultTimeItem {timeRFC = Just ref})
, testCase "ISO8601" $
assertJSON "{\"time_iso\":\"2014-11-07T04:42:13.000Z\"}"
(defaultTimeItem {timeISO = Just ref})
, testCase "AWS" $
assertJSON "{\"time_aws\":\"20141107T044213Z\"}"
(defaultTimeItem {timeAWS = Just ref})
, testCase "POSIX integer" $
assertJSON "{\"time_posix\":1415335333}"
(defaultTimeItem {timePOSIX = Just ref})
, testCase "POSIX scientific" $
assertJSON "{\"time_posix\":1.415335333E9}"
(defaultTimeItem {timePOSIX = Just ref})
]
, testGroup "serialise json"
[ testCase "POSIX integer" $
(@?=) (encode $ defaultTimeItem {timePOSIX = Just ref})
"{\"time_aws\":null,\"time_iso\":null,\
\\"time_posix\":1415335333,\"time_rfc\":null}"
]
]
ref :: Time a
ref = Time $ fromMaybe (error "Unable to parse time") (parseTime locale format ts)
where
locale = defaultTimeLocale
format = iso8601DateFormat (Just "%H:%M:%S")
ts = "2014-11-07T04:42:13"
data TimeItem = TimeItem
{ timeRFC :: Maybe RFC822
, timeISO :: Maybe ISO8601
, timeAWS :: Maybe AWSTime
, timePOSIX :: Maybe POSIX
} deriving (Eq, Show)
defaultTimeItem :: TimeItem
defaultTimeItem = TimeItem Nothing Nothing Nothing Nothing
instance ToJSON TimeItem where
toJSON TimeItem{..} = object
[ "time_rfc" .= timeRFC
, "time_iso" .= timeISO
, "time_aws" .= timeAWS
, "time_posix" .= timePOSIX
]
instance FromJSON TimeItem where
parseJSON = withObject "TimeItem" $ \o -> TimeItem
<$> o .:? "time_rfc"
<*> o .:? "time_iso"
<*> o .:? "time_aws"
<*> o .:? "time_posix"