Improve code search + tests (#663)
Signed-off-by: Thomas Miceli <tho.miceli@gmail.com> Co-authored-by: Qiang Zhou <zhouqiang.loaded@bytedance.com> Co-authored-by: theodoruszq <theodoruszq@gmail.com>
This commit is contained in:
@@ -4,33 +4,31 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// setupBleveIndexer creates a new BleveIndexer for testing
|
||||
func setupBleveIndexer(t *testing.T) (*BleveIndexer, func()) {
|
||||
func setupBleveIndexer(t *testing.T) (Indexer, func()) {
|
||||
zerolog.SetGlobalLevel(zerolog.Disabled)
|
||||
t.Helper()
|
||||
|
||||
// Create a temporary directory for the test index
|
||||
tmpDir, err := os.MkdirTemp("", "bleve-test-*")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create temp directory: %v", err)
|
||||
}
|
||||
require.NoError(t, err)
|
||||
|
||||
indexPath := filepath.Join(tmpDir, "test.index")
|
||||
indexer := NewBleveIndexer(indexPath)
|
||||
|
||||
// Initialize the indexer
|
||||
err = indexer.Init()
|
||||
if err != nil {
|
||||
os.RemoveAll(tmpDir)
|
||||
t.Fatalf("Failed to initialize BleveIndexer: %v", err)
|
||||
}
|
||||
|
||||
// Store in the global atomicIndexer since Add/Remove use it
|
||||
var idx Indexer = indexer
|
||||
atomicIndexer.Store(&idx)
|
||||
|
||||
// Return cleanup function
|
||||
cleanup := func() {
|
||||
atomicIndexer.Store(nil)
|
||||
indexer.Close()
|
||||
@@ -40,124 +38,50 @@ func setupBleveIndexer(t *testing.T) (*BleveIndexer, func()) {
|
||||
return indexer, cleanup
|
||||
}
|
||||
|
||||
func TestBleveIndexerAddGist(t *testing.T) {
|
||||
indexer, cleanup := setupBleveIndexer(t)
|
||||
defer cleanup()
|
||||
func TestBleveAddAndSearch(t *testing.T) { testAddAndSearch(t, setupBleveIndexer) }
|
||||
func TestBleveAccessControl(t *testing.T) { testAccessControl(t, setupBleveIndexer) }
|
||||
func TestBleveMetadataFilters(t *testing.T) { testMetadataFilters(t, setupBleveIndexer) }
|
||||
func TestBleveAllFieldSearch(t *testing.T) { testAllFieldSearch(t, setupBleveIndexer) }
|
||||
func TestBleveFuzzySearch(t *testing.T) { testFuzzySearch(t, setupBleveIndexer) }
|
||||
func TestBleveContentSearch(t *testing.T) { testContentSearch(t, setupBleveIndexer) }
|
||||
func TestBlevePagination(t *testing.T) { testPagination(t, setupBleveIndexer) }
|
||||
func TestBleveLanguageFacets(t *testing.T) { testLanguageFacets(t, setupBleveIndexer) }
|
||||
func TestBleveWildcardSearch(t *testing.T) { testWildcardSearch(t, setupBleveIndexer) }
|
||||
func TestBleveMetadataOnlySearch(t *testing.T) { testMetadataOnlySearch(t, setupBleveIndexer) }
|
||||
func TestBleveTitleFuzzySearch(t *testing.T) { testTitleFuzzySearch(t, setupBleveIndexer) }
|
||||
func TestBleveMultiLanguageFacets(t *testing.T) { testMultiLanguageFacets(t, setupBleveIndexer) }
|
||||
|
||||
testIndexerAddGist(t, indexer)
|
||||
}
|
||||
|
||||
func TestBleveIndexerAllFieldSearch(t *testing.T) {
|
||||
indexer, cleanup := setupBleveIndexer(t)
|
||||
defer cleanup()
|
||||
|
||||
testIndexerAllFieldSearch(t, indexer)
|
||||
}
|
||||
|
||||
func TestBleveIndexerFuzzySearch(t *testing.T) {
|
||||
indexer, cleanup := setupBleveIndexer(t)
|
||||
defer cleanup()
|
||||
|
||||
testIndexerFuzzySearch(t, indexer)
|
||||
}
|
||||
|
||||
func TestBleveIndexerSearchBasic(t *testing.T) {
|
||||
indexer, cleanup := setupBleveIndexer(t)
|
||||
defer cleanup()
|
||||
|
||||
testIndexerSearchBasic(t, indexer)
|
||||
}
|
||||
|
||||
func TestBleveIndexerPagination(t *testing.T) {
|
||||
indexer, cleanup := setupBleveIndexer(t)
|
||||
defer cleanup()
|
||||
|
||||
testIndexerPagination(t, indexer)
|
||||
}
|
||||
|
||||
// TestBleveIndexerInitAndClose tests Bleve-specific initialization and closing
|
||||
func TestBleveIndexerInitAndClose(t *testing.T) {
|
||||
tmpDir, err := os.MkdirTemp("", "bleve-init-test-*")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create temp directory: %v", err)
|
||||
}
|
||||
func TestBlevePersistence(t *testing.T) {
|
||||
tmpDir, err := os.MkdirTemp("", "bleve-persist-test-*")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tmpDir)
|
||||
|
||||
indexPath := filepath.Join(tmpDir, "test.index")
|
||||
indexer := NewBleveIndexer(indexPath)
|
||||
|
||||
// Test initialization
|
||||
err = indexer.Init()
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to initialize BleveIndexer: %v", err)
|
||||
}
|
||||
// Create and populate index
|
||||
indexer1 := NewBleveIndexer(indexPath)
|
||||
require.NoError(t, indexer1.Init())
|
||||
|
||||
if indexer.index == nil {
|
||||
t.Fatal("Expected index to be initialized, got nil")
|
||||
}
|
||||
var idx Indexer = indexer1
|
||||
atomicIndexer.Store(&idx)
|
||||
|
||||
// Test closing
|
||||
indexer.Close()
|
||||
g := newGist(1, 1, 0, "persistent data survives restart")
|
||||
require.NoError(t, indexer1.Add(g))
|
||||
|
||||
// Test reopening the same index
|
||||
indexer1.Close()
|
||||
atomicIndexer.Store(nil)
|
||||
|
||||
// Reopen at same path
|
||||
indexer2 := NewBleveIndexer(indexPath)
|
||||
err = indexer2.Init()
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to reopen BleveIndexer: %v", err)
|
||||
}
|
||||
require.NoError(t, indexer2.Init())
|
||||
defer indexer2.Close()
|
||||
|
||||
if indexer2.index == nil {
|
||||
t.Fatal("Expected reopened index to be initialized, got nil")
|
||||
}
|
||||
}
|
||||
|
||||
// TestBleveIndexerUnicodeSearch tests that Unicode content can be indexed and searched
|
||||
func TestBleveIndexerUnicodeSearch(t *testing.T) {
|
||||
indexer, cleanup := setupBleveIndexer(t)
|
||||
defer cleanup()
|
||||
|
||||
// Add a gist with Unicode content
|
||||
gist := &Gist{
|
||||
GistID: 100,
|
||||
UserID: 100,
|
||||
Visibility: 0,
|
||||
Username: "testuser",
|
||||
Title: "Unicode Test",
|
||||
Description: "Descrition with Unicode characters: Café résumé naive",
|
||||
Content: "Hello world with unicode characters: café résumé naïve",
|
||||
Filenames: []string{"test.txt"},
|
||||
Extensions: []string{".txt"},
|
||||
Languages: []string{"Text"},
|
||||
Topics: []string{"unicode"},
|
||||
CreatedAt: 1234567890,
|
||||
UpdatedAt: 1234567890,
|
||||
}
|
||||
|
||||
err := indexer.Add(gist)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to add gist: %v", err)
|
||||
}
|
||||
|
||||
// Search for unicode content
|
||||
gistIDs, total, _, err := indexer.Search(SearchGistMetadata{All: "café"}, 100, 1)
|
||||
if err != nil {
|
||||
t.Fatalf("Search failed: %v", err)
|
||||
}
|
||||
|
||||
if total == 0 {
|
||||
t.Skip("Unicode search may require specific index configuration")
|
||||
return
|
||||
}
|
||||
|
||||
found := false
|
||||
for _, id := range gistIDs {
|
||||
if id == 100 {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
t.Log("Unicode gist not found in search results, but other results were returned")
|
||||
}
|
||||
idx = indexer2
|
||||
atomicIndexer.Store(&idx)
|
||||
defer atomicIndexer.Store(nil)
|
||||
|
||||
ids, total, _, err := indexer2.Search(SearchGistMetadata{Content: "persistent"}, 1, 1)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, uint64(1), total, "data should survive close+reopen")
|
||||
require.Equal(t, uint(1), ids[0])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user