blob: db23d92dd44f85bb969024960ca6cd5e77e7664f [file] [log] [blame]
// Copyright 2021 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 webtest
import (
"fmt"
"io/ioutil"
"net/http"
"net/http/httptest"
"path/filepath"
"strings"
"testing"
)
func TestWebtestHandler(t *testing.T) {
h := http.FileServer(http.Dir("testdata"))
testWebtest(t, "testdata/fs*.txt", func(c *case_) error { return c.runHandler(h) })
}
func echo(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
fmt.Fprintf(w, "%v %v\n", r.Method, r.RequestURI)
if err := r.ParseForm(); err != nil {
fmt.Fprintf(w, "parsing form: %v\n", err)
}
for k, v := range r.Form {
fmt.Fprintf(w, "%q: %q\n", k, v)
}
if len(r.Form) == 0 {
fmt.Fprintf(w, "no query\n")
}
}
func TestEchoHandler(t *testing.T) {
TestHandler(t, "testdata/echo.txt", http.HandlerFunc(echo))
}
func TestEchoServer(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(echo))
defer srv.Close()
addr := strings.TrimPrefix(srv.URL, "http://")
TestServer(t, "testdata/echo.txt", addr)
}
func testWebtest(t *testing.T, glob string, do func(*case_) error) {
files, err := filepath.Glob(glob)
if err != nil {
t.Fatal(err)
}
for _, file := range files {
t.Run(filepath.Base(file), func(t *testing.T) {
data, err := ioutil.ReadFile(file)
if err != nil {
t.Fatal(err)
}
script, err := parseScript(file, string(data))
if err != nil {
t.Fatal(err)
}
for _, c := range script.cases {
t.Run(c.method+"/"+strings.TrimPrefix(c.url, "/"), func(t *testing.T) {
hint := c.hint
c.hint = ""
if err := do(c); err != nil {
if hint == "" {
t.Fatal(err)
}
if !strings.Contains(err.Error(), hint) {
t.Fatalf("unexpected error %v (want %q)", err, hint)
}
return
}
if hint != "" {
t.Fatalf("unexpected success (want %q)", hint)
}
})
}
})
}
}