packages feed

log-0.9.0.0: test/Test/ElasticSearch.hs

module Test.ElasticSearch
  (ElasticSearchTestConfig(..)
  ,defaultElasticSearchConfig
  ,defaultElasticSearchTestConfig
  ,getNumHits
  ,refreshTestIndex)
where

import Log.Backend.ElasticSearch.V5

import Control.Monad
import Data.Aeson
import Data.Text (Text)
import Data.Time
import Database.V5.Bloodhound
import Network.HTTP.Client
import Test.Tasty.HUnit

import qualified Data.Text as T

data ElasticSearchTestConfig = ElasticSearchTestConfig {
  testServer :: Server,
  testIndex  :: IndexName
  }

defaultElasticSearchTestConfig :: ElasticSearchConfig
                               -> IO ElasticSearchTestConfig
defaultElasticSearchTestConfig esc = do
  now <- getCurrentTime
  let testServer = Server (esServer esc)
      testIndex  = IndexName $ T.concat
                   [ esIndex esc
                   , "-"
                   , T.pack $ formatTime defaultTimeLocale "%F" now
                   ]
  return ElasticSearchTestConfig{..}


getNumHits :: ElasticSearchTestConfig -> Text -> IO Int
getNumHits ElasticSearchTestConfig{..} query = do
  let tquery = TermQuery (Term "message" query) Nothing
      search = mkSearch (Just tquery) Nothing
  reply <- withBH' $ searchByIndex testIndex search
  let result = eitherDecode (responseBody reply)
        :: Either String (SearchResult Value)
  case result of
    Left err -> assertString err >> return (-1)
    Right res -> return . hitsTotal . searchHits $ res

  where
    withBH' = withBH defaultManagerSettings testServer

refreshTestIndex :: ElasticSearchTestConfig -> IO ()
refreshTestIndex ElasticSearchTestConfig{..} =
  void . withBH' $ refreshIndex testIndex

  where
    withBH' = withBH defaultManagerSettings testServer