{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE DataKinds #-} import Test.Hspec import Control.Monad (zipWithM_) import Data.Aeson (ToJSON) import Data.Default (Default, def) import Data.Proxy (Proxy(Proxy)) import Elm (ToElmType) import GHC.Generics (Generic) import Servant.API import Servant.Elm data Book = Book { title :: String } deriving Generic instance ToJSON Book instance ToElmType Book type TestApi = "one" :> Get '[JSON] Int :<|> "two" :> ReqBody '[JSON] String :> Post '[JSON] (Maybe Int) :<|> "books" :> Capture "id" Int :> Get '[JSON] Book :<|> "books" :> QueryFlag "published" :> QueryParam "sort" String :> QueryParams "filters" (Maybe Bool) :> Get '[JSON] [Book] :<|> "nothing" :> Get '[JSON] () main :: IO () main = hspec $ describe "encoding a simple api" $ it "does it" $ do getOneSource <- readFile "test/getOneSource.elm" postTwoSource <- readFile "test/postTwoSource.elm" bookTypeSource <- readFile "test/bookTypeSource.elm" decodeBookSource <- readFile "test/decodeBookSource.elm" getBooksBySource <- readFile "test/getBooksBySource.elm" getBooksSource <- readFile "test/getBooksSource.elm" getNothingSource <- readFile "test/getNothingSource.elm" let generated = map (++ "\n") (generateElmForAPI (Proxy :: Proxy TestApi)) expected = [ getOneSource , postTwoSource , bookTypeSource , decodeBookSource , getBooksBySource , getBooksSource , getNothingSource ] generated `itemsShouldBe` expected itemsShouldBe :: (Default a, Eq a, Show a) => [a] -> [a] -> IO () itemsShouldBe actual expected = zipWithM_ shouldBe (actual ++ replicate (length expected - length actual) def) (expected ++ replicate (length actual - length expected) def)