diff --git a/test/context_binder_test.go b/test/context_binder_test.go new file mode 100644 index 00000000..951bd260 --- /dev/null +++ b/test/context_binder_test.go @@ -0,0 +1,90 @@ +package test + +import ( + "encoding/xml" + "net/url" + "strconv" + "testing" + + "github.com/kataras/iris" +) + +/* Contains tests for context.ReadJSON/ReadXML/ReadFORM */ + +type testBinderData struct { + Username string + Mail string + Data []string `form:"mydata" json:"mydata"` +} + +type testBinderXMLData struct { + XMLName xml.Name `xml:"info"` + FirstAttr string `xml:"first,attr"` + SecondAttr string `xml:"second,attr"` + Name string `xml:"name",json:"name"` + Birth string `xml:"birth",json:"birth"` + Stars int `xml:"stars",json:"stars"` +} + +func TestBindForm(t *testing.T) { + api := iris.New() + api.Post("/form", func(ctx *iris.Context) { + obj := testBinderData{} + err := ctx.ReadForm(&obj) + if err != nil { + t.Fatalf("Error when parsing the FORM: %s", err.Error()) + } + ctx.JSON(iris.StatusOK, obj) + }) + + e := tester(api, t) + passed := map[string]interface{}{"Username": "myusername", "Mail": "mymail@iris-go.com", "mydata": url.Values{"[0]": []string{"mydata1"}, + "[1]": []string{"mydata2"}}} + + expectedObject := testBinderData{Username: "myusername", Mail: "mymail@iris-go.com", Data: []string{"mydata1", "mydata2"}} + + e.POST("/form").WithForm(passed).Expect().Status(iris.StatusOK).JSON().Object().Equal(expectedObject) +} + +func TestBindJSON(t *testing.T) { + api := iris.New() + api.Post("/json", func(ctx *iris.Context) { + obj := testBinderData{} + err := ctx.ReadJSON(&obj) + if err != nil { + t.Fatalf("Error when parsing the JSON body: %s", err.Error()) + } + ctx.JSON(iris.StatusOK, obj) + }) + + e := tester(api, t) + passed := map[string]interface{}{"Username": "myusername", "Mail": "mymail@iris-go.com", "mydata": []string{"mydata1", "mydata2"}} + expectedObject := testBinderData{Username: "myusername", Mail: "mymail@iris-go.com", Data: []string{"mydata1", "mydata2"}} + + e.POST("/json").WithJSON(passed).Expect().Status(iris.StatusOK).JSON().Object().Equal(expectedObject) +} + +func TestBindXML(t *testing.T) { + api := iris.New() + api.Post("/xml", func(ctx *iris.Context) { + obj := testBinderXMLData{} + err := ctx.ReadXML(&obj) + if err != nil { + t.Fatalf("Error when parsing the XML body: %s", err.Error()) + } + ctx.XML(iris.StatusOK, obj) + }) + + e := tester(api, t) + expectedObj := testBinderXMLData{ + XMLName: xml.Name{Local: "info", Space: "info"}, + FirstAttr: "this is the first attr", + SecondAttr: "this is the second attr", + Name: "Iris web framework", + Birth: "13 March 2016", + Stars: 4064, + } + // so far no WithXML or .XML like WithJSON and .JSON on httpexpect I added a feature request as post issue and we're waiting + expectedBody := `<` + expectedObj.XMLName.Local + ` first="` + expectedObj.FirstAttr + `" second="` + expectedObj.SecondAttr + `">` + expectedObj.Name + `` + expectedObj.Birth + `` + strconv.Itoa(expectedObj.Stars) + `` + e.POST("/xml").WithText(expectedBody).Expect().Status(iris.StatusOK).Body().Equal(expectedBody) +} diff --git a/test/mux_test.go b/test/mux_test.go index aa1512e5..60cdf8ac 100644 --- a/test/mux_test.go +++ b/test/mux_test.go @@ -229,3 +229,61 @@ func TestMuxCustomErrors(t *testing.T) { Status(r.Status).Body().Equal(r.Body) } } + +type testUserAPI struct { + *iris.Context +} + +// GET /users +func (u testUserAPI) Get() { + u.Write("Get Users\n") +} + +// GET /users/:param1 which its value passed to the id argument +func (u testUserAPI) GetBy(id string) { // id equals to u.Param("param1") + u.Write("Get By %s\n", id) +} + +// PUT /users +func (u testUserAPI) Put() { + u.Write("Put, name: %s\n", u.FormValue("name")) +} + +// POST /users/:param1 +func (u testUserAPI) PostBy(id string) { + u.Write("Post By %s, name: %s\n", id, u.FormValue("name")) +} + +// DELETE /users/:param1 +func (u testUserAPI) DeleteBy(id string) { + u.Write("Delete By %s\n", id) +} + +func TestMuxAPI(t *testing.T) { + api := iris.New() + + middlewareResponseText := "I assume that you are authenticated\n" + api.API("/users", testUserAPI{}, func(ctx *iris.Context) { // optional middleware for .API + // do your work here, or render a login window if not logged in, get the user and send it to the next middleware, or do all here + ctx.Set("user", "username") + ctx.Next() + }, func(ctx *iris.Context) { + if ctx.Get("user") == "username" { + ctx.Write(middlewareResponseText) + ctx.Next() + } else { + ctx.SetStatusCode(iris.StatusUnauthorized) + } + }) + + e := tester(api, t) + + userID := "4077" + formname := "kataras" + + e.GET("/users").Expect().Status(iris.StatusOK).Body().Equal(middlewareResponseText + "Get Users\n") + e.GET("/users/" + userID).Expect().Status(iris.StatusOK).Body().Equal(middlewareResponseText + "Get By " + userID + "\n") + e.PUT("/users").WithFormField("name", formname).Expect().Status(iris.StatusOK).Body().Equal(middlewareResponseText + "Put, name: " + formname + "\n") + e.POST("/users/"+userID).WithFormField("name", formname).Expect().Status(iris.StatusOK).Body().Equal(middlewareResponseText + "Post By " + userID + ", name: " + formname + "\n") + e.DELETE("/users/" + userID).Expect().Status(iris.StatusOK).Body().Equal(middlewareResponseText + "Delete By " + userID + "\n") +} diff --git a/test/sessions_test.go b/test/sessions_test.go index c1e8e277..52eaebd0 100644 --- a/test/sessions_test.go +++ b/test/sessions_test.go @@ -1,7 +1,7 @@ //Package test -v ./... builds all tests package test -// Contains tests for sessions +// Contains tests for sessions(sessions package) & flash messages(context) import ( "testing"