blob: 2cff8d799191364320a97d28b2750ea72ce93bce [file] [log] [blame]
// Copyright 2020 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 dl
import (
"encoding/json"
"net/http/httptest"
"sort"
"testing"
)
func TestServeJSON(t *testing.T) {
data := listTemplateData{
Stable: []Release{{Version: "Stable"}},
Unstable: []Release{{Version: "Unstable"}},
Archive: []Release{{Version: "Archived"}},
}
testCases := []struct {
desc string
method string
target string
status int
versions []string
}{
{
desc: "basic",
method: "GET",
target: "/",
status: 200,
versions: []string{"Stable"},
},
{
desc: "include all versions",
method: "GET",
target: "/?include=all",
status: 200,
versions: []string{"Stable", "Unstable", "Archived"},
},
{
desc: "CORS preflight request",
method: "OPTIONS",
target: "/",
status: 204,
},
}
for _, tc := range testCases {
t.Run(tc.desc, func(t *testing.T) {
r := httptest.NewRequest(tc.method, tc.target, nil)
w := httptest.NewRecorder()
serveJSON(w, r, data)
resp := w.Result()
defer resp.Body.Close()
if got, want := resp.StatusCode, tc.status; got != want {
t.Errorf("Response status code = %d; want %d", got, want)
}
for k, v := range map[string]string{
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, OPTIONS",
} {
if got, want := resp.Header.Get(k), v; got != want {
t.Errorf("%s = %q; want %q", k, got, want)
}
}
if tc.versions == nil {
return
}
if got, want := resp.Header.Get("Content-Type"), "application/json"; got != want {
t.Errorf("Content-Type = %q; want %q", got, want)
}
var rs []Release
if err := json.NewDecoder(resp.Body).Decode(&rs); err != nil {
t.Fatalf("json.Decode: got unexpected error: %v", err)
}
sort.Slice(rs, func(i, j int) bool {
return rs[i].Version < rs[j].Version
})
sort.Strings(tc.versions)
if got, want := len(rs), len(tc.versions); got != want {
t.Fatalf("Number of releases = %d; want %d", got, want)
}
for i := range rs {
if got, want := rs[i].Version, tc.versions[i]; got != want {
t.Errorf("Got version %q; want %q", got, want)
}
}
})
}
}