Files
es-demo/operations/index/index_test.go

298 lines
6.3 KiB
Go

package index
import (
"context"
"testing"
"time"
)
// TestIndexIntegration tests complete index lifecycle.
func TestIndexIntegration(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
c := setupIntegrationTest(t)
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
defer cancel()
indexName := "test-index-integration"
// Cleanup before and after test
_ = DeleteIndex(ctx, c, indexName)
defer func() {
_ = DeleteIndex(ctx, c, indexName)
}()
// Test 1: Create index
t.Run("CreateIndex", func(t *testing.T) {
config := &IndexConfig{
Settings: &IndexSettings{
NumberOfShards: 1,
NumberOfReplicas: 0,
},
Mappings: map[string]any{
"properties": map[string]any{
"title": map[string]any{
"type": "text",
},
"count": map[string]any{
"type": "integer",
},
},
},
}
err := CreateIndex(ctx, c, indexName, config)
if err != nil {
t.Fatalf("CreateIndex() error = %v", err)
}
t.Log("Index created successfully")
})
// Test 2: Index exists
t.Run("IndexExists", func(t *testing.T) {
exists, err := IndexExists(ctx, c, indexName)
if err != nil {
t.Fatalf("IndexExists() error = %v", err)
}
if !exists {
t.Error("IndexExists() = false, want true")
}
t.Log("Index exists check passed")
})
// Test 3: Get index
t.Run("GetIndex", func(t *testing.T) {
info, err := GetIndex(ctx, c, indexName)
if err != nil {
t.Fatalf("GetIndex() error = %v", err)
}
if info.Name != indexName {
t.Errorf("GetIndex() name = %q, want %q", info.Name, indexName)
}
t.Logf("Retrieved index: %s", info.Name)
})
// Test 4: List indices
t.Run("ListIndices", func(t *testing.T) {
indices, err := ListIndices(ctx, c, "test-*")
if err != nil {
t.Fatalf("ListIndices() error = %v", err)
}
found := false
for _, idx := range indices {
if idx == indexName {
found = true
break
}
}
if !found {
t.Errorf("Index %q not found in list", indexName)
}
t.Logf("Found %d indices", len(indices))
})
// Test 5: Delete index
t.Run("DeleteIndex", func(t *testing.T) {
err := DeleteIndex(ctx, c, indexName)
if err != nil {
t.Fatalf("DeleteIndex() error = %v", err)
}
// Verify deletion
exists, err := IndexExists(ctx, c, indexName)
if err != nil {
t.Fatalf("IndexExists() error = %v", err)
}
if exists {
t.Error("Index still exists after deletion")
}
t.Log("Index deleted successfully")
})
}
func TestCreateIndex(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
c := setupIntegrationTest(t)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
indexName := "test-create-index"
defer func() {
_ = DeleteIndex(ctx, c, indexName)
}()
config := &IndexConfig{
Settings: &IndexSettings{
NumberOfShards: 1,
NumberOfReplicas: 0,
},
}
err := CreateIndex(ctx, c, indexName, config)
if err != nil {
t.Fatalf("CreateIndex() error = %v", err)
}
t.Log("CreateIndex succeeded")
}
func TestGetIndex(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
c := setupIntegrationTest(t)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
indexName := "test-get-index"
// Cleanup any existing index first
_ = DeleteIndex(ctx, c, indexName)
// Setup
err := CreateIndex(ctx, c, indexName, nil)
if err != nil {
t.Fatalf("setup: CreateIndex() error = %v", err)
}
defer func() {
_ = DeleteIndex(ctx, c, indexName)
}()
// Test getting the index
info, err := GetIndex(ctx, c, indexName)
if err != nil {
t.Fatalf("GetIndex() error = %v", err)
}
if info.Name != indexName {
t.Errorf("GetIndex() name = %q, want %q", info.Name, indexName)
}
t.Logf("GetIndex succeeded: %s", info.Name)
}
func TestDeleteIndex(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
c := setupIntegrationTest(t)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
indexName := "test-delete-index"
// Create index
err := CreateIndex(ctx, c, indexName, nil)
if err != nil {
t.Fatalf("setup: CreateIndex() error = %v", err)
}
// Test deletion
err = DeleteIndex(ctx, c, indexName)
if err != nil {
t.Fatalf("DeleteIndex() error = %v", err)
}
t.Log("DeleteIndex succeeded")
}
func TestIndexExists(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
c := setupIntegrationTest(t)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
indexName := "test-exists-index"
// Test non-existent index
exists, err := IndexExists(ctx, c, indexName)
if err != nil {
t.Fatalf("IndexExists() error = %v", err)
}
if exists {
t.Error("IndexExists() = true for non-existent index")
}
// Create index
err = CreateIndex(ctx, c, indexName, nil)
if err != nil {
t.Fatalf("setup: CreateIndex() error = %v", err)
}
defer func() {
_ = DeleteIndex(ctx, c, indexName)
}()
// Test existing index
exists, err = IndexExists(ctx, c, indexName)
if err != nil {
t.Fatalf("IndexExists() error = %v", err)
}
if !exists {
t.Error("IndexExists() = false for existing index")
}
t.Log("IndexExists succeeded")
}
func TestListIndices(t *testing.T) {
if testing.Short() {
t.Skip("skipping integration test in short mode")
}
c := setupIntegrationTest(t)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
indices, err := ListIndices(ctx, c, "*")
if err != nil {
t.Fatalf("ListIndices() error = %v", err)
}
if indices == nil {
t.Error("ListIndices() returned nil")
}
t.Logf("ListIndices succeeded: found %d indices", len(indices))
}
// Unit tests for validation
func TestCreateIndex_Validation(t *testing.T) {
ctx := context.Background()
tests := []struct {
name string
indexName string
wantErr error
}{
{
name: "empty index name",
indexName: "",
wantErr: ErrInvalidIndexName,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Pass nil client to only test validation logic
err := CreateIndex(ctx, nil, tt.indexName, nil)
if err != tt.wantErr {
t.Errorf("CreateIndex() error = %v, want %v", err, tt.wantErr)
}
})
}
}