handlers_test.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  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) TestDeleteActivityJSON() {
  140. req, err := http.NewRequest("DELETE", fmt.Sprintf("/api/activities/%d/delete?format=json", 1), nil)
  141. if err != nil {
  142. panic(err)
  143. }
  144. req.Header.Set("Content-Type", "application/json; charset=utf-8")
  145. rr := httptest.NewRecorder()
  146. pattern := PathPattern{"/api/%s/{id}/delete", "", []string{"DELETE"}}
  147. router := mux.NewRouter()
  148. router.Handle("/api/activities/{id}/delete", modelHandler("activities", pattern))
  149. router.ServeHTTP(rr, req)
  150. t.Equal(http.StatusOK, rr.Code)
  151. }
  152. func (t *testSuite) TestGetTeacherJSON() {
  153. var (
  154. teacher *orm.Teacher
  155. response renderer.JsonResponse
  156. )
  157. req, err := http.NewRequest("GET", "/api/teachers/9?format=json", nil)
  158. if err != nil {
  159. panic(err)
  160. }
  161. pattern := PathPattern{"/api/%s/{id}", "", []string{"GET"}}
  162. rr := httptest.NewRecorder()
  163. router := mux.NewRouter()
  164. router.Handle("/api/teachers/{id}", modelHandler("teachers", pattern))
  165. router.ServeHTTP(rr, req)
  166. t.Equal(http.StatusOK, rr.Code)
  167. if !t.Failed() {
  168. err := json.Unmarshal(rr.Body.Bytes(), &response)
  169. t.Nil(err)
  170. if !t.Failed() {
  171. err := json.Unmarshal(response.Result, &teacher)
  172. t.Nil(err)
  173. t.Equal("FRANCESCHINI", teacher.Surname)
  174. }
  175. }
  176. }
  177. func (t *testSuite) TestGetTeachersCSV() {
  178. var response renderer.JsonResponse
  179. req, err := http.NewRequest("GET", "/api/teachers?format=csv", nil)
  180. if err != nil {
  181. panic(err)
  182. }
  183. pattern := PathPattern{
  184. "/api/%s",
  185. "/%s/%d?format=csv",
  186. []string{"GET"},
  187. }
  188. rr := httptest.NewRecorder()
  189. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  190. t.Equal(http.StatusOK, rr.Code)
  191. if !t.Failed() {
  192. err := json.Unmarshal(rr.Body.Bytes(), &response)
  193. t.Nil(err)
  194. if !t.Failed() {
  195. t.True(strings.Contains(string(response.Result), "AGOSTINO"))
  196. }
  197. }
  198. }
  199. func (t *testSuite) TestGetErrorJSON() {
  200. var (
  201. response renderer.JsonResponse
  202. )
  203. req, err := http.NewRequest("GET", "/api/teacher/100?format=json", nil)
  204. if err != nil {
  205. panic(err)
  206. }
  207. pattern := PathPattern{"/api/%s/{id}", "/%s?format=json", []string{"GET"}}
  208. rr := httptest.NewRecorder()
  209. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  210. err = json.Unmarshal(rr.Body.Bytes(), &response)
  211. t.Nil(err)
  212. t.Equal("record not found", string(response.Error))
  213. }
  214. func (t *testSuite) TestPostErrorJSON() {
  215. var (
  216. response renderer.JsonResponse
  217. )
  218. teacher := getTeacherJSON(1)
  219. teacher.Name = "Mario"
  220. teacher.Surname = "ROSSI"
  221. data, err := json.Marshal(teacher)
  222. if err != nil {
  223. panic(err)
  224. }
  225. req, err := http.NewRequest("POST", "/api/teachers/0/update?format=json", bytes.NewBuffer(data))
  226. if err != nil {
  227. panic(err)
  228. }
  229. req.Header.Set("Content-Type", "application/json; charset=utf-8")
  230. rr := httptest.NewRecorder()
  231. pattern := PathPattern{"/api/%s/{id}/update", "", []string{"POST"}}
  232. router := mux.NewRouter()
  233. router.Handle("/api/teachers/{id}/update", modelHandler("teachers", pattern))
  234. router.ServeHTTP(rr, req)
  235. t.Equal(http.StatusInternalServerError, rr.Code)
  236. err = json.Unmarshal(rr.Body.Bytes(), &response)
  237. t.Nil(err)
  238. t.Equal("record not found", string(response.Error))
  239. }
  240. func (t *testSuite) TestAddTeacherJSON() {
  241. var (
  242. response renderer.JsonResponse
  243. id uint
  244. )
  245. teacher := new(orm.Teacher)
  246. teacher.Name = "Mario"
  247. teacher.Surname = "ROSSI"
  248. data, err := json.Marshal(teacher)
  249. t.Nil(err)
  250. req, err := http.NewRequest("POST", "/api/teachers/add", bytes.NewBuffer(data))
  251. req.Header.Set("Content-Type", "application/json; charset=utf-8")
  252. if err != nil {
  253. panic(err)
  254. }
  255. pattern := PathPattern{
  256. "/api/%s/add",
  257. "",
  258. []string{"POST"},
  259. }
  260. rr := httptest.NewRecorder()
  261. modelHandler("teachers", pattern).ServeHTTP(rr, req)
  262. t.Equal(http.StatusOK, rr.Code)
  263. if !t.Failed() {
  264. err := json.Unmarshal(rr.Body.Bytes(), &response)
  265. t.Nil(err)
  266. if !t.Failed() {
  267. err := json.Unmarshal(response.Result, &id)
  268. t.Nil(err)
  269. t.Equal(uint(10), id)
  270. }
  271. }
  272. }
  273. func (t *testSuite) TestUpdateTeacherJSON() {
  274. teacher := getTeacherJSON(1)
  275. teacher.Name = "Mario"
  276. teacher.Surname = "ROSSI"
  277. data, err := json.Marshal(teacher)
  278. if err != nil {
  279. panic(err)
  280. }
  281. req, err := http.NewRequest("POST", fmt.Sprintf("/api/teachers/%d/update?format=json", teacher.ID), bytes.NewBuffer(data))
  282. if err != nil {
  283. panic(err)
  284. }
  285. req.Header.Set("Content-Type", "application/json; charset=utf-8")
  286. rr := httptest.NewRecorder()
  287. pattern := PathPattern{"/api/%s/{id}/update", "", []string{"POST"}}
  288. router := mux.NewRouter()
  289. router.Handle("/api/teachers/{id}/update", modelHandler("teachers", pattern))
  290. router.ServeHTTP(rr, req)
  291. t.Equal(http.StatusOK, rr.Code)
  292. if !t.Failed() {
  293. dbTeacher := getTeacherJSON(1)
  294. t.Equal("ROSSI", dbTeacher.Surname)
  295. }
  296. }
  297. func getTeacherJSON(id uint) *orm.Teacher {
  298. var (
  299. teacher *orm.Teacher
  300. response renderer.JsonResponse
  301. )
  302. req, err := http.NewRequest("GET", fmt.Sprintf("/api/teachers/%d?format=json", id), nil)
  303. if err != nil {
  304. panic(err)
  305. }
  306. pattern := PathPattern{"/api/%s/{id}", "", []string{"GET"}}
  307. rr := httptest.NewRecorder()
  308. router := mux.NewRouter()
  309. router.Handle("/api/teachers/{id}", modelHandler("teachers", pattern))
  310. router.ServeHTTP(rr, req)
  311. err = json.Unmarshal(rr.Body.Bytes(), &response)
  312. if err != nil {
  313. panic(err)
  314. }
  315. err = json.Unmarshal(response.Result, &teacher)
  316. if err != nil {
  317. panic(err)
  318. }
  319. return teacher
  320. }
  321. func (t *testSuite) TestGetDepartmentJSON() {
  322. var (
  323. department *orm.Department
  324. response renderer.JsonResponse
  325. )
  326. req, err := http.NewRequest("GET", "/api/departments/1?format=json", nil)
  327. if err != nil {
  328. panic(err)
  329. }
  330. pattern := PathPattern{"/api/%s/{id}", "", []string{"GET"}}
  331. rr := httptest.NewRecorder()
  332. router := mux.NewRouter()
  333. router.Handle("/api/departments/{id}", modelHandler("departments", pattern))
  334. router.ServeHTTP(rr, req)
  335. t.Equal(http.StatusOK, rr.Code)
  336. if !t.Failed() {
  337. err := json.Unmarshal(rr.Body.Bytes(), &response)
  338. t.Nil(err)
  339. if !t.Failed() {
  340. err := json.Unmarshal(response.Result, &department)
  341. t.Nil(err)
  342. t.Equal("LINGUE STRANIERE", department.Name)
  343. }
  344. }
  345. }