- Updated the CitationGenerator to produce simple integer IDs instead of formatted strings, improving clarity and consistency in citation references. - Enhanced the executeAutoSearch method to save both successful and failed search results, capturing detailed execution data for better traceability. - Introduced a new SearchExecutionResult type to structure search result data, including query, keywords, configuration, duration, and error information. - Updated related tests to reflect changes in citation ID format and ensure proper functionality of the new storage mechanisms. - Revised documentation to clarify the new citation format and search result handling processes.
134 lines
2.4 KiB
Go
134 lines
2.4 KiB
Go
package search
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestCitationGenerator_Next(t *testing.T) {
|
|
gen := NewCitationGenerator()
|
|
|
|
// First ID should be "1"
|
|
id1 := gen.Next()
|
|
assert.Equal(t, "1", id1)
|
|
|
|
// Second ID should be "2"
|
|
id2 := gen.Next()
|
|
assert.Equal(t, "2", id2)
|
|
|
|
// Third ID should be "3"
|
|
id3 := gen.Next()
|
|
assert.Equal(t, "3", id3)
|
|
}
|
|
|
|
func TestCitationGenerator_NextInt(t *testing.T) {
|
|
gen := NewCitationGenerator()
|
|
|
|
// First ID should be 1
|
|
id1 := gen.NextInt()
|
|
assert.Equal(t, 1, id1)
|
|
|
|
// Second ID should be 2
|
|
id2 := gen.NextInt()
|
|
assert.Equal(t, 2, id2)
|
|
}
|
|
|
|
func TestCitationGenerator_Current(t *testing.T) {
|
|
gen := NewCitationGenerator()
|
|
|
|
// Initial should be 0
|
|
assert.Equal(t, 0, gen.Current())
|
|
|
|
// After one Next, should be 1
|
|
gen.Next()
|
|
assert.Equal(t, 1, gen.Current())
|
|
|
|
// Current doesn't increment
|
|
assert.Equal(t, 1, gen.Current())
|
|
}
|
|
|
|
func TestCitationGenerator_Reset(t *testing.T) {
|
|
gen := NewCitationGenerator()
|
|
|
|
// Generate some IDs
|
|
gen.Next()
|
|
gen.Next()
|
|
gen.Next()
|
|
|
|
// Reset
|
|
gen.Reset()
|
|
|
|
// Next ID should be "1" again
|
|
id := gen.Next()
|
|
assert.Equal(t, "1", id)
|
|
}
|
|
|
|
func TestCitationGenerator_LargeNumbers(t *testing.T) {
|
|
gen := NewCitationGenerator()
|
|
|
|
// Generate 999 IDs
|
|
for i := 0; i < 999; i++ {
|
|
gen.Next()
|
|
}
|
|
|
|
// 1000th ID should be "1000"
|
|
id := gen.Next()
|
|
assert.Equal(t, "1000", id)
|
|
}
|
|
|
|
func TestCitationGenerator_Concurrent(t *testing.T) {
|
|
gen := NewCitationGenerator()
|
|
|
|
// Run 100 goroutines, each generating 10 IDs
|
|
var wg sync.WaitGroup
|
|
ids := make(chan string, 1000)
|
|
|
|
for i := 0; i < 100; i++ {
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
for j := 0; j < 10; j++ {
|
|
ids <- gen.Next()
|
|
}
|
|
}()
|
|
}
|
|
|
|
wg.Wait()
|
|
close(ids)
|
|
|
|
// Collect all IDs
|
|
idSet := make(map[string]bool)
|
|
for id := range ids {
|
|
idSet[id] = true
|
|
}
|
|
|
|
// All 1000 IDs should be unique
|
|
assert.Equal(t, 1000, len(idSet))
|
|
}
|
|
|
|
func TestNewCitationGenerator(t *testing.T) {
|
|
gen := NewCitationGenerator()
|
|
assert.NotNil(t, gen)
|
|
}
|
|
|
|
func TestUint64ToString(t *testing.T) {
|
|
tests := []struct {
|
|
input uint64
|
|
expected string
|
|
}{
|
|
{0, "0"},
|
|
{1, "1"},
|
|
{10, "10"},
|
|
{100, "100"},
|
|
{999, "999"},
|
|
{1000, "1000"},
|
|
{18446744073709551615, "18446744073709551615"}, // max uint64
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
result := uint64ToString(tt.input)
|
|
assert.Equal(t, tt.expected, result, "uint64ToString(%d)", tt.input)
|
|
}
|
|
}
|