1
0

tui_test.go 8.9 KB

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