You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.7 KiB
103 lines
2.7 KiB
package fizzbuzz
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestServer(t *testing.T) {
|
|
restAPI := &Server{}
|
|
tserver := httptest.NewServer(restAPI.Routes())
|
|
defer tserver.Close()
|
|
|
|
t.Run("invalid URLs", func(t *testing.T) {
|
|
tcases := []struct {
|
|
urlParams string
|
|
errCode int
|
|
errContains string
|
|
}{
|
|
{urlParams: "?limit=toto", errCode: 400, errContains: "invalid integer 'toto'"},
|
|
{urlParams: "?int1=tata", errCode: 400, errContains: "int1"},
|
|
{urlParams: "?int2=titi", errCode: 400, errContains: "int2"},
|
|
{urlParams: "/notFoundPath", errCode: 404, errContains: "not found"},
|
|
}
|
|
for i, tcase := range tcases {
|
|
resp, err := http.Get(tserver.URL + tcase.urlParams)
|
|
if err != nil {
|
|
t.Fatalf("%d: %s", i+1, err)
|
|
}
|
|
assertStatus(i, t, resp, tcase.errCode)
|
|
if got, want := readErrorFromResponse(t, resp), tcase.errContains; !strings.Contains(got, want) {
|
|
t.Fatalf("%d: expect errors contains %s, got %s", i+1, want, got)
|
|
}
|
|
}
|
|
})
|
|
t.Run("valid URLs", func(t *testing.T) {
|
|
emptyList := []string{}
|
|
tcases := []struct {
|
|
urlParams string
|
|
expectOut []string
|
|
}{
|
|
// Invalid cases
|
|
{urlParams: "", expectOut: emptyList},
|
|
{urlParams: "?", expectOut: emptyList},
|
|
{urlParams: "?limit=0", expectOut: emptyList},
|
|
{urlParams: "?string1=aa&string2=bb&int1=2&int2=3&limit=0", expectOut: emptyList},
|
|
// Valid case
|
|
{
|
|
urlParams: "?string1=aa&string2=bb&int1=3&int2=2&limit=12",
|
|
expectOut: []string{"1", "bb", "aa", "bb", "5", "aabb", "7", "bb", "aa", "bb", "11", "aabb"},
|
|
},
|
|
}
|
|
for i, tcase := range tcases {
|
|
resp, err := http.Get(tserver.URL + tcase.urlParams)
|
|
if err != nil {
|
|
t.Fatalf("%d: %s", i+1, err)
|
|
}
|
|
assertStatus(i, t, resp, 200)
|
|
if got, want := readListFromResponse(t, resp), tcase.expectOut; !reflect.DeepEqual(got, want) {
|
|
t.Fatalf("%d: got %#v, want %#v", i+1, got, want)
|
|
}
|
|
}
|
|
})
|
|
|
|
}
|
|
|
|
func assertStatus(i int, t *testing.T, resp *http.Response, expect int) {
|
|
t.Helper()
|
|
if got, want := resp.StatusCode, expect; got != want {
|
|
t.Fatalf("%d, got %d, want %d", i+1, got, want)
|
|
}
|
|
}
|
|
|
|
func readListFromResponse(t *testing.T, resp *http.Response) []string {
|
|
t.Helper()
|
|
defer resp.Body.Close()
|
|
var list []string
|
|
bytes, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(bytes) == 0 {
|
|
return list
|
|
}
|
|
if err = json.Unmarshal(bytes, &list); err != nil {
|
|
t.Fatalf("error while unmarshalling %s: %s", string(bytes), err)
|
|
}
|
|
return list
|
|
}
|
|
|
|
func readErrorFromResponse(t *testing.T, resp *http.Response) string {
|
|
t.Helper()
|
|
defer resp.Body.Close()
|
|
bytes, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return string(bytes)
|
|
}
|
|
|