packages feed

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