bloodhound-0.19.0.0: tests/Test/Indices.hs
{-# LANGUAGE OverloadedStrings #-}
module Test.Indices where
import Test.Common
import Test.Import
import qualified Data.List as L
import qualified Data.Map as M
checkHasSettings :: [UpdatableIndexSetting] -> BH IO ()
checkHasSettings settings = do
currentSettingsE <- getIndexSettings testIndex
case currentSettingsE of
Left err -> fail $ "could not get index settings: " <> show err
Right (IndexSettingsSummary _ _ currentSettings) -> liftIO $ L.intersect currentSettings settings `shouldBe` settings
spec :: Spec
spec = do
describe "Index create/delete API" $ do
it "creates and then deletes the requested index" $ withTestEnv $ do
-- priming state.
_ <- deleteExampleIndex
resp <- createExampleIndex
deleteResp <- deleteExampleIndex
liftIO $ do
validateStatus resp 200
validateStatus deleteResp 200
describe "Index aliases" $ do
let aname = IndexAliasName (IndexName "bloodhound-tests-twitter-1-alias")
let alias = IndexAlias (testIndex) aname
let create = IndexAliasCreate Nothing Nothing
let action = AddAlias alias create
it "handles the simple case of aliasing an existing index" $ do
withTestEnv $ do
resetIndex
resp <- updateIndexAliases (action :| [])
liftIO $ validateStatus resp 200
let cleanup = withTestEnv (updateIndexAliases (RemoveAlias alias :| []))
(do aliases <- withTestEnv getIndexAliases
let expected = IndexAliasSummary alias create
case aliases of
Right (IndexAliasesSummary summs) ->
L.find ((== alias) . indexAliasSummaryAlias) summs `shouldBe` Just expected
Left e -> expectationFailure ("Expected an IndexAliasesSummary but got " <> show e)) `finally` cleanup
it "allows alias deletion" $ do
aliases <- withTestEnv $ do
resetIndex
resp <- updateIndexAliases (action :| [])
liftIO $ validateStatus resp 200
_ <- deleteIndexAlias aname
getIndexAliases
-- let expected = IndexAliasSummary alias create
case aliases of
Right (IndexAliasesSummary summs) ->
L.find ( (== aname)
. indexAlias
. indexAliasSummaryAlias
) summs
`shouldBe` Nothing
Left e -> expectationFailure ("Expected an IndexAliasesSummary but got " <> show e)
describe "Index Listing" $ do
it "returns a list of index names" $ withTestEnv $ do
_ <- createExampleIndex
ixns <- listIndices
liftIO (ixns `shouldContain` [testIndex])
describe "Index Settings" $ do
it "persists settings" $ withTestEnv $ do
_ <- deleteExampleIndex
_ <- createExampleIndex
let updates = BlocksWrite False :| []
updateResp <- updateIndexSettings updates testIndex
liftIO $ validateStatus updateResp 200
checkHasSettings [BlocksWrite False]
it "allows total fields to be set" $ withTestEnv $ do
_ <- deleteExampleIndex
_ <- createExampleIndex
let updates = MappingTotalFieldsLimit 2500 :| []
updateResp <- updateIndexSettings updates testIndex
liftIO $ validateStatus updateResp 200
checkHasSettings [MappingTotalFieldsLimit 2500]
it "allows unassigned.node_left.delayed_timeout to be set" $ withTestEnv $ do
_ <- deleteExampleIndex
_ <- createExampleIndex
let updates = UnassignedNodeLeftDelayedTimeout 10 :| []
updateResp <- updateIndexSettings updates testIndex
liftIO $ validateStatus updateResp 200
checkHasSettings [UnassignedNodeLeftDelayedTimeout 10]
it "accepts customer analyzers" $ withTestEnv $ do
_ <- deleteExampleIndex
let analysis = Analysis
(M.singleton "ex_analyzer"
( AnalyzerDefinition
(Just (Tokenizer "ex_tokenizer"))
(map TokenFilter
[ "ex_filter_lowercase","ex_filter_uppercase","ex_filter_apostrophe"
, "ex_filter_reverse","ex_filter_snowball"
, "ex_filter_shingle"
]
)
(map CharFilter
["html_strip", "ex_mapping", "ex_pattern_replace"]
)
)
)
(M.singleton "ex_tokenizer"
( TokenizerDefinitionNgram
( Ngram 3 4 [TokenLetter,TokenDigit])
)
)
(M.fromList
[ ("ex_filter_lowercase",TokenFilterDefinitionLowercase (Just Greek))
, ("ex_filter_uppercase",TokenFilterDefinitionUppercase Nothing)
, ("ex_filter_apostrophe",TokenFilterDefinitionApostrophe)
, ("ex_filter_reverse",TokenFilterDefinitionReverse)
, ("ex_filter_snowball",TokenFilterDefinitionSnowball English)
, ("ex_filter_shingle",TokenFilterDefinitionShingle (Shingle 3 3 True False " " "_"))
, ("ex_filter_stemmer",TokenFilterDefinitionStemmer German)
, ("ex_filter_stop1", TokenFilterDefinitionStop (Left French))
, ("ex_filter_stop2",
TokenFilterDefinitionStop
(Right
$ map StopWord ["a", "is", "the"]))
]
)
(M.fromList
[ ("ex_mapping", CharFilterDefinitionMapping (M.singleton "١" "1"))
, ("ex_pattern_replace", CharFilterDefinitionPatternReplace "(\\d+)-(?=\\d)" "$1_" Nothing)
]
)
updates = [AnalysisSetting analysis]
createResp <- createIndexWith (updates ++ [NumberOfReplicas (ReplicaCount 0)]) 1 testIndex
liftIO $ validateStatus createResp 200
checkHasSettings updates
it "accepts default compression codec" $ withTestEnv $ do
_ <- deleteExampleIndex
let updates = [CompressionSetting CompressionDefault]
createResp <- createIndexWith (updates ++ [NumberOfReplicas (ReplicaCount 0)]) 1 testIndex
liftIO $ validateStatus createResp 200
checkHasSettings updates
it "accepts best compression codec" $ withTestEnv $ do
_ <- deleteExampleIndex
let updates = [CompressionSetting CompressionBest]
createResp <- createIndexWith (updates ++ [NumberOfReplicas (ReplicaCount 0)]) 1 testIndex
liftIO $ validateStatus createResp 200
checkHasSettings updates
describe "Index Optimization" $ do
it "returns a successful response upon completion" $ withTestEnv $ do
_ <- createExampleIndex
resp <- forceMergeIndex (IndexList (testIndex :| [])) defaultForceMergeIndexSettings
liftIO $ validateStatus resp 200
describe "Index flushing" $ do
it "returns a successful response upon flushing" $ withTestEnv $ do
_ <- createExampleIndex
resp <- flushIndex testIndex
liftIO $ validateStatus resp 200