munin/internal/workspace/workspace_test.go

82 lines
2 KiB
Go

package workspace
import (
"context"
"testing"
"munin/internal/store"
)
func TestManagerGetCachesAndOpens(t *testing.T) {
m := NewManager(store.NewSQLite("", t.TempDir()))
t.Cleanup(func() { m.Close() })
id := store.NewID()
w1, err := m.Get(id)
if err != nil {
t.Fatal(err)
}
if w1.ID != id {
t.Errorf("ID = %q, erwartet %q", w1.ID, id)
}
// Ein zweiter Zugriff auf dieselbe ID muss dieselbe, bereits offene
// Instanz liefern — sonst würde jede Anfrage die Datei neu öffnen und
// den Suchindex neu aufbauen.
w2, err := m.Get(id)
if err != nil {
t.Fatal(err)
}
if w1 != w2 {
t.Error("zweiter Get(id) hat eine neue Instanz geöffnet statt die gecachte zu liefern")
}
// Grundfunktion: Der gelieferte Store lässt sich tatsächlich benutzen.
if _, err := w1.Store.CreateProject(context.Background(), id, "test", "Test", ""); err != nil {
t.Fatal(err)
}
}
func TestManagerGetOpensSeparateFilesPerWorkspace(t *testing.T) {
m := NewManager(store.NewSQLite("", t.TempDir()))
t.Cleanup(func() { m.Close() })
a, err := m.Get(store.NewID())
if err != nil {
t.Fatal(err)
}
b, err := m.Get(store.NewID())
if err != nil {
t.Fatal(err)
}
ctx := context.Background()
if _, err := a.Store.CreateProject(ctx, a.ID, "in-a", "In A", ""); err != nil {
t.Fatal(err)
}
// Strukturelle Trennung: Ein Projekt aus Workspace A darf in Workspace B
// nicht auffindbar sein — sie sind unterschiedliche Dateien.
if _, err := b.Store.ProjectBySlug(ctx, b.ID, "in-a"); err == nil {
t.Error("Projekt aus Workspace A war über Workspace B erreichbar")
}
}
func TestManagerCloseClosesAllOpened(t *testing.T) {
m := NewManager(store.NewSQLite("", t.TempDir()))
w, err := m.Get(store.NewID())
if err != nil {
t.Fatal(err)
}
if err := m.Close(); err != nil {
t.Fatal(err)
}
// Nach dem Schließen darf die Datenbank nicht mehr benutzbar sein.
if _, err := w.Store.CreateProject(context.Background(), w.ID, "zu-spaet", "Zu spät", ""); err == nil {
t.Error("Store nahm nach Manager.Close() noch Schreibvorgänge an")
}
}