70 lines
1.7 KiB
Haskell
70 lines
1.7 KiB
Haskell
|
|
module Internal.ConnectionSpec (
|
|
spec,
|
|
) where
|
|
|
|
import Prelude hiding (read)
|
|
import Data.Monoid
|
|
import Data.IORef
|
|
import Control.Monad
|
|
import System.IO.Error (isEOFError)
|
|
import Test.Hspec
|
|
|
|
import Database.MongoDB.Internal.Connection
|
|
|
|
spec :: Spec
|
|
spec = describe "Internal.Connection" $ do
|
|
readExactlySpec
|
|
|
|
readExactlySpec :: Spec
|
|
readExactlySpec = describe "readExactly" $ do
|
|
it "should return specified number of bytes" $ do
|
|
let conn = Connection
|
|
{ read = return "12345"
|
|
, unread = \_ -> return ()
|
|
, write = \_ -> return ()
|
|
, flush = return ()
|
|
, close = return ()
|
|
}
|
|
|
|
res <- readExactly conn 3
|
|
res `shouldBe` "123"
|
|
|
|
it "should unread the rest" $ do
|
|
restRef <- newIORef mempty
|
|
let conn = Connection
|
|
{ read = return "12345"
|
|
, unread = writeIORef restRef
|
|
, write = \_ -> return ()
|
|
, flush = return ()
|
|
, close = return ()
|
|
}
|
|
|
|
void $ readExactly conn 3
|
|
rest <- readIORef restRef
|
|
rest `shouldBe` "45"
|
|
|
|
it "should ask for more bytes if the first chunk is too small" $ do
|
|
let conn = Connection
|
|
{ read = return "12345"
|
|
, unread = \_ -> return ()
|
|
, write = \_ -> return ()
|
|
, flush = return ()
|
|
, close = return ()
|
|
}
|
|
|
|
res <- readExactly conn 8
|
|
res `shouldBe` "12345123"
|
|
|
|
it "should throw on EOF" $ do
|
|
let conn = Connection
|
|
{ read = return mempty
|
|
, unread = \_ -> return ()
|
|
, write = \_ -> return ()
|
|
, flush = return ()
|
|
, close = return ()
|
|
}
|
|
|
|
void $ readExactly conn 3
|
|
`shouldThrow` isEOFError
|