main pico / pkg / apps / feeds / uploader_test.go
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}