| package restful |
| |
| import ( |
| "bytes" |
| "fmt" |
| "io" |
| "net/http" |
| "net/http/httptest" |
| "reflect" |
| "testing" |
| ) |
| |
| type keyvalue struct { |
| readCalled bool |
| writeCalled bool |
| } |
| |
| func (kv *keyvalue) Read(req *Request, v interface{}) error { |
| //t := reflect.TypeOf(v) |
| //rv := reflect.ValueOf(v) |
| kv.readCalled = true |
| return nil |
| } |
| |
| func (kv *keyvalue) Write(resp *Response, status int, v interface{}) error { |
| t := reflect.TypeOf(v) |
| rv := reflect.ValueOf(v) |
| for ix := 0; ix < t.NumField(); ix++ { |
| sf := t.Field(ix) |
| io.WriteString(resp, sf.Name) |
| io.WriteString(resp, "=") |
| io.WriteString(resp, fmt.Sprintf("%v\n", rv.Field(ix).Interface())) |
| } |
| kv.writeCalled = true |
| return nil |
| } |
| |
| // go test -v -test.run TestKeyValueEncoding ...restful |
| func TestKeyValueEncoding(t *testing.T) { |
| type Book struct { |
| Title string |
| Author string |
| PublishedYear int |
| } |
| kv := new(keyvalue) |
| RegisterEntityAccessor("application/kv", kv) |
| b := Book{"Singing for Dummies", "john doe", 2015} |
| |
| // Write |
| httpWriter := httptest.NewRecorder() |
| // Accept Produces |
| resp := Response{ResponseWriter: httpWriter, requestAccept: "application/kv,*/*;q=0.8", routeProduces: []string{"application/kv"}, prettyPrint: true} |
| resp.WriteEntity(b) |
| t.Log(string(httpWriter.Body.Bytes())) |
| if !kv.writeCalled { |
| t.Error("Write never called") |
| } |
| |
| // Read |
| bodyReader := bytes.NewReader(httpWriter.Body.Bytes()) |
| httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) |
| httpRequest.Header.Set("Content-Type", "application/kv; charset=UTF-8") |
| request := NewRequest(httpRequest) |
| var bb Book |
| request.ReadEntity(&bb) |
| if !kv.readCalled { |
| t.Error("Read never called") |
| } |
| } |