1
0

tui_test.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package pingo
  2. import (
  3. "strings"
  4. "testing"
  5. tea "charm.land/bubbletea/v2"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func spawnTestModel(addresses []string, points []float64, width, height, cHeight int) Model {
  9. testModel := InitialModel(addresses, cHeight, width, height)
  10. for i := range testModel.Addresses {
  11. testModel.Addresses[i].Results = points
  12. }
  13. return testModel
  14. }
  15. func Test_InitialModel(t *testing.T) {
  16. addresses := []string{"127.0.0.1", "cantresolvethisever"}
  17. chartHeight := 10
  18. model := InitialModel(addresses, 80, 24, chartHeight)
  19. assert.Implements(t, new(tea.Model), model)
  20. assert.Equal(t, chartHeight, model.ChartHeight)
  21. assert.Equal(t, 80, model.Width)
  22. assert.Equal(t, 24, model.Height)
  23. assert.Equal(t, 2, len(model.Addresses))
  24. for i, address := range model.Addresses {
  25. assert.Equal(t, 80, address.MaxResults)
  26. assert.Equal(t, addresses[i], address.Address)
  27. }
  28. }
  29. func Test_Model_Update_handle_pollMsg(t *testing.T) {
  30. testModel := spawnTestModel(
  31. []string{"127.0.0.1"}, []float64{}, 0, 20, 10)
  32. batch := testModel.Poll()
  33. msg := batch().(pollResultMsg)
  34. assert.IsType(t, *new(pollResultMsg), msg)
  35. assert.Equal(t, 1, len(msg.results))
  36. assert.InDelta(t, 1, msg.results[0], 10)
  37. assert.Nil(t, msg.err)
  38. assert.Equal(t, 0, msg.index)
  39. model, batch := testModel.Update(msg)
  40. assert.IsType(t, *new(tea.Cmd), batch)
  41. assert.Equal(t, msg.results, model.(Model).Addresses[0].Results)
  42. }
  43. func Test_Model_View(t *testing.T) {
  44. testModel := spawnTestModel(
  45. []string{"127.0.0.1", "cantresolvethisever"}, []float64{1.0, 2.0, 3.0}, 20, 20, 10)
  46. result := testModel.View()
  47. assert.IsType(t, *new(tea.View), result)
  48. }
  49. func Test_Model_View_init_state(t *testing.T) {
  50. testModel := spawnTestModel(
  51. []string{"127.0.0.1", "cantresolvethisever"}, []float64{}, 0, 20, 10)
  52. result := testModel.View().Content
  53. assert.IsType(t, *new(string), result)
  54. assert.True(t, strings.Contains(result, "127.0.0.1"))
  55. assert.True(t, strings.Contains(result, "cantresolvethisever"))
  56. assert.False(t, strings.Contains(result, "pingo"))
  57. assert.False(t, strings.Contains(result, "j/k: up/down"))
  58. for line := range strings.SplitSeq(result, "\n") {
  59. if strings.Contains(line, "127.0.0.1") || strings.Contains(line, "cantresolvethisever") {
  60. assert.True(t, strings.Contains(line, "loading..."))
  61. }
  62. }
  63. }
  64. func Test_Model_View_connection_unstable(t *testing.T) {
  65. testModel := spawnTestModel([]string{"doesntmatter"}, []float64{-1}, 200, 200, 200)
  66. result := testModel.View().Content
  67. assert.IsType(t, *new(string), result)
  68. assert.True(t, strings.Contains(result, "connection unstable"), result)
  69. }
  70. func Test_Model_View_has_charts(t *testing.T) {
  71. testModel := spawnTestModel(
  72. []string{"127.0.0.1", "cantresolvethisever"}, make([]float64, 20), 200, 200, 200)
  73. result := testModel.View().Content
  74. assert.IsType(t, *new(string), result)
  75. assert.True(t, strings.Contains(result, "127.0.0.1"))
  76. assert.True(t, strings.Contains(result, "cantresolvethisever"))
  77. assert.False(t, strings.Contains(result, "pingo"))
  78. assert.False(t, strings.Contains(result, "j/k: up/down"))
  79. lines := strings.Split(result, "\n")
  80. for i, line := range lines {
  81. if strings.Contains(line, "127.0.0.1") || strings.Contains(line, "cantresolvethisever") {
  82. assert.False(t, strings.Contains(line, "loading..."))
  83. assert.True(t, strings.Contains(lines[i+1], "│")) // assert has chart seperator character
  84. }
  85. }
  86. }
  87. func Test_Model_View_has_big_chart(t *testing.T) {
  88. testModel := spawnTestModel(
  89. []string{"127.0.0.1"}, make([]float64, 20), 20, 20, 200)
  90. result := testModel.View().Content
  91. assert.IsType(t, *new(string), result)
  92. assert.IsType(t, *new(string), result)
  93. assert.True(t, strings.Contains(result, "127.0.0.1"))
  94. assert.True(t, strings.Contains(result, "127.0.0.1"), result)
  95. lines := strings.Split(result, "\n")
  96. assert.True(t, strings.Contains(lines[1], "127.0.0.1"), lines[1])
  97. assert.False(t, strings.Contains(lines[1], "loading..."))
  98. assert.True(t, strings.Contains(lines[21], "0│"), result)
  99. }
  100. func Test_Model_View_has_big_charts(t *testing.T) {
  101. testModel := spawnTestModel(
  102. []string{"127.0.0.1", "cantresolvethisever"}, make([]float64, 20), 20, 20, 200)
  103. result := testModel.View().Content
  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. lines := strings.Split(result, "\n")
  110. for i, line := range lines {
  111. if strings.Contains(line, "127.0.0.1") || strings.Contains(line, "cantresolvethisever") {
  112. assert.False(t, strings.Contains(line, "loading..."))
  113. assert.True(t, strings.Contains(lines[i+20], "0│"), lines[i+20]) // assert bottom of chart is where we expect it to be
  114. }
  115. }
  116. }
  117. func Test_Model_cmd_Poll(t *testing.T) {
  118. addresses := []string{"127.0.0.1", "cantresolvethisever"}
  119. chartHeight := 10
  120. model := InitialModel(addresses, chartHeight, 80, 24)
  121. batch := model.Poll()
  122. msgs := []tea.Cmd(batch().(tea.BatchMsg)) // type assert for legibility
  123. for i, cmd := range msgs {
  124. msg := cmd()
  125. assert.IsType(t, *new(pollResultMsg), msg)
  126. result := msg.(pollResultMsg)
  127. switch i {
  128. case 0:
  129. assert.Equal(t, 1, len(result.results))
  130. assert.InDelta(t, 1, result.results[0], 10)
  131. assert.Nil(t, result.err)
  132. assert.Equal(t, 0, result.index)
  133. case 1:
  134. assert.Equal(t, 1, len(result.results))
  135. assert.Equal(t, float64(-1), result.results[0])
  136. assert.NotNil(t, result.err.Error())
  137. assert.Equal(t, 1, result.index)
  138. }
  139. }
  140. }