Add go backend

This commit is contained in:
2022-12-18 13:42:21 +13:00
parent 5719891df8
commit 99f88d6adf
15 changed files with 1179 additions and 0 deletions

View File

@@ -0,0 +1,199 @@
package controllers_test
import (
"encoding/json"
"magmise/controllers"
"magmise/models"
"magmise/test"
"net/http"
"testing"
)
// "/user/{username}"
func TestGetUser(t *testing.T) {
setup := test.Setup(t, "get user")
defer setup()
var user controllers.User
w := test.Request(t, user.Get, "GET", "/user/{username}", `{}`, map[string]string{"username": "fred"})
var usermodel models.User
if json.Unmarshal(w.Body.Bytes(), &usermodel) != nil {
t.Fail()
}
if usermodel.Username != "fred" {
t.Fatal(usermodel)
}
}
// "/user"
func TestCreateUser(t *testing.T) {
setup := test.Setup(t, "create user")
defer setup()
var user controllers.User
w := test.Request(t, user.Create, "POST", "/user/{username}", `{"username": "fred", "password": "a"}`, nil)
if w.Code != http.StatusOK {
t.Fatal(w.Code, w.Result().Status)
}
}
// // "/user/application/:userid/:discordid"
// func TestCreateuser(t *testing.T) {
// setup := test.Setup(t)
// defer setup()
// var user controllers.User
// handler := http.HandlerFunc(user.Createuser)
// r, err := http.NewRequest("POST", "/user/application/:userid/:discordid", nil)
// if err != nil {
// t.Fatal(err)
// }
// q := r.URL.Query()
// q.Add(":userid", "6")
// q.Add(":discordid", "6")
// r.URL.RawQuery = q.Encode()
// w := httptest.NewRecorder()
// handler(w, r)
// if w.Code != 200 {
// t.Fail()
// }
// }
// // PATCH "/user/application/:userid"
// func TestUpdateuser(t *testing.T) {
// setup := test.Setup(t)
// defer setup()
// t.Log("Test Updateuser")
// usermodel := models.User{userId: "1", Status: "closed"}
// userjson, err := json.Marshal(usermodel)
// if err != nil {
// t.Fatal(err)
// }
// var user controllers.Userco
// handler := http.HandlerFunc(user.Updateuser)
// r, err := http.NewRequest("PATCH", "/user/application/:userid", bytes.NewBuffer(userjson))
// r.Header.Set("Content-Type", "application/json; charset=UTF-8")
// if err != nil {
// t.Fatal(err)
// }
// q := r.URL.Query()
// q.Add(":userid", "1")
// r.URL.RawQuery = q.Encode()
// w := httptest.NewRecorder()
// handler(w, r)
// if w.Code != 200 {
// t.Log(w.Body)
// t.Fatal(w.Code)
// }
// usermodel.Read()
// if usermodel.Status != "closed" {
// t.Fail()
// }
// }
// // "/user/application/:userid"
// func TestDeleteuser(t *testing.T) {
// setup := test.Setup(t)
// defer setup()
// var user controllers.User
// handler := http.HandlerFunc(user.Deleteuser)
// r, err := http.NewRequest("POST", "/user/application/:userid", nil)
// if err != nil {
// t.Fatal(err)
// }
// q := r.URL.Query()
// q.Add(":userid", "1")
// r.URL.RawQuery = q.Encode()
// w := httptest.NewRecorder()
// handler(w, r)
// if w.Code != 200 {
// t.Fail()
// }
// }
// // /user/:discordid/users/application/:status/
// func TestGetUserusers(t *testing.T) {
// setup := test.Setup(t)
// defer setup()
// handler := http.HandlerFunc(controllers.User{}.GetUserusers)
// r, err := http.NewRequest("GET", "/user/:discordid/users/application/:status/", nil)
// if err != nil {
// t.Fatal(err)
// }
// q := r.URL.Query()
// q.Add(":discordid", "1")
// q.Add(":status", "all")
// q.Add(":limit", "100")
// r.URL.RawQuery = q.Encode()
// w := httptest.NewRecorder()
// handler(w, r)
// if w.Code != 200 {
// t.Fail()
// }
// var users []models.User
// if json.Unmarshal(w.Body.Bytes(), &users) != nil {
// t.Fatal("Failed unmarshal")
// }
// for _, user := range users {
// t.Log(user)
// t.Log("\n")
// }
// }
// // /users/application/:status/
// func TestGetusers(t *testing.T) {
// setup := test.Setup(t)
// defer setup()
// handler := http.HandlerFunc(controllers.User{}.GetUserusers)
// r, err := http.NewRequest("GET", "/users/application/:status/", nil)
// if err != nil {
// t.Fatal(err)
// }
// q := r.URL.Query()
// q.Add(":status", "all")
// q.Add(":limit", "100")
// r.URL.RawQuery = q.Encode()
// w := httptest.NewRecorder()
// handler(w, r)
// if w.Code != 200 {
// t.Fail()
// }
// var users []models.User
// if json.Unmarshal(w.Body.Bytes(), &users) != nil {
// t.Fatal("Failed unmarshal")
// }
// for _, user := range users {
// t.Log(user)
// t.Log("\n")
// }
// }
// // "/answer/application/:userid/"
// func TestAddAnswer(t *testing.T) {
// setup := test.Setup(t)
// defer setup()
// var user controllers.User
// handler := http.HandlerFunc(user.AddAnswer)
// r, err := http.NewRequest("POST", "/answer/application/:userid/", bytes.NewBufferString("Hello world"))
// if err != nil {
// t.Fatal(err)
// }
// q := r.URL.Query()
// q.Add(":userid", "1")
// r.URL.RawQuery = q.Encode()
// w := httptest.NewRecorder()
// handler(w, r)
// if w.Code != 200 {
// t.Fatal("Failed to add answer", w.Code)
// }
// }

View File

@@ -0,0 +1,18 @@
package middleware_test
import (
"magmise/middleware"
"testing"
)
func TestCheckPasswordHash(t *testing.T) {
password := "password"
hash, _ := middleware.HashPassword(password)
if middleware.CheckPasswordHash(password, hash) == false {
t.Fail()
}
}
func TestBasicAuth(t *testing.T) {
}

View File

@@ -0,0 +1,72 @@
package models_test
import (
"magmise/models"
"testing"
)
type Test struct {
Name string
}
func TestDB(t *testing.T) {
// Create table
models.DB().AutoMigrate(&models.User{})
user := models.User{Username: "test"}
//Create
if err := models.Create(&user); err != nil {
t.Fatal(err)
}
t.Log("\033[33mShould error with unique contraint\033[0m")
if err := models.Create(&user); err == nil {
t.Fatal(err)
}
// Read
if err := models.Read(&user); err != nil {
t.Fatal(err)
}
// Create more rows
user = models.User{Username: "test2"}
models.Create(&user)
user = models.User{Username: "test3"}
models.Create(&user)
user = models.User{Username: "test4"}
models.Create(&user)
// Get second and third row
var users []models.User
if err := models.ReadAll(&users, 1, 2); err != nil {
t.Fatal(err)
}
if users[0].Username != "test2" {
t.Fatal("Offset failed\n", users)
}
if len(users) != 2 {
t.Fatal("Limit failed\n", users)
}
// Update
user.Password = "b"
if err := models.Update(&user, "username", user.Username); err != nil {
t.Fatal(err)
}
// Check Update
if err := models.Read(&user); err != nil {
t.Fatal(err)
}
if user.Password != "b" {
t.Fatal("failed update")
}
// Delete
if err := models.Delete(&user); err != nil {
t.Fatal(err)
}
models.DB().Migrator().DropTable(&models.User{})
}

View File

@@ -0,0 +1,76 @@
package models_test
import (
"magmise/models"
"magmise/test"
"testing"
)
func TestUserCreate(t *testing.T) {
cleanup := test.Setup(t, "user create")
defer cleanup()
user := models.User{Username: "Bob", Password: "a"}
if user.Create() != nil {
t.Fail()
}
}
func TestUserRead(t *testing.T) {
cleanup := test.Setup(t, "user read")
defer cleanup()
user := models.User{Username: "fred"}
if user.Read() != nil {
t.Fatal("Faied to read application user")
}
if user.Password != "a" {
t.Log(user)
}
}
func TestUserReadAll(t *testing.T) {
cleanup := test.Setup(t, "user readall")
defer cleanup()
user := models.User{}
users, err := user.ReadAll(0, 10)
if err != nil {
t.Fatal(err)
}
if users[0].Username != "fred" {
t.Log(users)
t.Fail()
}
}
func TestUserUpdate(t *testing.T) {
cleanup := test.Setup(t, "user update")
defer cleanup()
user := models.User{Username: "fred"}
user.Read()
user.Password = "b"
if user.Update() != nil {
t.Fail()
}
user.Read()
if user.Password != "b" {
t.Fail()
}
}
func TestUserDelete(t *testing.T) {
cleanup := test.Setup(t, "user delete")
defer cleanup()
user := models.User{Username: "fred"}
if err := user.Delete(); err != nil {
t.Fatal(err)
}
t.Log()
t.Log("\033[33m\033[1mShould error with \033[95mrecord not found\033[0m")
if user.Read() == nil {
t.Fatal(user)
}
}

49
api/test/test.go Normal file
View File

@@ -0,0 +1,49 @@
package test
import (
"bytes"
"context"
"magmise/models"
"net/http"
"net/http/httptest"
"testing"
"github.com/go-chi/chi/v5"
)
func Setup(t *testing.T, name string) func() {
t.Log("Setup " + name)
models.Init()
//models.DB().Exec("DROP TABLE ticketapplication_answers")
models.DB().Migrator().DropTable(models.User{})
models.DB().AutoMigrate(models.User{})
models.User{Username: "fred", Password: "a"}.Create()
return func() {
t.Log("Cleanup " + name)
models.DB().Migrator().DropTable(models.User{})
}
}
func Request(t *testing.T, model http.HandlerFunc, method, path, _json string, urlparams map[string]string) *httptest.ResponseRecorder {
handler := http.HandlerFunc(model)
r, err := http.NewRequest("GET", "/user/{username}", bytes.NewBufferString(_json))
if err != nil {
t.Fatal(err)
}
rctx := chi.NewRouteContext()
for key, value := range urlparams {
rctx.URLParams.Add(key, value)
}
r = r.WithContext(context.WithValue(r.Context(), chi.RouteCtxKey, rctx))
w := httptest.NewRecorder()
handler(w, r)
if w.Code != 200 {
t.Fail()
}
return w
}