281 lines
7.2 KiB
Go
281 lines
7.2 KiB
Go
// Copyright 2012-present Oliver Eilhard. All rights reserved.
|
|
// Use of this source code is governed by a MIT-license.
|
|
// See http://olivere.mit-license.org/license.txt for details.
|
|
|
|
package elastic
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
func TestIndexLifecycle(t *testing.T) {
|
|
client := setupTestClientAndCreateIndex(t)
|
|
|
|
tweet1 := tweet{User: "olivere", Message: "Welcome to Golang and Elasticsearch."}
|
|
|
|
// Add a document
|
|
indexResult, err := client.Index().
|
|
Index(testIndexName).
|
|
Type("tweet").
|
|
Id("1").
|
|
BodyJson(&tweet1).
|
|
Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if indexResult == nil {
|
|
t.Errorf("expected result to be != nil; got: %v", indexResult)
|
|
}
|
|
|
|
// Exists
|
|
exists, err := client.Exists().Index(testIndexName).Type("tweet").Id("1").Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !exists {
|
|
t.Errorf("expected exists %v; got %v", true, exists)
|
|
}
|
|
|
|
// Get document
|
|
getResult, err := client.Get().
|
|
Index(testIndexName).
|
|
Type("tweet").
|
|
Id("1").
|
|
Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if getResult.Index != testIndexName {
|
|
t.Errorf("expected GetResult.Index %q; got %q", testIndexName, getResult.Index)
|
|
}
|
|
if getResult.Type != "tweet" {
|
|
t.Errorf("expected GetResult.Type %q; got %q", "tweet", getResult.Type)
|
|
}
|
|
if getResult.Id != "1" {
|
|
t.Errorf("expected GetResult.Id %q; got %q", "1", getResult.Id)
|
|
}
|
|
if getResult.Source == nil {
|
|
t.Errorf("expected GetResult.Source to be != nil; got nil")
|
|
}
|
|
|
|
// Decode the Source field
|
|
var tweetGot tweet
|
|
err = json.Unmarshal(*getResult.Source, &tweetGot)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tweetGot.User != tweet1.User {
|
|
t.Errorf("expected Tweet.User to be %q; got %q", tweet1.User, tweetGot.User)
|
|
}
|
|
if tweetGot.Message != tweet1.Message {
|
|
t.Errorf("expected Tweet.Message to be %q; got %q", tweet1.Message, tweetGot.Message)
|
|
}
|
|
|
|
// Delete document again
|
|
deleteResult, err := client.Delete().Index(testIndexName).Type("tweet").Id("1").Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if deleteResult == nil {
|
|
t.Errorf("expected result to be != nil; got: %v", deleteResult)
|
|
}
|
|
|
|
// Exists
|
|
exists, err = client.Exists().Index(testIndexName).Type("tweet").Id("1").Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if exists {
|
|
t.Errorf("expected exists %v; got %v", false, exists)
|
|
}
|
|
}
|
|
|
|
func TestIndexLifecycleWithAutomaticIDGeneration(t *testing.T) {
|
|
client := setupTestClientAndCreateIndex(t)
|
|
|
|
tweet1 := tweet{User: "olivere", Message: "Welcome to Golang and Elasticsearch."}
|
|
|
|
// Add a document
|
|
indexResult, err := client.Index().
|
|
Index(testIndexName).
|
|
Type("tweet").
|
|
BodyJson(&tweet1).
|
|
Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if indexResult == nil {
|
|
t.Errorf("expected result to be != nil; got: %v", indexResult)
|
|
}
|
|
if indexResult.Id == "" {
|
|
t.Fatalf("expected Es to generate an automatic ID, got: %v", indexResult.Id)
|
|
}
|
|
id := indexResult.Id
|
|
|
|
// Exists
|
|
exists, err := client.Exists().Index(testIndexName).Type("tweet").Id(id).Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !exists {
|
|
t.Errorf("expected exists %v; got %v", true, exists)
|
|
}
|
|
|
|
// Get document
|
|
getResult, err := client.Get().
|
|
Index(testIndexName).
|
|
Type("tweet").
|
|
Id(id).
|
|
Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if getResult.Index != testIndexName {
|
|
t.Errorf("expected GetResult.Index %q; got %q", testIndexName, getResult.Index)
|
|
}
|
|
if getResult.Type != "tweet" {
|
|
t.Errorf("expected GetResult.Type %q; got %q", "tweet", getResult.Type)
|
|
}
|
|
if getResult.Id != id {
|
|
t.Errorf("expected GetResult.Id %q; got %q", id, getResult.Id)
|
|
}
|
|
if getResult.Source == nil {
|
|
t.Errorf("expected GetResult.Source to be != nil; got nil")
|
|
}
|
|
|
|
// Decode the Source field
|
|
var tweetGot tweet
|
|
err = json.Unmarshal(*getResult.Source, &tweetGot)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if tweetGot.User != tweet1.User {
|
|
t.Errorf("expected Tweet.User to be %q; got %q", tweet1.User, tweetGot.User)
|
|
}
|
|
if tweetGot.Message != tweet1.Message {
|
|
t.Errorf("expected Tweet.Message to be %q; got %q", tweet1.Message, tweetGot.Message)
|
|
}
|
|
|
|
// Delete document again
|
|
deleteResult, err := client.Delete().Index(testIndexName).Type("tweet").Id(id).Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if deleteResult == nil {
|
|
t.Errorf("expected result to be != nil; got: %v", deleteResult)
|
|
}
|
|
|
|
// Exists
|
|
exists, err = client.Exists().Index(testIndexName).Type("tweet").Id(id).Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if exists {
|
|
t.Errorf("expected exists %v; got %v", false, exists)
|
|
}
|
|
}
|
|
|
|
func TestIndexValidate(t *testing.T) {
|
|
client := setupTestClient(t)
|
|
|
|
tweet := tweet{User: "olivere", Message: "Welcome to Golang and Elasticsearch."}
|
|
|
|
// No index name -> fail with error
|
|
res, err := NewIndexService(client).Type("tweet").Id("1").BodyJson(&tweet).Do(context.TODO())
|
|
if err == nil {
|
|
t.Fatalf("expected Index to fail without index name")
|
|
}
|
|
if res != nil {
|
|
t.Fatalf("expected result to be == nil; got: %v", res)
|
|
}
|
|
|
|
// No index name -> fail with error
|
|
res, err = NewIndexService(client).Index(testIndexName).Id("1").BodyJson(&tweet).Do(context.TODO())
|
|
if err == nil {
|
|
t.Fatalf("expected Index to fail without type")
|
|
}
|
|
if res != nil {
|
|
t.Fatalf("expected result to be == nil; got: %v", res)
|
|
}
|
|
}
|
|
|
|
func TestIndexCreateExistsOpenCloseDelete(t *testing.T) {
|
|
// TODO: Find out how to make these test robust
|
|
t.Skip("test fails regularly with 409 (Conflict): " +
|
|
"IndexPrimaryShardNotAllocatedException[[elastic-test] " +
|
|
"primary not allocated post api... skipping")
|
|
|
|
client := setupTestClient(t)
|
|
|
|
// Create index
|
|
createIndex, err := client.CreateIndex(testIndexName).Body(testMapping).Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if createIndex == nil {
|
|
t.Fatalf("expected response; got: %v", createIndex)
|
|
}
|
|
if !createIndex.Acknowledged {
|
|
t.Errorf("expected ack for creating index; got: %v", createIndex.Acknowledged)
|
|
}
|
|
|
|
// Exists
|
|
indexExists, err := client.IndexExists(testIndexName).Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !indexExists {
|
|
t.Fatalf("expected index exists=%v; got %v", true, indexExists)
|
|
}
|
|
|
|
// Flush
|
|
_, err = client.Flush().Index(testIndexName).Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Close index
|
|
closeIndex, err := client.CloseIndex(testIndexName).Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if closeIndex == nil {
|
|
t.Fatalf("expected response; got: %v", closeIndex)
|
|
}
|
|
if !closeIndex.Acknowledged {
|
|
t.Errorf("expected ack for closing index; got: %v", closeIndex.Acknowledged)
|
|
}
|
|
|
|
// Open index
|
|
openIndex, err := client.OpenIndex(testIndexName).Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if openIndex == nil {
|
|
t.Fatalf("expected response; got: %v", openIndex)
|
|
}
|
|
if !openIndex.Acknowledged {
|
|
t.Errorf("expected ack for opening index; got: %v", openIndex.Acknowledged)
|
|
}
|
|
|
|
// Flush
|
|
_, err = client.Flush().Index(testIndexName).Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Delete index
|
|
deleteIndex, err := client.DeleteIndex(testIndexName).Do(context.TODO())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if deleteIndex == nil {
|
|
t.Fatalf("expected response; got: %v", deleteIndex)
|
|
}
|
|
if !deleteIndex.Acknowledged {
|
|
t.Errorf("expected ack for deleting index; got %v", deleteIndex.Acknowledged)
|
|
}
|
|
}
|