| // Copyright 2019 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. |
| |
| //go:build go1.16 |
| // +build go1.16 |
| |
| package main |
| |
| import ( |
| "net/http/httptest" |
| "strings" |
| "testing" |
| ) |
| |
| func TestXHandler(t *testing.T) { |
| type check func(t *testing.T, rec *httptest.ResponseRecorder) |
| status := func(v int) check { |
| return func(t *testing.T, rec *httptest.ResponseRecorder) { |
| t.Helper() |
| if rec.Code != v { |
| t.Errorf("response status = %v; want %v", rec.Code, v) |
| } |
| } |
| } |
| substr := func(s string) check { |
| return func(t *testing.T, rec *httptest.ResponseRecorder) { |
| t.Helper() |
| if !strings.Contains(rec.Body.String(), s) { |
| t.Errorf("missing expected substring %q in value: %#q", s, rec.Body) |
| } |
| } |
| } |
| hasHeader := func(k, v string) check { |
| return func(t *testing.T, rec *httptest.ResponseRecorder) { |
| t.Helper() |
| if got := rec.HeaderMap.Get(k); got != v { |
| t.Errorf("header[%q] = %q; want %q", k, got, v) |
| } |
| } |
| } |
| |
| tests := []struct { |
| name string |
| path string |
| checks []check |
| }{ |
| { |
| name: "net", |
| path: "/x/net", |
| checks: []check{ |
| status(200), |
| substr(`<meta name="go-import" content="golang.org/x/net git https://go.googlesource.com/net">`), |
| substr(`http-equiv="refresh" content="0; url=https://pkg.go.dev/golang.org/x/net">`), |
| }, |
| }, |
| { |
| name: "net-suffix", |
| path: "/x/net/suffix", |
| checks: []check{ |
| status(200), |
| substr(`<meta name="go-import" content="golang.org/x/net git https://go.googlesource.com/net">`), |
| substr(`http-equiv="refresh" content="0; url=https://pkg.go.dev/golang.org/x/net/suffix">`), |
| }, |
| }, |
| { |
| name: "pkgsite", |
| path: "/x/pkgsite", |
| checks: []check{ |
| status(200), |
| substr(`<meta name="go-import" content="golang.org/x/pkgsite git https://go.googlesource.com/pkgsite">`), |
| substr(`<a href="https://pkg.go.dev/golang.org/x/pkgsite">Redirecting to documentation...</a>`), |
| substr(`http-equiv="refresh" content="0; url=https://pkg.go.dev/golang.org/x/pkgsite">`), |
| }, |
| }, |
| { |
| name: "notexist", |
| path: "/x/notexist", |
| checks: []check{status(404)}, |
| }, |
| { |
| name: "empty", |
| path: "/x/", |
| checks: []check{ |
| status(307), |
| hasHeader("Location", "https://pkg.go.dev/search?q=golang.org/x"), |
| }, |
| }, |
| { |
| name: "invalid", |
| path: "/x/In%20Valid,X", |
| checks: []check{status(404)}, |
| }, |
| } |
| for _, tt := range tests { |
| t.Run(tt.name, func(t *testing.T) { |
| req := httptest.NewRequest("GET", tt.path, nil) |
| rec := httptest.NewRecorder() |
| xHandler(rec, req) |
| for _, check := range tt.checks { |
| check(t, rec) |
| } |
| }) |
| } |
| } |