Skip to content
quarry Artifact [41a8191689]
Login

Artifact [41a8191689]

Artifact 41a8191689b2ab0f6a6d348f0c0e4c90c3d746239333761f06bc9af2728d986c:


package api

import (
	"context"
	"path/filepath"
	"strings"
	"testing"

	"craftdesign.group/quarry/internal/artifact"
	"craftdesign.group/quarry/internal/chat"
	"craftdesign.group/quarry/internal/index"
	"craftdesign.group/quarry/internal/oltp"
)

// A robot row stored before lines named things by number renders the
// landing reference hook with the landing's number; a person's line
// that happens to say "landing <hash>" is left exactly as written.
func TestOldRobotLinesRenderAsNumberedRefs(t *testing.T) {
	ix, err := index.Open(filepath.Join(t.TempDir(), "r.db"))
	if err != nil {
		t.Fatal(err)
	}
	t.Cleanup(func() { ix.Close() })
	lid := strings.Repeat("d4", 20)
	if err := ix.FoldNow([]index.Parsed{
		{Hash: lid, Art: &artifact.Artifact{Type: artifact.Forum, ThreadTitle: "Land it", Date: "2026-08-18T09:00:00", User: "dan",
			Body: []byte("zit-landing: 1\nbranch: b\ntarget: trunk\n\nmessage\n")}},
	}); err != nil {
		t.Fatal(err)
	}
	db, err := oltp.Open(filepath.Join(t.TempDir(), "o.db"))
	if err != nil {
		t.Fatal(err)
	}
	t.Cleanup(func() { db.Close() })
	if err := db.LandingNumbersAssign("demo", []string{lid}); err != nil {
		t.Fatal(err)
	}
	ll := func(_ string, n int) (string, bool) { return lid, n == 1 }
	ln := func(_, id string) int {
		if id == lid {
			return 1
		}
		return 0
	}
	prevL, prevN := landingByNumber.Swap(&ll), landingNumberOfRef.Swap(&ln)
	t.Cleanup(func() { landingByNumber.Store(prevL); landingNumberOfRef.Store(prevN) })
	d := Deps{LandingNumbers: db, CanRead: func(context.Context, string) bool { return true },
		CapsFor: func(_, _ string) CapSet { return fakeCaps(anyCapLetters) }}
	repo := &Repo{Index: ix}
	render := func(kind, text string) chatMsgOut {
		return d.chatRenderOne(context.Background(), repo, "demo", chat.Message{Seq: 1, Kind: kind, User: "robot", Text: text})
	}
	const hook = `data-ref-kind="landing"`
	typed := render(chat.KindMsg, "!1 opened by zeitgeist")
	if !strings.Contains(typed.HTML, hook) {
		t.Fatalf("typed !1 has no landing hook: %s", typed.HTML)
	}
	old := render(chat.KindRobot, "landing "+lid[:12]+" opened by zeitgeist")
	if old.HTML != typed.HTML {
		t.Errorf("old robot row differs from the typed reference:\n%s\n%s", old.HTML, typed.HTML)
	}
	if len(old.Refs) != 1 {
		t.Errorf("refs = %v, want the one landing", old.Refs)
	}
	unknown := render(chat.KindRobot, "landing "+strings.Repeat("0", 12)+" opened by zeitgeist")
	if strings.Contains(unknown.HTML, hook) {
		t.Errorf("an unknown hash became a reference: %s", unknown.HTML)
	}
	human := render(chat.KindMsg, "landing "+lid[:12]+" opened by zeitgeist")
	if strings.Contains(human.HTML, hook) {
		t.Errorf("a human line was rewritten: %s", human.HTML)
	}
}