request_test.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package restful
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/url"
  6. "strconv"
  7. "strings"
  8. "testing"
  9. )
  10. func TestQueryParameter(t *testing.T) {
  11. hreq := http.Request{Method: "GET"}
  12. hreq.URL, _ = url.Parse("http://www.google.com/search?q=foo&q=bar")
  13. rreq := Request{Request: &hreq}
  14. if rreq.QueryParameter("q") != "foo" {
  15. t.Errorf("q!=foo %#v", rreq)
  16. }
  17. }
  18. type Anything map[string]interface{}
  19. type Number struct {
  20. ValueFloat float64
  21. ValueInt int64
  22. }
  23. type Sample struct {
  24. Value string
  25. }
  26. func TestReadEntityXmlCached(t *testing.T) {
  27. SetCacheReadEntity(true)
  28. bodyReader := strings.NewReader("<Sample><Value>42</Value></Sample>")
  29. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  30. httpRequest.Header.Set("Content-Type", "application/xml")
  31. request := &Request{Request: httpRequest}
  32. sam := new(Sample)
  33. request.ReadEntity(sam)
  34. if sam.Value != "42" {
  35. t.Fatal("read failed")
  36. }
  37. if request.bodyContent == nil {
  38. t.Fatal("no expected cached bytes found")
  39. }
  40. }
  41. func TestReadEntityXmlNonCached(t *testing.T) {
  42. SetCacheReadEntity(false)
  43. bodyReader := strings.NewReader("<Sample><Value>42</Value></Sample>")
  44. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  45. httpRequest.Header.Set("Content-Type", "application/xml")
  46. request := &Request{Request: httpRequest}
  47. sam := new(Sample)
  48. request.ReadEntity(sam)
  49. if sam.Value != "42" {
  50. t.Fatal("read failed")
  51. }
  52. if request.bodyContent != nil {
  53. t.Fatal("unexpected cached bytes found")
  54. }
  55. }
  56. func TestReadEntityJson(t *testing.T) {
  57. bodyReader := strings.NewReader(`{"Value" : "42"}`)
  58. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  59. httpRequest.Header.Set("Content-Type", "application/json")
  60. request := &Request{Request: httpRequest}
  61. sam := new(Sample)
  62. request.ReadEntity(sam)
  63. if sam.Value != "42" {
  64. t.Fatal("read failed")
  65. }
  66. }
  67. func TestReadEntityJsonCharset(t *testing.T) {
  68. bodyReader := strings.NewReader(`{"Value" : "42"}`)
  69. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  70. httpRequest.Header.Set("Content-Type", "application/json; charset=UTF-8")
  71. request := NewRequest(httpRequest)
  72. sam := new(Sample)
  73. request.ReadEntity(sam)
  74. if sam.Value != "42" {
  75. t.Fatal("read failed")
  76. }
  77. }
  78. func TestReadEntityJsonNumber(t *testing.T) {
  79. SetCacheReadEntity(true)
  80. bodyReader := strings.NewReader(`{"Value" : 4899710515899924123}`)
  81. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  82. httpRequest.Header.Set("Content-Type", "application/json")
  83. request := &Request{Request: httpRequest}
  84. any := make(Anything)
  85. request.ReadEntity(&any)
  86. number, ok := any["Value"].(json.Number)
  87. if !ok {
  88. t.Fatal("read failed")
  89. }
  90. vint, err := number.Int64()
  91. if err != nil {
  92. t.Fatal("convert failed")
  93. }
  94. if vint != 4899710515899924123 {
  95. t.Fatal("read failed")
  96. }
  97. vfloat, err := number.Float64()
  98. if err != nil {
  99. t.Fatal("convert failed")
  100. }
  101. // match the default behaviour
  102. vstring := strconv.FormatFloat(vfloat, 'e', 15, 64)
  103. if vstring != "4.899710515899924e+18" {
  104. t.Fatal("convert float64 failed")
  105. }
  106. }
  107. func TestReadEntityJsonNumberNonCached(t *testing.T) {
  108. SetCacheReadEntity(false)
  109. bodyReader := strings.NewReader(`{"Value" : 4899710515899924123}`)
  110. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  111. httpRequest.Header.Set("Content-Type", "application/json")
  112. request := &Request{Request: httpRequest}
  113. any := make(Anything)
  114. request.ReadEntity(&any)
  115. number, ok := any["Value"].(json.Number)
  116. if !ok {
  117. t.Fatal("read failed")
  118. }
  119. vint, err := number.Int64()
  120. if err != nil {
  121. t.Fatal("convert failed")
  122. }
  123. if vint != 4899710515899924123 {
  124. t.Fatal("read failed")
  125. }
  126. vfloat, err := number.Float64()
  127. if err != nil {
  128. t.Fatal("convert failed")
  129. }
  130. // match the default behaviour
  131. vstring := strconv.FormatFloat(vfloat, 'e', 15, 64)
  132. if vstring != "4.899710515899924e+18" {
  133. t.Fatal("convert float64 failed")
  134. }
  135. }
  136. func TestReadEntityJsonLong(t *testing.T) {
  137. bodyReader := strings.NewReader(`{"ValueFloat" : 4899710515899924123, "ValueInt": 4899710515899924123}`)
  138. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  139. httpRequest.Header.Set("Content-Type", "application/json")
  140. request := &Request{Request: httpRequest}
  141. number := new(Number)
  142. request.ReadEntity(&number)
  143. if number.ValueInt != 4899710515899924123 {
  144. t.Fatal("read failed")
  145. }
  146. // match the default behaviour
  147. vstring := strconv.FormatFloat(number.ValueFloat, 'e', 15, 64)
  148. if vstring != "4.899710515899924e+18" {
  149. t.Fatal("convert float64 failed")
  150. }
  151. }
  152. func TestBodyParameter(t *testing.T) {
  153. bodyReader := strings.NewReader(`value1=42&value2=43`)
  154. httpRequest, _ := http.NewRequest("POST", "/test?value1=44", bodyReader) // POST and PUT body parameters take precedence over URL query string
  155. httpRequest.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
  156. request := NewRequest(httpRequest)
  157. v1, err := request.BodyParameter("value1")
  158. if err != nil {
  159. t.Error(err)
  160. }
  161. v2, err := request.BodyParameter("value2")
  162. if err != nil {
  163. t.Error(err)
  164. }
  165. if v1 != "42" || v2 != "43" {
  166. t.Fatal("read failed")
  167. }
  168. }
  169. func TestReadEntityUnkown(t *testing.T) {
  170. bodyReader := strings.NewReader("?")
  171. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  172. httpRequest.Header.Set("Content-Type", "application/rubbish")
  173. request := NewRequest(httpRequest)
  174. sam := new(Sample)
  175. err := request.ReadEntity(sam)
  176. if err == nil {
  177. t.Fatal("read should be in error")
  178. }
  179. }
  180. func TestSetAttribute(t *testing.T) {
  181. bodyReader := strings.NewReader("?")
  182. httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
  183. request := NewRequest(httpRequest)
  184. request.SetAttribute("go", "there")
  185. there := request.Attribute("go")
  186. if there != "there" {
  187. t.Fatalf("missing request attribute:%v", there)
  188. }
  189. }