verstak-desktop/internal/core/filewatcher/service_test.go

87 lines
2.2 KiB
Go

package filewatcher
import (
"os"
"path/filepath"
"testing"
"time"
"github.com/verstak/verstak-desktop/internal/core/events"
)
func TestServicePublishesExternalFileChanges(t *testing.T) {
root := t.TempDir()
bus := events.NewBus()
received := make(chan events.Event, 4)
bus.Subscribe("file.changed", func(event events.Event) {
received <- event
})
service := NewService(bus, 10*time.Millisecond)
if err := service.Start(root); err != nil {
t.Fatalf("Start: %v", err)
}
t.Cleanup(service.Stop)
if err := os.WriteFile(filepath.Join(root, "note.md"), []byte("hello"), 0o644); err != nil {
t.Fatal(err)
}
event := waitForEvent(t, received)
payload, ok := event.Payload.(map[string]interface{})
if !ok {
t.Fatalf("payload type = %T, want map", event.Payload)
}
if event.Name != "file.changed" {
t.Fatalf("event name = %q, want file.changed", event.Name)
}
if payload["path"] != "note.md" {
t.Fatalf("path = %v, want note.md", payload["path"])
}
if payload["operation"] != "external.create" {
t.Fatalf("operation = %v, want external.create", payload["operation"])
}
if payload["type"] != "file" {
t.Fatalf("type = %v, want file", payload["type"])
}
}
func TestServiceIgnoresReservedVerstakPaths(t *testing.T) {
root := t.TempDir()
if err := os.MkdirAll(filepath.Join(root, ".verstak"), 0o755); err != nil {
t.Fatal(err)
}
bus := events.NewBus()
received := make(chan events.Event, 4)
bus.Subscribe("file.changed", func(event events.Event) {
received <- event
})
service := NewService(bus, 10*time.Millisecond)
if err := service.Start(root); err != nil {
t.Fatalf("Start: %v", err)
}
t.Cleanup(service.Stop)
if err := os.WriteFile(filepath.Join(root, ".verstak", "internal.json"), []byte("{}"), 0o644); err != nil {
t.Fatal(err)
}
select {
case event := <-received:
t.Fatalf("unexpected reserved-path event: %+v", event)
case <-time.After(80 * time.Millisecond):
}
}
func waitForEvent(t *testing.T, eventCh <-chan events.Event) events.Event {
t.Helper()
select {
case event := <-eventCh:
return event
case <-time.After(500 * time.Millisecond):
t.Fatal("timed out waiting for file.changed")
return events.Event{}
}
}