bloodhound-0.20.0.0: tests/Test/Indices.hs
{-# LANGUAGE OverloadedStrings #-}
module Test.Indices where
import qualified Data.List as L
import qualified Data.Map as M
import Test.Common
import Test.Import
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