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}