json-api-0.1.0.2: test/Network/JSONApi/ResourceObjectSpec.hs
module Network.JSONApi.ResourceObjectSpec where
import qualified Data.Aeson as AE
import qualified Data.ByteString.Lazy.Char8 as BS
import qualified Data.Map as Map
import Data.Maybe (isJust, fromJust)
import Data.Text (Text, pack)
import qualified GHC.Generics as G
import Network.JSONApi.Document
import Network.URL (URL, importURL)
import TestHelpers (prettyEncode)
import Test.Hspec
data TestObject =
TestObject { myId :: Int
, myName :: Text
, myAge :: Int
, myFavoriteFood :: Text
} deriving (Show, G.Generic)
instance AE.ToJSON TestObject
instance AE.FromJSON TestObject
toResourceObject :: TestObject -> ResourceObject TestObject Int
toResourceObject obj =
ResourceObject
(ResourceId . pack . show . myId $ obj)
(ResourceType "TestObject")
obj
(Just resourceObjectLinks)
(Just resourceObjectMetaData)
resourceObjectLinks :: Links
resourceObjectLinks =
toLinks [ ("self", toURL "/me")
, ("related", toURL "/tacos/4")
]
resourceObjectMetaData :: Meta Int
resourceObjectMetaData = Meta . Map.fromList $ [ ("extraData", 20) ]
toURL :: String -> URL
toURL = fromJust . importURL
testObject :: TestObject
testObject = TestObject 1 "Fred Armisen" 49 "Pizza"
main :: IO ()
main = hspec spec
spec :: Spec
spec =
describe "ToResourceObject" $
it "can be encoded and decoded from JSON" $ do
let encodedJson = BS.unpack . prettyEncode $ toResourceObject testObject
let decodedJson = AE.decode (BS.pack encodedJson) :: Maybe (ResourceObject TestObject (Maybe Int))
isJust decodedJson `shouldBe` True
{- putStrLn encodedJson -}
-- putStrLn $ show . fromJust $ decodedJson