line-4.0.0: test/Line/Messaging/API/TypesSpec.hs
module Line.Messaging.API.TypesSpec where
import Test.Hspec
import Line.Messaging.API.TypesSpecHelper
import Data.Aeson
import Data.Aeson.Types
import Data.Maybe (isJust, fromJust)
import Line.Messaging.API.Types
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text as T
fromJSONSpec :: (FromJSON a, Eq a, Show a)
=> [(BL.ByteString, Maybe a)]
-> SpecWith ()
fromJSONSpec ((raw, result):xs) = do
let title = if isJust result then "success" else "fail"
it title $ decode raw `shouldBe` result
fromJSONSpec xs
fromJSONSpec [] = return ()
messageableSpec :: (Messageable a, Eq a, Show a)
=> String
-> a
-> BL.ByteString
-> SpecWith ()
messageableSpec testTitle a result =
it testTitle $ toJSON (Message a) `shouldBe` fromJust (decode result)
spec :: Spec
spec = do
describe "messageables" $ do
messageableSpec "text"
(Text "Hello, world")
textMessageableResult
messageableSpec "image"
(Image "https://example.com/original.jpg" "https://example.com/preview.jpg")
imageMessageableResult
messageableSpec "video"
(Video "https://example.com/original.mp4" "https://example.com/preview.jpg")
videoMessageableResult
messageableSpec "audio"
(Audio "https://example.com/original.m4a" 240000)
audioMessageableResult
messageableSpec "location"
(Location "my location" "some address" 35.65910807942215 139.70372892916203)
locationMessageableResult
messageableSpec "sticker"
(Sticker "1" "1")
stickerMessageableResult
messageableSpec "imagemap"
(ImageMap "https://example.com/bot/images/rm001" "this is an imagemap" (1040, 1040)
[ IMURIAction "https://example.com/" (0, 0, 520, 1040)
, IMMessageAction "hello" (520, 0, 520, 1040)
])
imageMapMessageableResult
messageableSpec "template buttons"
(Template "this is a buttons template" $
Buttons (Just "https://example.com/bot/images/image.jpg") (Just "Menu") "Please select"
[ TplPostbackAction "Buy" "action=buy&itemid=123" Nothing
, TplPostbackAction "Add to cart" "action=add&itemid=123" Nothing
, TplURIAction "View detail" "http://example.com/page/123"
, TplDatetimePickerAction (Just "yes label") "pickpick" Datetime Nothing Nothing Nothing
])
buttonsTemplateMessageableResult
messageableSpec "template confirm"
(Template "this is a confirm template" $
Confirm "Are you sure?"
[ TplMessageAction "Yes" "yes"
, TplMessageAction "No" "no"
, TplDatetimePickerAction Nothing "pickpick2" Date (Just "1990-01-01") (Just "2100-12-31") (Just "1900-01-01")
])
confirmTemplateMessageableResult
messageableSpec "template carousel"
(Template "this is a carousel template" $
Carousel [ Column (Just "https://example.com/bot/images/item1.jpg")
(Just "this is menu")
"description"
[ TplPostbackAction "Buy" "action=buy&itemid=111" Nothing
, TplPostbackAction "Add to cart" "action=add&itemid=111" Nothing
, TplURIAction "View detail" "http://example.com/page/111"
, TplDatetimePickerAction Nothing "pickpick3" Time Nothing (Just "23:23") (Just "11:11")
]
, Column (Just "https://example.com/bot/images/item2.jpg")
(Just "this is menu")
"description"
[ TplPostbackAction "Buy" "action=buy&itemid=222" Nothing
, TplPostbackAction "Add to cart" "action=add&itemid=222" Nothing
, TplURIAction "View detail" "http://example.com/page/222"
]
])
carouselTemplateMessageableResult
messageableSpec "template image carousel"
(Template "this is an image carousel template" $
ImageCarousel [ ImageColumn "https://example.com/bot/images/item1.jpg"
(TplPostbackAction "Buy" "action=buy&itemid=111" Nothing)
, ImageColumn "https://example.com/bot/images/item2.jpg"
(TplPostbackAction "Buy" "action=buy&itemid=222" Nothing)
]
)
imageCarouselTemplateMessageableResult
describe "JSON decode" $ do
describe "profile" $ fromJSONSpec
[ ( fullProfile, Just $ Profile
"123"
"Jun"
(Just "https://example.com/profile.jpg")
(Just "some status message") )
, ( noPicProfile, Just $ Profile
"123"
"Jun"
Nothing
(Just "some status message") )
, ( noDescProfile, Just $ Profile
"123"
"Jun"
(Just "https://example.com/profile.jpg")
Nothing )
, ( simpleProfile, Just $ Profile
"123"
"Jun"
Nothing
Nothing )
, ( badProfile, Nothing )
]
describe "API error body" $ fromJSONSpec
[ ( simpleError, Just $ APIErrorBody "Invalid reply token" Nothing Nothing )
, ( complexError, Just $ APIErrorBody
"The request body has 2 error(s)"
Nothing
(Just [ APIErrorBody "May not be empty" (Just "messages[0].text") Nothing
, APIErrorBody "Must be one of the following values: [text, image, video, audio, location, sticker, template, imagemap]" (Just "messages[1].type") Nothing
])
)
, ( badError, Nothing )
]