handlers_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package handlers
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "net/http"
  6. "net/http/httptest"
  7. "net/url"
  8. "strings"
  9. "testing"
  10. "time"
  11. "github.com/jinzhu/gorm"
  12. "github.com/remogatto/prettytest"
  13. "gogs.carducci-dante.gov.it/karmen/core/config"
  14. "gogs.carducci-dante.gov.it/karmen/core/orm"
  15. "gogs.carducci-dante.gov.it/karmen/core/renderer"
  16. )
  17. var (
  18. token string
  19. )
  20. // Start of setup
  21. type testSuite struct {
  22. prettytest.Suite
  23. }
  24. func TestRunner(t *testing.T) {
  25. prettytest.Run(
  26. t,
  27. new(testSuite),
  28. )
  29. }
  30. func (t *testSuite) BeforeAll() {
  31. var (
  32. db *gorm.DB
  33. err error
  34. )
  35. // Initialize the ORM
  36. connected := false
  37. for !connected {
  38. time.Sleep(10 * time.Second)
  39. db, err = orm.New("karmen:karmen@/karmen_test?charset=utf8&parseTime=True&loc=Local")
  40. if err != nil {
  41. time.Sleep(5 * time.Second)
  42. continue
  43. }
  44. connected = true
  45. }
  46. orm.Use(db)
  47. orm.AutoMigrate()
  48. // Initialize the renderers
  49. htmlRenderer, err := renderer.NewHTMLRenderer("./testdata/templates/")
  50. if err != nil {
  51. panic(err)
  52. }
  53. jsonRenderer, err := renderer.NewJSONRenderer()
  54. if err != nil {
  55. panic(err)
  56. }
  57. csvRenderer, err := renderer.NewCSVRenderer()
  58. if err != nil {
  59. panic(err)
  60. }
  61. renderer.Render = make(map[string]func(http.ResponseWriter, *http.Request, interface{}, ...url.Values))
  62. renderer.Render["html"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
  63. htmlRenderer.Render(w, r, data, options...)
  64. }
  65. renderer.Render["json"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
  66. jsonRenderer.Render(w, r, data, options...)
  67. }
  68. renderer.Render["csv"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
  69. csvRenderer.Render(w, r, data, options...)
  70. }
  71. // Load the configuration
  72. err = config.ReadFile("testdata/config.yaml", config.Config)
  73. if err != nil {
  74. panic(err)
  75. }
  76. config.Config.LogLevel = config.LOG_LEVEL_OFF
  77. req, err := http.NewRequest("GET", "/get_token", nil)
  78. if err != nil {
  79. panic(err)
  80. }
  81. req.SetBasicAuth("admin", "admin")
  82. rr := httptest.NewRecorder()
  83. tokenHandler().ServeHTTP(rr, req)
  84. var data struct {
  85. Token string
  86. UserID string
  87. }
  88. if err := json.Unmarshal(rr.Body.Bytes(), &data); err != nil {
  89. panic(err)
  90. }
  91. token = data.Token
  92. }
  93. func (t *testSuite) TestGetTeachersHTML() {
  94. req, err := http.NewRequest("GET", "/teachers?format=html&tpl_layout=base&tpl_content=teachers", nil)
  95. if err != nil {
  96. panic(err)
  97. }
  98. pattern := PathPattern{
  99. "/%s",
  100. "/%s?format=html&tpl_layout=base&tpl_content=%s",
  101. []string{"GET"},
  102. }
  103. rr := httptest.NewRecorder()
  104. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  105. t.Equal(http.StatusOK, rr.Code)
  106. if !t.Failed() {
  107. t.True(strings.Contains(rr.Body.String(), "DELLE ROSE"))
  108. }
  109. }
  110. func (t *testSuite) TestGetTeachersJSON() {
  111. var (
  112. teachers []*orm.Teacher
  113. response renderer.JsonResponse
  114. )
  115. req, err := http.NewRequest("GET", "/api/teachers?format=json", nil)
  116. if err != nil {
  117. panic(err)
  118. }
  119. pattern := PathPattern{
  120. "/api/%s",
  121. "/%s/%d?format=json",
  122. []string{"GET"},
  123. }
  124. rr := httptest.NewRecorder()
  125. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  126. t.Equal(http.StatusOK, rr.Code)
  127. if !t.Failed() {
  128. err := json.Unmarshal(rr.Body.Bytes(), &response)
  129. t.Nil(err)
  130. if !t.Failed() {
  131. err := json.Unmarshal(response.Result, &teachers)
  132. t.Nil(err)
  133. t.Equal("AGOSTINO", teachers[0].Surname)
  134. }
  135. }
  136. }
  137. func (t *testSuite) TestGetTeachersCSV() {
  138. var response renderer.JsonResponse
  139. req, err := http.NewRequest("GET", "/api/teachers?format=csv", nil)
  140. if err != nil {
  141. panic(err)
  142. }
  143. pattern := PathPattern{
  144. "/api/%s",
  145. "/%s/%d?format=csv",
  146. []string{"GET"},
  147. }
  148. rr := httptest.NewRecorder()
  149. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  150. t.Equal(http.StatusOK, rr.Code)
  151. if !t.Failed() {
  152. err := json.Unmarshal(rr.Body.Bytes(), &response)
  153. t.Nil(err)
  154. if !t.Failed() {
  155. t.True(strings.Contains(string(response.Result), "AGOSTINO"))
  156. }
  157. }
  158. }
  159. func (t *testSuite) TestGetErrorJSON() {
  160. var (
  161. response renderer.JsonResponse
  162. )
  163. req, err := http.NewRequest("GET", "/api/teacher/100?format=json", nil)
  164. if err != nil {
  165. panic(err)
  166. }
  167. pattern := PathPattern{"/api/%s/{id}", "/%s?format=json", []string{"GET"}}
  168. rr := httptest.NewRecorder()
  169. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  170. err = json.Unmarshal(rr.Body.Bytes(), &response)
  171. t.Nil(err)
  172. t.Equal("record not found", string(response.Error))
  173. }
  174. func (t *testSuite) TestPostTeacherJSON() {
  175. var (
  176. response renderer.JsonResponse
  177. id uint
  178. )
  179. teacher := new(orm.Teacher)
  180. teacher.Name = "Mario"
  181. teacher.Surname = "ROSSI"
  182. data, err := json.Marshal(teacher)
  183. t.Nil(err)
  184. req, err := http.NewRequest("POST", "/api/teachers/add?format=json", bytes.NewBuffer(data))
  185. req.Header.Set("Content-Type", "application/json; charset=utf-8")
  186. if err != nil {
  187. panic(err)
  188. }
  189. pattern := PathPattern{
  190. "/api/%s/add",
  191. "/%s?format=json",
  192. []string{"POST"},
  193. }
  194. rr := httptest.NewRecorder()
  195. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  196. t.Equal(http.StatusOK, rr.Code)
  197. if !t.Failed() {
  198. err := json.Unmarshal(rr.Body.Bytes(), &response)
  199. t.Nil(err)
  200. if !t.Failed() {
  201. err := json.Unmarshal(response.Result, &id)
  202. t.Nil(err)
  203. t.Equal(uint(10), id)
  204. }
  205. }
  206. }