package main import ( "bytes" "encoding/json" "io" "net/http" "net/http/httptest" "os" "testing" "gitea.tecamino.com/paadi/memberDB/api" "gitea.tecamino.com/paadi/memberDB/models" "github.com/gin-gonic/gin" "github.com/go-playground/assert/v2" ) func TestErrors(t *testing.T) { dbName := "test.db" if _, err := os.Stat(dbName); err == nil { t.Log("remove user.db to start test with empty database") if err := os.Remove(dbName); err != nil { t.Fatal(err) } } t.Log("start member db test") t.Log("initialize accessHandler") r := gin.Default() apiHandler, err := api.NewAPIHandler(nil) if err != nil { t.Fatal(err) } v1 := r.Group("v1") v1.GET("/events", apiHandler.GetEvent) v1.GET("/events/new", apiHandler.StartNewEvent) v1.GET("/events/delete", apiHandler.DeleteEvent) v1.GET("/members", apiHandler.GetMember) v1.GET("/responsible", apiHandler.GetResponsible) v1.POST("/database/open", apiHandler.OpenDatabase) v1.POST("/members/add", apiHandler.AddNewMember) v1.POST("/members/edit", apiHandler.UpdateMember) v1.POST("/members/delete", apiHandler.DeleteMember) v1.POST("/members/import/csv", apiHandler.ImportCSV) v1.POST("/events/attendees/add", apiHandler.AddNewAttendees) v1.POST("/events/attendees/delete", apiHandler.DeleteAttendee) v1.POST("/responsible/add", apiHandler.AddNewResponsible) v1.POST("/responsible/delete", apiHandler.DeleteResponsible) type request struct { Log string Name string Method string Path string Payload any Cookie *http.Cookie ignoreError bool } var requests []request type payload struct { DBPath string `json:"dbPath,omitempty"` Create bool `json:"create,omitempty"` FirstName string `json:"FirstName,omitempty"` LastName string `json:"lastName,omitempty"` Birthday string `json:"birthday,omitempty"` } requests = append(requests, request{Log: "error db not opened", Name: "error db not opened", Method: "POST", Path: "/v1/members/add", Payload: payload{FirstName: "Adrian", LastName: "Zürcher", Birthday: "23.06.1987"}, ignoreError: true}, request{Log: "open member db", Name: "open member db", Method: "POST", Path: "/v1/database/open", Payload: payload{DBPath: "test.db", Create: true}}, request{Log: "add new member", Name: "add new member", Method: "POST", Path: "/v1/members/add", Payload: payload{FirstName: "Adrian", LastName: "Zürcher", Birthday: "23.06.1987"}, ignoreError: true}, request{Log: "error first name missing", Name: "error first name missing", Method: "POST", Path: "/v1/members/add", Payload: payload{LastName: "Zürcher", Birthday: "23.06.1987"}, ignoreError: true}, request{Log: "error last name missing", Name: "error last name missing", Method: "POST", Path: "/v1/members/add", Payload: payload{FirstName: "Adrian", Birthday: "23.06.1987"}, ignoreError: true}, request{Log: "error birthday missing", Name: "error birthday missing", Method: "POST", Path: "/v1/members/add", Payload: payload{FirstName: "Paulina", LastName: "Zürcher"}, ignoreError: true}, request{Log: "error wrong birthday format", Name: "error wrong birthday format", Method: "POST", Path: "/v1/members/add", Payload: payload{FirstName: "Paulina", LastName: "Zürcher", Birthday: "213.06.1987"}, ignoreError: true}, ) for _, request := range requests { if request.Log != "" { t.Log(request.Log) } var bodyReader io.Reader if request.Payload != nil { jsonBytes, _ := json.Marshal(request.Payload) bodyReader = bytes.NewBuffer(jsonBytes) } req, _ := http.NewRequest(request.Method, request.Path, bodyReader) if request.Cookie != nil { req.AddCookie(request.Cookie) // attach refresh_token cookie } w := httptest.NewRecorder() r.ServeHTTP(w, req) t.Log(request.Name+" response:", w.Body.String()) if !request.ignoreError { assert.Equal(t, http.StatusOK, w.Code) } } } func TestMemberDB(t *testing.T) { dbName := "test.db" if _, err := os.Stat(dbName); err == nil { t.Log("remove user.db to start test with empty database") if err := os.Remove(dbName); err != nil { t.Fatal(err) } } t.Log("start member db test") t.Log("initialize accessHandler") r := gin.Default() apiHandler, err := api.NewAPIHandler(nil) if err != nil { t.Fatal(err) } v1 := r.Group("v1") v1.GET("/events", apiHandler.GetEvent) v1.GET("/events/new", apiHandler.StartNewEvent) v1.GET("/events/delete", apiHandler.DeleteEvent) v1.GET("/members", apiHandler.GetMember) v1.GET("/responsible", apiHandler.GetResponsible) v1.POST("/database/open", apiHandler.OpenDatabase) v1.POST("/members/add", apiHandler.AddNewMember) v1.POST("/members/edit", apiHandler.EditMember) v1.POST("/members/delete", apiHandler.DeleteMember) v1.POST("/members/import/csv", apiHandler.ImportCSV) v1.POST("/events/attendees/add", apiHandler.AddNewAttendees) v1.POST("/events/attendees/delete", apiHandler.DeleteAttendee) v1.POST("/responsible/add", apiHandler.AddNewResponsible) v1.POST("/responsible/delete", apiHandler.DeleteResponsible) type request struct { Log string Name string Method string Path string Payload any Cookie *http.Cookie ignoreError bool } var requests []request type payload struct { DBPath string `json:"dbPath,omitempty"` Create bool `json:"create,omitempty"` Ids []uint `json:"ids,omitempty"` FirstName string `json:"FirstName,omitempty"` LastName string `json:"lastName,omitempty"` Birthday string `json:"birthday,omitempty"` Group string `json:"group,omitempty"` } requests = append(requests, request{Log: "open member db", Name: "open member db", Method: "POST", Path: "/v1/database/open", Payload: payload{DBPath: "test.db", Create: true}}, request{Log: "add new member", Name: "add new member", Method: "POST", Path: "/v1/members/add", Payload: payload{FirstName: "Adrian", LastName: "Zürcher", Birthday: "23.06.1987"}}, request{Log: "add existing member", Name: "add existing member", Method: "POST", Path: "/v1/members/add", Payload: payload{FirstName: "Adrian", LastName: "Zürcher", Birthday: "23.06.1987"}, ignoreError: true}, request{Log: "add new member", Name: "add new member", Method: "POST", Path: "/v1/members/add", Payload: payload{FirstName: "Paulina", LastName: "Zürcher", Birthday: "15.01.1991"}}, request{Log: "get members", Name: "get members", Method: "GET", Path: "/v1/members"}, request{Log: "update members", Name: "update members", Method: "POST", Path: "/v1/members/edit?id=1", Payload: payload{Group: "testGroup"}}, request{Log: "get again members", Name: "get again members", Method: "GET", Path: "/v1/members"}, request{Log: "delete members", Name: "delete members", Method: "POST", Path: "/v1/members/delete", Payload: payload{Ids: []uint{2, 1}}}, request{Log: "get again members", Name: "get again members", Method: "GET", Path: "/v1/members"}, request{Log: "new event", Name: "new event", Method: "GET", Path: "/v1/events/new?name=testEvent"}, request{Log: "add new attendee", Name: "add new attendee", Method: "POST", Path: "/v1/events/attendees/add", Payload: models.Event{Attendees: models.Persons{{FirstName: "Adi", LastName: "Züri"}}}}, request{Log: "add another attendee", Name: "add another attendee", Method: "POST", Path: "/v1/events/attendees/add", Payload: models.Event{Attendees: models.Persons{{FirstName: "Pau", LastName: "Züri"}}}}, request{Log: "get events", Name: "get events", Method: "GET", Path: "/v1/events"}, request{Log: "add delete attendee", Name: "add delete attendee", Method: "POST", Path: "/v1/events/attendees/delete", Payload: models.Event{Attendees: models.Persons{{FirstName: "Adi", LastName: "Züri"}}}}, request{Log: "get events", Name: "get events", Method: "GET", Path: "/v1/events"}, request{Log: "add responsible", Name: "add responsible", Method: "POST", Path: "/v1/responsible/add", Payload: models.Person{FirstName: "Max", LastName: "Muster"}}, request{Log: "add another responsible", Name: "add another responsible", Method: "POST", Path: "/v1/responsible/add", Payload: models.Person{FirstName: "Hausi", LastName: "Muster"}}, request{Log: "get responsible", Name: "get responsible", Method: "GET", Path: "/v1/responsible"}, request{Log: "delete responsible id 1", Name: "delete responsible id 1", Method: "POST", Path: "/v1/responsible/delete", Payload: payload{Ids: []uint{1}}}, request{Log: "get responsible", Name: "get responsible", Method: "GET", Path: "/v1/responsible"}, ) for _, request := range requests { if request.Log != "" { t.Log(request.Log) } var bodyReader io.Reader if request.Payload != nil { jsonBytes, _ := json.Marshal(request.Payload) bodyReader = bytes.NewBuffer(jsonBytes) } req, _ := http.NewRequest(request.Method, request.Path, bodyReader) if request.Cookie != nil { req.AddCookie(request.Cookie) // attach refresh_token cookie } w := httptest.NewRecorder() r.ServeHTTP(w, req) t.Log(request.Name+" response:", w.Body.String()) if !request.ignoreError { assert.Equal(t, http.StatusOK, w.Code) } } }