| // Copyright 2017 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 ( | |
| "crypto/tls" | |
| "net/http" | |
| "net/http/httptest" | |
| "testing" | |
| ) | |
| var testServer = newServer(http.DefaultServeMux, "./static/", "./templates/", false) | |
| func TestStaticAssetsFound(t *testing.T) { | |
| req := httptest.NewRequest("GET", "/", nil) | |
| w := httptest.NewRecorder() | |
| testServer.ServeHTTP(w, req) | |
| if w.Code != http.StatusOK { | |
| t.Errorf("expected code %d, got %d", http.StatusOK, w.Code) | |
| } | |
| if hdr := w.Header().Get("Content-Type"); hdr != "text/html; charset=utf-8" { | |
| t.Errorf("incorrect Content-Type header, got headers: %v", w.Header()) | |
| } | |
| } | |
| func TestFaviconFound(t *testing.T) { | |
| req := httptest.NewRequest("GET", "/favicon.ico", nil) | |
| w := httptest.NewRecorder() | |
| testServer.ServeHTTP(w, req) | |
| if w.Code != http.StatusOK { | |
| t.Errorf("expected code %d, got %d", http.StatusOK, w.Code) | |
| } | |
| if hdr := w.Header().Get("Content-Type"); hdr != "image/x-icon" { | |
| t.Errorf("incorrect Content-Type header, got headers: %v", w.Header()) | |
| } | |
| } | |
| func TestHSTSHeaderSet(t *testing.T) { | |
| req := httptest.NewRequest("GET", "/", nil) | |
| req.TLS = &tls.ConnectionState{} | |
| w := httptest.NewRecorder() | |
| testServer.ServeHTTP(w, req) | |
| if hdr := w.Header().Get("Strict-Transport-Security"); hdr == "" { | |
| t.Errorf("missing Strict-Transport-Security header; headers = %v", w.Header()) | |
| } | |
| } | |
| func TestRandomHelpWantedIssue(t *testing.T) { | |
| req := httptest.NewRequest("GET", "/imfeelinglucky", nil) | |
| w := httptest.NewRecorder() | |
| testServer.ServeHTTP(w, req) | |
| if w.Code != http.StatusSeeOther { | |
| t.Errorf("w.Code = %d; want %d", w.Code, http.StatusSeeOther) | |
| } | |
| if g, w := w.Header().Get("Location"), issuesURLBase; g != w { | |
| t.Errorf("Location header = %q; want %q", g, w) | |
| } | |
| testServer.cMu.Lock() | |
| testServer.helpWantedIssues = []issueData{{id: 42}} | |
| testServer.cMu.Unlock() | |
| w = httptest.NewRecorder() | |
| testServer.ServeHTTP(w, req) | |
| if w.Code != http.StatusSeeOther { | |
| t.Errorf("w.Code = %d; want %d", w.Code, http.StatusSeeOther) | |
| } | |
| if g, w := w.Header().Get("Location"), issuesURLBase+"42"; g != w { | |
| t.Errorf("Location header = %q; want %q", g, w) | |
| } | |
| } | |
| func TestRandomFilteredHelpWantedIssue(t *testing.T) { | |
| req := httptest.NewRequest("GET", "/imfeelinglucky?pkg=foo", nil) | |
| w := httptest.NewRecorder() | |
| testServer.ServeHTTP(w, req) | |
| if w.Code != http.StatusSeeOther { | |
| t.Errorf("w.Code = %d; want %d", w.Code, http.StatusSeeOther) | |
| } | |
| if g, w := w.Header().Get("Location"), issuesURLBase; g != w { | |
| t.Errorf("Location header = %q; want %q", g, w) | |
| } | |
| testServer.cMu.Lock() | |
| testServer.helpWantedIssues = []issueData{ | |
| {id: 41, titlePrefix: "not/foo: bar"}, | |
| {id: 42, titlePrefix: "foo/bar: baz"}, | |
| } | |
| testServer.cMu.Unlock() | |
| w = httptest.NewRecorder() | |
| testServer.ServeHTTP(w, req) | |
| if w.Code != http.StatusSeeOther { | |
| t.Errorf("w.Code = %d; want %d", w.Code, http.StatusSeeOther) | |
| } | |
| if g, w := w.Header().Get("Location"), issuesURLBase+"42"; g != w { | |
| t.Errorf("Location header = %q; want %q", g, w) | |
| } | |
| } | |
| func TestHandleDirRedirect(t *testing.T) { | |
| tests := []struct { | |
| path string | |
| ref string | |
| want string | |
| }{ | |
| {"/dir/build", "", "https://github.com/golang/build/tree/master/"}, | |
| {"/dir/build/", "", "https://github.com/golang/build/tree/master/"}, | |
| {"/dir/build", "https://go.googlesource.com/", "https://go.googlesource.com/build/+/master/"}, | |
| {"/dir/build/", "https://go.googlesource.com/", "https://go.googlesource.com/build/+/master/"}, | |
| {"/dir/build/maintner", "", "https://github.com/golang/build/tree/master/maintner"}, | |
| {"/dir/build/maintner/", "", "https://github.com/golang/build/tree/master/maintner"}, | |
| {"/dir/build/maintner", "https://go.googlesource.com/", "https://go.googlesource.com/build/+/master/maintner"}, | |
| {"/dir/build/maintner/", "https://go.googlesource.com/", "https://go.googlesource.com/build/+/master/maintner"}, | |
| } | |
| for _, tt := range tests { | |
| req := httptest.NewRequest("GET", tt.path, nil) | |
| if tt.ref != "" { | |
| req.Header.Set("Referer", tt.ref) | |
| } | |
| w := httptest.NewRecorder() | |
| testServer.ServeHTTP(w, req) | |
| if w.Code != http.StatusFound { | |
| t.Errorf("for %q from %q, got code %d, want %d", tt.path, tt.ref, w.Code, http.StatusFound) | |
| continue | |
| } | |
| got := w.Header().Get("Location") | |
| if got != tt.want { | |
| t.Errorf("for %q from %q, got %q; want %q", tt.path, tt.ref, got, tt.want) | |
| } | |
| } | |
| } |