| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package frontend |
| |
| import ( |
| "flag" |
| "io" |
| "io/ioutil" |
| "net/http" |
| "net/http/httptest" |
| "strings" |
| "testing" |
| ) |
| |
| var playground = flag.Bool("playground", false, "Make a request to https://play.golang.org/") |
| |
| const testShareID = "arbitraryShareID" |
| |
| func TestPlaygroundShare(t *testing.T) { |
| pgURL := playgroundURL |
| if !*playground { |
| ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| if r.Method != http.MethodPost { |
| http.Error(w, "Expected a POST", http.StatusMethodNotAllowed) |
| } |
| |
| if _, err := io.WriteString(w, testShareID); err != nil { |
| t.Fatal(err) |
| } |
| })) |
| defer ts.Close() |
| pgURL = ts.URL |
| } |
| |
| testCases := []struct { |
| pgURL string |
| method string |
| desc string |
| body string |
| code int |
| // shareID is a hash returned by play.golang.org when the body is POSTed to |
| // play.golang.org/share. We expect play.golang.org to always return the |
| // same hash for a given unique body. If the request is made to the mock |
| // server, shareID will be set to testShareID when running the tests below. |
| shareID string |
| }{ |
| { |
| pgURL: pgURL, |
| method: http.MethodPost, |
| desc: "Share endpoint: for Hello World func", |
| body: `package main |
| |
| import ( |
| "fmt" |
| ) |
| |
| func main() { |
| fmt.Println("Hello, playground") |
| }`, |
| code: http.StatusOK, |
| shareID: "BpXrY1MHLkk", |
| }, |
| { |
| pgURL: pgURL, |
| method: http.MethodGet, |
| desc: "Share endpoint: Failed GET Request, Accept POST only", |
| code: http.StatusMethodNotAllowed, |
| shareID: "UCPdVNrl0-P", |
| }, |
| { |
| pgURL: "/*?", |
| method: http.MethodPost, |
| desc: "Share endpoint: Malformed URL returns internal server error", |
| code: http.StatusInternalServerError, |
| }, |
| } |
| for _, test := range testCases { |
| t.Run(test.desc, func(t *testing.T) { |
| body := strings.NewReader(test.body) |
| |
| req, err := http.NewRequest(test.method, "/play", body) |
| if err != nil { |
| t.Fatal(err) |
| } |
| req.Header.Set("Content-Type", "text/plain; charset=utf-8") |
| w := httptest.NewRecorder() |
| makeFetchPlayRequest(w, req, test.pgURL) |
| |
| res := w.Result() |
| if got, want := res.StatusCode, test.code; got != want { |
| t.Errorf("Status Code = %d; want %d", got, want) |
| } |
| |
| if res.StatusCode >= 200 && res.StatusCode < 300 { |
| body, err := ioutil.ReadAll(res.Body) |
| if err != nil { |
| t.Fatal(err) |
| } |
| wantID := test.shareID |
| if !*playground { |
| wantID = testShareID |
| } |
| if string(body) != wantID { |
| t.Errorf("body = %s; want %s", body, wantID) |
| } |
| } |
| }) |
| } |
| } |