opentofu/command/webbrowser/mock_test.go
Martin Atkins 7ccd6204c4 command: Swappable implementation of launching web browsers
For unit testing in particular we can't launch a real browser for testing,
so this indirection is primarily to allow us to substitute a mock when
testing a command that can launch a browser.

This includes a simple mock implementation that expects to interact with
a running web server directly.
2019-09-09 11:15:24 -07:00

96 lines
3.0 KiB
Go

package webbrowser
import (
"context"
"net/http"
"net/http/httptest"
"testing"
)
func TestMockLauncher(t *testing.T) {
s := httptest.NewServer(http.HandlerFunc(func(resp http.ResponseWriter, req *http.Request) {
resp.Header().Set("Content-Length", "0")
switch req.URL.Path {
case "/standard-redirect-source":
resp.Header().Set("Location", "/standard-redirect-target")
resp.WriteHeader(302)
case "/custom-redirect-source":
resp.Header().Set("X-Redirect-To", "/custom-redirect-target")
resp.WriteHeader(200)
case "/error":
resp.WriteHeader(500)
default:
resp.WriteHeader(200)
}
}))
defer s.Close()
t.Run("no redirects", func(t *testing.T) {
l := NewMockLauncher(context.Background())
err := l.OpenURL(s.URL)
if err != nil {
t.Fatal(err)
}
l.Wait() // Let the async work complete
if got, want := len(l.Responses), 1; got != want {
t.Fatalf("wrong number of responses %d; want %d", got, want)
}
if got, want := l.Responses[0].Request.URL.Path, ""; got != want {
t.Fatalf("wrong request URL %q; want %q", got, want)
}
})
t.Run("error", func(t *testing.T) {
l := NewMockLauncher(context.Background())
err := l.OpenURL(s.URL + "/error")
if err != nil {
// Th is kind of error is supposed to happen asynchronously, so we
// should not see it here.
t.Fatal(err)
}
l.Wait() // Let the async work complete
if got, want := len(l.Responses), 1; got != want {
t.Fatalf("wrong number of responses %d; want %d", got, want)
}
if got, want := l.Responses[0].Request.URL.Path, "/error"; got != want {
t.Fatalf("wrong request URL %q; want %q", got, want)
}
if got, want := l.Responses[0].StatusCode, 500; got != want {
t.Fatalf("wrong response status %d; want %d", got, want)
}
})
t.Run("standard redirect", func(t *testing.T) {
l := NewMockLauncher(context.Background())
err := l.OpenURL(s.URL + "/standard-redirect-source")
if err != nil {
t.Fatal(err)
}
l.Wait() // Let the async work complete
if got, want := len(l.Responses), 2; got != want {
t.Fatalf("wrong number of responses %d; want %d", got, want)
}
if got, want := l.Responses[0].Request.URL.Path, "/standard-redirect-source"; got != want {
t.Fatalf("wrong request 0 URL %q; want %q", got, want)
}
if got, want := l.Responses[1].Request.URL.Path, "/standard-redirect-target"; got != want {
t.Fatalf("wrong request 1 URL %q; want %q", got, want)
}
})
t.Run("custom redirect", func(t *testing.T) {
l := NewMockLauncher(context.Background())
err := l.OpenURL(s.URL + "/custom-redirect-source")
if err != nil {
t.Fatal(err)
}
l.Wait() // Let the async work complete
if got, want := len(l.Responses), 2; got != want {
t.Fatalf("wrong number of responses %d; want %d", got, want)
}
if got, want := l.Responses[0].Request.URL.Path, "/custom-redirect-source"; got != want {
t.Fatalf("wrong request 0 URL %q; want %q", got, want)
}
if got, want := l.Responses[1].Request.URL.Path, "/custom-redirect-target"; got != want {
t.Fatalf("wrong request 1 URL %q; want %q", got, want)
}
})
}