Umsetzung der Ausbaustufen 2.1, 3.6, 3.8, 3.9, 4.1, 4.2, 4.4, 4.6, 5.1–5.4 (Details in AUSBAUSTUFEN.md). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
82 lines
2 KiB
Go
82 lines
2 KiB
Go
package workspace
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"munin/internal/store"
|
|
)
|
|
|
|
func TestManagerGetCachesAndOpens(t *testing.T) {
|
|
m := NewManager(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(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(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")
|
|
}
|
|
}
|