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

369 lines
7.7 KiB
Go

package index
import (
"context"
"testing"
"time"
)
// TestDocumentIntegration tests complete document lifecycle.
func TestDocumentIntegration(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-doc-integration"
// Setup index
err := CreateIndex(ctx, c, indexName, nil)
if err != nil {
t.Fatalf("setup: CreateIndex() error = %v", err)
}
defer func() {
_ = DeleteIndex(ctx, c, indexName)
}()
var docID string
// Test 1: Index document
t.Run("IndexDocument", func(t *testing.T) {
doc := &Document{
Source: map[string]any{
"title": "Test Document",
"content": "This is a test",
"count": 42,
},
}
id, err := IndexDocument(ctx, c, indexName, doc)
if err != nil {
t.Fatalf("IndexDocument() error = %v", err)
}
if id == "" {
t.Error("IndexDocument() returned empty ID")
}
docID = id
t.Logf("Document indexed with ID: %s", docID)
})
// Test 2: Get document
t.Run("GetDocument", func(t *testing.T) {
doc, err := GetDocument(ctx, c, indexName, docID)
if err != nil {
t.Fatalf("GetDocument() error = %v", err)
}
if doc.ID != docID {
t.Errorf("GetDocument() ID = %q, want %q", doc.ID, docID)
}
if doc.Source["title"] != "Test Document" {
t.Errorf("GetDocument() title = %v, want %v", doc.Source["title"], "Test Document")
}
t.Logf("Retrieved document: %s", doc.ID)
})
// Test 3: Update document
t.Run("UpdateDocument", func(t *testing.T) {
updates := map[string]any{
"title": "Updated Document",
"count": 100,
}
err := UpdateDocument(ctx, c, indexName, docID, updates)
if err != nil {
t.Fatalf("UpdateDocument() error = %v", err)
}
// Verify update
doc, err := GetDocument(ctx, c, indexName, docID)
if err != nil {
t.Fatalf("GetDocument() error = %v", err)
}
if doc.Source["title"] != "Updated Document" {
t.Errorf("Updated title = %v, want %v", doc.Source["title"], "Updated Document")
}
t.Log("Document updated successfully")
})
// Test 4: Delete document
t.Run("DeleteDocument", func(t *testing.T) {
err := DeleteDocument(ctx, c, indexName, docID)
if err != nil {
t.Fatalf("DeleteDocument() error = %v", err)
}
// Verify deletion
_, err = GetDocument(ctx, c, indexName, docID)
if err != ErrDocumentNotFound {
t.Errorf("GetDocument() error = %v, want %v", err, ErrDocumentNotFound)
}
t.Log("Document deleted successfully")
})
}
func TestBulkIndexDocuments(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-bulk-index"
// Setup index
err := CreateIndex(ctx, c, indexName, nil)
if err != nil {
t.Fatalf("setup: CreateIndex() error = %v", err)
}
defer func() {
_ = DeleteIndex(ctx, c, indexName)
}()
// Create multiple documents
docs := []*Document{
{
ID: "doc1",
Source: map[string]any{
"title": "Document 1",
"value": 1,
},
},
{
ID: "doc2",
Source: map[string]any{
"title": "Document 2",
"value": 2,
},
},
{
ID: "doc3",
Source: map[string]any{
"title": "Document 3",
"value": 3,
},
},
}
err = BulkIndexDocuments(ctx, c, indexName, docs)
if err != nil {
t.Fatalf("BulkIndexDocuments() error = %v", err)
}
// Verify all documents were indexed
for _, doc := range docs {
retrieved, err := GetDocument(ctx, c, indexName, doc.ID)
if err != nil {
t.Errorf("GetDocument(%s) error = %v", doc.ID, err)
continue
}
if retrieved.Source["title"] != doc.Source["title"] {
t.Errorf("Document %s title = %v, want %v", doc.ID, retrieved.Source["title"], doc.Source["title"])
}
}
t.Logf("BulkIndexDocuments succeeded: indexed %d documents", len(docs))
}
func TestIndexDocument(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-index-document"
// 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)
}()
doc := &Document{
Source: map[string]any{
"field1": "value1",
"field2": 123,
},
}
id, err := IndexDocument(ctx, c, indexName, doc)
if err != nil {
t.Fatalf("IndexDocument() error = %v", err)
}
if id == "" {
t.Error("IndexDocument() returned empty ID")
}
t.Logf("IndexDocument succeeded: %s", id)
}
func TestGetDocument(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-document"
// 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)
}()
// Index a document
doc := &Document{
ID: "test-doc",
Source: map[string]any{
"test": "data",
},
}
_, err = IndexDocument(ctx, c, indexName, doc)
if err != nil {
t.Fatalf("setup: IndexDocument() error = %v", err)
}
// Test getting the document
retrieved, err := GetDocument(ctx, c, indexName, "test-doc")
if err != nil {
t.Fatalf("GetDocument() error = %v", err)
}
if retrieved.ID != "test-doc" {
t.Errorf("GetDocument() ID = %q, want %q", retrieved.ID, "test-doc")
}
t.Logf("GetDocument succeeded: %s", retrieved.ID)
}
func TestUpdateDocument(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-update-document"
// 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)
}()
// Index a document
doc := &Document{
ID: "test-doc",
Source: map[string]any{
"value": 1,
},
}
_, err = IndexDocument(ctx, c, indexName, doc)
if err != nil {
t.Fatalf("setup: IndexDocument() error = %v", err)
}
// Test update
updates := map[string]any{
"value": 2,
}
err = UpdateDocument(ctx, c, indexName, "test-doc", updates)
if err != nil {
t.Fatalf("UpdateDocument() error = %v", err)
}
t.Log("UpdateDocument succeeded")
}
func TestDeleteDocument(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-document"
// 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)
}()
// Index a document
doc := &Document{
ID: "test-doc",
Source: map[string]any{
"test": "data",
},
}
_, err = IndexDocument(ctx, c, indexName, doc)
if err != nil {
t.Fatalf("setup: IndexDocument() error = %v", err)
}
// Test deletion
err = DeleteDocument(ctx, c, indexName, "test-doc")
if err != nil {
t.Fatalf("DeleteDocument() error = %v", err)
}
t.Log("DeleteDocument succeeded")
}