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