Ctrl K
ComunidadGuías…

internal/memory/read_command_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package memory_test

import (
	"bytes"
	"context"
	"encoding/json"
	"os"
	"strings"
	"testing"

	"github.com/yeomyeonggeori/blueclaw/internal/memory"
	"github.com/yeomyeonggeori/blueclaw/internal/memory/memorytest"
	"github.com/yeomyeonggeori/bluememo"
	"github.com/yeomyeonggeori/bluememo/bluememotest"
)

func TestAReadAnswersFromTheFileWithNothingButACarriedVector(t *testing.T) {
	stores := memorytest.Open(t)
	scope := memory.PersonScope("person-1")
	memorytest.Remember(t, stores, scope, "박예시 keeps the quarterly ledger")

	result := readFrom(t, stores, scope, "who keeps the ledger")

	if len(result.Memories) == 0 {
		t.Fatal("a read of a store that holds a memory returned none")
	}
	if !strings.Contains(result.Memories[0].Memory.Content, "ledger") {
		t.Fatalf("a read answered with something else: %q", result.Memories[0].Memory.Content)
	}
}

func TestAFileTheReadCannotOpenFailsRatherThanLookingEmpty(t *testing.T) {
	if os.Geteuid() == 0 {
		t.Skip("root opens every file, so the kernel decides nothing here")
	}
	stores := memorytest.Open(t)
	scope := memory.PersonScope("person-1")
	memorytest.Remember(t, stores, scope, "박예시 keeps the quarterly ledger")
	path := pathOf(t, stores, scope)
	if errorValue := stores.Close(); errorValue != nil {
		t.Fatalf("close: %v", errorValue)
	}
	if errorValue := os.Chmod(path, 0o000); errorValue != nil {
		t.Fatalf("chmod: %v", errorValue)
	}
	t.Cleanup(func() { _ = os.Chmod(path, 0o600) })

	var output bytes.Buffer
	errorValue := memory.RunRead(context.Background(), requestFor(t, path, "who keeps the ledger"), &output)

	if errorValue == nil {
		t.Fatalf("a read of a file this process may not open reported success: %s", output.String())
	}
	if output.Len() != 0 {
		t.Fatalf("a refused read still wrote a result: %s", output.String())
	}
}

func TestAReadWithoutAPathOrAVectorIsRefused(t *testing.T) {
	for name, request := range map[string]memory.ReadRequest{
		"no path":   {QueryVector: []float32{0.1}},
		"no vector": {StorePaths: []string{"/tmp/absent.db"}},
	} {
		t.Run(name, func(t *testing.T) {
			encoded, errorValue := json.Marshal(request)
			if errorValue != nil {
				t.Fatalf("marshal: %v", errorValue)
			}
			if errorValue := memory.RunRead(context.Background(), bytes.NewReader(encoded), &bytes.Buffer{}); errorValue == nil {
				t.Fatal("an incomplete read request was accepted")
			}
		})
	}
}

func readFrom(t *testing.T, stores *memory.Stores, scope memory.Scope, query string) bluememo.RecallResult {
	t.Helper()
	var output bytes.Buffer
	if errorValue := memory.RunRead(context.Background(), requestFor(t, pathOf(t, stores, scope), query), &output); errorValue != nil {
		t.Fatalf("read: %v", errorValue)
	}
	var result memory.ReadResult
	if errorValue := json.Unmarshal(output.Bytes(), &result); errorValue != nil {
		t.Fatalf("decode read result: %v", errorValue)
	}
	return result.Recall
}

func pathOf(t *testing.T, stores *memory.Stores, scope memory.Scope) string {
	t.Helper()
	path, errorValue := stores.Path(scope)
	if errorValue != nil {
		t.Fatalf("path for %v: %v", scope, errorValue)
	}
	return path
}

func requestFor(t *testing.T, path string, query string) *bytes.Reader {
	t.Helper()
	vector, errorValue := (&bluememotest.HashEmbedder{}).EmbedQuery(context.Background(), query)
	if errorValue != nil {
		t.Fatalf("embed the query: %v", errorValue)
	}
	encoded, errorValue := json.Marshal(memory.ReadRequest{
		StorePaths:     []string{path},
		Query:          query,
		QueryVector:    vector,
		EmbeddingModel: "test-embed",
		Limit:          10,
	})
	if errorValue != nil {
		t.Fatalf("marshal the read request: %v", errorValue)
	}
	return bytes.NewReader(encoded)
}