94 lines
3.4 KiB
Haskell
94 lines
3.4 KiB
Haskell
{-# LANGUAGE DataKinds #-}
|
|
{-# LANGUAGE FlexibleInstances #-}
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
{-# LANGUAGE ScopedTypeVariables #-}
|
|
{-# LANGUAGE TypeFamilies #-}
|
|
{-# LANGUAGE TypeOperators #-}
|
|
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
|
module Servant.JQuerySpec where
|
|
|
|
import Data.Either (isRight)
|
|
import Data.Proxy
|
|
import Language.ECMAScript3.Parser (parseFromString)
|
|
import Test.Hspec
|
|
|
|
import Servant.API
|
|
import Servant.JQuery
|
|
import Servant.JQuerySpec.CustomHeaders
|
|
|
|
type TestAPI = [sitemap|
|
|
POST /simple String -> Bool
|
|
GET /has.extension Bool
|
|
|]
|
|
|
|
type TopLevelRawAPI = "something" :> Get Int
|
|
:<|> Raw
|
|
|
|
type HeaderHandlingAPI = "something" :> Header "Foo" String
|
|
:> Get Int
|
|
|
|
type CustomAuthAPI = "something" :> Authorization "Basic" String
|
|
:> Get Int
|
|
|
|
type CustomHeaderAPI = "something" :> MyLovelyHorse String
|
|
:> Get Int
|
|
|
|
type CustomHeaderAPI2 = "something" :> WhatsForDinner String
|
|
:> Get Int
|
|
|
|
headerHandlingProxy :: Proxy HeaderHandlingAPI
|
|
headerHandlingProxy = Proxy
|
|
|
|
customAuthProxy :: Proxy CustomAuthAPI
|
|
customAuthProxy = Proxy
|
|
|
|
customHeaderProxy :: Proxy CustomHeaderAPI
|
|
customHeaderProxy = Proxy
|
|
|
|
customHeaderProxy2 :: Proxy CustomHeaderAPI2
|
|
customHeaderProxy2 = Proxy
|
|
|
|
spec :: Spec
|
|
spec = describe "Servant.JQuery"
|
|
generateJSSpec
|
|
|
|
generateJSSpec :: Spec
|
|
generateJSSpec = describe "generateJS" $ do
|
|
it "should generate valid javascript" $ do
|
|
let (postSimple :<|> getHasExtension ) = jquery (Proxy :: Proxy TestAPI)
|
|
parseFromString (generateJS postSimple) `shouldSatisfy` isRight
|
|
parseFromString (generateJS getHasExtension) `shouldSatisfy` isRight
|
|
print $ generateJS getHasExtension
|
|
|
|
it "should use non-empty function names" $ do
|
|
let (_ :<|> topLevel) = jquery (Proxy :: Proxy TopLevelRawAPI)
|
|
print $ generateJS $ topLevel "GET"
|
|
parseFromString (generateJS $ topLevel "GET") `shouldSatisfy` isRight
|
|
|
|
it "should handle simple HTTP headers" $ do
|
|
let jsText = generateJS $ jquery headerHandlingProxy
|
|
print jsText
|
|
parseFromString jsText `shouldSatisfy` isRight
|
|
jsText `shouldContain` "headerFoo"
|
|
jsText `shouldContain` "headers: { \"Foo\": headerFoo }\n"
|
|
|
|
it "should handle complex HTTP headers" $ do
|
|
let jsText = generateJS $ jquery customAuthProxy
|
|
print jsText
|
|
parseFromString jsText `shouldSatisfy` isRight
|
|
jsText `shouldContain` "headerAuthorization"
|
|
jsText `shouldContain` "headers: { \"Authorization\": \"Basic \" + headerAuthorization }\n"
|
|
|
|
it "should handle complex, custom HTTP headers" $ do
|
|
let jsText = generateJS $ jquery customHeaderProxy
|
|
print jsText
|
|
parseFromString jsText `shouldSatisfy` isRight
|
|
jsText `shouldContain` "headerXMyLovelyHorse"
|
|
jsText `shouldContain` "headers: { \"X-MyLovelyHorse\": \"I am good friends with \" + headerXMyLovelyHorse }\n"
|
|
|
|
it "should handle complex, custom HTTP headers (template replacement)" $ do
|
|
let jsText = generateJS $ jquery customHeaderProxy2
|
|
print jsText
|
|
parseFromString jsText `shouldSatisfy` isRight
|
|
jsText `shouldContain` "headerXWhatsForDinner"
|
|
jsText `shouldContain` "headers: { \"X-WhatsForDinner\": \"I would like \" + headerXWhatsForDinner + \" with a cherry on top.\" }\n"
|