packages feed

servant-multipart-api-0.13.0: test/Test.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
module Main (main) where

import Data.Text (Text)
import Test.Tasty
import Test.Tasty.HUnit

import Servant.Multipart.API

main :: IO ()
main = defaultMain lookupTests

sampleFileData :: FileData Tmp
sampleFileData = FileData "file" "doc1.pdf" "application/pdf" "payload1"

lookupTests :: TestTree
lookupTests = testGroup "Lookup function tests"
  [ testCase "lookupInput - found" $ do
       let md = MultipartData [ Input "title" "hello" ] []
       lookupInput "title" md @?= Right "hello"

  , testCase "lookupInput - missing" $ do
       let md = MultipartData [ Input "title" "hello" ] []
       lookupInput "author" md @?= Left "Field author not found"

  , testCase "lookupFile - found" $ do
       let md = MultipartData [] [ sampleFileData ]
       lookupFile "file" md @?= Right sampleFileData

  , testCase "lookupFile - missing" $ do
       let md = MultipartData [] [ sampleFileData ]
       lookupFile "image" md @?= Left "File image not found"

  , testCase "lookupAllInputs - found" $ do
       let md = MultipartData [ Input "color" "red"
                              , Input "color" "blue"
                              ] []
       lookupAllInputs "color" md @?= ["red", "blue"]

  , testCase "lookupAllInputs - missing field" $ do
       let md = MultipartData [ Input "color" "red"
                              , Input "color" "blue"
                              ] []
       lookupAllInputs "size" md @?= []

  , testCase "lookupAllFiles - found" $ do
       let file1 = sampleFileData
           file2 = FileData "file" "doc2.pdf" "application/pdf" "/tmp/doc2.buf" :: FileData Tmp
           md = MultipartData [] [file1, file2]
       lookupAllFiles "file" md @?= [file1, file2]

  , testCase "lookupAllFiles - missing file" $ do
       let file1 = sampleFileData
           md = MultipartData [] [file1]
       lookupAllFiles "image" md @?= []

  , testCase "lookupInputAs - parsed successfully" $ do
       let md = MultipartData [ Input "age" "30" ] []
       lookupInputAs @Int "age" md @?= Right 30

  , testCase "lookupInputAs - missing input" $ do
       let md = MultipartData [ Input "age" "30" ] []
       case lookupInputAs @Bool "isAdmin" md of
         Left err -> err @?= "Field isAdmin not found"
         Right _  -> assertFailure "Expected failure on missing input"

  , testCase "lookupAllInputsAs - parsing list of numbers" $ do
       let md = MultipartData [ Input "nums" "1"
                              , Input "nums" "2"
                              , Input "nums" "3"
                              ] []
       lookupAllInputsAs @Int "nums" md @?= Right [1,2,3]

  , testCase "lookupAllInputsAs - missing field returns empty list" $ do
       let md = MultipartData [ Input "nums" "1" ] []
       lookupAllInputsAs @Int "other" md @?= Right []
  ]