entity_accessors_test.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package restful
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "net/http/httptest"
  8. "reflect"
  9. "testing"
  10. )
  11. type keyvalue struct {
  12. readCalled bool
  13. writeCalled bool
  14. }
  15. func (kv *keyvalue) Read(req *Request, v interface{}) error {
  16. //t := reflect.TypeOf(v)
  17. //rv := reflect.ValueOf(v)
  18. kv.readCalled = true
  19. return nil
  20. }
  21. func (kv *keyvalue) Write(resp *Response, status int, v interface{}) error {
  22. t := reflect.TypeOf(v)
  23. rv := reflect.ValueOf(v)
  24. for ix := 0; ix < t.NumField(); ix++ {
  25. sf := t.Field(ix)
  26. io.WriteString(resp, sf.Name)
  27. io.WriteString(resp, "=")
  28. io.WriteString(resp, fmt.Sprintf("%v\n", rv.Field(ix).Interface()))
  29. }
  30. kv.writeCalled = true
  31. return nil
  32. }
  33. // go test -v -test.run TestKeyValueEncoding ...restful
  34. func TestKeyValueEncoding(t *testing.T) {
  35. type Book struct {
  36. Title string
  37. Author string
  38. PublishedYear int
  39. }
  40. kv := new(keyvalue)
  41. RegisterEntityAccessor("application/kv", kv)
  42. b := Book{"Singing for Dummies", "john doe", 2015}
  43. // Write
  44. httpWriter := httptest.NewRecorder()
  45. // Accept Produces
  46. resp := Response{httpWriter, "application/kv,*/*;q=0.8", []string{"application/kv"}, 0, 0, true, nil}
  47. resp.WriteEntity(b)
  48. t.Log(string(httpWriter.Body.Bytes()))
  49. if !kv.writeCalled {
  50. t.Error("Write never called")
  51. }
  52. // Read
  53. bodyReader := bytes.NewReader(httpWriter.Body.Bytes())
  54. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  55. httpRequest.Header.Set("Content-Type", "application/kv; charset=UTF-8")
  56. request := NewRequest(httpRequest)
  57. var bb Book
  58. request.ReadEntity(&bb)
  59. if !kv.readCalled {
  60. t.Error("Read never called")
  61. }
  62. }