Antonio Mika
·
2026-10-10
1package feeds
2
3import (
4 "context"
5 "log/slog"
6 "strings"
7 "testing"
8 "time"
9
10 "github.com/picosh/pico/pkg/db"
11 "github.com/picosh/pico/pkg/db/stub"
12 "github.com/picosh/pico/pkg/pssh"
13 sendutils "github.com/picosh/pico/pkg/send/utils"
14 "golang.org/x/crypto/ssh"
15)
16
17func TestWriteKeepsDigestState(t *testing.T) {
18 logger := slog.New(slog.DiscardHandler)
19 session := &pssh.SSHServerConnSession{
20 SSHServerConn: &pssh.SSHServerConn{
21 Conn: &ssh.ServerConn{Permissions: &ssh.Permissions{Extensions: map[string]string{}}},
22 Logger: logger,
23 },
24 Ctx: context.Background(),
25 }
26 user := &db.User{ID: "user-1", Name: "tester"}
27 pssh.SetUser(session, user)
28 posts := stub.NewPostsDB(logger, user)
29 cfg := NewConfig("feeds-test")
30 h := NewUploadHandler(cfg, posts)
31 write := func(text string, mtime int64) {
32 t.Helper()
33 _, err := h.Write(session, &sendutils.FileEntry{Filepath: "/news.txt", Reader: strings.NewReader(text), Mtime: mtime})
34 if err != nil {
35 t.Fatal(err)
36 }
37 }
38
39 write("=: email me@pico.test\n=> https://pico.sh/rss.xml\n", 100)
40 post, err := posts.FindPostWithFilename("news.txt", user.ID, cfg.Space)
41 if err != nil {
42 t.Fatal(err)
43 }
44 digest := time.Date(2026, 1, 2, 0, 0, 0, 0, time.UTC)
45 post.Data = db.PostData{LastDigest: &digest, Attempts: 2}
46 if _, err := posts.UpdatePost(post); err != nil {
47 t.Fatal(err)
48 }
49
50 write("=: email me@pico.test\n=> https://blog.pico.sh/rss.xml\n", 200)
51 got, err := posts.FindPostWithFilename("news.txt", user.ID, cfg.Space)
52 if err != nil {
53 t.Fatal(err)
54 }
55 if !strings.Contains(got.Text, "blog.pico.sh") || got.Data.LastDigest == nil || !got.Data.LastDigest.Equal(digest) || got.Data.Attempts != 2 {
56 t.Errorf("feed = %q with data %+v, want the new text and the old digest state", got.Text, got.Data)
57 }
58
59 _, err = h.Write(session, &sendutils.FileEntry{Filepath: "/news.txt", Reader: strings.NewReader("=> https://pico.sh/rss.xml\n")})
60 if err == nil || !strings.Contains(err.Error(), "no email") {
61 t.Errorf("feed without an email: %v", err)
62 }
63}