handlers_test.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. package handlers
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "net/http/httptest"
  8. "net/url"
  9. "strings"
  10. "testing"
  11. "time"
  12. "github.com/gorilla/mux"
  13. "github.com/jinzhu/gorm"
  14. "github.com/remogatto/prettytest"
  15. "gogs.carducci-dante.gov.it/karmen/core/config"
  16. "gogs.carducci-dante.gov.it/karmen/core/orm"
  17. "gogs.carducci-dante.gov.it/karmen/core/renderer"
  18. )
  19. var (
  20. token string
  21. )
  22. // Start of setup
  23. type testSuite struct {
  24. prettytest.Suite
  25. }
  26. func TestRunner(t *testing.T) {
  27. prettytest.Run(
  28. t,
  29. new(testSuite),
  30. )
  31. }
  32. func (t *testSuite) BeforeAll() {
  33. var (
  34. db *gorm.DB
  35. err error
  36. )
  37. // Initialize the ORM
  38. connected := false
  39. for !connected {
  40. time.Sleep(10 * time.Second)
  41. db, err = orm.New("karmen:karmen@/karmen_test?charset=utf8&parseTime=True&loc=Local")
  42. if err != nil {
  43. time.Sleep(5 * time.Second)
  44. continue
  45. }
  46. connected = true
  47. }
  48. orm.Use(db)
  49. orm.AutoMigrate()
  50. // Initialize the renderers
  51. htmlRenderer, err := renderer.NewHTMLRenderer("./testdata/templates/")
  52. if err != nil {
  53. panic(err)
  54. }
  55. jsonRenderer, err := renderer.NewJSONRenderer()
  56. if err != nil {
  57. panic(err)
  58. }
  59. csvRenderer, err := renderer.NewCSVRenderer()
  60. if err != nil {
  61. panic(err)
  62. }
  63. renderer.Render = make(map[string]func(http.ResponseWriter, *http.Request, interface{}, ...url.Values))
  64. renderer.Render["html"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
  65. htmlRenderer.Render(w, r, data, options...)
  66. }
  67. renderer.Render["json"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
  68. jsonRenderer.Render(w, r, data, options...)
  69. }
  70. renderer.Render["csv"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
  71. csvRenderer.Render(w, r, data, options...)
  72. }
  73. // Load the configuration
  74. err = config.ReadFile("testdata/config.yaml", config.Config)
  75. if err != nil {
  76. panic(err)
  77. }
  78. config.Config.LogLevel = config.LOG_LEVEL_OFF
  79. req, err := http.NewRequest("GET", "/get_token", nil)
  80. if err != nil {
  81. panic(err)
  82. }
  83. req.SetBasicAuth("admin", "admin")
  84. rr := httptest.NewRecorder()
  85. tokenHandler().ServeHTTP(rr, req)
  86. var data struct {
  87. Token string
  88. UserID string
  89. }
  90. if err := json.Unmarshal(rr.Body.Bytes(), &data); err != nil {
  91. panic(err)
  92. }
  93. token = data.Token
  94. }
  95. func (t *testSuite) TestGetTeachersHTML() {
  96. req, err := http.NewRequest("GET", "/teachers?format=html&tpl_layout=base&tpl_content=teachers", nil)
  97. if err != nil {
  98. panic(err)
  99. }
  100. pattern := PathPattern{
  101. "/%s",
  102. "/%s?format=html&tpl_layout=base&tpl_content=%s",
  103. []string{"GET"},
  104. }
  105. rr := httptest.NewRecorder()
  106. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  107. t.Equal(http.StatusOK, rr.Code)
  108. if !t.Failed() {
  109. t.True(strings.Contains(rr.Body.String(), "DELLE ROSE"))
  110. }
  111. }
  112. func (t *testSuite) TestGetTeachersJSON() {
  113. var (
  114. teachers []*orm.Teacher
  115. response renderer.JsonResponse
  116. )
  117. req, err := http.NewRequest("GET", "/api/teachers?format=json", nil)
  118. if err != nil {
  119. panic(err)
  120. }
  121. pattern := PathPattern{
  122. "/api/%s",
  123. "/%s/%d?format=json",
  124. []string{"GET"},
  125. }
  126. rr := httptest.NewRecorder()
  127. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  128. t.Equal(http.StatusOK, rr.Code)
  129. if !t.Failed() {
  130. err := json.Unmarshal(rr.Body.Bytes(), &response)
  131. t.Nil(err)
  132. if !t.Failed() {
  133. err := json.Unmarshal(response.Result, &teachers)
  134. t.Nil(err)
  135. t.Equal("AGOSTINO", teachers[0].Surname)
  136. }
  137. }
  138. }
  139. func (t *testSuite) TestGetTeacherJSON() {
  140. var (
  141. teacher *orm.Teacher
  142. response renderer.JsonResponse
  143. )
  144. req, err := http.NewRequest("GET", "/api/teachers/9?format=json", nil)
  145. if err != nil {
  146. panic(err)
  147. }
  148. pattern := PathPattern{"/api/%s/{id}", "", []string{"GET"}}
  149. rr := httptest.NewRecorder()
  150. router := mux.NewRouter()
  151. router.Handle("/api/teachers/{id}", modelHandler("teachers", pattern))
  152. router.ServeHTTP(rr, req)
  153. t.Equal(http.StatusOK, rr.Code)
  154. if !t.Failed() {
  155. err := json.Unmarshal(rr.Body.Bytes(), &response)
  156. t.Nil(err)
  157. if !t.Failed() {
  158. err := json.Unmarshal(response.Result, &teacher)
  159. t.Nil(err)
  160. t.Equal("FRANCESCHINI", teacher.Surname)
  161. }
  162. }
  163. }
  164. func (t *testSuite) TestGetTeachersCSV() {
  165. var response renderer.JsonResponse
  166. req, err := http.NewRequest("GET", "/api/teachers?format=csv", nil)
  167. if err != nil {
  168. panic(err)
  169. }
  170. pattern := PathPattern{
  171. "/api/%s",
  172. "/%s/%d?format=csv",
  173. []string{"GET"},
  174. }
  175. rr := httptest.NewRecorder()
  176. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  177. t.Equal(http.StatusOK, rr.Code)
  178. if !t.Failed() {
  179. err := json.Unmarshal(rr.Body.Bytes(), &response)
  180. t.Nil(err)
  181. if !t.Failed() {
  182. t.True(strings.Contains(string(response.Result), "AGOSTINO"))
  183. }
  184. }
  185. }
  186. func (t *testSuite) TestGetErrorJSON() {
  187. var (
  188. response renderer.JsonResponse
  189. )
  190. req, err := http.NewRequest("GET", "/api/teacher/100?format=json", nil)
  191. if err != nil {
  192. panic(err)
  193. }
  194. pattern := PathPattern{"/api/%s/{id}", "/%s?format=json", []string{"GET"}}
  195. rr := httptest.NewRecorder()
  196. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  197. err = json.Unmarshal(rr.Body.Bytes(), &response)
  198. t.Nil(err)
  199. t.Equal("record not found", string(response.Error))
  200. }
  201. func (t *testSuite) TestAddTeacherJSON() {
  202. var (
  203. response renderer.JsonResponse
  204. id uint
  205. )
  206. teacher := new(orm.Teacher)
  207. teacher.Name = "Mario"
  208. teacher.Surname = "ROSSI"
  209. data, err := json.Marshal(teacher)
  210. t.Nil(err)
  211. req, err := http.NewRequest("POST", "/api/teachers/add", bytes.NewBuffer(data))
  212. req.Header.Set("Content-Type", "application/json; charset=utf-8")
  213. if err != nil {
  214. panic(err)
  215. }
  216. pattern := PathPattern{
  217. "/api/%s/add",
  218. "",
  219. []string{"POST"},
  220. }
  221. rr := httptest.NewRecorder()
  222. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  223. t.Equal(http.StatusOK, rr.Code)
  224. if !t.Failed() {
  225. err := json.Unmarshal(rr.Body.Bytes(), &response)
  226. t.Nil(err)
  227. if !t.Failed() {
  228. err := json.Unmarshal(response.Result, &id)
  229. t.Nil(err)
  230. t.Equal(uint(10), id)
  231. }
  232. }
  233. }
  234. func (t *testSuite) TestUpdateTeacherJSON() {
  235. teacher := getTeacherJSON(1)
  236. teacher.Name = "Mario"
  237. teacher.Surname = "ROSSI"
  238. data, err := json.Marshal(teacher)
  239. if err != nil {
  240. panic(err)
  241. }
  242. req, err := http.NewRequest("POST", fmt.Sprintf("/api/teachers/%d/update?format=json", teacher.ID), bytes.NewBuffer(data))
  243. if err != nil {
  244. panic(err)
  245. }
  246. req.Header.Set("Content-Type", "application/json; charset=utf-8")
  247. rr := httptest.NewRecorder()
  248. pattern := PathPattern{"/api/%s/{id}/update", "", []string{"POST"}}
  249. router := mux.NewRouter()
  250. router.Handle("/api/teachers/{id}/update", modelHandler("teachers", pattern))
  251. router.ServeHTTP(rr, req)
  252. t.Equal(http.StatusOK, rr.Code)
  253. if !t.Failed() {
  254. dbTeacher := getTeacherJSON(1)
  255. t.Equal("ROSSI", dbTeacher.Surname)
  256. }
  257. }
  258. func getTeacherJSON(id uint) *orm.Teacher {
  259. var (
  260. teacher *orm.Teacher
  261. response renderer.JsonResponse
  262. )
  263. req, err := http.NewRequest("GET", fmt.Sprintf("/api/teachers/%d?format=json", id), nil)
  264. if err != nil {
  265. panic(err)
  266. }
  267. pattern := PathPattern{"/api/%s/{id}", "", []string{"GET"}}
  268. rr := httptest.NewRecorder()
  269. router := mux.NewRouter()
  270. router.Handle("/api/teachers/{id}", modelHandler("teachers", pattern))
  271. router.ServeHTTP(rr, req)
  272. err = json.Unmarshal(rr.Body.Bytes(), &response)
  273. if err != nil {
  274. panic(err)
  275. }
  276. err = json.Unmarshal(response.Result, &teacher)
  277. if err != nil {
  278. panic(err)
  279. }
  280. return teacher
  281. }
  282. func (t *testSuite) TestGetDepartmentJSON() {
  283. var (
  284. department *orm.Department
  285. response renderer.JsonResponse
  286. )
  287. req, err := http.NewRequest("GET", "/api/departments/1?format=json", nil)
  288. if err != nil {
  289. panic(err)
  290. }
  291. pattern := PathPattern{"/api/%s/{id}", "", []string{"GET"}}
  292. rr := httptest.NewRecorder()
  293. router := mux.NewRouter()
  294. router.Handle("/api/departments/{id}", modelHandler("departments", pattern))
  295. router.ServeHTTP(rr, req)
  296. t.Equal(http.StatusOK, rr.Code)
  297. if !t.Failed() {
  298. err := json.Unmarshal(rr.Body.Bytes(), &response)
  299. t.Nil(err)
  300. if !t.Failed() {
  301. err := json.Unmarshal(response.Result, &department)
  302. t.Nil(err)
  303. t.Equal("LINGUE STRANIERE", department.Name)
  304. }
  305. }
  306. }