197 lines
3.9 KiB
Go
197 lines
3.9 KiB
Go
package search
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"testing"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/stretchr/testify/assert"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestIndex(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
entry := &WorkflowEntry{
|
||
|
|
ID: "wf-1",
|
||
|
|
Name: "Deploy Service",
|
||
|
|
Status: "completed",
|
||
|
|
Content: "deployment task",
|
||
|
|
}
|
||
|
|
|
||
|
|
err := ws.Index(entry)
|
||
|
|
assert.NoError(t, err)
|
||
|
|
|
||
|
|
retrieved, exists := ws.GetByID("wf-1")
|
||
|
|
assert.True(t, exists)
|
||
|
|
assert.Equal(t, "Deploy Service", retrieved.Name)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestSearch(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{
|
||
|
|
ID: "wf-1",
|
||
|
|
Name: "Deploy Service",
|
||
|
|
Content: "deployment production",
|
||
|
|
})
|
||
|
|
ws.Index(&WorkflowEntry{
|
||
|
|
ID: "wf-2",
|
||
|
|
Name: "Build Docker",
|
||
|
|
Content: "docker image",
|
||
|
|
})
|
||
|
|
|
||
|
|
results := ws.Search("deployment")
|
||
|
|
assert.Equal(t, 1, len(results))
|
||
|
|
assert.Equal(t, "wf-1", results[0].ID)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestFilterByStatus(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-1", Status: "completed"})
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-2", Status: "running"})
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-3", Status: "completed"})
|
||
|
|
|
||
|
|
results := ws.FilterByStatus("completed")
|
||
|
|
assert.Equal(t, 2, len(results))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestFilterByAssignee(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-1", Assignee: "alice"})
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-2", Assignee: "bob"})
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-3", Assignee: "alice"})
|
||
|
|
|
||
|
|
results := ws.FilterByAssignee("alice")
|
||
|
|
assert.Equal(t, 2, len(results))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestFilterByTag(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{
|
||
|
|
ID: "wf-1",
|
||
|
|
Tags: []string{"production", "critical"},
|
||
|
|
})
|
||
|
|
ws.Index(&WorkflowEntry{
|
||
|
|
ID: "wf-2",
|
||
|
|
Tags: []string{"staging"},
|
||
|
|
})
|
||
|
|
|
||
|
|
results := ws.FilterByTag("production")
|
||
|
|
assert.Equal(t, 1, len(results))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestFilterByDateRange(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
now := time.Now()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{
|
||
|
|
ID: "wf-1",
|
||
|
|
CreatedAt: now.Add(-1 * time.Hour),
|
||
|
|
})
|
||
|
|
ws.Index(&WorkflowEntry{
|
||
|
|
ID: "wf-2",
|
||
|
|
CreatedAt: now.Add(-24 * time.Hour),
|
||
|
|
})
|
||
|
|
|
||
|
|
results := ws.FilterByDateRange(now.Add(-2*time.Hour), now)
|
||
|
|
assert.Equal(t, 1, len(results))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestSearchRegex(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{
|
||
|
|
ID: "wf-1",
|
||
|
|
Content: "error 404 not found",
|
||
|
|
})
|
||
|
|
ws.Index(&WorkflowEntry{
|
||
|
|
ID: "wf-2",
|
||
|
|
Content: "success 200 ok",
|
||
|
|
})
|
||
|
|
|
||
|
|
results, err := ws.SearchRegex("error.*404")
|
||
|
|
assert.NoError(t, err)
|
||
|
|
assert.Equal(t, 1, len(results))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestSaveAndGetFilter(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
filter := map[string]interface{}{"status": "completed"}
|
||
|
|
ws.SaveFilter("completed-only", filter)
|
||
|
|
|
||
|
|
retrieved, exists := ws.GetFilter("completed-only")
|
||
|
|
assert.True(t, exists)
|
||
|
|
assert.NotNil(t, retrieved)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestGetAll(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-1"})
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-2"})
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-3"})
|
||
|
|
|
||
|
|
all := ws.GetAll()
|
||
|
|
assert.Equal(t, 3, len(all))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestDelete(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-1"})
|
||
|
|
ws.Delete("wf-1")
|
||
|
|
|
||
|
|
_, exists := ws.GetByID("wf-1")
|
||
|
|
assert.False(t, exists)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestClear(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-1"})
|
||
|
|
ws.Index(&WorkflowEntry{ID: "wf-2"})
|
||
|
|
ws.Clear()
|
||
|
|
|
||
|
|
all := ws.GetAll()
|
||
|
|
assert.Equal(t, 0, len(all))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestMultiwordSearch(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{
|
||
|
|
ID: "wf-1",
|
||
|
|
Content: "deploy service to production",
|
||
|
|
})
|
||
|
|
|
||
|
|
results := ws.Search("deploy service")
|
||
|
|
assert.Equal(t, 1, len(results))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestCaseSensitivity(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
ws.Index(&WorkflowEntry{
|
||
|
|
ID: "wf-1",
|
||
|
|
Content: "Deploy Service Production",
|
||
|
|
})
|
||
|
|
|
||
|
|
results := ws.Search("deploy")
|
||
|
|
assert.Equal(t, 1, len(results))
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestIndexError(t *testing.T) {
|
||
|
|
ws := NewWorkflowSearch()
|
||
|
|
|
||
|
|
entry := &WorkflowEntry{
|
||
|
|
Name: "No ID",
|
||
|
|
}
|
||
|
|
|
||
|
|
err := ws.Index(entry)
|
||
|
|
assert.Error(t, err)
|
||
|
|
}
|