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