tui_test.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package pingo
  2. import (
  3. "strings"
  4. "testing"
  5. "time"
  6. tea "charm.land/bubbletea/v2"
  7. "charm.land/lipgloss/v2"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func Test_InitialModel(t *testing.T) {
  11. addresses := []string{"127.0.0.1", "cantresolvethisever"}
  12. speed := time.Second * 1
  13. chartHeight := 10
  14. model := InitialModel(addresses, speed, chartHeight)
  15. assert.Implements(t, new(tea.Model), model)
  16. assert.True(t, model.viewport.MouseWheelEnabled)
  17. assert.Equal(t, speed, model.UpdateSpeed)
  18. assert.Equal(t, chartHeight, model.ChartHeight)
  19. assert.Equal(t, 2, len(model.Addresses))
  20. for i, address := range model.Addresses {
  21. assert.Equal(t, 80, address.max_results)
  22. assert.Equal(t, addresses[i], address.Address)
  23. }
  24. }
  25. // skipped until a testing paradigm can be determined (func has sig)
  26. func Test_Model_Init(t *testing.T) {
  27. t.Skip()
  28. addresses := []string{"127.0.0.1", "cantresolvethisever"}
  29. speed := time.Millisecond * 1
  30. chartHeight := 10
  31. model := InitialModel(addresses, speed, chartHeight)
  32. cmd := model.Init()
  33. msg := cmd()
  34. assert.IsType(t, new(tickMsg), msg)
  35. }
  36. // skipped until a testing paradigm can be determined (viewport has scrolled)
  37. func Test_Model_Update_scroll_on_j(t *testing.T) {
  38. t.Skip()
  39. testAddresses := []string{"127.0.0.1", "cantresolvethisever"}
  40. testSpeed := time.Second * 1
  41. testModel := InitialModel(testAddresses, testSpeed, 10)
  42. testScroll := testModel.viewport.ScrollPercent()
  43. testSize := tea.WindowSizeMsg{Width: 20, Height: 200}
  44. testMsg := tea.KeyPressMsg(tea.Key{Text: "j"})
  45. model, _ := testModel.Update(testSize)
  46. modelv2, _ := model.Update(testMsg)
  47. assert.Greater(t, testScroll, modelv2.(Model).viewport.ScrollPercent())
  48. }
  49. // skipped until a testing paradigm can be determined (viewport has scrolled)
  50. func Test_Model_Update_scroll_on_k(t *testing.T) { t.Skip() }
  51. func Test_Model_Update_handle_windowsize(t *testing.T) {
  52. testAddresses := []string{"127.0.0.1", "cantresolvethisever"}
  53. testSpeed := time.Second * 1
  54. testModel := InitialModel(testAddresses, testSpeed, 10)
  55. assert.True(t, testModel.viewport.Height() == 0)
  56. testMsg := tea.KeyPressMsg(tea.Key{Text: "ctrl+c"})
  57. assert.IsType(t, *new(tea.KeyPressMsg), testMsg)
  58. testSize := tea.WindowSizeMsg{Width: 20, Height: 200}
  59. assert.IsType(t, *new(tea.WindowSizeMsg), testSize)
  60. model, cmd := testModel.Update(testSize)
  61. assert.Nil(t, cmd)
  62. assert.Equal(t, 200-2, model.(Model).viewport.Height()) // TODO make margin height accessible to tests
  63. }
  64. // skipped until a testing paradigm can be determined (func has sig)
  65. func Test_Model_Update_handle_tickMsg(t *testing.T) {}
  66. func spawnTestModel(addresses []string, points []float64, width, height, cHeight int) Model {
  67. speed := time.Second * 1
  68. testModel := InitialModel(addresses, speed, cHeight)
  69. for i := range testModel.Addresses {
  70. testModel.Addresses[i].results = points
  71. }
  72. testModel.ModelWidth = width
  73. testModel.ModelHeight = height
  74. return testModel
  75. }
  76. func Test_Model_Update_handle_pollMsg(t *testing.T) {
  77. testModel := spawnTestModel(
  78. []string{"127.0.0.1"}, []float64{}, 0, 20, 10)
  79. batch := testModel.Poll()
  80. msg := batch().(pollResultMsg)
  81. assert.IsType(t, *new(pollResultMsg), msg)
  82. assert.Equal(t, 1, len(msg.results))
  83. assert.InDelta(t, 1, msg.results[0], 10)
  84. assert.Nil(t, msg.err)
  85. assert.Equal(t, 0, msg.index)
  86. model, batch := testModel.Update(msg)
  87. assert.IsType(t, *new(tea.Cmd), batch)
  88. assert.Equal(t, msg.results, model.(Model).Addresses[0].results)
  89. }
  90. func Test_Model_View(t *testing.T) {
  91. testModel := spawnTestModel(
  92. []string{"127.0.0.1", "cantresolvethisever"}, []float64{1.0, 2.0, 3.0}, 0, 20, 10)
  93. result := testModel.View()
  94. assert.IsType(t, *new(tea.View), result)
  95. assert.True(t, strings.Contains(result.Content, "pingo"))
  96. assert.True(t, strings.Contains(result.Content, "j/k: down/up"))
  97. assert.True(t, strings.Contains(result.Content, "ctrl-c"))
  98. assert.True(t, strings.Contains(result.Content, "quit"))
  99. }
  100. func Test_Model_Render_init_state(t *testing.T) {
  101. testModel := spawnTestModel(
  102. []string{"127.0.0.1", "cantresolvethisever"}, []float64{}, 0, 20, 10)
  103. result := testModel.Render()
  104. assert.IsType(t, *new(string), result)
  105. assert.True(t, strings.Contains(result, "127.0.0.1"))
  106. assert.True(t, strings.Contains(result, "cantresolvethisever"))
  107. assert.False(t, strings.Contains(result, "pingo"))
  108. assert.False(t, strings.Contains(result, "j/k: up/down"))
  109. for line := range strings.SplitSeq(result, "\n") {
  110. if strings.Contains(line, "127.0.0.1") || strings.Contains(line, "cantresolvethisever") {
  111. assert.True(t, strings.Contains(line, "loading..."))
  112. }
  113. }
  114. }
  115. func Test_Model_Render_connection_unstable(t *testing.T) {
  116. testModel := spawnTestModel([]string{"doesntmatter"}, []float64{-1}, 200, 20, 10)
  117. result := testModel.Render()
  118. assert.IsType(t, *new(string), result)
  119. assert.True(t, strings.Contains(result, "connection unstable"))
  120. }
  121. func Test_Model_Render_has_charts(t *testing.T) {
  122. testModel := spawnTestModel(
  123. []string{"127.0.0.1", "cantresolvethisever"}, make([]float64, 20), 20, 20, 10)
  124. result := testModel.Render()
  125. assert.IsType(t, *new(string), result)
  126. assert.True(t, strings.Contains(result, "127.0.0.1"))
  127. assert.True(t, strings.Contains(result, "cantresolvethisever"))
  128. assert.False(t, strings.Contains(result, "pingo"))
  129. assert.False(t, strings.Contains(result, "j/k: up/down"))
  130. lines := strings.Split(result, "\n")
  131. for i, line := range lines {
  132. if strings.Contains(line, "127.0.0.1") || strings.Contains(line, "cantresolvethisever") {
  133. assert.False(t, strings.Contains(line, "loading..."))
  134. assert.True(t, strings.Contains(lines[i+1], "│")) // assert has chart seperator character
  135. }
  136. }
  137. }
  138. func Test_Model_Render_has_big_chart(t *testing.T) {
  139. testModel := spawnTestModel(
  140. []string{"127.0.0.1"}, make([]float64, 20), 20, 20, 0)
  141. result := testModel.Render()
  142. assert.IsType(t, *new(string), result)
  143. assert.True(t, strings.Contains(result, "127.0.0.1"))
  144. assert.False(t, strings.Contains(result, "pingo"))
  145. assert.False(t, strings.Contains(result, "j/k: up/down"))
  146. lines := strings.Split(result, "\n")
  147. assert.True(t, strings.Contains(lines[1], "127.0.0.1"), lines[1])
  148. assert.False(t, strings.Contains(lines[1], "loading..."))
  149. assert.True(t, strings.Contains(lines[1+18], "0├"), lines[1+18])
  150. }
  151. func Test_Model_Render_has_big_charts(t *testing.T) {
  152. testModel := spawnTestModel(
  153. []string{"127.0.0.1", "cantresolvethisever"}, make([]float64, 20), 20, 20, 0)
  154. result := testModel.Render()
  155. assert.IsType(t, *new(string), result)
  156. assert.True(t, strings.Contains(result, "127.0.0.1"))
  157. assert.True(t, strings.Contains(result, "cantresolvethisever"))
  158. assert.False(t, strings.Contains(result, "pingo"))
  159. assert.False(t, strings.Contains(result, "j/k: up/down"))
  160. lines := strings.Split(result, "\n")
  161. for i, line := range lines {
  162. if strings.Contains(line, "127.0.0.1") || strings.Contains(line, "cantresolvethisever") {
  163. assert.False(t, strings.Contains(line, "loading..."))
  164. assert.True(t, strings.Contains(lines[i+18-5], "0├"), line) // assert bottom of chart is where we expect it to be
  165. }
  166. }
  167. }
  168. func Test_Model_header_and_footer(t *testing.T) {
  169. addresses := []string{"127.0.0.1", "cantresolvethisever"}
  170. speed := time.Second * 1
  171. chartHeight := 10
  172. testModel := InitialModel(addresses, speed, chartHeight)
  173. result := testModel.header()
  174. assert.IsType(t, *new(string), result)
  175. assert.Equal(t, 1, lipgloss.Height(result))
  176. result = testModel.footer()
  177. assert.IsType(t, *new(string), result)
  178. assert.Equal(t, 1, lipgloss.Height(result))
  179. }
  180. func Test_Model_getVerticalMargin(t *testing.T) {
  181. addresses := []string{"127.0.0.1", "cantresolvethisever"}
  182. speed := time.Second * 1
  183. chartHeight := 10
  184. testModel := InitialModel(addresses, speed, chartHeight)
  185. testModel.ModelWidth = 20
  186. testModel.ModelHeight = 20
  187. result := testModel.getVerticalMargin()
  188. assert.IsType(t, *new(int), result)
  189. assert.Equal(t, 2, result)
  190. }
  191. // skipped until a testing paradigm can be determined (func has sig)
  192. func Test_Model_cmd_Tick(t *testing.T) {
  193. t.Skip()
  194. addresses := []string{"127.0.0.1", "cantresolvethisever"}
  195. speed := time.Second * 1
  196. chartHeight := 10
  197. model := InitialModel(addresses, speed, chartHeight)
  198. cmd := model.Tick()
  199. assert.Nil(t, cmd)
  200. }
  201. func Test_Model_cmd_Poll(t *testing.T) {
  202. addresses := []string{"127.0.0.1", "cantresolvethisever"}
  203. speed := time.Second * 1
  204. chartHeight := 10
  205. model := InitialModel(addresses, speed, chartHeight)
  206. batch := model.Poll()
  207. msgs := []tea.Cmd(batch().(tea.BatchMsg)) // type assert for legibility
  208. for i, cmd := range msgs {
  209. msg := cmd()
  210. assert.IsType(t, *new(pollResultMsg), msg)
  211. result := msg.(pollResultMsg)
  212. switch i {
  213. case 0:
  214. assert.Equal(t, 1, len(result.results))
  215. assert.InDelta(t, 1, result.results[0], 10)
  216. assert.Nil(t, result.err)
  217. assert.Equal(t, 0, result.index)
  218. case 1:
  219. assert.Equal(t, 1, len(result.results))
  220. assert.Equal(t, float64(-1), result.results[0])
  221. assert.NotNil(t, result.err.Error())
  222. assert.Equal(t, 1, result.index)
  223. }
  224. }
  225. }