|
|
@@ -196,6 +196,45 @@ func TestFeed(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func TestPinnedPosts(t *testing.T) {
|
|
|
+ srv, _ := newTestServer(t, map[string]string{
|
|
|
+ "2026-01-01-old-pinned.md": "---\npinned: true\n---\n# Old pinned\n",
|
|
|
+ "2026-02-01-plain-a.md": "---\npinned: false\n---\n# Plain A\n",
|
|
|
+ "2026-03-01-new-pinned.md": "---\npinned: yes\n---\n# Bad value\n",
|
|
|
+ "2026-04-01-mid-pinned.md": "---\npinned: true\n---\n# Mid pinned\n",
|
|
|
+ "2026-05-01-plain-b.md": "# Plain B\n",
|
|
|
+ })
|
|
|
+
|
|
|
+ // Index: pinned posts first (newest first), then the rest by date.
|
|
|
+ // The invalid "pinned: yes" post is skipped, like a bad draft value.
|
|
|
+ _, _, index := get(t, srv, "/")
|
|
|
+ order := []string{"Mid pinned", "Old pinned", "Plain B", "Plain A"}
|
|
|
+ last := -1
|
|
|
+ for _, title := range order {
|
|
|
+ i := strings.Index(index, ">"+title+"<")
|
|
|
+ if i < 0 || i < last {
|
|
|
+ t.Fatalf("index order should be %v:\n%s", order, index)
|
|
|
+ }
|
|
|
+ last = i
|
|
|
+ }
|
|
|
+ if strings.Contains(index, "Bad value") {
|
|
|
+ t.Error("post with invalid pinned value should be skipped")
|
|
|
+ }
|
|
|
+ if n := strings.Count(index, `<span class="pinned">Pinned</span>`); n != 2 {
|
|
|
+ t.Errorf("want 2 Pinned labels, got %d", n)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Newer/older links and the feed keep plain date order.
|
|
|
+ _, _, post := get(t, srv, "/posts/old-pinned")
|
|
|
+ if !strings.Contains(post, `<a class="newer" href="/posts/plain-a">`) || strings.Contains(post, `class="older"`) {
|
|
|
+ t.Errorf("old-pinned should link newer to plain-a and have no older link:\n%s", post)
|
|
|
+ }
|
|
|
+ _, _, feed := get(t, srv, "/feed.xml")
|
|
|
+ if b, m := strings.Index(feed, "/posts/plain-b<"), strings.Index(feed, "/posts/mid-pinned<"); b < 0 || m < 0 || b > m {
|
|
|
+ t.Error("feed should stay newest first, ignoring pins")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func TestAuthor(t *testing.T) {
|
|
|
srv, dir := newTestServer(t, map[string]string{
|
|
|
"2026-01-01-anon.md": "# Anonymous\n",
|