github.com/billybanfield/evergreen@v0.0.0-20170525200750-eeee692790f7/apiv3/route/route_test.go (about)

     1  package route
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"testing"
     9  
    10  	"github.com/evergreen-ci/evergreen"
    11  	"github.com/evergreen-ci/evergreen/apiv3/model"
    12  	"github.com/evergreen-ci/evergreen/apiv3/servicecontext"
    13  	"github.com/gorilla/mux"
    14  	. "github.com/smartystreets/goconvey/convey"
    15  )
    16  
    17  func TestMakeRoute(t *testing.T) {
    18  
    19  	// With a route with many methods
    20  	Convey("With mocked methods", t, func() {
    21  		getAuth := &mockAuthenticator{}
    22  		getHandler := &mockRequestHandler{
    23  			storedModels: []model.Model{
    24  				&model.MockModel{
    25  					FieldId: "GET_method",
    26  				},
    27  			},
    28  		}
    29  		mockGet := MethodHandler{
    30  			Authenticator:  getAuth,
    31  			RequestHandler: getHandler,
    32  			MethodType:     evergreen.MethodGet,
    33  		}
    34  
    35  		postAuth := &mockAuthenticator{}
    36  		postHandler := &mockRequestHandler{
    37  			storedModels: []model.Model{
    38  				&model.MockModel{
    39  					FieldId: "POST_method",
    40  				},
    41  			},
    42  		}
    43  		mockPost := MethodHandler{
    44  			Authenticator:  postAuth,
    45  			RequestHandler: postHandler,
    46  			MethodType:     evergreen.MethodPost,
    47  		}
    48  
    49  		deleteAuth := &mockAuthenticator{}
    50  		deleteHandler := &mockRequestHandler{
    51  			storedModels: []model.Model{
    52  				&model.MockModel{
    53  					FieldId: "DELETE_method",
    54  				},
    55  			},
    56  		}
    57  		mockDelete := MethodHandler{
    58  			Authenticator:  deleteAuth,
    59  			RequestHandler: deleteHandler,
    60  			MethodType:     evergreen.MethodDelete,
    61  		}
    62  		Convey("then adding and registering should result in a correct route", func() {
    63  			sc := &servicecontext.MockServiceContext{}
    64  			sc.SetPrefix("rest")
    65  			r := mux.NewRouter()
    66  			route := &RouteManager{
    67  				Version: 2,
    68  				Route:   "/test_path",
    69  				Methods: []MethodHandler{mockGet, mockPost, mockDelete},
    70  			}
    71  			route.Register(r, sc)
    72  
    73  			for _, method := range route.Methods {
    74  
    75  				req, err := http.NewRequest(method.MethodType, "/rest/v2/test_path", nil)
    76  
    77  				So(err, ShouldBeNil)
    78  				rr := httptest.NewRecorder()
    79  				r.ServeHTTP(rr, req)
    80  				So(rr.Code, ShouldEqual, http.StatusOK)
    81  
    82  				res := model.MockModel{}
    83  				err = json.Unmarshal(rr.Body.Bytes(), &res)
    84  
    85  				So(err, ShouldBeNil)
    86  				So(res.FieldId, ShouldEqual, fmt.Sprintf("%s_method", method.MethodType))
    87  			}
    88  		})
    89  	})
    90  }