// Copyright 2018 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 !appengine
// +build !appengine

package main

import (
	"net/http/httptest"
	"os"
	"runtime"
	"strings"
	"testing"

	"golang.org/x/tools/blog"
)

func TestServer(t *testing.T) {
	if runtime.GOOS == "android" {
		t.Skip("skipping on android; can't run go tool")
	}
	if os.Getenv("GO_BUILDER_NAME") == "aix-ppc64" {
		t.Skip("skipping on aix-ppc64 builder: https://golang.org/issue/33940")
	}

	oldStatic := *staticPath
	*staticPath = "/static"
	defer func() { *staticPath = oldStatic }()
	mux, err := newServer(false, blog.Config{
		TemplatePath: "./_template",
	})
	if err != nil {
		t.Fatal(err)
	}
	r := httptest.NewRequest("GET", "/", nil)
	w := httptest.NewRecorder()
	mux.ServeHTTP(w, r)
	if w.Code != 200 {
		t.Errorf("GET /: code = %d; want 200", w.Code)
	}
	want := "The Go Programming Language Blog"
	if !strings.Contains(w.Body.String(), want) {
		t.Errorf("GET /: want to find %q, got\n\n%q", want, w.Body.String())
	}
	if hdr := w.Header().Get("Content-Type"); hdr != "text/html; charset=utf-8" {
		t.Errorf("GET /: want text/html content-type, got %q", hdr)
	}
}
