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 }