test(integration): add t.Helper()

This commit is contained in:
Rob Watson 2025-04-13 11:00:18 +02:00
parent c4bc32b3e8
commit 5f6b6fa3a9
2 changed files with 86 additions and 77 deletions

View File

@ -21,6 +21,8 @@ import (
)
func setupSimulationScreen(t *testing.T) (tcell.SimulationScreen, chan<- terminal.ScreenCapture, func() []string) {
t.Helper()
// Fetching the screen contents is tricky at this level of the test pyramid,
// because we need to:
//
@ -59,7 +61,7 @@ func setupSimulationScreen(t *testing.T) (tcell.SimulationScreen, chan<- termina
t.Cleanup(func() {
if t.Failed() {
printScreen(getContents, "After failing")
printScreen(t, getContents, "After failing")
}
})
@ -93,6 +95,8 @@ func contentsIncludes(contents []string, search string) bool {
}
func setupConfigService(t *testing.T, cfg config.Config) *config.Service {
t.Helper()
tmpDir, err := os.MkdirTemp("", "octoplex_"+strings.ReplaceAll(t.Name(), "/", "_"))
require.NoError(t, err)
t.Cleanup(func() { os.RemoveAll(tmpDir) })
@ -103,29 +107,32 @@ func setupConfigService(t *testing.T, cfg config.Config) *config.Service {
return configService
}
func printScreen(getContents func() []string, label string) {
func printScreen(t *testing.T, getContents func() []string, label string) {
t.Helper()
fmt.Println(label + ":")
for _, line := range getContents() {
fmt.Println(line)
}
}
func sendKey(screen tcell.SimulationScreen, key tcell.Key, ch rune) {
func sendKey(t *testing.T, screen tcell.SimulationScreen, key tcell.Key, ch rune) {
t.Helper()
screen.InjectKey(key, ch, tcell.ModNone)
time.Sleep(50 * time.Millisecond)
}
func sendKeyShift(screen tcell.SimulationScreen, key tcell.Key, ch rune) {
screen.InjectKey(key, ch, tcell.ModShift)
time.Sleep(50 * time.Millisecond)
}
func sendKeys(t *testing.T, screen tcell.SimulationScreen, keys string) {
t.Helper()
func sendKeys(screen tcell.SimulationScreen, keys string) {
screen.InjectKeyBytes([]byte(keys))
time.Sleep(500 * time.Millisecond)
}
func sendBackspaces(screen tcell.SimulationScreen, n int) {
func sendBackspaces(t *testing.T, screen tcell.SimulationScreen, n int) {
t.Helper()
for range n {
screen.InjectKey(tcell.KeyBackspace, ' ', tcell.ModNone)
time.Sleep(50 * time.Millisecond)
@ -135,6 +142,8 @@ func sendBackspaces(screen tcell.SimulationScreen, n int) {
// kickFirstRTMPConn kicks the first RTMP connection from the mediaMTX server.
func kickFirstRTMPConn(t *testing.T, srv testcontainers.Container) {
t.Helper()
type conn struct {
ID string `json:"id"`
}

View File

@ -123,7 +123,7 @@ func testIntegration(t *testing.T, streamKey string) {
time.Second,
"expected the mediaserver to start",
)
printScreen(getContents, "After starting the mediaserver")
printScreen(t, getContents, "After starting the mediaserver")
// Start streaming a test video to the app:
testhelpers.StreamFLV(t, "rtmp://localhost:1935/"+wantStreamKey)
@ -143,19 +143,19 @@ func testIntegration(t *testing.T, streamKey string) {
time.Second,
"expected to receive an ingress stream",
)
printScreen(getContents, "After receiving the ingress stream")
printScreen(t, getContents, "After receiving the ingress stream")
// Add a second destination in-app:
sendKey(screen, tcell.KeyRune, 'a')
sendKey(t, screen, tcell.KeyRune, 'a')
sendBackspaces(screen, 30)
sendKeys(screen, "Local server 2")
sendKey(screen, tcell.KeyTab, ' ')
sendBackspaces(t, screen, 30)
sendKeys(t, screen, "Local server 2")
sendKey(t, screen, tcell.KeyTab, ' ')
sendBackspaces(screen, 30)
sendKeys(screen, destURL2)
sendKey(screen, tcell.KeyTab, ' ')
sendKey(screen, tcell.KeyEnter, ' ')
sendBackspaces(t, screen, 30)
sendKeys(t, screen, destURL2)
sendKey(t, screen, tcell.KeyTab, ' ')
sendKey(t, screen, tcell.KeyEnter, ' ')
require.EventuallyWithT(
t,
@ -178,12 +178,12 @@ func testIntegration(t *testing.T, streamKey string) {
time.Second,
"expected to add the destinations",
)
printScreen(getContents, "After adding the destinations")
printScreen(t, getContents, "After adding the destinations")
// Start destinations:
sendKey(screen, tcell.KeyRune, ' ')
sendKey(screen, tcell.KeyDown, ' ')
sendKey(screen, tcell.KeyRune, ' ')
sendKey(t, screen, tcell.KeyRune, ' ')
sendKey(t, screen, tcell.KeyDown, ' ')
sendKey(t, screen, tcell.KeyRune, ' ')
require.EventuallyWithT(
t,
@ -207,11 +207,11 @@ func testIntegration(t *testing.T, streamKey string) {
time.Second,
"expected to start the destination streams",
)
printScreen(getContents, "After starting the destination streams")
printScreen(t, getContents, "After starting the destination streams")
sendKey(screen, tcell.KeyUp, ' ')
sendKey(screen, tcell.KeyDelete, ' ')
sendKey(screen, tcell.KeyEnter, ' ')
sendKey(t, screen, tcell.KeyUp, ' ')
sendKey(t, screen, tcell.KeyDelete, ' ')
sendKey(t, screen, tcell.KeyEnter, ' ')
require.EventuallyWithT(
t,
@ -234,10 +234,10 @@ func testIntegration(t *testing.T, streamKey string) {
time.Second,
"expected to remove the second destination",
)
printScreen(getContents, "After removing the second destination")
printScreen(t, getContents, "After removing the second destination")
// Stop remaining destination.
sendKey(screen, tcell.KeyRune, ' ')
sendKey(t, screen, tcell.KeyRune, ' ')
require.EventuallyWithT(
t,
@ -255,7 +255,7 @@ func testIntegration(t *testing.T, streamKey string) {
"expected to stop the first destination stream",
)
printScreen(getContents, "After stopping the first destination")
printScreen(t, getContents, "After stopping the first destination")
// TODO:
// - Source error
@ -337,7 +337,7 @@ func TestIntegrationRestartDestination(t *testing.T) {
time.Second,
"expected the mediaserver to start",
)
printScreen(getContents, "After starting the mediaserver")
printScreen(t, getContents, "After starting the mediaserver")
// Start streaming a test video to the app:
testhelpers.StreamFLV(t, "rtmp://localhost:1935/live")
@ -354,10 +354,10 @@ func TestIntegrationRestartDestination(t *testing.T) {
time.Second,
"expected to receive an ingress stream",
)
printScreen(getContents, "After receiving the ingress stream")
printScreen(t, getContents, "After receiving the ingress stream")
// Start destination:
sendKey(screen, tcell.KeyRune, ' ')
sendKey(t, screen, tcell.KeyRune, ' ')
require.EventuallyWithT(
t,
@ -375,7 +375,7 @@ func TestIntegrationRestartDestination(t *testing.T) {
time.Second,
"expected to start the destination stream",
)
printScreen(getContents, "After starting the destination stream")
printScreen(t, getContents, "After starting the destination stream")
// Wait for enough time that the container will be restarted.
// Then, kick the connection to force a restart.
@ -398,7 +398,7 @@ func TestIntegrationRestartDestination(t *testing.T) {
time.Second,
"expected to begin restarting",
)
printScreen(getContents, "After stopping the destination server")
printScreen(t, getContents, "After stopping the destination server")
require.EventuallyWithT(
t,
@ -416,10 +416,10 @@ func TestIntegrationRestartDestination(t *testing.T) {
time.Second,
"expected to restart the destination stream",
)
printScreen(getContents, "After restarting the destination stream")
printScreen(t, getContents, "After restarting the destination stream")
// Stop destination.
sendKey(screen, tcell.KeyRune, ' ')
sendKey(t, screen, tcell.KeyRune, ' ')
require.EventuallyWithT(
t,
@ -437,7 +437,7 @@ func TestIntegrationRestartDestination(t *testing.T) {
"expected to stop the destination stream",
)
printScreen(getContents, "After stopping the destination")
printScreen(t, getContents, "After stopping the destination")
cancel()
@ -493,7 +493,7 @@ func TestIntegrationStartDestinationFailed(t *testing.T) {
time.Second,
"expected the mediaserver to start",
)
printScreen(getContents, "After starting the mediaserver")
printScreen(t, getContents, "After starting the mediaserver")
// Start streaming a test video to the app:
testhelpers.StreamFLV(t, "rtmp://localhost:1935/live")
@ -510,10 +510,10 @@ func TestIntegrationStartDestinationFailed(t *testing.T) {
time.Second,
"expected to receive an ingress stream",
)
printScreen(getContents, "After receiving the ingress stream")
printScreen(t, getContents, "After receiving the ingress stream")
// Start destination:
sendKey(screen, tcell.KeyRune, ' ')
sendKey(t, screen, tcell.KeyRune, ' ')
require.EventuallyWithT(
t,
@ -526,7 +526,7 @@ func TestIntegrationStartDestinationFailed(t *testing.T) {
time.Second,
"expected to see the destination start error modal",
)
printScreen(getContents, "After starting the destination stream fails")
printScreen(t, getContents, "After starting the destination stream fails")
cancel()
@ -582,13 +582,13 @@ func TestIntegrationDestinationValidations(t *testing.T) {
time.Second,
"expected the mediaserver to start",
)
printScreen(getContents, "After starting the mediaserver")
printScreen(t, getContents, "After starting the mediaserver")
sendKey(screen, tcell.KeyRune, 'a')
sendKey(screen, tcell.KeyTab, ' ')
sendBackspaces(screen, 10)
sendKey(screen, tcell.KeyTab, ' ')
sendKey(screen, tcell.KeyEnter, ' ')
sendKey(t, screen, tcell.KeyRune, 'a')
sendKey(t, screen, tcell.KeyTab, ' ')
sendBackspaces(t, screen, 10)
sendKey(t, screen, tcell.KeyTab, ' ')
sendKey(t, screen, tcell.KeyEnter, ' ')
require.EventuallyWithT(
t,
@ -602,13 +602,13 @@ func TestIntegrationDestinationValidations(t *testing.T) {
time.Second,
"expected a validation error for an empty URL",
)
printScreen(getContents, "After entering an empty destination URL")
printScreen(t, getContents, "After entering an empty destination URL")
sendKey(screen, tcell.KeyEnter, ' ')
sendKey(screen, tcell.KeyBacktab, ' ')
sendKeys(screen, "nope")
sendKey(screen, tcell.KeyTab, ' ')
sendKey(screen, tcell.KeyEnter, ' ')
sendKey(t, screen, tcell.KeyEnter, ' ')
sendKey(t, screen, tcell.KeyBacktab, ' ')
sendKeys(t, screen, "nope")
sendKey(t, screen, tcell.KeyTab, ' ')
sendKey(t, screen, tcell.KeyEnter, ' ')
require.EventuallyWithT(
t,
@ -622,14 +622,14 @@ func TestIntegrationDestinationValidations(t *testing.T) {
time.Second,
"expected a validation error for an invalid URL",
)
printScreen(getContents, "After entering an invalid destination URL")
printScreen(t, getContents, "After entering an invalid destination URL")
sendKey(screen, tcell.KeyEnter, ' ')
sendKey(screen, tcell.KeyBacktab, ' ')
sendBackspaces(screen, len("nope"))
sendKeys(screen, "rtmp://rtmp.youtube.com:1935/live")
sendKey(screen, tcell.KeyTab, ' ')
sendKey(screen, tcell.KeyEnter, ' ')
sendKey(t, screen, tcell.KeyEnter, ' ')
sendKey(t, screen, tcell.KeyBacktab, ' ')
sendBackspaces(t, screen, len("nope"))
sendKeys(t, screen, "rtmp://rtmp.youtube.com:1935/live")
sendKey(t, screen, tcell.KeyTab, ' ')
sendKey(t, screen, tcell.KeyEnter, ' ')
require.EventuallyWithT(
t,
@ -645,14 +645,14 @@ func TestIntegrationDestinationValidations(t *testing.T) {
time.Second,
"expected to add the destination",
)
printScreen(getContents, "After adding the destination")
printScreen(t, getContents, "After adding the destination")
sendKey(screen, tcell.KeyRune, 'a')
sendKey(screen, tcell.KeyTab, ' ')
sendBackspaces(screen, 10)
sendKeys(screen, "rtmp://rtmp.youtube.com:1935/live")
sendKey(screen, tcell.KeyTab, ' ')
sendKey(screen, tcell.KeyEnter, ' ')
sendKey(t, screen, tcell.KeyRune, 'a')
sendKey(t, screen, tcell.KeyTab, ' ')
sendBackspaces(t, screen, 10)
sendKeys(t, screen, "rtmp://rtmp.youtube.com:1935/live")
sendKey(t, screen, tcell.KeyTab, ' ')
sendKey(t, screen, tcell.KeyEnter, ' ')
// Start streaming a test video to the app:
testhelpers.StreamFLV(t, "rtmp://localhost:1935/live")
@ -669,7 +669,7 @@ func TestIntegrationDestinationValidations(t *testing.T) {
time.Second,
"expected a validation error for a duplicate URL",
)
printScreen(getContents, "After entering a duplicate destination URL")
printScreen(t, getContents, "After entering a duplicate destination URL")
cancel()
<-done
@ -734,9 +734,9 @@ func TestIntegrationStartupCheck(t *testing.T) {
time.Second,
"expected to see startup check modal",
)
printScreen(getContents, "Ater displaying the startup check modal")
printScreen(t, getContents, "Ater displaying the startup check modal")
sendKey(screen, tcell.KeyEnter, ' ') // quit other containers
sendKey(t, screen, tcell.KeyEnter, ' ') // quit other containers
require.EventuallyWithT(
t,
@ -750,7 +750,7 @@ func TestIntegrationStartupCheck(t *testing.T) {
2*time.Second,
"expected to quit the other containers",
)
printScreen(getContents, "After quitting the other containers")
printScreen(t, getContents, "After quitting the other containers")
require.EventuallyWithT(
t,
@ -764,7 +764,7 @@ func TestIntegrationStartupCheck(t *testing.T) {
time.Second,
"expected the mediaserver to start",
)
printScreen(getContents, "After starting the mediaserver")
printScreen(t, getContents, "After starting the mediaserver")
cancel()
<-done
@ -817,10 +817,10 @@ func TestIntegrationMediaServerError(t *testing.T) {
time.Second,
"expected to see media server error modal",
)
printScreen(getContents, "Ater displaying the media server error modal")
printScreen(t, getContents, "Ater displaying the media server error modal")
// Quit the app, this should cause the done channel to receive.
sendKey(screen, tcell.KeyEnter, ' ')
sendKey(t, screen, tcell.KeyEnter, ' ')
<-done
}
@ -869,10 +869,10 @@ func TestIntegrationDockerClientError(t *testing.T) {
time.Second,
"expected to see fatal error modal",
)
printScreen(getContents, "Ater displaying the fatal error modal")
printScreen(t, getContents, "Ater displaying the fatal error modal")
// Quit the app, this should cause the done channel to receive.
sendKey(screen, tcell.KeyEnter, ' ')
sendKey(t, screen, tcell.KeyEnter, ' ')
<-done
}