packages feed

nirum-0.2.0: test/Nirum/Constructs/ServiceSpec.hs

{-# LANGUAGE OverloadedLists #-}
module Nirum.Constructs.ServiceSpec where

import Test.Hspec.Meta

import Nirum.Constructs.Annotation (Annotation (Annotation)
                                   , empty
                                   , fromList
                                   , union
                                   )
import Nirum.Constructs.Docs (toCode)
import Nirum.Constructs.Service (Method(Method), Parameter(Parameter))
import Nirum.Constructs.TypeExpression ( TypeExpression ( ListModifier
                                                        , OptionModifier
                                                        )
                                       )
import Util (singleDocs)


spec :: Spec
spec = do
    let Right methodAnno = fromList [Annotation "http-get" (Just "/ping/")]
    let docsAnno = singleDocs "docs..."
    describe "Parameter" $
        specify "toCode" $ do
            toCode (Parameter "dob" "date" empty) `shouldBe` "date dob,"
            toCode (Parameter "dob" "date" docsAnno) `shouldBe`
                "date dob,\n# docs..."
    describe "Method" $
        specify "toCode" $ do
            toCode (Method "ping" [] "bool"
                           Nothing
                           empty) `shouldBe`
                "bool ping (),"
            toCode (Method "ping" [] "bool"
                           Nothing
                           methodAnno) `shouldBe`
                "@http-get(\"/ping/\")\nbool ping (),"
            toCode (Method "ping" [] "bool"
                           Nothing
                           docsAnno) `shouldBe`
                "bool ping (\n  # docs...\n),"
            toCode (Method "ping" [] "bool"
                           (Just "ping-error")
                           empty) `shouldBe`
                "bool ping () throws ping-error,"
            toCode (Method "ping" [] "bool"
                           (Just "ping-error")
                           docsAnno) `shouldBe`
                "bool ping (\n  # docs...\n) throws ping-error,"
            toCode (Method "ping" [] "bool"
                           Nothing
                           methodAnno) `shouldBe`
                "@http-get(\"/ping/\")\nbool ping (),"
            toCode (Method "ping" [] "bool"
                           (Just "ping-error")
                           methodAnno) `shouldBe`
                "@http-get(\"/ping/\")\nbool ping () throws ping-error,"
            toCode (Method "get-user"
                           [Parameter "user-id" "uuid" empty]
                           (OptionModifier "user")
                           Nothing
                           empty) `shouldBe`
                "user? get-user (uuid user-id),"
            toCode (Method "get-user"
                           [Parameter "user-id" "uuid" empty]
                           (OptionModifier "user")
                           Nothing
                           docsAnno) `shouldBe`
                "user? get-user (\n  # docs...\n  uuid user-id,\n),"
            toCode (Method "get-user"
                           [Parameter "user-id" "uuid" empty]
                           (OptionModifier "user")
                           (Just "get-user-error")
                           empty) `shouldBe`
                "user? get-user (uuid user-id) throws get-user-error,"
            toCode (Method "get-user"
                           [Parameter "user-id" "uuid" empty]
                           (OptionModifier "user")
                           (Just "get-user-error")
                           docsAnno) `shouldBe`
                "user? get-user (\n\
                \  # docs...\n\
                \  uuid user-id,\n\
                \) throws get-user-error,"
            toCode (Method "get-user"
                           [Parameter "user-id" "uuid" $ singleDocs "param docs..."]
                           (OptionModifier "user")
                           Nothing
                           empty) `shouldBe`
                "user? get-user (\n  uuid user-id,\n  # param docs...\n),"
            toCode (Method "get-user"
                           [Parameter "user-id" "uuid" $ singleDocs "param docs..."]
                           (OptionModifier "user")
                           Nothing
                           docsAnno) `shouldBe`
                "user? get-user (\n\
                \  # docs...\n\
                \  uuid user-id,\n\
                \  # param docs...\n\
                \),"
            toCode (Method "get-user"
                           [Parameter "user-id" "uuid" $ singleDocs "param docs..."]
                           (OptionModifier "user")
                           (Just "get-user-error")
                           empty) `shouldBe`
                "user? get-user (\n\
                \  uuid user-id,\n\
                \  # param docs...\n\
                \) throws get-user-error,"
            toCode (Method "get-user"
                           [Parameter "user-id" "uuid" $ singleDocs "param docs..."]
                           (OptionModifier "user")
                           (Just "get-user-error")
                           docsAnno) `shouldBe`
                "user? get-user (\n\
                \  # docs...\n\
                \  uuid user-id,\n\
                \  # param docs...\n\
                \) throws get-user-error,"
            toCode (Method "search-posts"
                           [ Parameter "blog-id" "uuid" empty
                           , Parameter "keyword" "text" empty
                           ]
                           (ListModifier "post")
                           Nothing
                           empty) `shouldBe`
                "[post] search-posts (\n  uuid blog-id,\n  text keyword,\n),"
            toCode (Method "search-posts"
                           [ Parameter "blog-id" "uuid" empty
                           , Parameter "keyword" "text" empty
                           ]
                           (ListModifier "post")
                           Nothing
                           docsAnno) `shouldBe`
                "[post] search-posts (\n\
                \  # docs...\n\
                \  uuid blog-id,\n\
                \  text keyword,\n\
                \),"
            toCode (Method "search-posts"
                           [ Parameter "blog-id" "uuid" empty
                           , Parameter "keyword" "text" empty
                           ]
                           (ListModifier "post")
                           (Just "search-posts-error")
                           empty) `shouldBe`
                "[post] search-posts (\n\
                \  uuid blog-id,\n\
                \  text keyword,\n\
                \) throws search-posts-error,"
            toCode (Method "search-posts"
                           [ Parameter "blog-id" "uuid" empty
                           , Parameter "keyword" "text" empty
                           ]
                           (ListModifier "post")
                           (Just "search-posts-error")
                           docsAnno) `shouldBe`
                "[post] search-posts (\n\
                \  # docs...\n\
                \  uuid blog-id,\n\
                \  text keyword,\n\
                \) throws search-posts-error,"
            toCode (Method "search-posts"
                           [ Parameter "blog-id" "uuid" $ singleDocs "blog id..."
                           , Parameter "keyword" "text" $ singleDocs "keyword..."
                           ]
                           (ListModifier "post")
                           Nothing
                           empty) `shouldBe`
                "[post] search-posts (\n\
                \  uuid blog-id,\n\
                \  # blog id...\n\
                \  text keyword,\n\
                \  # keyword...\n\
                \),"
            toCode (Method "search-posts"
                           [ Parameter "blog-id" "uuid" $ singleDocs "blog id..."
                           , Parameter "keyword" "text" $ singleDocs "keyword..."
                           ]
                           (ListModifier "post")
                           Nothing
                           docsAnno) `shouldBe`
                "[post] search-posts (\n\
                \  # docs...\n\
                \  uuid blog-id,\n\
                \  # blog id...\n\
                \  text keyword,\n\
                \  # keyword...\n\
                \),"
            toCode (Method "search-posts"
                           [ Parameter "blog-id" "uuid" $ singleDocs "blog id..."
                           , Parameter "keyword" "text" $ singleDocs "keyword..."
                           ]
                           (ListModifier "post")
                           (Just "search-posts-error")
                           empty) `shouldBe`
                "[post] search-posts (\n\
                \  uuid blog-id,\n\
                \  # blog id...\n\
                \  text keyword,\n\
                \  # keyword...\n\
                \) throws search-posts-error,"
            toCode (Method "search-posts"
                           [ Parameter "blog-id" "uuid" $ singleDocs "blog id..."
                           , Parameter "keyword" "text" $ singleDocs "keyword..."
                           ]
                           (ListModifier "post")
                           (Just "search-posts-error")
                           docsAnno) `shouldBe`
                "[post] search-posts (\n\
                \  # docs...\n\
                \  uuid blog-id,\n\
                \  # blog id...\n\
                \  text keyword,\n\
                \  # keyword...\n\
                \) throws search-posts-error,"
            toCode (Method "search-posts"
                           [ Parameter "blog-id" "uuid" $ singleDocs "blog id..."
                           , Parameter "keyword" "text" $ singleDocs "keyword..."
                           ]
                           (ListModifier "post")
                           (Just "search-posts-error")
                           (docsAnno `union` methodAnno)) `shouldBe`
                "@http-get(\"/ping/\")\n\
                \[post] search-posts (\n\
                \  # docs...\n\
                \  uuid blog-id,\n\
                \  # blog id...\n\
                \  text keyword,\n\
                \  # keyword...\n\
                \) throws search-posts-error,"