Enable subtests for environments prior to Go 1.7
This commit is contained in:
parent
3f0faedfd8
commit
9b4126cae6
114
handler_test.go
114
handler_test.go
|
@ -1,128 +1,14 @@
|
|||
package tusd_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/mock/gomock"
|
||||
|
||||
"github.com/tus/tusd"
|
||||
. "github.com/tus/tusd"
|
||||
)
|
||||
|
||||
type zeroStore struct{}
|
||||
|
||||
func (store zeroStore) NewUpload(info FileInfo) (string, error) {
|
||||
return "", nil
|
||||
}
|
||||
func (store zeroStore) WriteChunk(id string, offset int64, src io.Reader) (int64, error) {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func (store zeroStore) GetInfo(id string) (FileInfo, error) {
|
||||
return FileInfo{}, nil
|
||||
}
|
||||
|
||||
type FullDataStore interface {
|
||||
tusd.DataStore
|
||||
tusd.TerminaterDataStore
|
||||
tusd.ConcaterDataStore
|
||||
tusd.GetReaderDataStore
|
||||
}
|
||||
|
||||
type httpTest struct {
|
||||
Name string
|
||||
|
||||
Method string
|
||||
URL string
|
||||
|
||||
ReqBody io.Reader
|
||||
ReqHeader map[string]string
|
||||
|
||||
Code int
|
||||
ResBody string
|
||||
ResHeader map[string]string
|
||||
}
|
||||
|
||||
func (test *httpTest) Run(handler http.Handler, t *testing.T) *httptest.ResponseRecorder {
|
||||
req, _ := http.NewRequest(test.Method, test.URL, test.ReqBody)
|
||||
|
||||
// Add headers
|
||||
for key, value := range test.ReqHeader {
|
||||
req.Header.Set(key, value)
|
||||
}
|
||||
|
||||
req.Host = "tus.io"
|
||||
w := httptest.NewRecorder()
|
||||
handler.ServeHTTP(w, req)
|
||||
|
||||
if w.Code != test.Code {
|
||||
t.Errorf("Expected %v %s as status code (got %v %s)", test.Code, http.StatusText(test.Code), w.Code, http.StatusText(w.Code))
|
||||
}
|
||||
|
||||
for key, value := range test.ResHeader {
|
||||
header := w.HeaderMap.Get(key)
|
||||
|
||||
if value != header {
|
||||
t.Errorf("Expected '%s' as '%s' (got '%s')", value, key, header)
|
||||
}
|
||||
}
|
||||
|
||||
if test.ResBody != "" && string(w.Body.Bytes()) != test.ResBody {
|
||||
t.Errorf("Expected '%s' as body (got '%s'", test.ResBody, string(w.Body.Bytes()))
|
||||
}
|
||||
|
||||
return w
|
||||
}
|
||||
|
||||
func SubTest(t *testing.T, name string, runTest func(*testing.T, *MockFullDataStore)) {
|
||||
t.Run(name, func(subT *testing.T) {
|
||||
//subT.Parallel()
|
||||
|
||||
ctrl := gomock.NewController(subT)
|
||||
defer ctrl.Finish()
|
||||
|
||||
store := NewMockFullDataStore(ctrl)
|
||||
|
||||
runTest(subT, store)
|
||||
})
|
||||
}
|
||||
|
||||
type ReaderMatcher struct {
|
||||
expect string
|
||||
}
|
||||
|
||||
func NewReaderMatcher(expect string) gomock.Matcher {
|
||||
return ReaderMatcher{
|
||||
expect: expect,
|
||||
}
|
||||
}
|
||||
|
||||
func (m ReaderMatcher) Matches(x interface{}) bool {
|
||||
input, ok := x.(io.Reader)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
bytes, err := ioutil.ReadAll(input)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
readStr := string(bytes)
|
||||
return reflect.DeepEqual(m.expect, readStr)
|
||||
}
|
||||
|
||||
func (m ReaderMatcher) String() string {
|
||||
return fmt.Sprintf("reads to %s", m.expect)
|
||||
}
|
||||
|
||||
func TestMethodOverride(t *testing.T) {
|
||||
mockCtrl := gomock.NewController(t)
|
||||
defer mockCtrl.Finish()
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
// +build go1.7
|
||||
|
||||
package tusd_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/golang/mock/gomock"
|
||||
)
|
||||
|
||||
func SubTest(t *testing.T, name string, runTest func(*testing.T, *MockFullDataStore)) {
|
||||
t.Run(name, func(subT *testing.T) {
|
||||
//subT.Parallel()
|
||||
|
||||
ctrl := gomock.NewController(subT)
|
||||
defer ctrl.Finish()
|
||||
|
||||
store := NewMockFullDataStore(ctrl)
|
||||
|
||||
runTest(subT, store)
|
||||
})
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
// +build !go1.7
|
||||
|
||||
package tusd_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/mock/gomock"
|
||||
)
|
||||
|
||||
func SubTest(t *testing.T, name string, runTest func(*testing.T, *MockFullDataStore)) {
|
||||
fmt.Println("\t=== RUN SubTest:", name)
|
||||
|
||||
ctrl := gomock.NewController(t)
|
||||
defer ctrl.Finish()
|
||||
|
||||
store := NewMockFullDataStore(ctrl)
|
||||
|
||||
runTest(t, store)
|
||||
|
||||
if t.Failed() {
|
||||
fmt.Println("\t--- FAIL SubTest:", name)
|
||||
t.FailNow()
|
||||
} else {
|
||||
fmt.Println("\t--- PASS SubTest:", name)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
package tusd_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/tus/tusd"
|
||||
. "github.com/tus/tusd"
|
||||
)
|
||||
|
||||
type zeroStore struct{}
|
||||
|
||||
func (store zeroStore) NewUpload(info FileInfo) (string, error) {
|
||||
return "", nil
|
||||
}
|
||||
func (store zeroStore) WriteChunk(id string, offset int64, src io.Reader) (int64, error) {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func (store zeroStore) GetInfo(id string) (FileInfo, error) {
|
||||
return FileInfo{}, nil
|
||||
}
|
||||
|
||||
type FullDataStore interface {
|
||||
tusd.DataStore
|
||||
tusd.TerminaterDataStore
|
||||
tusd.ConcaterDataStore
|
||||
tusd.GetReaderDataStore
|
||||
}
|
||||
|
||||
type httpTest struct {
|
||||
Name string
|
||||
|
||||
Method string
|
||||
URL string
|
||||
|
||||
ReqBody io.Reader
|
||||
ReqHeader map[string]string
|
||||
|
||||
Code int
|
||||
ResBody string
|
||||
ResHeader map[string]string
|
||||
}
|
||||
|
||||
func (test *httpTest) Run(handler http.Handler, t *testing.T) *httptest.ResponseRecorder {
|
||||
req, _ := http.NewRequest(test.Method, test.URL, test.ReqBody)
|
||||
|
||||
// Add headers
|
||||
for key, value := range test.ReqHeader {
|
||||
req.Header.Set(key, value)
|
||||
}
|
||||
|
||||
req.Host = "tus.io"
|
||||
w := httptest.NewRecorder()
|
||||
handler.ServeHTTP(w, req)
|
||||
|
||||
if w.Code != test.Code {
|
||||
t.Errorf("Expected %v %s as status code (got %v %s)", test.Code, http.StatusText(test.Code), w.Code, http.StatusText(w.Code))
|
||||
}
|
||||
|
||||
for key, value := range test.ResHeader {
|
||||
header := w.HeaderMap.Get(key)
|
||||
|
||||
if value != header {
|
||||
t.Errorf("Expected '%s' as '%s' (got '%s')", value, key, header)
|
||||
}
|
||||
}
|
||||
|
||||
if test.ResBody != "" && string(w.Body.Bytes()) != test.ResBody {
|
||||
t.Errorf("Expected '%s' as body (got '%s'", test.ResBody, string(w.Body.Bytes()))
|
||||
}
|
||||
|
||||
return w
|
||||
}
|
||||
|
||||
type ReaderMatcher struct {
|
||||
expect string
|
||||
}
|
||||
|
||||
func NewReaderMatcher(expect string) gomock.Matcher {
|
||||
return ReaderMatcher{
|
||||
expect: expect,
|
||||
}
|
||||
}
|
||||
|
||||
func (m ReaderMatcher) Matches(x interface{}) bool {
|
||||
input, ok := x.(io.Reader)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
bytes, err := ioutil.ReadAll(input)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
readStr := string(bytes)
|
||||
return reflect.DeepEqual(m.expect, readStr)
|
||||
}
|
||||
|
||||
func (m ReaderMatcher) String() string {
|
||||
return fmt.Sprintf("reads to %s", m.expect)
|
||||
}
|
Loading…
Reference in New Issue