123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463 |
- package handlers
- import (
- "bytes"
- "encoding/json"
- "fmt"
- "net/http"
- "net/http/httptest"
- "net/url"
- "strings"
- "testing"
- "time"
- "github.com/gorilla/mux"
- "github.com/jinzhu/gorm"
- "github.com/remogatto/prettytest"
- "gogs.carduccidante.edu.it/karmen/core/config"
- "gogs.carduccidante.edu.it/karmen/core/orm"
- "gogs.carduccidante.edu.it/karmen/core/renderer"
- )
- var (
- token string
- )
- // Start of setup
- type testSuite struct {
- prettytest.Suite
- }
- func TestRunner(t *testing.T) {
- prettytest.Run(
- t,
- new(testSuite),
- )
- }
- func (t *testSuite) BeforeAll() {
- var (
- db *gorm.DB
- err error
- )
- // Initialize the ORM
- connected := false
- for !connected {
- time.Sleep(10 * time.Second)
- db, err = orm.New("karmen:karmen@/karmen_test?charset=utf8&parseTime=True&loc=Local")
- if err != nil {
- time.Sleep(5 * time.Second)
- continue
- }
- connected = true
- }
- orm.Use(db)
- orm.AutoMigrate()
- // Initialize the renderers
- htmlRenderer, err := renderer.NewHTMLRenderer("./testdata/templates/")
- if err != nil {
- panic(err)
- }
- jsonRenderer, err := renderer.NewJSONRenderer()
- if err != nil {
- panic(err)
- }
- csvRenderer, err := renderer.NewCSVRenderer()
- if err != nil {
- panic(err)
- }
- renderer.Render = make(map[string]func(http.ResponseWriter, *http.Request, interface{}, ...url.Values))
- renderer.Render["html"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
- htmlRenderer.Render(w, r, data, options...)
- }
- renderer.Render["json"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
- jsonRenderer.Render(w, r, data, options...)
- }
- renderer.Render["csv"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
- csvRenderer.Render(w, r, data, options...)
- }
- // Load the configuration
- err = config.ReadFile("testdata/config.yaml", config.Config)
- if err != nil {
- panic(err)
- }
- config.Config.LogLevel = config.LOG_LEVEL_OFF
- req, err := http.NewRequest("GET", "/get_token", nil)
- if err != nil {
- panic(err)
- }
- req.SetBasicAuth("admin", "admin")
- rr := httptest.NewRecorder()
- tokenHandler().ServeHTTP(rr, req)
- var data struct {
- Token string
- UserID string
- }
- if err := json.Unmarshal(rr.Body.Bytes(), &data); err != nil {
- panic(err)
- }
- token = data.Token
- }
- func (t *testSuite) TestGetTeachersHTML() {
- req, err := http.NewRequest("GET", "/teachers?format=html&tpl_layout=base&tpl_content=teachers", nil)
- if err != nil {
- panic(err)
- }
- pattern := PathPattern{
- "/%s",
- "/%s?format=html&tpl_layout=base&tpl_content=%s",
- []string{"GET"},
- }
- rr := httptest.NewRecorder()
- modelHandler("teachers", pattern).ServeHTTP(rr, req)
- t.Equal(http.StatusOK, rr.Code)
- if !t.Failed() {
- t.True(strings.Contains(rr.Body.String(), "DELLE ROSE"))
- }
- }
- func (t *testSuite) TestGetTeachersJSON() {
- var (
- teachers []*orm.Teacher
- response renderer.JsonResponse
- )
- req, err := http.NewRequest("GET", "/api/teachers?format=json", nil)
- if err != nil {
- panic(err)
- }
- pattern := PathPattern{
- "/api/%s",
- "/%s/%d?format=json",
- []string{"GET"},
- }
- rr := httptest.NewRecorder()
- modelHandler("teachers", pattern).ServeHTTP(rr, req)
- t.Equal(http.StatusOK, rr.Code)
- if !t.Failed() {
- err := json.Unmarshal(rr.Body.Bytes(), &response)
- t.Nil(err)
- if !t.Failed() {
- err := json.Unmarshal(response.Result, &teachers)
- t.Nil(err)
- t.Equal("AGOSTINO", teachers[0].Surname)
- }
- }
- }
- func (t *testSuite) TestDeleteActivityJSON() {
- var response renderer.JsonResponse
- req, err := http.NewRequest("DELETE", fmt.Sprintf("/api/activities/%d/delete?format=json", 1), nil)
- if err != nil {
- panic(err)
- }
- req.Header.Set("Content-Type", "application/json; charset=utf-8")
- rr := httptest.NewRecorder()
- pattern := PathPattern{"/api/%s/{id}/delete", "", []string{"DELETE"}}
- router := mux.NewRouter()
- router.Handle("/api/activities/{id}/delete", modelHandler("activities", pattern))
- router.ServeHTTP(rr, req)
- if !t.Failed() {
- err := json.Unmarshal(rr.Body.Bytes(), &response)
- t.Nil(err)
- if !t.Failed() {
- t.Equal("1", string(response.Result))
- }
- }
- t.Equal(http.StatusOK, rr.Code)
- }
- func (t *testSuite) TestGetTeacherJSON() {
- var (
- teacher *orm.Teacher
- response renderer.JsonResponse
- )
- req, err := http.NewRequest("GET", "/api/teachers/9?format=json", nil)
- if err != nil {
- panic(err)
- }
- pattern := PathPattern{"/api/%s/{id}", "", []string{"GET"}}
- rr := httptest.NewRecorder()
- router := mux.NewRouter()
- router.Handle("/api/teachers/{id}", modelHandler("teachers", pattern))
- router.ServeHTTP(rr, req)
- t.Equal(http.StatusOK, rr.Code)
- if !t.Failed() {
- err := json.Unmarshal(rr.Body.Bytes(), &response)
- t.Nil(err)
- if !t.Failed() {
- err := json.Unmarshal(response.Result, &teacher)
- t.Nil(err)
- t.Equal("FRANCESCHINI", teacher.Surname)
- }
- }
- }
- func (t *testSuite) TestGetTeachersCSV() {
- var response renderer.JsonResponse
- req, err := http.NewRequest("GET", "/api/teachers?format=csv", nil)
- if err != nil {
- panic(err)
- }
- pattern := PathPattern{
- "/api/%s",
- "/%s/%d?format=csv",
- []string{"GET"},
- }
- rr := httptest.NewRecorder()
- modelHandler("teachers", pattern).ServeHTTP(rr, req)
- t.Equal(http.StatusOK, rr.Code)
- if !t.Failed() {
- err := json.Unmarshal(rr.Body.Bytes(), &response)
- t.Nil(err)
- if !t.Failed() {
- t.True(strings.Contains(string(response.Result), "AGOSTINO"))
- }
- }
- }
- func (t *testSuite) TestGetErrorJSON() {
- var (
- response renderer.JsonResponse
- )
- req, err := http.NewRequest("GET", "/api/teacher/100?format=json", nil)
- if err != nil {
- panic(err)
- }
- pattern := PathPattern{"/api/%s/{id}", "/%s?format=json", []string{"GET"}}
- rr := httptest.NewRecorder()
- modelHandler("teachers", pattern).ServeHTTP(rr, req)
- err = json.Unmarshal(rr.Body.Bytes(), &response)
- t.Nil(err)
- t.Equal("record not found", string(response.Error))
- }
- func (t *testSuite) TestPostErrorJSON() {
- var (
- response renderer.JsonResponse
- )
- teacher := getTeacherJSON(1)
- teacher.Name = "Mario"
- teacher.Surname = "ROSSI"
- data, err := json.Marshal(teacher)
- if err != nil {
- panic(err)
- }
- req, err := http.NewRequest("POST", "/api/teachers/0/update?format=json", bytes.NewBuffer(data))
- if err != nil {
- panic(err)
- }
- req.Header.Set("Content-Type", "application/json; charset=utf-8")
- rr := httptest.NewRecorder()
- pattern := PathPattern{"/api/%s/{id}/update", "", []string{"POST"}}
- router := mux.NewRouter()
- router.Handle("/api/teachers/{id}/update", modelHandler("teachers", pattern))
- router.ServeHTTP(rr, req)
- t.Equal(http.StatusInternalServerError, rr.Code)
- err = json.Unmarshal(rr.Body.Bytes(), &response)
- t.Nil(err)
- t.Equal("record not found", string(response.Error))
- }
- func (t *testSuite) TestAddTeacherJSON() {
- var (
- response renderer.JsonResponse
- id uint
- )
- teacher := new(orm.Teacher)
- teacher.Name = "Mario"
- teacher.Surname = "ROSSI"
- data, err := json.Marshal(teacher)
- t.Nil(err)
- req, err := http.NewRequest("POST", "/api/teachers/add", bytes.NewBuffer(data))
- req.Header.Set("Content-Type", "application/json; charset=utf-8")
- if err != nil {
- panic(err)
- }
- pattern := PathPattern{
- "/api/%s/add",
- "",
- []string{"POST"},
- }
- rr := httptest.NewRecorder()
- modelHandler("teachers", pattern).ServeHTTP(rr, req)
- t.Equal(http.StatusOK, rr.Code)
- if !t.Failed() {
- err := json.Unmarshal(rr.Body.Bytes(), &response)
- t.Nil(err)
- if !t.Failed() {
- err := json.Unmarshal(response.Result, &id)
- t.Nil(err)
- t.Equal(uint(10), id)
- }
- }
- }
- func (t *testSuite) TestUpdateTeacherJSON() {
- teacher := getTeacherJSON(1)
- teacher.Name = "Mario"
- teacher.Surname = "ROSSI"
- data, err := json.Marshal(teacher)
- if err != nil {
- panic(err)
- }
- req, err := http.NewRequest("POST", fmt.Sprintf("/api/teachers/%d/update?format=json", teacher.ID), bytes.NewBuffer(data))
- if err != nil {
- panic(err)
- }
- req.Header.Set("Content-Type", "application/json; charset=utf-8")
- rr := httptest.NewRecorder()
- pattern := PathPattern{"/api/%s/{id}/update", "", []string{"POST"}}
- router := mux.NewRouter()
- router.Handle("/api/teachers/{id}/update", modelHandler("teachers", pattern))
- router.ServeHTTP(rr, req)
- t.Equal(http.StatusOK, rr.Code)
- if !t.Failed() {
- dbTeacher := getTeacherJSON(1)
- t.Equal("ROSSI", dbTeacher.Surname)
- }
- }
- func getTeacherJSON(id uint) *orm.Teacher {
- var (
- teacher *orm.Teacher
- response renderer.JsonResponse
- )
- req, err := http.NewRequest("GET", fmt.Sprintf("/api/teachers/%d?format=json", id), nil)
- if err != nil {
- panic(err)
- }
- pattern := PathPattern{"/api/%s/{id}", "", []string{"GET"}}
- rr := httptest.NewRecorder()
- router := mux.NewRouter()
- router.Handle("/api/teachers/{id}", modelHandler("teachers", pattern))
- router.ServeHTTP(rr, req)
- err = json.Unmarshal(rr.Body.Bytes(), &response)
- if err != nil {
- panic(err)
- }
- err = json.Unmarshal(response.Result, &teacher)
- if err != nil {
- panic(err)
- }
- return teacher
- }
- func (t *testSuite) TestGetDepartmentJSON() {
- var (
- department *orm.Department
- response renderer.JsonResponse
- )
- req, err := http.NewRequest("GET", "/api/departments/1?format=json", nil)
- if err != nil {
- panic(err)
- }
- pattern := PathPattern{"/api/%s/{id}", "", []string{"GET"}}
- rr := httptest.NewRecorder()
- router := mux.NewRouter()
- router.Handle("/api/departments/{id}", modelHandler("departments", pattern))
- router.ServeHTTP(rr, req)
- t.Equal(http.StatusOK, rr.Code)
- if !t.Failed() {
- err := json.Unmarshal(rr.Body.Bytes(), &response)
- t.Nil(err)
- if !t.Failed() {
- err := json.Unmarshal(response.Result, &department)
- t.Nil(err)
- t.Equal("LINGUE STRANIERE", department.Name)
- }
- }
- }
|