main pico / pkg / apps / prose / router_test.go
Antonio Mika  ·  2026-10-11
 1package prose
 2
 3import (
 4	"errors"
 5	"os"
 6	"testing"
 7
 8	"github.com/picosh/pico/pkg/pssh"
 9	sendutils "github.com/picosh/pico/pkg/send/utils"
10)
11
12// listHandler lists names and records the renames it is sent.
13type listHandler struct {
14	ReadWriteHandler
15	names   []string
16	renamed int
17}
18
19func (h *listHandler) List(*pssh.SSHServerConnSession, string, bool, bool) ([]os.FileInfo, error) {
20	files := []os.FileInfo{&sendutils.VirtualFile{FName: "/", FIsDir: true}}
21	for _, name := range h.names {
22		files = append(files, &sendutils.VirtualFile{FName: name})
23	}
24	return files, nil
25}
26
27func (h *listHandler) Rename(*pssh.SSHServerConnSession, *sendutils.FileEntry, *sendutils.FileEntry) error {
28	h.renamed++
29	return nil
30}
31
32func entry(name string) *sendutils.FileEntry {
33	return &sendutils.FileEntry{Filepath: "/" + name}
34}
35
36func TestRouterSharedHandler(t *testing.T) {
37	posts := &listHandler{names: []string{"a.md"}}
38	router := newFileRouter("prose", map[string]ReadWriteHandler{
39		".md":      posts,
40		".lxt":     posts,
41		".txt":     &listHandler{names: []string{"a.md"}},
42		"fallback": &listHandler{names: []string{"x.png"}},
43	})
44
45	list, err := router.List(nil, "/", true, false)
46	if err != nil {
47		t.Fatal(err)
48	}
49	var names []string
50	for _, f := range list {
51		names = append(names, f.Name())
52	}
53	if len(names) != 3 {
54		t.Errorf("listed %q, want /, a.md and x.png once each", names)
55	}
56
57	if err := router.Rename(nil, entry("a.md"), entry("a.lxt")); err != nil || posts.renamed != 1 {
58		t.Fatalf("rename within a handler: %v, renamed %d", err, posts.renamed)
59	}
60	for _, to := range []string{"a.txt", "a.png"} {
61		if err := router.Rename(nil, entry("a.lxt"), entry(to)); !errors.Is(err, errors.ErrUnsupported) {
62			t.Errorf("rename to %s across handlers: %v", to, err)
63		}
64	}
65}