Skip to content

Commit

Permalink
#165 Remove 'render.pretty' config in-favor of REST client editor too…
Browse files Browse the repository at this point in the history
…l and browser support (#167)
  • Loading branch information
jeevatkm committed Apr 13, 2018
1 parent 2cc0529 commit baf98c1
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 149 deletions.
2 changes: 0 additions & 2 deletions aah.go
Expand Up @@ -103,7 +103,6 @@ type app struct {
staticAccessLogEnabled bool
dumpLogEnabled bool
defaultContentType *ahttp.ContentType
renderPretty bool
shutdownGraceTimeStr string
shutdownGraceTimeout time.Duration
initialized bool
Expand Down Expand Up @@ -428,7 +427,6 @@ func (a *app) initConfigValues() (err error) {
a.accessLogEnabled = cfg.BoolDefault("server.access_log.enable", false)
a.staticAccessLogEnabled = cfg.BoolDefault("server.access_log.static_file", true)
a.dumpLogEnabled = cfg.BoolDefault("server.dump_log.enable", false)
a.renderPretty = cfg.BoolDefault("render.pretty", false)
a.defaultContentType = resolveDefaultContentType(a.Config().StringDefault("render.default", ""))
if a.defaultContentType == nil {
return errors.New("'render.default' config value is not defined")
Expand Down
32 changes: 1 addition & 31 deletions engine_test.go
Expand Up @@ -104,7 +104,7 @@ func TestEngineTestRequests(t *testing.T) {
assert.Equal(t, "application/json; charset=utf-8", resp.Header.Get(ahttp.HeaderContentType))
assert.Equal(t, "true", resp.Header.Get("X-Centrallized-ErrorHandler"))
assert.Equal(t, "true", resp.Header.Get("X-Cntrl-ErrorHandler"))
assert.True(t, strings.Contains(responseBody(resp), `"message": "Internal Server Error"`))
assert.True(t, strings.Contains(responseBody(resp), `"message":"Internal Server Error"`))

// Panic Flow test XML - /trigger-panic
t.Log("Panic Flow test XML - /trigger-panic")
Expand All @@ -119,46 +119,17 @@ func TestEngineTestRequests(t *testing.T) {
assert.Equal(t, "true", resp.Header.Get("X-Cntrl-ErrorHandler"))
assert.True(t, strings.Contains(responseBody(resp), `<message>Internal Server Error</message>`))

// GET XML pretty response - /get-xml
t.Log("GET XML pretty response - /get-xml")
ts.app.renderPretty = true
resp, err = httpClient.Get(ts.URL + "/get-xml")
assert.Nil(t, err)
assert.Equal(t, 200, resp.StatusCode)
assert.Equal(t, "application/xml; charset=utf-8", resp.Header.Get(ahttp.HeaderContentType))
assert.Equal(t, "131", resp.Header.Get(ahttp.HeaderContentLength))
assert.True(t, strings.Contains(responseBody(resp), "<Message>This is XML payload result</Message>"))

// GET XML non-pretty response - /get-xml
t.Log("GET XML non-pretty response - /get-xml")
ts.app.renderPretty = false
resp, err = httpClient.Get(ts.URL + "/get-xml")
assert.Nil(t, err)
assert.Equal(t, 200, resp.StatusCode)
assert.Equal(t, "application/xml; charset=utf-8", resp.Header.Get(ahttp.HeaderContentType))
assert.Equal(t, "120", resp.Header.Get(ahttp.HeaderContentLength))
assert.True(t, strings.Contains(responseBody(resp), "<Message>This is XML payload result</Message>"))

// GET JSONP pretty response - /get-jsonp?callback=welcome1
t.Log("GET JSONP pretty response - /get-jsonp?callback=welcome1")
ts.app.renderPretty = true
resp, err = httpClient.Get(ts.URL + "/get-jsonp?callback=welcome1")
assert.Nil(t, err)
assert.Equal(t, 200, resp.StatusCode)
assert.Equal(t, "application/javascript; charset=utf-8", resp.Header.Get(ahttp.HeaderContentType))
assert.Equal(t, "176", resp.Header.Get(ahttp.HeaderContentLength))
assert.Equal(t, `welcome1({
"ProductID": 190398398,
"ProductName": "JSONP product",
"Username": "myuser_name",
"Email": "email@email.com",
"Page": 2,
"Count": "1000"
});`, responseBody(resp))

// GET JSONP non-pretty response - /get-jsonp?callback=welcome1
t.Log("GET JSONP non-pretty response - /get-jsonp?callback=welcome1")
ts.app.renderPretty = false
resp, err = httpClient.Get(ts.URL + "/get-jsonp?callback=welcome1")
assert.Nil(t, err)
assert.Equal(t, 200, resp.StatusCode)
Expand All @@ -168,7 +139,6 @@ func TestEngineTestRequests(t *testing.T) {

// GET JSONP non-pretty response no callback input - /get-jsonp
t.Log("GET JSONP non-pretty response no callback input - /get-jsonp")
ts.app.renderPretty = false
resp, err = httpClient.Get(ts.URL + "/get-jsonp")
assert.Nil(t, err)
assert.Equal(t, 200, resp.StatusCode)
Expand Down
40 changes: 5 additions & 35 deletions render.go
Expand Up @@ -75,20 +75,11 @@ func (t textRender) Render(w io.Writer) (err error) {
// jsonRender renders the response JSON content.
type jsonRender struct {
Data interface{}
r *Reply
}

// Render method writes JSON into HTTP response.
func (j jsonRender) Render(w io.Writer) error {
var jsonBytes []byte
var err error

if j.r.ctx.a.renderPretty {
jsonBytes, err = JSONMarshalIndent(j.Data, "", " ")
} else {
jsonBytes, err = JSONMarshal(j.Data)
}

jsonBytes, err := JSONMarshal(j.Data)
if err != nil {
return err
}
Expand All @@ -105,20 +96,11 @@ func (j jsonRender) Render(w io.Writer) error {
type jsonpRender struct {
Callback string
Data interface{}
r *Reply
}

// Render method writes JSONP into HTTP response.
func (j jsonpRender) Render(w io.Writer) error {
var jsonBytes []byte
var err error

if j.r.ctx.a.renderPretty {
jsonBytes, err = JSONMarshalIndent(j.Data, "", " ")
} else {
jsonBytes, err = JSONMarshal(j.Data)
}

jsonBytes, err := JSONMarshal(j.Data)
if err != nil {
return err
}
Expand All @@ -139,20 +121,11 @@ func (j jsonpRender) Render(w io.Writer) error {
// xmlRender renders the response XML content.
type xmlRender struct {
Data interface{}
r *Reply
}

// Render method writes XML into HTTP response.
func (x xmlRender) Render(w io.Writer) error {
var xmlBytes []byte
var err error

if x.r.ctx.a.renderPretty {
xmlBytes, err = xml.MarshalIndent(x.Data, "", " ")
} else {
xmlBytes, err = xml.Marshal(x.Data)
}

xmlBytes, err := xml.Marshal(x.Data)
if err != nil {
return err
}
Expand All @@ -161,11 +134,8 @@ func (x xmlRender) Render(w io.Writer) error {
return err
}

if _, err = w.Write(xmlBytes); err != nil {
return err
}

return nil
_, err = w.Write(xmlBytes)
return err
}

//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Expand Down
78 changes: 2 additions & 76 deletions render_test.go
Expand Up @@ -47,84 +47,13 @@ func TestRenderJSON(t *testing.T) {
Address: "this is my street",
}

a := newApp()
reply := newReply(&Context{a: a})
json1 := jsonRender{Data: data, r: reply}
json1 := jsonRender{Data: data}
err := json1.Render(buf)
assert.FailOnError(t, err, "")
assert.Equal(t, `{"Name":"John","Age":28,"Address":"this is my street"}`,
buf.String())
}

// func TestRenderJSONP(t *testing.T) {
// buf := acquireBuffer()
//
// data := struct {
// Name string
// Age int
// Address string
// }{
// Name: "John",
// Age: 28,
// Address: "this is my street",
// }
//
// renderPretty = true
// json1 := jsonpRender{Data: data, Callback: "mycallback"}
// err := json1.Render(buf)
// assert.FailOnError(t, err, "")
// assert.Equal(t, `mycallback({
// "Name": "John",
// "Age": 28,
// "Address": "this is my street"
// });`, buf.String())
//
// buf.Reset()
// renderPretty = false
//
// err = json1.Render(buf)
// assert.FailOnError(t, err, "")
// assert.Equal(t, `mycallback({"Name":"John","Age":28,"Address":"this is my street"});`,
// buf.String())
// }
//
// func TestRenderXML(t *testing.T) {
// buf := acquireBuffer()
//
// type Sample struct {
// Name string
// Age int
// Address string
// }
//
// data := Sample{
// Name: "John",
// Age: 28,
// Address: "this is my street",
// }
//
// renderPretty = true
// xml1 := xmlRender{Data: data}
// err := xml1.Render(buf)
// assert.FailOnError(t, err, "")
// assert.Equal(t, `<?xml version="1.0" encoding="UTF-8"?>
// <Sample>
// <Name>John</Name>
// <Age>28</Age>
// <Address>this is my street</Address>
// </Sample>`, buf.String())
//
// buf.Reset()
//
// renderPretty = false
//
// err = xml1.Render(buf)
// assert.FailOnError(t, err, "")
// assert.Equal(t, `<?xml version="1.0" encoding="UTF-8"?>
// <Sample><Name>John</Name><Age>28</Age><Address>this is my street</Address></Sample>`,
// buf.String())
// }
//
func TestRenderFailureXML(t *testing.T) {
buf := new(bytes.Buffer)

Expand All @@ -138,9 +67,7 @@ func TestRenderFailureXML(t *testing.T) {
Address: "this is my street",
}

a := newApp()
reply := newReply(&Context{a: a})
xml1 := xmlRender{Data: data, r: reply}
xml1 := xmlRender{Data: data}
err := xml1.Render(buf)
assert.Equal(t, "xml: unsupported type: struct { Name string; Age int; Address string }", err.Error())
}
Expand All @@ -149,7 +76,6 @@ func TestRenderFileNotExistsAndDir(t *testing.T) {
buf := new(bytes.Buffer)

// Directory error
// buf.Reset()
file1 := binaryRender{Path: os.Getenv("HOME")}
err := file1.Render(buf)
assert.NotNil(t, err)
Expand Down
8 changes: 3 additions & 5 deletions reply.go
Expand Up @@ -142,27 +142,25 @@ func (r *Reply) ContentType(contentType string) *Reply {

// JSON method renders given data as JSON response
// and it sets HTTP 'Content-Type' as 'application/json; charset=utf-8'.
// Response rendered pretty if 'render.pretty' is true.
func (r *Reply) JSON(data interface{}) *Reply {
r.ContentType(ahttp.ContentTypeJSON.String())
r.Render(&jsonRender{Data: data, r: r})
r.Render(&jsonRender{Data: data})
return r
}

// JSONP method renders given data as JSONP response with callback
// and it sets HTTP 'Content-Type' as 'application/javascript; charset=utf-8'.
func (r *Reply) JSONP(data interface{}, callback string) *Reply {
r.ContentType(ahttp.ContentTypeJavascript.String())
r.Render(&jsonpRender{Data: data, Callback: callback, r: r})
r.Render(&jsonpRender{Data: data, Callback: callback})
return r
}

// XML method renders given data as XML response and it sets
// HTTP Content-Type as 'application/xml; charset=utf-8'.
// Response rendered pretty if 'render.pretty' is true.
func (r *Reply) XML(data interface{}) *Reply {
r.ContentType(ahttp.ContentTypeXML.String())
r.Render(&xmlRender{Data: data, r: r})
r.Render(&xmlRender{Data: data})
return r
}

Expand Down
45 changes: 45 additions & 0 deletions static_test.go
Expand Up @@ -8,6 +8,8 @@ import (
"bytes"
"io/ioutil"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"strings"
"testing"
Expand Down Expand Up @@ -108,3 +110,46 @@ func TestStaticDetectContentType(t *testing.T) {
v, _ = detectFileContentType("test-image.noext", bytes.NewReader(content))
assert.Equal(t, "image/png", v)
}

func TestStaticCacheHeader(t *testing.T) {
sm := staticManager{
mimeCacheHdrMap: map[string]string{
"text/css": "public, max-age=604800, proxy-revalidate",
"application/javascript": "public, max-age=604800, proxy-revalidate",
"image/png": "public, max-age=604800, proxy-revalidate",
},
defaultCacheHdr: "public, max-age=31536000",
}

str := sm.cacheHeader("application/json")
assert.Equal(t, "public, max-age=31536000", str)

str = sm.cacheHeader("image/png")
assert.Equal(t, "public, max-age=604800, proxy-revalidate", str)

str = sm.cacheHeader("application/json; charset=utf-8")
assert.Equal(t, "public, max-age=31536000", str)

str = sm.cacheHeader("text/css")
assert.Equal(t, "public, max-age=604800, proxy-revalidate", str)
}

func TestStaticWriteFileError(t *testing.T) {
importPath := filepath.Join(testdataBaseDir(), "webapp1")
ts, err := newTestServer(t, importPath)
assert.Nil(t, err)
defer ts.Close()

t.Logf("Test Server URL [Static Write File Error]: %s", ts.URL)

sm := ts.app.staticMgr
req := httptest.NewRequest(ahttp.MethodGet, "http://localhost:8080/assets/js/myfile.js", nil)

w1 := httptest.NewRecorder()
sm.writeFileError(ahttp.AcquireResponseWriter(w1), ahttp.AcquireRequest(req), os.ErrPermission)
assert.Equal(t, "403 Forbidden", responseBody(w1.Result()))

w2 := httptest.NewRecorder()
sm.writeFileError(ahttp.AcquireResponseWriter(w2), ahttp.AcquireRequest(req), nil)
assert.Equal(t, "500 Internal Server Error", responseBody(w2.Result()))
}

0 comments on commit baf98c1

Please sign in to comment.