prime8dev

prime8dev
git clone https://git.prime8.dev/prime8dev.git
Log | Files | Refs | README | LICENSE

readme_render_test.go (2527B)


      1 package tui
      2 
      3 import (
      4 	"strings"
      5 	"testing"
      6 
      7 	tea "github.com/charmbracelet/bubbletea"
      8 	"github.com/charmbracelet/x/ansi"
      9 )
     10 
     11 const rawReadme = "# janitor\n\nsorts **audio** files.\n\n## usage\n\n- `janitor ~/music`\n"
     12 
     13 func assertRenderedReadme(t *testing.T, m portfolioModel, when string) {
     14 	t.Helper()
     15 	view := ansi.Strip(m.View())
     16 	for _, raw := range []string{"**audio**", "## usage", "`janitor"} {
     17 		if strings.Contains(view, raw) {
     18 			t.Fatalf("%s: raw markdown %q on screen:\n%s", when, raw, view)
     19 		}
     20 	}
     21 	for _, want := range []string{"audio", "usage"} {
     22 		if !strings.Contains(view, want) {
     23 			t.Fatalf("%s: rendered README missing %q:\n%s", when, want, view)
     24 		}
     25 	}
     26 	if strings.Contains(view, "rendering README") || strings.Contains(view, "formatting markdown") {
     27 		t.Fatalf("%s: still waiting on a render:\n%s", when, view)
     28 	}
     29 }
     30 
     31 // The first frame after a README arrives is already rendered markdown, and a
     32 // resize re-renders for the new width; there is no async window showing raw
     33 // text.
     34 func TestReadmeRendersOnFirstViewAndResize(t *testing.T) {
     35 	m := testModel(t, 120, 40)
     36 	id := m.projects[0].ID
     37 	delete(m.projectReadmes, id)
     38 	m.activateTab(tabProjects)
     39 
     40 	m = send(t, m, projectReadmeMsg{projectID: id, readme: rawReadme})
     41 	assertRenderedReadme(t, m, "after load")
     42 	w1 := m.projectMarkdownWidth()
     43 
     44 	m = send(t, m, tea.WindowSizeMsg{Width: 90, Height: 40})
     45 	if w2 := m.projectMarkdownWidth(); w2 == w1 {
     46 		t.Fatalf("resize did not change the readme width (%d)", w2)
     47 	} else if _, ok := m.cachedProjectMarkdown(id, w2); !ok {
     48 		t.Fatalf("no render cached for the new width %d", w2)
     49 	}
     50 	assertRenderedReadme(t, m, "after resize")
     51 
     52 	// a changed README (new HEAD) replaces the cached render right away
     53 	m = send(t, m, projectReadmeMsg{projectID: id, readme: strings.Replace(rawReadme, "audio", "video", 1)})
     54 	if view := ansi.Strip(m.View()); !strings.Contains(view, "video") || strings.Contains(view, "**video**") {
     55 		t.Fatalf("updated README not re-rendered:\n%s", view)
     56 	}
     57 }
     58 
     59 // Selecting a project whose README was prefetched while another tab was
     60 // active shows it rendered immediately.
     61 func TestPrefetchedReadmeRendersOnSelect(t *testing.T) {
     62 	m := testModel(t, 120, 40)
     63 	id := m.projects[1].ID
     64 	m = send(t, m, projectReadmeMsg{projectID: id, readme: rawReadme}) // on the about tab
     65 	m.activateTab(tabProjects)
     66 	m = send(t, m, tea.KeyMsg{Type: tea.KeyDown})
     67 	if m.selectedProject().ID != id {
     68 		t.Fatalf("selected %s, want %s", m.selectedProject().ID, id)
     69 	}
     70 	assertRenderedReadme(t, m, "after select")
     71 }