handlers_test.go 9.5 KB

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