packages feed

backblaze-b2-hs-0.1.0.0: test/Spec.hs

import           Test.Tasty
import           Test.Tasty.HUnit

import           LocalPrelude
import           Network.BackblazeB2.B2API

import qualified Conduit                   as C
import qualified Data.ByteString           as B
import qualified Data.ByteString.Char8     as B8

main :: IO ()
main = do
    credsM <- credsFromEnv
    c <- maybe (throwString "No creds env!") return credsM
    defaultMain $ funcTests c

funcTests :: Credentials -> TestTree
funcTests c = do
    testGroup "Functional tests" $ map (\f -> f c)
        [ basicBucketOpsTest
        , basicFileUploadDownloadTest
        ]

testBucket :: Bucket
testBucket = "bb2hs-test-xxx1"

basicBucketOpsTest :: Credentials -> TestTree
basicBucketOpsTest c = testCaseSteps "Basic Bucket Operations" $ \step -> do
    step "Authorizing account..."
    connInfo <- liftIO $ authorizeAccount c
    let b = "bb2hs-test-x1"
    step "Creating bucket.."
    bd <- liftIO $ flip runReaderT connInfo $
          createBucket b AllPrivate emptyBucketOpts
    brdBucketName bd @?= b

    let bucketId = brdBucketId bd

    step "Listing buckets.."
    AllBuckets bkts <- liftIO $ runReaderT listBuckets connInfo
    assertBool "Created bucket not found!" $
        isJust $ find ((b ==) . brdBucketName) bkts

    step "Deleting bucket.."
    void $ liftIO $ flip runReaderT connInfo $ deleteBucket bucketId

basicFileUploadDownloadTest :: Credentials -> TestTree
basicFileUploadDownloadTest c = testCaseSteps "Basic Upload/Download" $ \step -> do
    step "Authorizing account..."
    connInfo <- liftIO $ authorizeAccount c

    step "Check if testBucket exists..."
    AllBuckets bkts <- liftIO $ runReaderT listBuckets connInfo
    let listedBucketM = find ((testBucket ==) . brdBucketName) bkts
        createBucketFn = do
            step "Bucket does not exist: creating.."
            bd <- liftIO $ flip runReaderT connInfo $
                  createBucket testBucket AllPrivate emptyBucketOpts
            brdBucketName bd @?= testBucket
            return bd

    bucketId <- maybe (brdBucketId <$> createBucketFn)
                (return . brdBucketId) listedBucketM

    step "Getting upload URL"
    uu <- liftIO $ flip runReaderT connInfo $ getUploadUrl bucketId
    uuBucketId uu @?= bucketId

    step "Upload some data"
    let fname = "small-test-file"
        flen = 500 :: Int64

    fi <- liftIO $ flip runReaderT connInfo $
          uploadFile uu fname
          defaultFileProps (Stream flen $ C.yield $
                            B8.replicate (fromIntegral flen) 'a')

    fiFileName fi @?= "small-test-file"
    fiContentLength fi @?= flen

    step "Download the same data"
    let consumer (_, f) = loop f
        loop f = do b' <- f
                    if | B.null b' -> return True
                       | not (B8.all (== 'a') b') -> return False
                       | otherwise -> loop f
    ok <- liftIO $ flip runReaderT connInfo $
          downloadFileByName testBucket fname [] $ ObjectConsumer consumer
    assertBool "Downloaded bytes did not match!" ok

    step "Deleting object"
    let fv = FileVersion fname (fiFileId fi)
    void $ flip runReaderT connInfo $ deleteFileVersion fv

    step "Deleting bucket.."
    void $ liftIO $ flip runReaderT connInfo $ deleteBucket bucketId