json-api-0.1.0.1: 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 GHC.Generics (Generic)
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, 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