You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
7.2 KiB
280 lines
7.2 KiB
// 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) |
|
} |
|
}
|
|
|