wireguard-ui/handler/api_v1_users_test.go

123 lines
3.4 KiB
Go

package handler
import (
"net/http"
"testing"
"time"
"github.com/labstack/echo/v4"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/DigitalTolk/wireguard-ui/model"
)
func TestAPIListUsers(t *testing.T) {
env := setupTestEnv(t)
req, rec := jsonRequest(http.MethodGet, "/api/v1/users", nil)
c := env.echo.NewContext(req, rec)
err := APIListUsers(env.db)(c)
require.NoError(t, err)
assert.Equal(t, http.StatusOK, rec.Code)
}
func TestAPIGetUser(t *testing.T) {
env := setupTestEnv(t)
now := time.Now().UTC()
env.db.SaveUser(model.User{Username: "getme", Email: "get@test.com", CreatedAt: now, UpdatedAt: now})
req, rec := jsonRequest(http.MethodGet, "/api/v1/users/getme", nil)
c := env.echo.NewContext(req, rec)
c.SetParamNames("username")
c.SetParamValues("getme")
err := APIGetUser(env.db)(c)
require.NoError(t, err)
assert.Equal(t, http.StatusOK, rec.Code)
}
func TestAPIGetUser_NotFound(t *testing.T) {
env := setupTestEnv(t)
req, rec := jsonRequest(http.MethodGet, "/api/v1/users/nonexistent", nil)
c := env.echo.NewContext(req, rec)
c.SetParamNames("username")
c.SetParamValues("nonexistent")
err := APIGetUser(env.db)(c)
require.NoError(t, err)
assert.Equal(t, http.StatusNotFound, rec.Code)
}
func TestAPIListUsers_WithPopulatedData(t *testing.T) {
env := setupTestEnv(t)
now := time.Now().UTC()
env.db.SaveUser(model.User{Username: "user1", Email: "user1@test.com", Admin: true, OIDCSub: "sub-1", CreatedAt: now, UpdatedAt: now})
env.db.SaveUser(model.User{Username: "user2", Email: "user2@test.com", Admin: false, OIDCSub: "sub-2", CreatedAt: now, UpdatedAt: now})
env.db.SaveUser(model.User{Username: "user3", Email: "user3@test.com", Admin: false, OIDCSub: "sub-3", CreatedAt: now, UpdatedAt: now})
req, rec := jsonRequest(http.MethodGet, "/api/v1/users", nil)
c := env.echo.NewContext(req, rec)
err := APIListUsers(env.db)(c)
require.NoError(t, err)
assert.Equal(t, http.StatusOK, rec.Code)
var users []model.User
parseJSON(t, rec, &users)
assert.Len(t, users, 3)
}
func TestAPIGetUser_WithFullData(t *testing.T) {
env := setupTestEnv(t)
now := time.Now().UTC()
env.db.SaveUser(model.User{
Username: "fulluser",
Email: "full@test.com",
DisplayName: "Full User",
OIDCSub: "sub-full",
Admin: true,
CreatedAt: now,
UpdatedAt: now,
})
req, rec := jsonRequest(http.MethodGet, "/api/v1/users/fulluser", nil)
c := env.echo.NewContext(req, rec)
c.SetParamNames("username")
c.SetParamValues("fulluser")
err := APIGetUser(env.db)(c)
require.NoError(t, err)
assert.Equal(t, http.StatusOK, rec.Code)
var user model.User
parseJSON(t, rec, &user)
assert.Equal(t, "fulluser", user.Username)
assert.Equal(t, "full@test.com", user.Email)
assert.Equal(t, "Full User", user.DisplayName)
assert.True(t, user.Admin)
}
func TestAPIListUsers_DBError(t *testing.T) {
db := &errStore{}
e := echo.New()
req, rec := jsonRequest(http.MethodGet, "/api/v1/users", nil)
c := e.NewContext(req, rec)
err := APIListUsers(db)(c)
require.NoError(t, err)
assert.Equal(t, http.StatusInternalServerError, rec.Code)
}
func TestAPIGetUser_InvalidUsername(t *testing.T) {
env := setupTestEnv(t)
req, rec := jsonRequest(http.MethodGet, "/api/v1/users/baduser", nil)
c := env.echo.NewContext(req, rec)
c.SetParamNames("username")
c.SetParamValues("bad user!")
err := APIGetUser(env.db)(c)
require.NoError(t, err)
assert.Equal(t, http.StatusBadRequest, rec.Code)
}