packages feed

ftp-client-0.5.1.5: test/test.hs

import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as C
import Test.Hspec
import Network.FTP.Client hiding (Success)
import qualified Network.FTP.Client as F
import Control.Monad.IO.Class
import Control.Concurrent.MVar

data TestHandleMVars = TestHandleMVars
    { thmSend :: MVar [ByteString]
    , thmSendLine :: MVar [ByteString]
    , thmRecv :: MVar [Int]
    }

data TestHandle = TestHandle TestHandleMVars Handle

testHandle
    :: [ByteString]
    -> [ByteString]
    -> Security
    -> IO TestHandle
testHandle recvResps recvLineResps sec = do
    sendMVar <- newMVar []
    sendLineMVar <- newMVar []
    recvMVar <- newMVar []
    recvCount <- newMVar 0
    recvLineCount <- newMVar 0
    let testHandleMVars = TestHandleMVars
            sendMVar sendLineMVar recvMVar
        handle = Handle
            { send = \s ->
                modifyMVar_ sendMVar
                    (\ss -> return $ ss <> [s])
            , sendLine = \s ->
                modifyMVar_ sendLineMVar
                    (\ss -> return $ ss <> [s])
            , recv = \i -> do
                modifyMVar_ recvMVar
                    (\is -> return $ is <> [i])
                (recvResps !!) <$> modifyMVar recvCount
                    (\i -> return (i + 1, i))
            , recvLine =
                (recvLineResps !!) <$> modifyMVar recvLineCount
                    (\i -> return (i + 1, i))
            , security = sec
            }
    return $ TestHandle testHandleMVars handle

main :: IO ()
main = hspec $ do
    describe "Network.FTP.Client.sendCommand" $ do
        it "sends USER for User" $ do
            let expected = FTPResponse
                    F.Success 200
                    (SingleLine $ C.pack "Ok")
            (TestHandle mvars h) <- testHandle [] [C.pack "200 Ok"] Clear
            sendCommand h (User "megan") `shouldReturn` expected
            takeMVar (thmSend mvars) `shouldReturn` [C.pack "USER megan\r\n"]
        it "sends USER for User and receives a multiline response" $ do
            let expected = FTPResponse
                    F.Success 200
                    (MultiLine [C.pack "line1", C.pack "line2", C.pack "200 line3"])
            (TestHandle mvars h) <- testHandle []
                [ C.pack "200-line1\r\n"
                , C.pack "line2\r\n"
                , C.pack "200 line3\r\n"
                ] Clear
            sendCommand h (User "megan") `shouldReturn` expected
            takeMVar (thmSend mvars) `shouldReturn` [C.pack "USER megan\r\n"]
    describe "Network.FTP.Client.recvAll" $
        it "doesn't hang on empty response" $ do
            let expected = C.pack ""
            (TestHandle mvars h) <- testHandle [C.pack ""] [] Clear
            recvAll h `shouldReturn` expected