packages feed

dialogflow-fulfillment-0.1.0.0: test/Dialogflow/V2/Fulfillment/MessageSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Dialogflow.V2.Fulfillment.MessageSpec where

import Test.Hspec
import TestUtil

import Dialogflow.V2.Fulfillment.Message

basePath :: FilePath
basePath = "files/message/"

messagePath :: FilePath -> FilePath
messagePath = (<>) basePath

spec :: Spec
spec = beforeAll (prepareDirs basePath) $ do
  describe "SpeechText toJSON" $ do
    context "when it is a TextToSpeech" $
      it "should have the desired structure" $
        let textToSpeech = TextToSpeech "the text"
         in checkSerialization (messagePath "text_to_speech.json") textToSpeech
    context "when it is a SSML" $
      it "should have the desired structure" $
        let ssml = SSML "the xml"
         in checkSerialization (messagePath "ssml.json") ssml
  describe "SimpleResponse toJSON" $ do
    context "when it has a TextToSpeech" $
      it "should have the desired structure" $
        let simpleResponse = SimpleResponse (TextToSpeech "the text") (Just "the maybe text")
         in checkSerialization (messagePath "simple_response_text.json") simpleResponse
    context "when it has a SSML" $
      it "should have the desired structure" $
        let simpleResponse = SimpleResponse (SSML "the xml") (Just "the maybe text")
         in checkSerialization (messagePath "simple_response_ssml.json") simpleResponse
  describe "CardButton toJSON" $
    it "should have the desired structure" $
      let cardButton = CardButton (Just "the text") (Just "the postback")
       in checkSerialization (messagePath "card_button.json") cardButton
  describe "BasicCardContent toJSON" $
    context "when it is an Image" $
      it "should have the desired structure" $
        let image = BasicCardImage (Image "the uri" (Just "the ally text"))
         in checkSerialization (messagePath "basic_card_image.json") image
  describe "OpenUriAction toJSON" $
    it "should have the desired structure" $
      let openUriAction = OpenUriAction "the uri"
       in checkSerialization (messagePath "open_uri_action.json") openUriAction
  describe "BasicCardButton toJSON" $
    it "should have the desired structure" $
      let openUriAction = OpenUriAction "the uri"
          basicCardButton = BasicCardButton "the title" openUriAction
       in checkSerialization (messagePath "basic_card_button.json") basicCardButton
  describe "Suggestion toJSON" $
    it "should have the desired structure" $
      let suggestion = Suggestion "the title"
       in checkSerialization (messagePath "suggestion.json") suggestion
  describe "SelectedItemInfo toJSON" $
    it "should have the desired structure" $
       checkSerialization (messagePath "selected_item_info.json") selectedItemInfo
  describe "Item toJSON" $
    it "should have the desired structure" $
      checkSerialization (messagePath "item.json") item
  describe "Message toJSON" $ do
    context "Text" $
      it "should have the desired structure" $
        let text = Text (Just ["the text"])
         in checkSerialization (messagePath "text.json") text
    context "Image" $
      it "should have the desired structure" $
        let image = Image "the uri" (Just "the ally text")
         in checkSerialization (messagePath "image.json") image
    context "QuickReplies" $
      it "should have the desired structure" $
        let quickReplies = QuickReplies (Just "the title") ["the reply"]
         in checkSerialization (messagePath "quick_replies.json") quickReplies
    context "Card" $
      it "should have the desired structure" $
        let cardButton = CardButton (Just "the text") (Just "the postback")
            card =
              Card (Just "the title") (Just "the subtitle") (Just "the uri") (Just [cardButton])
            in checkSerialization (messagePath "card_image.json") card
    context "SimpleResponses" $
      it "should have the desired structure" $
        let simpleResponses = SimpleResponses [SimpleResponse (TextToSpeech "the text") (Just "the display text")]
           in checkSerialization (messagePath "simple_responses.json") simpleResponses
    context "BasicCard" $ do
      context "when it has an image content" $
        it "should have the desired structure" $
          let image = Image "the uri" (Just "the ally text")
              openUriAction = OpenUriAction "the uri"
              basicCardButton = BasicCardButton "the title" openUriAction
              basicCard =
                BasicCard (Just "the title") (Just "the subtitle") (BasicCardImage image) (Just [basicCardButton])
             in checkSerialization (messagePath "basic_card_with_image.json") basicCard
      context "when it has a formattedText content" $
        it "should have the desired structure" $
          let openUriAction = OpenUriAction "the uri"
              basicCardButton = BasicCardButton "the title" openUriAction
              basicCard =
                BasicCard (Just "the title") (Just "the subtitle") (BasicCardFormattedText "the formatted text") (Just [basicCardButton])
             in checkSerialization (messagePath "basic_card_with_text.json") basicCard
    context "Suggestions" $
      it "should have the desired structure" $
        let suggestions = Suggestions [Suggestion "the suggestion"]
         in checkSerialization (messagePath "suggestions.json") suggestions
    context "LinkOutSuggestion" $
      it "should have the desired structure" $
        let linkOutSuggestion = LinkOutSuggestion "the name" "the app"
         in checkSerialization (messagePath "link_out_suggestion.json") linkOutSuggestion
    context "ListSelect" $
      it "should have the desired structure" $
        let listSelect = ListSelect (Just "the title") [item]
           in checkSerialization (messagePath "list_select.json") listSelect
    context "CarouselSelect" $
      it "should have the desired structure" $
        let carouselSelect = CarouselSelect [item]
           in checkSerialization (messagePath "carousel_select.json") carouselSelect
  where
    selectedItemInfo = SelectItemInfo "the key" (Just ["a synonym"])
    image = Image "the uri" (Just "the ally text")
    item = Item selectedItemInfo "the title" (Just "the description") image