gomcp/internal/application/tools/fact_service_test.go

160 lines
4.3 KiB
Go

package tools
import (
"context"
"testing"
"github.com/syntrex-lab/gomcp/internal/domain/memory"
"github.com/syntrex-lab/gomcp/internal/infrastructure/sqlite"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func newTestFactService(t *testing.T) *FactService {
t.Helper()
db, err := sqlite.OpenMemory()
require.NoError(t, err)
t.Cleanup(func() { db.Close() })
repo, err := sqlite.NewFactRepo(db)
require.NoError(t, err)
return NewFactService(repo, nil)
}
func TestFactService_AddFact(t *testing.T) {
svc := newTestFactService(t)
ctx := context.Background()
fact, err := svc.AddFact(ctx, AddFactParams{
Content: "Go is fast",
Level: 0,
Domain: "core",
Module: "engine",
CodeRef: "main.go:42",
})
require.NoError(t, err)
require.NotNil(t, fact)
assert.Equal(t, "Go is fast", fact.Content)
assert.Equal(t, memory.LevelProject, fact.Level)
assert.Equal(t, "core", fact.Domain)
}
func TestFactService_AddFact_InvalidLevel(t *testing.T) {
svc := newTestFactService(t)
ctx := context.Background()
_, err := svc.AddFact(ctx, AddFactParams{Content: "test", Level: 99})
assert.Error(t, err)
}
func TestFactService_GetFact(t *testing.T) {
svc := newTestFactService(t)
ctx := context.Background()
fact, err := svc.AddFact(ctx, AddFactParams{Content: "test", Level: 0})
require.NoError(t, err)
got, err := svc.GetFact(ctx, fact.ID)
require.NoError(t, err)
assert.Equal(t, fact.ID, got.ID)
}
func TestFactService_UpdateFact(t *testing.T) {
svc := newTestFactService(t)
ctx := context.Background()
fact, err := svc.AddFact(ctx, AddFactParams{Content: "original", Level: 0})
require.NoError(t, err)
newContent := "updated"
updated, err := svc.UpdateFact(ctx, UpdateFactParams{
ID: fact.ID,
Content: &newContent,
})
require.NoError(t, err)
assert.Equal(t, "updated", updated.Content)
}
func TestFactService_DeleteFact(t *testing.T) {
svc := newTestFactService(t)
ctx := context.Background()
fact, err := svc.AddFact(ctx, AddFactParams{Content: "delete me", Level: 0})
require.NoError(t, err)
err = svc.DeleteFact(ctx, fact.ID)
require.NoError(t, err)
_, err = svc.GetFact(ctx, fact.ID)
assert.Error(t, err)
}
func TestFactService_ListFacts_ByDomain(t *testing.T) {
svc := newTestFactService(t)
ctx := context.Background()
_, _ = svc.AddFact(ctx, AddFactParams{Content: "f1", Level: 0, Domain: "backend"})
_, _ = svc.AddFact(ctx, AddFactParams{Content: "f2", Level: 1, Domain: "backend"})
_, _ = svc.AddFact(ctx, AddFactParams{Content: "f3", Level: 0, Domain: "frontend"})
facts, err := svc.ListFacts(ctx, ListFactsParams{Domain: "backend"})
require.NoError(t, err)
assert.Len(t, facts, 2)
}
func TestFactService_SearchFacts(t *testing.T) {
svc := newTestFactService(t)
ctx := context.Background()
_, _ = svc.AddFact(ctx, AddFactParams{Content: "Go concurrency", Level: 0})
_, _ = svc.AddFact(ctx, AddFactParams{Content: "Python is slow", Level: 0})
results, err := svc.SearchFacts(ctx, "Go", 10)
require.NoError(t, err)
assert.Len(t, results, 1)
}
func TestFactService_GetStats(t *testing.T) {
svc := newTestFactService(t)
ctx := context.Background()
_, _ = svc.AddFact(ctx, AddFactParams{Content: "f1", Level: 0, Domain: "core"})
_, _ = svc.AddFact(ctx, AddFactParams{Content: "f2", Level: 1, Domain: "core"})
stats, err := svc.GetStats(ctx)
require.NoError(t, err)
assert.Equal(t, 2, stats.TotalFacts)
}
func TestFactService_GetL0Facts(t *testing.T) {
svc := newTestFactService(t)
ctx := context.Background()
_, _ = svc.AddFact(ctx, AddFactParams{Content: "L0 fact", Level: 0})
_, _ = svc.AddFact(ctx, AddFactParams{Content: "L1 fact", Level: 1})
facts, err := svc.GetL0Facts(ctx)
require.NoError(t, err)
assert.Len(t, facts, 1)
assert.Equal(t, "L0 fact", facts[0].Content)
}
func TestFactService_ListDomains(t *testing.T) {
svc := newTestFactService(t)
ctx := context.Background()
_, _ = svc.AddFact(ctx, AddFactParams{Content: "f1", Level: 0, Domain: "backend"})
_, _ = svc.AddFact(ctx, AddFactParams{Content: "f2", Level: 0, Domain: "frontend"})
domains, err := svc.ListDomains(ctx)
require.NoError(t, err)
assert.Len(t, domains, 2)
}
func TestToJSON(t *testing.T) {
result := ToJSON(map[string]string{"key": "value"})
assert.Contains(t, result, "\"key\"")
assert.Contains(t, result, "\"value\"")
}