mirror of
https://github.com/syntrex-lab/gomcp.git
synced 2026-04-24 20:06:21 +02:00
150 lines
4 KiB
Go
150 lines
4 KiB
Go
package resources
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/syntrex-lab/gomcp/internal/domain/memory"
|
|
"github.com/syntrex-lab/gomcp/internal/domain/session"
|
|
"github.com/syntrex-lab/gomcp/internal/infrastructure/sqlite"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func newTestProvider(t *testing.T) (*Provider, *sqlite.DB, *sqlite.DB) {
|
|
t.Helper()
|
|
|
|
factDB, err := sqlite.OpenMemory()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() { factDB.Close() })
|
|
|
|
stateDB, err := sqlite.OpenMemory()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() { stateDB.Close() })
|
|
|
|
factRepo, err := sqlite.NewFactRepo(factDB)
|
|
require.NoError(t, err)
|
|
|
|
stateRepo, err := sqlite.NewStateRepo(stateDB)
|
|
require.NoError(t, err)
|
|
|
|
return NewProvider(factRepo, stateRepo), factDB, stateDB
|
|
}
|
|
|
|
func TestNewProvider(t *testing.T) {
|
|
p, _, _ := newTestProvider(t)
|
|
require.NotNil(t, p)
|
|
assert.NotNil(t, p.factStore)
|
|
assert.NotNil(t, p.stateStore)
|
|
}
|
|
|
|
func TestProvider_GetFacts_Empty(t *testing.T) {
|
|
p, _, _ := newTestProvider(t)
|
|
ctx := context.Background()
|
|
|
|
result, err := p.GetFacts(ctx)
|
|
require.NoError(t, err)
|
|
|
|
var facts []interface{}
|
|
require.NoError(t, json.Unmarshal([]byte(result), &facts))
|
|
assert.Empty(t, facts)
|
|
}
|
|
|
|
func TestProvider_GetFacts_WithData(t *testing.T) {
|
|
p, _, _ := newTestProvider(t)
|
|
ctx := context.Background()
|
|
|
|
// Add L0 facts directly via factStore.
|
|
f1 := memory.NewFact("Project uses Go", memory.LevelProject, "core", "")
|
|
f2 := memory.NewFact("Domain fact", memory.LevelDomain, "backend", "")
|
|
require.NoError(t, p.factStore.Add(ctx, f1))
|
|
require.NoError(t, p.factStore.Add(ctx, f2))
|
|
|
|
result, err := p.GetFacts(ctx)
|
|
require.NoError(t, err)
|
|
|
|
// Should only return L0 facts.
|
|
assert.Contains(t, result, "Project uses Go")
|
|
assert.NotContains(t, result, "Domain fact")
|
|
}
|
|
|
|
func TestProvider_GetStats(t *testing.T) {
|
|
p, _, _ := newTestProvider(t)
|
|
ctx := context.Background()
|
|
|
|
// Add some facts.
|
|
f1 := memory.NewFact("fact1", memory.LevelProject, "core", "")
|
|
f2 := memory.NewFact("fact2", memory.LevelDomain, "core", "")
|
|
require.NoError(t, p.factStore.Add(ctx, f1))
|
|
require.NoError(t, p.factStore.Add(ctx, f2))
|
|
|
|
result, err := p.GetStats(ctx)
|
|
require.NoError(t, err)
|
|
assert.Contains(t, result, "total_facts")
|
|
|
|
var stats map[string]interface{}
|
|
require.NoError(t, json.Unmarshal([]byte(result), &stats))
|
|
assert.Equal(t, float64(2), stats["total_facts"])
|
|
}
|
|
|
|
func TestProvider_GetStats_Empty(t *testing.T) {
|
|
p, _, _ := newTestProvider(t)
|
|
ctx := context.Background()
|
|
|
|
result, err := p.GetStats(ctx)
|
|
require.NoError(t, err)
|
|
|
|
var stats map[string]interface{}
|
|
require.NoError(t, json.Unmarshal([]byte(result), &stats))
|
|
assert.Equal(t, float64(0), stats["total_facts"])
|
|
}
|
|
|
|
func TestProvider_GetState(t *testing.T) {
|
|
p, _, _ := newTestProvider(t)
|
|
ctx := context.Background()
|
|
|
|
// Save a state first.
|
|
state := session.NewCognitiveStateVector("test-session")
|
|
state.SetGoal("Build GoMCP", 0.5)
|
|
state.AddFact("Go 1.25", "requirement", 1.0)
|
|
checksum := state.Checksum()
|
|
require.NoError(t, p.stateStore.Save(ctx, state, checksum))
|
|
|
|
result, err := p.GetState(ctx, "test-session")
|
|
require.NoError(t, err)
|
|
assert.Contains(t, result, "test-session")
|
|
assert.Contains(t, result, "Build GoMCP")
|
|
}
|
|
|
|
func TestProvider_GetState_NotFound(t *testing.T) {
|
|
p, _, _ := newTestProvider(t)
|
|
ctx := context.Background()
|
|
|
|
_, err := p.GetState(ctx, "nonexistent")
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestProvider_GetFacts_JSONFormat(t *testing.T) {
|
|
p, _, _ := newTestProvider(t)
|
|
ctx := context.Background()
|
|
|
|
f := memory.NewFact("JSON test", memory.LevelProject, "test", "")
|
|
require.NoError(t, p.factStore.Add(ctx, f))
|
|
|
|
result, err := p.GetFacts(ctx)
|
|
require.NoError(t, err)
|
|
|
|
// Should be valid indented JSON.
|
|
assert.True(t, json.Valid([]byte(result)))
|
|
assert.Contains(t, result, "\n") // Indented.
|
|
}
|
|
|
|
func TestProvider_GetStats_JSONFormat(t *testing.T) {
|
|
p, _, _ := newTestProvider(t)
|
|
ctx := context.Background()
|
|
|
|
result, err := p.GetStats(ctx)
|
|
require.NoError(t, err)
|
|
assert.True(t, json.Valid([]byte(result)))
|
|
}
|