@@ -6,6 +6,7 @@ module Main where
7import Control.Applicative
7import Control.Applicative
8import Control.Monad
8import Control.Monad
9+import Control.Monad.Reader
9import Data.Aeson
10import Data.Aeson
10import qualified Data.HashMap.Strict as HM
11import qualified Data.HashMap.Strict as HM
11import Data.List (nub)
12import Data.List (nub)
@@ -34,15 +35,23 @@ testIndex = IndexName "bloodhound-tests-twitter-1"
34testMapping :: MappingName
35testMapping :: MappingName
35testMapping = MappingName "tweet"
36testMapping = MappingName "tweet"
39+--TODO: similar convenience function in Client
40+-- withTestEnv :: MonadIO m => Reader m a -> IO a
41+withTestEnv f = withManager defaultManagerSettings $ \mgr -> do
42+ let env = BHEnv { bhServer = testServer
37validateStatus :: Response body -> Int -> Expectation
46validateStatus :: Response body -> Int -> Expectation
38validateStatus resp expected =
47validateStatus resp expected =
39 (NHTS.statusCode $ responseStatus resp)
48 (NHTS.statusCode $ responseStatus resp)
40 `shouldBe` (expected :: Int)
49 `shouldBe` (expected :: Int)
42−createExampleIndex :: IO Reply
51+-- createExampleIndex :: IO Reply
43−createExampleIndex = createIndex testServer defaultIndexSettings testIndex
52+createExampleIndex = createIndex defaultIndexSettings testIndex
44−deleteExampleIndex :: IO Reply
53+-- deleteExampleIndex :: IO Reply
45−deleteExampleIndex = deleteIndex testServer testIndex
54+deleteExampleIndex = deleteIndex testIndex
47data ServerVersion = ServerVersion Int Int Int deriving (Show, Eq, Ord)
56data ServerVersion = ServerVersion Int Int Int deriving (Show, Eq, Ord)
@@ -70,18 +79,16 @@ mkServerVersion [majorVer, minorVer, patchVer] =
70 Just (ServerVersion majorVer minorVer patchVer)
79 Just (ServerVersion majorVer minorVer patchVer)
71mkServerVersion _ = Nothing
80mkServerVersion _ = Nothing
73−getServerVersion :: Server -> IO (Maybe ServerVersion)
82+-- getServerVersion :: IO (Maybe ServerVersion)
74−getServerVersion s = liftM extractVersion (getStatus s)
83+getServerVersion = liftM extractVersion (withTestEnv getStatus)
76 version' = T.splitOn "." . number . version
85 version' = T.splitOn "." . number . version
77 toInt = read . T.unpack
86 toInt = read . T.unpack
78 parseVersion v = map toInt (version' v)
87 parseVersion v = map toInt (version' v)
79 extractVersion = join . liftM (mkServerVersion . parseVersion)
88 extractVersion = join . liftM (mkServerVersion . parseVersion)
83testServerBranch :: IO (Maybe ServerVersion)
90testServerBranch :: IO (Maybe ServerVersion)
84−testServerBranch = getServerVersion testServer >>= \v -> return $ liftM serverBranch v
91+testServerBranch = getServerVersion >>= \v -> return $ liftM serverBranch v
86atleast :: ServerVersion -> IO Bool
93atleast :: ServerVersion -> IO Bool
87atleast v = testServerBranch >>= \x -> return $ x >= Just (serverBranch v)
94atleast v = testServerBranch >>= \x -> return $ x >= Just (serverBranch v)
@@ -136,60 +143,63 @@ otherTweet = Tweet { user = "notmyapp"
136 , age = 1000
143 , age = 1000
137 , location = Location 40.12 (-71.34) }
144 , location = Location 40.12 (-71.34) }
139−insertData :: IO ()
146+insertData :: ReaderT BHEnv IO ()
140insertData = do
147insertData = do
141 _ <- deleteExampleIndex
148 _ <- deleteExampleIndex
142 _ <- createExampleIndex
149 _ <- createExampleIndex
143− _ <- putMapping testServer testIndex testMapping TweetMapping
150+ _ <- putMapping testIndex testMapping TweetMapping
144− _ <- indexDocument testServer testIndex testMapping exampleTweet (DocId "1")
151+ _ <- indexDocument testIndex testMapping exampleTweet (DocId "1")
145− _ <- refreshIndex testServer testIndex
152+ _ <- refreshIndex testIndex
146 return ()
153 return ()
148−insertOther :: IO ()
155+-- insertOther :: IO ()
149insertOther = do
156insertOther = do
150− _ <- indexDocument testServer testIndex testMapping otherTweet (DocId "2")
157+ _ <- indexDocument testIndex testMapping otherTweet (DocId "2")
151− _ <- refreshIndex testServer testIndex
158+ _ <- refreshIndex testIndex
152 return ()
159 return ()
154−searchTweet :: Search -> IO (Either String Tweet)
161+-- searchTweet :: Search -> IO (Either String Tweet)
155searchTweet search = do
162searchTweet search = do
156− reply <- searchByIndex testServer testIndex search
163+ reply <- searchByIndex testIndex search
157 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
164 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
158 let myTweet = fmap (hitSource . head . hits . searchHits) result
165 let myTweet = fmap (hitSource . head . hits . searchHits) result
159 return myTweet
166 return myTweet
161−searchExpectNoResults :: Search -> IO ()
168+-- searchExpectNoResults :: Search -> IO ()
162searchExpectNoResults search = do
169searchExpectNoResults search = do
163− reply <- searchByIndex testServer testIndex search
170+ reply <- searchByIndex testIndex search
164 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
171 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
165 let emptyHits = fmap (hits . searchHits) result
172 let emptyHits = fmap (hits . searchHits) result
166− emptyHits `shouldBe` Right []
174+ emptyHits `shouldBe` Right []
168−searchExpectAggs :: Search -> IO ()
176+-- searchExpectAggs :: Search -> IO ()
169searchExpectAggs search = do
177searchExpectAggs search = do
170− reply <- searchAll testServer search
178+ reply <- searchAll search
171 let isEmpty x = return (M.null x)
179 let isEmpty x = return (M.null x)
172 let result = decode (responseBody reply) :: Maybe (SearchResult Tweet)
180 let result = decode (responseBody reply) :: Maybe (SearchResult Tweet)
173− (result >>= aggregations >>= isEmpty) `shouldBe` Just False
182+ (result >>= aggregations >>= isEmpty) `shouldBe` Just False
175−searchValidBucketAgg :: (BucketAggregation a, FromJSON a, Show a) => Search -> Text -> (Text -> AggregationResults -> Maybe (Bucket a)) -> IO ()
184+-- searchValidBucketAgg :: (BucketAggregation a, FromJSON a, Show a) => Search -> Text -> (Text -> AggregationResults -> Maybe (Bucket a)) -> IO ()
176searchValidBucketAgg search aggKey extractor = do
185searchValidBucketAgg search aggKey extractor = do
177− reply <- searchAll testServer search
186+ reply <- searchAll search
178 let bucketDocs = docCount . head . buckets
187 let bucketDocs = docCount . head . buckets
179 let result = decode (responseBody reply) :: Maybe (SearchResult Tweet)
188 let result = decode (responseBody reply) :: Maybe (SearchResult Tweet)
180 let count = result >>= aggregations >>= extractor aggKey >>= \x -> return (bucketDocs x)
189 let count = result >>= aggregations >>= extractor aggKey >>= \x -> return (bucketDocs x)
181− count `shouldBe` Just 1
191+ count `shouldBe` Just 1
183−searchTermsAggHint :: [ExecutionHint] -> IO ()
193+-- searchTermsAggHint :: [ExecutionHint] -> IO ()
184searchTermsAggHint hints = do
194searchTermsAggHint hints = do
185 let terms hint = TermsAgg $ (mkTermsAggregation "user") { termExecutionHint = Just hint }
195 let terms hint = TermsAgg $ (mkTermsAggregation "user") { termExecutionHint = Just hint }
186 let search hint = mkAggregateSearch Nothing $ mkAggregations "users" $ terms hint
196 let search hint = mkAggregateSearch Nothing $ mkAggregations "users" $ terms hint
187 forM_ hints $ searchExpectAggs . search
197 forM_ hints $ searchExpectAggs . search
188 forM_ hints (\x -> searchValidBucketAgg (search x) "users" toTerms)
198 forM_ hints (\x -> searchValidBucketAgg (search x) "users" toTerms)
190−searchTweetHighlight :: Search -> IO (Either String (Maybe HitHighlight))
200+-- searchTweetHighlight :: Search -> IO (Either String (Maybe HitHighlight))
191searchTweetHighlight search = do
201searchTweetHighlight search = do
192− reply <- searchByIndex testServer testIndex search
202+ reply <- searchByIndex testIndex search
193 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
203 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
194 let myHighlight = fmap (hitHighlight . head . hits . searchHits) result
204 let myHighlight = fmap (hitHighlight . head . hits . searchHits) result
195 return myHighlight
205 return myHighlight
@@ -223,26 +233,27 @@ main :: IO ()
223main = hspec $ do
233main = hspec $ do
225 describe "index create/delete API" $ do
235 describe "index create/delete API" $ do
226− it "creates and then deletes the requested index" $ do
236+ it "creates and then deletes the requested index" $ withTestEnv $ do
227 -- priming state.
237 -- priming state.
228 _ <- deleteExampleIndex
238 _ <- deleteExampleIndex
229 resp <- createExampleIndex
239 resp <- createExampleIndex
230 deleteResp <- deleteExampleIndex
240 deleteResp <- deleteExampleIndex
231− validateStatus resp 200
242+ validateStatus resp 200
232− validateStatus deleteResp 200
243+ validateStatus deleteResp 200
235 describe "document API" $ do
246 describe "document API" $ do
236− it "indexes, gets, and then deletes the generated document" $ do
247+ it "indexes, gets, and then deletes the generated document" $ withTestEnv $ do
237 _ <- insertData
248 _ <- insertData
238− docInserted <- getDocument testServer testIndex testMapping (DocId "1")
249+ docInserted <- getDocument testIndex testMapping (DocId "1")
239 let newTweet = eitherDecode
250 let newTweet = eitherDecode
240 (responseBody docInserted) :: Either String (EsResult Tweet)
251 (responseBody docInserted) :: Either String (EsResult Tweet)
241− fmap _source newTweet `shouldBe` Right exampleTweet
252+ liftIO $ (fmap _source newTweet `shouldBe` Right exampleTweet)
244 describe "bulk API" $ do
255 describe "bulk API" $ do
245− it "inserts all documents we request" $ do
256+ it "inserts all documents we request" $ withTestEnv $ do
246 _ <- insertData
257 _ <- insertData
247 let firstTest = BulkTest "blah"
258 let firstTest = BulkTest "blah"
248 let secondTest = BulkTest "bloo"
259 let secondTest = BulkTest "bloo"
@@ -251,49 +262,54 @@ main = hspec $ do
251 let secondDoc = BulkCreate testIndex
262 let secondDoc = BulkCreate testIndex
252 testMapping (DocId "3") (toJSON secondTest)
263 testMapping (DocId "3") (toJSON secondTest)
253 let stream = V.fromList [firstDoc, secondDoc]
264 let stream = V.fromList [firstDoc, secondDoc]
254− _ <- bulk testServer stream
265+ _ <- bulk stream
255− _ <- refreshIndex testServer testIndex
266+ _ <- refreshIndex testIndex
256− fDoc <- getDocument testServer testIndex testMapping (DocId "2")
267+ fDoc <- getDocument testIndex testMapping (DocId "2")
257− sDoc <- getDocument testServer testIndex testMapping (DocId "3")
268+ sDoc <- getDocument testIndex testMapping (DocId "3")
258 let maybeFirst = eitherDecode $ responseBody fDoc :: Either String (EsResult BulkTest)
269 let maybeFirst = eitherDecode $ responseBody fDoc :: Either String (EsResult BulkTest)
259 let maybeSecond = eitherDecode $ responseBody sDoc :: Either String (EsResult BulkTest)
270 let maybeSecond = eitherDecode $ responseBody sDoc :: Either String (EsResult BulkTest)
260− fmap _source maybeFirst `shouldBe` Right firstTest
272+ fmap _source maybeFirst `shouldBe` Right firstTest
261− fmap _source maybeSecond `shouldBe` Right secondTest
273+ fmap _source maybeSecond `shouldBe` Right secondTest
264 describe "query API" $ do
276 describe "query API" $ do
265− it "returns document for term query and identity filter" $ do
277+ it "returns document for term query and identity filter" $ withTestEnv $ do
266 _ <- insertData
278 _ <- insertData
267 let query = TermQuery (Term "user" "bitemyapp") Nothing
279 let query = TermQuery (Term "user" "bitemyapp") Nothing
268 let filter = IdentityFilter <&&> IdentityFilter
280 let filter = IdentityFilter <&&> IdentityFilter
269 let search = mkSearch (Just query) (Just filter)
281 let search = mkSearch (Just query) (Just filter)
270 myTweet <- searchTweet search
282 myTweet <- searchTweet search
271− myTweet `shouldBe` Right exampleTweet
284+ myTweet `shouldBe` Right exampleTweet
273− it "returns document for terms query and identity filter" $ do
286+ it "returns document for terms query and identity filter" $ withTestEnv $ do
274 _ <- insertData
287 _ <- insertData
275 let query = TermsQuery (NE.fromList [(Term "user" "bitemyapp")])
288 let query = TermsQuery (NE.fromList [(Term "user" "bitemyapp")])
276 let filter = IdentityFilter <&&> IdentityFilter
289 let filter = IdentityFilter <&&> IdentityFilter
277 let search = mkSearch (Just query) (Just filter)
290 let search = mkSearch (Just query) (Just filter)
278 myTweet <- searchTweet search
291 myTweet <- searchTweet search
279− myTweet `shouldBe` Right exampleTweet
293+ myTweet `shouldBe` Right exampleTweet
281− it "returns document for match query" $ do
295+ it "returns document for match query" $ withTestEnv $ do
282 _ <- insertData
296 _ <- insertData
283 let query = QueryMatchQuery $ mkMatchQuery (FieldName "user") (QueryString "bitemyapp")
297 let query = QueryMatchQuery $ mkMatchQuery (FieldName "user") (QueryString "bitemyapp")
284 let search = mkSearch (Just query) Nothing
298 let search = mkSearch (Just query) Nothing
285 myTweet <- searchTweet search
299 myTweet <- searchTweet search
286− myTweet `shouldBe` Right exampleTweet
301+ myTweet `shouldBe` Right exampleTweet
288− it "returns document for multi-match query" $ do
303+ it "returns document for multi-match query" $ withTestEnv $ do
289 _ <- insertData
304 _ <- insertData
290 let fields = [FieldName "user", FieldName "message"]
305 let fields = [FieldName "user", FieldName "message"]
291 let query = QueryMultiMatchQuery $ mkMultiMatchQuery fields (QueryString "bitemyapp")
306 let query = QueryMultiMatchQuery $ mkMultiMatchQuery fields (QueryString "bitemyapp")
292 let search = mkSearch (Just query) Nothing
307 let search = mkSearch (Just query) Nothing
293 myTweet <- searchTweet search
308 myTweet <- searchTweet search
294− myTweet `shouldBe` Right exampleTweet
310+ myTweet `shouldBe` Right exampleTweet
296− it "returns document for bool query" $ do
312+ it "returns document for bool query" $ withTestEnv $ do
297 _ <- insertData
313 _ <- insertData
298 let innerQuery = QueryMatchQuery $
314 let innerQuery = QueryMatchQuery $
299 mkMatchQuery (FieldName "user") (QueryString "bitemyapp")
315 mkMatchQuery (FieldName "user") (QueryString "bitemyapp")
@@ -301,18 +317,20 @@ main = hspec $ do
301 mkBoolQuery [innerQuery] [] []
317 mkBoolQuery [innerQuery] [] []
302 let search = mkSearch (Just query) Nothing
318 let search = mkSearch (Just query) Nothing
303 myTweet <- searchTweet search
319 myTweet <- searchTweet search
304− myTweet `shouldBe` Right exampleTweet
321+ myTweet `shouldBe` Right exampleTweet
306− it "returns document for boosting query" $ do
323+ it "returns document for boosting query" $ withTestEnv $ do
307 _ <- insertData
324 _ <- insertData
308 let posQuery = QueryMatchQuery $ mkMatchQuery (FieldName "user") (QueryString "bitemyapp")
325 let posQuery = QueryMatchQuery $ mkMatchQuery (FieldName "user") (QueryString "bitemyapp")
309 let negQuery = QueryMatchQuery $ mkMatchQuery (FieldName "user") (QueryString "notmyapp")
326 let negQuery = QueryMatchQuery $ mkMatchQuery (FieldName "user") (QueryString "notmyapp")
310 let query = QueryBoostingQuery $ BoostingQuery posQuery negQuery (Boost 0.2)
327 let query = QueryBoostingQuery $ BoostingQuery posQuery negQuery (Boost 0.2)
311 let search = mkSearch (Just query) Nothing
328 let search = mkSearch (Just query) Nothing
312 myTweet <- searchTweet search
329 myTweet <- searchTweet search
313− myTweet `shouldBe` Right exampleTweet
331+ myTweet `shouldBe` Right exampleTweet
315− it "returns document for common terms query" $ do
333+ it "returns document for common terms query" $ withTestEnv $ do
316 _ <- insertData
334 _ <- insertData
317 let query = QueryCommonTermsQuery $
335 let query = QueryCommonTermsQuery $
318 CommonTermsQuery (FieldName "user")
336 CommonTermsQuery (FieldName "user")
@@ -321,55 +339,61 @@ main = hspec $ do
321 Or Or Nothing Nothing Nothing Nothing
339 Or Or Nothing Nothing Nothing Nothing
322 let search = mkSearch (Just query) Nothing
340 let search = mkSearch (Just query) Nothing
323 myTweet <- searchTweet search
341 myTweet <- searchTweet search
324− myTweet `shouldBe` Right exampleTweet
343+ myTweet `shouldBe` Right exampleTweet
327 describe "sorting" $ do
346 describe "sorting" $ do
328− it "returns documents in the right order" $ do
347+ it "returns documents in the right order" $ withTestEnv $ do
329 _ <- insertData
348 _ <- insertData
330 _ <- insertOther
349 _ <- insertOther
331 let sortSpec = DefaultSortSpec $ mkSort (FieldName "age") Ascending
350 let sortSpec = DefaultSortSpec $ mkSort (FieldName "age") Ascending
332 let search = Search Nothing
351 let search = Search Nothing
333 (Just IdentityFilter) (Just [sortSpec]) Nothing Nothing
352 (Just IdentityFilter) (Just [sortSpec]) Nothing Nothing
334 False 0 10
353 False 0 10
335− reply <- searchByIndex testServer testIndex search
354+ reply <- searchByIndex testIndex search
336 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
355 let result = eitherDecode (responseBody reply) :: Either String (SearchResult Tweet)
337 let myTweet = fmap (hitSource . head . hits . searchHits) result
356 let myTweet = fmap (hitSource . head . hits . searchHits) result
338− myTweet `shouldBe` Right otherTweet
358+ myTweet `shouldBe` Right otherTweet
341 describe "filtering API" $ do
361 describe "filtering API" $ do
342− it "returns document for composed boolmatch and identity" $ do
362+ it "returns document for composed boolmatch and identity" $ withTestEnv $ do
343 _ <- insertData
363 _ <- insertData
344 let queryFilter = BoolFilter (MustMatch (Term "user" "bitemyapp") False)
364 let queryFilter = BoolFilter (MustMatch (Term "user" "bitemyapp") False)
345 <&&> IdentityFilter
365 <&&> IdentityFilter
346 let search = mkSearch Nothing (Just queryFilter)
366 let search = mkSearch Nothing (Just queryFilter)
347 myTweet <- searchTweet search
367 myTweet <- searchTweet search
348− myTweet `shouldBe` Right exampleTweet
369+ myTweet `shouldBe` Right exampleTweet
350− it "returns document for term filter" $ do
371+ it "returns document for term filter" $ withTestEnv $ do
351 _ <- insertData
372 _ <- insertData
352 let termFilter = TermFilter (Term "user" "bitemyapp") False
373 let termFilter = TermFilter (Term "user" "bitemyapp") False
353 let search = mkSearch Nothing (Just termFilter)
374 let search = mkSearch Nothing (Just termFilter)
354 myTweet <- searchTweet search
375 myTweet <- searchTweet search
355− myTweet `shouldBe` Right exampleTweet
377+ myTweet `shouldBe` Right exampleTweet
357− it "returns document for existential filter" $ do
379+ it "returns document for existential filter" $ withTestEnv $ do
358 _ <- insertData
380 _ <- insertData
359 let search = mkSearch Nothing (Just (ExistsFilter (FieldName "user")))
381 let search = mkSearch Nothing (Just (ExistsFilter (FieldName "user")))
360 myTweet <- searchTweet search
382 myTweet <- searchTweet search
361− myTweet `shouldBe` Right exampleTweet
384+ myTweet `shouldBe` Right exampleTweet
363− it "returns document for geo boundingbox filter" $ do
386+ it "returns document for geo boundingbox filter" $ withTestEnv $ do
364 _ <- insertData
387 _ <- insertData
365 let box = GeoBoundingBox (LatLon 40.73 (-74.1)) (LatLon 40.10 (-71.12))
388 let box = GeoBoundingBox (LatLon 40.73 (-74.1)) (LatLon 40.10 (-71.12))
366 let bbConstraint = GeoBoundingBoxConstraint (FieldName "tweet.location") box False GeoFilterMemory
389 let bbConstraint = GeoBoundingBoxConstraint (FieldName "tweet.location") box False GeoFilterMemory
367 let geoFilter = GeoBoundingBoxFilter bbConstraint
390 let geoFilter = GeoBoundingBoxFilter bbConstraint
368 let search = mkSearch Nothing (Just geoFilter)
391 let search = mkSearch Nothing (Just geoFilter)
369 myTweet <- searchTweet search
392 myTweet <- searchTweet search
370− myTweet `shouldBe` Right exampleTweet
394+ myTweet `shouldBe` Right exampleTweet
372− it "doesn't return document for nonsensical boundingbox filter" $ do
396+ it "doesn't return document for nonsensical boundingbox filter" $ withTestEnv $ do
373 _ <- insertData
397 _ <- insertData
374 let box = GeoBoundingBox (LatLon 0.73 (-4.1)) (LatLon 0.10 (-1.12))
398 let box = GeoBoundingBox (LatLon 0.73 (-4.1)) (LatLon 0.10 (-1.12))
375 let bbConstraint = GeoBoundingBoxConstraint (FieldName "tweet.location") box False GeoFilterMemory
399 let bbConstraint = GeoBoundingBoxConstraint (FieldName "tweet.location") box False GeoFilterMemory
@@ -377,7 +401,7 @@ main = hspec $ do
377 let search = mkSearch Nothing (Just geoFilter)
401 let search = mkSearch Nothing (Just geoFilter)
378 searchExpectNoResults search
402 searchExpectNoResults search
380− it "returns document for geo distance filter" $ do
404+ it "returns document for geo distance filter" $ withTestEnv $ do
381 _ <- insertData
405 _ <- insertData
382 let geoPoint = GeoPoint (FieldName "tweet.location") (LatLon 40.12 (-71.34))
406 let geoPoint = GeoPoint (FieldName "tweet.location") (LatLon 40.12 (-71.34))
383 let distance = Distance 10.0 Miles
407 let distance = Distance 10.0 Miles
@@ -385,18 +409,20 @@ main = hspec $ do
385 let geoFilter = GeoDistanceFilter geoPoint distance SloppyArc optimizeBbox False
409 let geoFilter = GeoDistanceFilter geoPoint distance SloppyArc optimizeBbox False
386 let search = mkSearch Nothing (Just geoFilter)
410 let search = mkSearch Nothing (Just geoFilter)
387 myTweet <- searchTweet search
411 myTweet <- searchTweet search
388− myTweet `shouldBe` Right exampleTweet
413+ myTweet `shouldBe` Right exampleTweet
390− it "returns document for geo distance range filter" $ do
415+ it "returns document for geo distance range filter" $ withTestEnv $ do
391 _ <- insertData
416 _ <- insertData
392 let geoPoint = GeoPoint (FieldName "tweet.location") (LatLon 40.12 (-71.34))
417 let geoPoint = GeoPoint (FieldName "tweet.location") (LatLon 40.12 (-71.34))
393 let distanceRange = DistanceRange (Distance 0.0 Miles) (Distance 10.0 Miles)
418 let distanceRange = DistanceRange (Distance 0.0 Miles) (Distance 10.0 Miles)
394 let geoFilter = GeoDistanceRangeFilter geoPoint distanceRange
419 let geoFilter = GeoDistanceRangeFilter geoPoint distanceRange
395 let search = mkSearch Nothing (Just geoFilter)
420 let search = mkSearch Nothing (Just geoFilter)
396 myTweet <- searchTweet search
421 myTweet <- searchTweet search
397− myTweet `shouldBe` Right exampleTweet
423+ myTweet `shouldBe` Right exampleTweet
399− it "doesn't return document for wild geo distance range filter" $ do
425+ it "doesn't return document for wild geo distance range filter" $ withTestEnv $ do
400 _ <- insertData
426 _ <- insertData
401 let geoPoint = GeoPoint (FieldName "tweet.location") (LatLon 40.12 (-71.34))
427 let geoPoint = GeoPoint (FieldName "tweet.location") (LatLon 40.12 (-71.34))
402 let distanceRange = DistanceRange (Distance 100.0 Miles) (Distance 1000.0 Miles)
428 let distanceRange = DistanceRange (Distance 100.0 Miles) (Distance 1000.0 Miles)
@@ -404,7 +430,7 @@ main = hspec $ do
404 let search = mkSearch Nothing (Just geoFilter)
430 let search = mkSearch Nothing (Just geoFilter)
405 searchExpectNoResults search
431 searchExpectNoResults search
407− it "returns document for geo polygon filter" $ do
433+ it "returns document for geo polygon filter" $ withTestEnv $ do
408 _ <- insertData
434 _ <- insertData
409 let points = [LatLon 40.0 (-70.00),
435 let points = [LatLon 40.0 (-70.00),
410 LatLon 40.0 (-72.00),
436 LatLon 40.0 (-72.00),
@@ -413,9 +439,10 @@ main = hspec $ do
413 let geoFilter = GeoPolygonFilter (FieldName "tweet.location") points
439 let geoFilter = GeoPolygonFilter (FieldName "tweet.location") points
414 let search = mkSearch Nothing (Just geoFilter)
440 let search = mkSearch Nothing (Just geoFilter)
415 myTweet <- searchTweet search
441 myTweet <- searchTweet search
416− myTweet `shouldBe` Right exampleTweet
443+ myTweet `shouldBe` Right exampleTweet
418− it "doesn't return document for bad geo polygon filter" $ do
445+ it "doesn't return document for bad geo polygon filter" $ withTestEnv $ do
419 _ <- insertData
446 _ <- insertData
420 let points = [LatLon 40.0 (-70.00),
447 let points = [LatLon 40.0 (-70.00),
421 LatLon 40.0 (-71.00),
448 LatLon 40.0 (-71.00),
@@ -425,23 +452,25 @@ main = hspec $ do
425 let search = mkSearch Nothing (Just geoFilter)
452 let search = mkSearch Nothing (Just geoFilter)
426 searchExpectNoResults search
453 searchExpectNoResults search
428− it "returns document for ids filter" $ do
455+ it "returns document for ids filter" $ withTestEnv $ do
429 _ <- insertData
456 _ <- insertData
430 let filter = IdsFilter (MappingName "tweet") [DocId "1"]
457 let filter = IdsFilter (MappingName "tweet") [DocId "1"]
431 let search = mkSearch Nothing (Just filter)
458 let search = mkSearch Nothing (Just filter)
432 myTweet <- searchTweet search
459 myTweet <- searchTweet search
433− myTweet `shouldBe` Right exampleTweet
461+ myTweet `shouldBe` Right exampleTweet
435− it "returns document for Double range filter" $ do
463+ it "returns document for Double range filter" $ withTestEnv $ do
436 _ <- insertData
464 _ <- insertData
437 let filter = RangeFilter (FieldName "age")
465 let filter = RangeFilter (FieldName "age")
438 (RangeDoubleGtLt (GreaterThan 1000.0) (LessThan 100000.0))
466 (RangeDoubleGtLt (GreaterThan 1000.0) (LessThan 100000.0))
439 RangeExecutionIndex False
467 RangeExecutionIndex False
440 let search = mkSearch Nothing (Just filter)
468 let search = mkSearch Nothing (Just filter)
441 myTweet <- searchTweet search
469 myTweet <- searchTweet search
442− myTweet `shouldBe` Right exampleTweet
471+ myTweet `shouldBe` Right exampleTweet
444− it "returns document for UTCTime date filter" $ do
473+ it "returns document for UTCTime date filter" $ withTestEnv $ do
445 _ <- insertData
474 _ <- insertData
446 let filter = RangeFilter (FieldName "postDate")
475 let filter = RangeFilter (FieldName "postDate")
447 (RangeDateGtLt
476 (RangeDateGtLt
@@ -454,18 +483,20 @@ main = hspec $ do
454 RangeExecutionIndex False
483 RangeExecutionIndex False
455 let search = mkSearch Nothing (Just filter)
484 let search = mkSearch Nothing (Just filter)
456 myTweet <- searchTweet search
485 myTweet <- searchTweet search
457− myTweet `shouldBe` Right exampleTweet
487+ myTweet `shouldBe` Right exampleTweet
460− it "returns document for regexp filter" $ do
490+ it "returns document for regexp filter" $ withTestEnv $ do
461 _ <- insertData
491 _ <- insertData
462 let filter = RegexpFilter (FieldName "user") (Regexp "bite.*app")
492 let filter = RegexpFilter (FieldName "user") (Regexp "bite.*app")
463 AllRegexpFlags (CacheName "test") False (CacheKey "key")
493 AllRegexpFlags (CacheName "test") False (CacheKey "key")
464 let search = mkSearch Nothing (Just filter)
494 let search = mkSearch Nothing (Just filter)
465 myTweet <- searchTweet search
495 myTweet <- searchTweet search
466− myTweet `shouldBe` Right exampleTweet
497+ myTweet `shouldBe` Right exampleTweet
468− it "doesn't return document for non-matching regexp filter" $ do
499+ it "doesn't return document for non-matching regexp filter" $ withTestEnv $ do
469 _ <- insertData
500 _ <- insertData
470 let filter = RegexpFilter (FieldName "user")
501 let filter = RegexpFilter (FieldName "user")
471 (Regexp "boy") AllRegexpFlags
502 (Regexp "boy") AllRegexpFlags
@@ -474,40 +505,40 @@ main = hspec $ do
474 searchExpectNoResults search
505 searchExpectNoResults search
476 describe "Aggregation API" $ do
507 describe "Aggregation API" $ do
477− it "returns term aggregation results" $ do
508+ it "returns term aggregation results" $ withTestEnv $ do
478 _ <- insertData
509 _ <- insertData
479 let terms = TermsAgg $ mkTermsAggregation "user"
510 let terms = TermsAgg $ mkTermsAggregation "user"
480 let search = mkAggregateSearch Nothing $ mkAggregations "users" terms
511 let search = mkAggregateSearch Nothing $ mkAggregations "users" terms
481 searchExpectAggs search
512 searchExpectAggs search
482 searchValidBucketAgg search "users" toTerms
513 searchValidBucketAgg search "users" toTerms
484− it "can give collection hint parameters to term aggregations" $ when' (atleast es13) $ do
515+ it "can give collection hint parameters to term aggregations" $ when' (atleast es13) $ withTestEnv $ do
485 _ <- insertData
516 _ <- insertData
486 let terms = TermsAgg $ (mkTermsAggregation "user") { termCollectMode = Just BreadthFirst }
517 let terms = TermsAgg $ (mkTermsAggregation "user") { termCollectMode = Just BreadthFirst }
487 let search = mkAggregateSearch Nothing $ mkAggregations "users" terms
518 let search = mkAggregateSearch Nothing $ mkAggregations "users" terms
488 searchExpectAggs search
519 searchExpectAggs search
489 searchValidBucketAgg search "users" toTerms
520 searchValidBucketAgg search "users" toTerms
491− it "can give execution hint paramters to term aggregations" $ when' (atmost es11) $ do
522+ it "can give execution hint paramters to term aggregations" $ when' (atmost es11) $ withTestEnv $ do
492 _ <- insertData
523 _ <- insertData
493 searchTermsAggHint [Map, Ordinals]
524 searchTermsAggHint [Map, Ordinals]
495− it "can give execution hint paramters to term aggregations" $ when' (is es12) $ do
526+ it "can give execution hint paramters to term aggregations" $ when' (is es12) $ withTestEnv $ do
496 _ <- insertData
527 _ <- insertData
497 searchTermsAggHint [GlobalOrdinals, GlobalOrdinalsHash, GlobalOrdinalsLowCardinality, Map, Ordinals]
528 searchTermsAggHint [GlobalOrdinals, GlobalOrdinalsHash, GlobalOrdinalsLowCardinality, Map, Ordinals]
499− it "can give execution hint paramters to term aggregations" $ when' (atleast es12) $ do
530+ it "can give execution hint paramters to term aggregations" $ when' (atleast es12) $ withTestEnv $ do
500 _ <- insertData
531 _ <- insertData
501 searchTermsAggHint [GlobalOrdinals, GlobalOrdinalsHash, GlobalOrdinalsLowCardinality, Map]
532 searchTermsAggHint [GlobalOrdinals, GlobalOrdinalsHash, GlobalOrdinalsLowCardinality, Map]
503− it "returns date histogram aggregation results" $ do
534+ it "returns date histogram aggregation results" $ withTestEnv $ do
504 _ <- insertData
535 _ <- insertData
505 let histogram = DateHistogramAgg $ mkDateHistogram (FieldName "postDate") Minute
536 let histogram = DateHistogramAgg $ mkDateHistogram (FieldName "postDate") Minute
506 let search = mkAggregateSearch Nothing (mkAggregations "byDate" histogram)
537 let search = mkAggregateSearch Nothing (mkAggregations "byDate" histogram)
507 searchExpectAggs search
538 searchExpectAggs search
508 searchValidBucketAgg search "byDate" toDateHistogram
539 searchValidBucketAgg search "byDate" toDateHistogram
510− it "returns date histogram using fractional date" $ do
541+ it "returns date histogram using fractional date" $ withTestEnv $ do
511 _ <- insertData
542 _ <- insertData
512 let periods = [Year, Quarter, Month, Week, Day, Hour, Minute, Second]
543 let periods = [Year, Quarter, Month, Week, Day, Hour, Minute, Second]
513 let fractionals = map (FractionalInterval 1.5) [Weeks, Days, Hours, Minutes, Seconds]
544 let fractionals = map (FractionalInterval 1.5) [Weeks, Days, Hours, Minutes, Seconds]
@@ -521,7 +552,7 @@ main = hspec $ do
522 describe "Highlights API" $ do
553 describe "Highlights API" $ do
524− it "returns highlight from query when there should be one" $ do
555+ it "returns highlight from query when there should be one" $ withTestEnv $ do
525 _ <- insertData
556 _ <- insertData
526 _ <- insertOther
557 _ <- insertOther
527 let query = QueryMatchQuery $ mkMatchQuery (FieldName "_all") (QueryString "haskell")
558 let query = QueryMatchQuery $ mkMatchQuery (FieldName "_all") (QueryString "haskell")
@@ -529,9 +560,10 @@ main = hspec $ do
530 let search = mkHighlightSearch (Just query) testHighlight
561 let search = mkHighlightSearch (Just query) testHighlight
531 myHighlight <- searchTweetHighlight search
562 myHighlight <- searchTweetHighlight search
532− myHighlight `shouldBe` Right (Just (M.fromList [("message",["Use <em>haskell</em>!"])]))
564+ myHighlight `shouldBe` Right (Just (M.fromList [("message",["Use <em>haskell</em>!"])]))
534− it "doesn't return highlight from a query when it shouldn't" $ do
566+ it "doesn't return highlight from a query when it shouldn't" $ withTestEnv $ do
535 _ <- insertData
567 _ <- insertData
536 _ <- insertOther
568 _ <- insertOther
537 let query = QueryMatchQuery $ mkMatchQuery (FieldName "_all") (QueryString "haskell")
569 let query = QueryMatchQuery $ mkMatchQuery (FieldName "_all") (QueryString "haskell")
@@ -539,7 +571,8 @@ main = hspec $ do
540 let search = mkHighlightSearch (Just query) testHighlight
572 let search = mkHighlightSearch (Just query) testHighlight
541 myHighlight <- searchTweetHighlight search
573 myHighlight <- searchTweetHighlight search
542− myHighlight `shouldBe` Right Nothing
575+ myHighlight `shouldBe` Right Nothing