| 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) |
| } |
| }) |
| } |