85 lines
3.1 KiB
Go
85 lines
3.1 KiB
Go
package notes
|
|
|
|
import (
|
|
"context"
|
|
"git.zb-server.de/Sebi/ssh-netbox-wrapper/internal/netbox"
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
func TestLocalNotesPersistAndStayIsolated(t *testing.T) {
|
|
ctx := context.Background()
|
|
s := &Service{Dir: t.TempDir(), Namespace: "https://netbox.example"}
|
|
host := netbox.HostEntry{Name: "web01", Kind: "device"}
|
|
n := Note{Host: host, Text: "Maintenance\nReady 🔧"}
|
|
if err := s.Write(ctx, n, false); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
reloaded := &Service{Dir: s.Dir, Namespace: s.Namespace}
|
|
got, err := reloaded.Read(ctx, host, false)
|
|
if err != nil || got.Text != n.Text {
|
|
t.Fatalf("round trip: %+v, %v", got, err)
|
|
}
|
|
info, err := os.Stat(s.path(host))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if info.Mode().Perm() != 0o600 {
|
|
t.Fatalf("permissions: %v", info.Mode())
|
|
}
|
|
host.Kind = "vm"
|
|
got, err = s.Read(ctx, host, false)
|
|
if err != nil || got.Text != "" {
|
|
t.Fatalf("kind isolation: %+v, %v", got, err)
|
|
}
|
|
host.Kind = "device"
|
|
reloaded.Namespace = "https://other.example"
|
|
got, err = reloaded.Read(ctx, host, false)
|
|
if err != nil || got.Text != "" {
|
|
t.Fatalf("instance isolation: %+v, %v", got, err)
|
|
}
|
|
}
|
|
|
|
func TestUnreadableNoteIsNotTreatedAsEmpty(t *testing.T) {
|
|
s := &Service{Dir: t.TempDir()}
|
|
host := netbox.HostEntry{Name: "web01", Kind: "vm"}
|
|
if err := os.Mkdir(s.path(host), 0o700); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := s.Read(context.Background(), host, false); err == nil {
|
|
t.Fatal("expected read error")
|
|
}
|
|
}
|
|
|
|
func TestLocalNotesSeparateInstancesAndSurviveRename(t *testing.T) {
|
|
ctx := context.Background()
|
|
client := netbox.NewMultiClient([]netbox.Source{{Name: "office", URL: "https://office.example"}, {Name: "lab", URL: "https://lab.example"}})
|
|
service := &Service{Dir: t.TempDir(), Client: client}
|
|
for _, source := range []string{"office", "lab"} {
|
|
note := Note{Host: netbox.HostEntry{Name: source + "/web", Kind: "device"}, Text: source + " private note"}
|
|
if err := service.Write(ctx, note, false); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
for _, source := range []string{"office", "lab"} {
|
|
note, err := service.Read(ctx, netbox.HostEntry{Name: source + "/web", Kind: "device"}, false)
|
|
if err != nil || note.Text != source+" private note" {
|
|
t.Fatalf("notes crossed instances: %+v, %v", note, err)
|
|
}
|
|
}
|
|
service.Client = netbox.NewMultiClient([]netbox.Source{{Name: "renamed", URL: "https://office.example"}})
|
|
note, err := service.Read(ctx, netbox.HostEntry{Name: "renamed/web", Kind: "device"}, false)
|
|
if err != nil || note.Text != "office private note" {
|
|
t.Fatalf("renaming source lost note: %+v, %v", note, err)
|
|
}
|
|
// This is also the namespace used before migrating a legacy single NetBox.
|
|
legacy := &Service{Dir: service.Dir, Namespace: "https://office.example"}
|
|
note, err = legacy.Read(ctx, netbox.HostEntry{Name: "web", Kind: "device"}, false)
|
|
if err != nil || note.Text != "office private note" {
|
|
t.Fatalf("legacy note namespace changed: %+v, %v", note, err)
|
|
}
|
|
if err := service.Write(ctx, Note{Host: netbox.HostEntry{Name: "web", Kind: "device"}}, false); err == nil {
|
|
t.Fatal("unqualified notes accepted for multiple sources")
|
|
}
|
|
}
|