96 lines
3.0 KiB
Go
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)
|
||
|
}
|
||
|
})
|
||
|
}
|