packages feed

mongoDB-2.7.1.4: test/TestImport.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE LambdaCase #-}

module TestImport (
  module TestImport,
  module Export,
) where

import Control.Exception (SomeException (SomeException), try)
import Control.Monad.Trans as Export (MonadIO, liftIO)
import qualified Data.Text as T
import Data.Time (ParseTime, UTCTime)
import qualified Data.Time as Time
import Database.MongoDB as Export
import Test.Hspec as Export hiding (Selector)

-- We support the old version of time because it's easier than trying to use
-- only the new version and test older GHC versions.
#if MIN_VERSION_time(1,5,0)
import Data.Time.Format (defaultTimeLocale, iso8601DateFormat)
#else
import System.Locale (defaultTimeLocale, iso8601DateFormat)
import Data.Maybe (fromJust)
#endif

parseTime :: (ParseTime t) => String -> String -> t
#if MIN_VERSION_time(1,5,0)
parseTime = Time.parseTimeOrError True defaultTimeLocale
#else
parseTime fmt = fromJust . Time.parseTime defaultTimeLocale fmt
#endif

parseDate :: String -> UTCTime
parseDate = parseTime (iso8601DateFormat Nothing)

parseDateTime :: String -> UTCTime
parseDateTime = parseTime (iso8601DateFormat (Just "%H:%M:%S"))

mongodbHostEnvVariable :: String
mongodbHostEnvVariable = "HASKELL_MONGODB_TEST_HOST"

data MongoAtlas = MongoAtlas
  { atlas_host :: T.Text
  , atlas_user :: T.Text
  , atlas_password :: T.Text
  }

extractMongoAtlasCredentials :: T.Text -> MongoAtlas
extractMongoAtlasCredentials cs =
  let s = T.drop 14 cs
      [u, s'] = T.splitOn ":" s
      [p, h] = T.splitOn "@" s'
   in MongoAtlas h u p

connectAtlas :: MongoAtlas -> IO Pipe
connectAtlas (MongoAtlas h _ _) = do
  repset <- openReplicaSetSRV' $ T.unpack h
  primaryOrSecondary repset >>= \case
    Just pipe -> pure pipe
    Nothing -> ioError $ error "Unable to acquire pipe from MongoDB Atlas' replicaset"
 where
  primaryOrSecondary rep =
    try (primary rep) >>= \case
      Left (SomeException err) -> do
        print $
          "Failed to acquire primary replica, reason:"
            ++ show err
            ++ ". Moving to second..."
        try (secondaryOk rep) >>= \case
          Left (SomeException _) -> pure Nothing
          Right pipe -> pure $ Just pipe
      Right pipe -> pure $ Just pipe