123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package app_test
- import (
- "bytes"
- "io"
- "io/ioutil"
- "net/http"
- "net/http/httptest"
- "path/filepath"
- "reflect"
- "runtime"
- "testing"
- )
- // assert fails the test if the condition is false.
- func assert(tb testing.TB, condition bool, msg string, v ...interface{}) {
- if !condition {
- _, file, line, _ := runtime.Caller(1)
- tb.Fatalf("%s:%d: "+msg, append([]interface{}{filepath.Base(file), line}, v...)...)
- }
- }
- // ok errors the test if an err is not nil.
- func ok(tb testing.TB, err error) {
- if err != nil {
- _, file, line, _ := runtime.Caller(1)
- tb.Errorf("%s:%d: unexpected error: %v", filepath.Base(file), line, err)
- }
- }
- // equals errors the test if want is not equal to have.
- func equals(tb testing.TB, want, have interface{}) {
- if !reflect.DeepEqual(want, have) {
- _, file, line, _ := runtime.Caller(1)
- tb.Errorf("%s:%d: want %#v, have %#v", filepath.Base(file), line, want, have)
- }
- }
- // checkGet does a GET and returns the response and the body
- func checkGet(t *testing.T, ts *httptest.Server, path string) (*http.Response, []byte) {
- return checkRequest(t, ts, "GET", path, nil)
- }
- // checkRequest does a 'method'-request (e.g. 'GET') and returns the response and the body
- func checkRequest(t *testing.T, ts *httptest.Server, method, path string, body []byte) (*http.Response, []byte) {
- fullPath := ts.URL + path
- var bodyReader io.Reader
- if len(body) > 0 {
- bodyReader = bytes.NewReader(body)
- }
- req, err := http.NewRequest(method, fullPath, bodyReader)
- if err != nil {
- t.Fatalf("Error getting %s: %s %s", method, path, err)
- }
- req.Header.Set("Content-Type", "application/msgpack")
- client := &http.Client{}
- res, err := client.Do(req)
- if err != nil {
- t.Fatalf("Error getting %s %s: %s", method, path, err)
- }
- body, err = ioutil.ReadAll(res.Body)
- res.Body.Close()
- if err != nil {
- t.Fatalf("%s %s body read error: %s", method, path, err)
- }
- return res, body
- }
- // getRawJSON GETs a file, checks it is JSON, and returns the non-parsed body
- func getRawJSON(t *testing.T, ts *httptest.Server, path string) []byte {
- res, body := checkGet(t, ts, path)
- _, file, line, _ := runtime.Caller(1)
- file = filepath.Base(file)
- if res.StatusCode != 200 {
- t.Fatalf("%s:%d: Expected status %d, got %d. Path: %s", file, line, 200, res.StatusCode, path)
- }
- foundCtype := res.Header.Get("content-type")
- if foundCtype != "application/json" {
- t.Errorf("%s:%d: Wrong Content-type for JSON: %s", file, line, foundCtype)
- }
- if len(body) == 0 {
- t.Errorf("%s:%d: No response body", file, line)
- }
- // fmt.Printf("Body: %s", body)
- return body
- }
- // is200 GETs path and verifies the status code. Returns the body
- func is200(t *testing.T, ts *httptest.Server, path string) []byte {
- res, body := checkGet(t, ts, path)
- if res.StatusCode != 200 {
- t.Fatalf("Expected status %d, got %d. Path: %s", 200, res.StatusCode, path)
- }
- return body
- }
- // is404 GETs path and verifies it returns a 404 status code. Returns the body
- func is404(t *testing.T, ts *httptest.Server, path string) []byte {
- res, body := checkGet(t, ts, path)
- if res.StatusCode != 404 {
- t.Fatalf("Expected status %d, got %d", 404, res.StatusCode)
- }
- return body
- }
- // is400 GETs path and verifies it returns a 400 status code. Returns the body
- func is400(t *testing.T, ts *httptest.Server, path string) []byte {
- res, body := checkGet(t, ts, path)
- if res.StatusCode != 400 {
- t.Fatalf("Expected status %d, got %d", 400, res.StatusCode)
- }
- return body
- }
|