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