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