// 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.

package main

import (
	"bytes"
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"

	"golang.org/x/website/go.dev/cmd/internal/site"
)

var testHosts = map[string]string{
	"":                     "foo.example.test",
	"dev.example.test":     "foo-dev.example.test",
	"staging.example.test": "foo-staging.example.test",
}

func TestRedirect(t *testing.T) {
	tests := []struct {
		desc     string
		target   string
		hosts    map[string]string
		want     string
		wantCode int
	}{
		{
			desc:     "basic redirect",
			target:   "/",
			hosts:    testHosts,
			want:     "https://foo.example.test/",
			wantCode: http.StatusFound,
		},
		{
			desc:     "redirect keeps query and path",
			target:   "/github.com/golang/glog?tab=overview",
			hosts:    testHosts,
			want:     "https://foo.example.test/github.com/golang/glog?tab=overview",
			wantCode: http.StatusFound,
		},
		{
			desc:     "redirects to the correct host",
			target:   "https://dev.example.test/",
			hosts:    testHosts,
			want:     "https://foo-dev.example.test/",
			wantCode: http.StatusFound,
		},
		{
			desc:     "renders 404 if hosts are missing",
			target:   "https://dev.example.test/",
			hosts:    nil,
			wantCode: http.StatusNotFound,
		},
	}
	for _, tt := range tests {
		t.Run(tt.desc, func(t *testing.T) {
			req := httptest.NewRequest("GET", tt.target, nil)
			w := httptest.NewRecorder()
			redirectHosts(tt.hosts).ServeHTTP(w, req)
			resp := w.Result()
			if resp.StatusCode != tt.wantCode {
				t.Errorf("w.Result().StatusCode = %v, wanted %v", resp.StatusCode, tt.wantCode)
			}
			l, err := resp.Location()
			if resp.StatusCode == http.StatusFound && (l == nil || l.String() != tt.want || err != nil) {
				t.Errorf("resp.Location() = %v, %v, wanted %v, no error", l, err, tt.want)
			}
		})
	}
}

var siteTests = []struct {
	target string
	want   []string
}{
	{"/", []string{"Go is an open source programming language supported by Google"}},
	{"/solutions/", []string{"Using Go at Google"}},
	{"/solutions/dropbox/", []string{"About Dropbox"}},
}

func TestSite(t *testing.T) {
	godev, err := site.Load("../..")
	if err != nil {
		t.Fatal(err)
	}

	for _, tt := range siteTests {
		t.Run(tt.target, func(t *testing.T) {
			r := httptest.NewRequest("GET", tt.target, nil)
			resp := httptest.NewRecorder()
			resp.Body = new(bytes.Buffer)
			http.FileServer(godev).ServeHTTP(resp, r)
			if resp.Code != 200 {
				t.Fatalf("Code = %d, want 200", resp.Code)
			}
			body := resp.Body.String()
			for _, str := range tt.want {
				if !strings.Contains(body, str) {
					t.Fatalf("Body does not contain %q:\n%s", str, body)
				}
			}
		})
	}
}
