packages feed

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