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