Files
Gokapi/internal/models/User_test.go
Marc Bulling d88f649209 Add support for multiple different users, rewrote API, breaking API changes, UI changes
* Require 1.9.6 for upgrade, add function to get userID from request

* Automatically add user when successfully authenticated with headers / oauth, disallow modifing own user permissions

* Dont show user/pw page when using header authentication

* Only display redacted versions of API keys #228, fixed deployment password

* Added animation for deleting API key

* Only create salt once

* Disable elements on upload UI if insufficient permissions

* BREAKING: User field must be email for OAUTH2, added warning in setup when changing database

* BREAKING: Added option to restrict to only registered users

* Fixed crash due to concurrent map iteration

* Replace /uploadComplete with API call, BREAKING API is now in headers

* BREAKING: require true|false instead of only checking for true

* BREAKING API: Renamed apiKeyToModify parameter to targetKey
2025-02-04 09:22:55 +01:00

281 lines
8.5 KiB
Go

package models
import (
"github.com/forceu/gokapi/internal/test"
"os"
"testing"
"time"
)
func TestUser_GetReadableDate(t *testing.T) {
u := User{
Id: 50,
Name: "Admin",
Permissions: UserPermissionAll,
UserLevel: UserLevelSuperAdmin,
LastOnline: 0,
Password: "1234",
ResetPassword: false,
}
date := u.GetReadableDate()
test.IsEqualString(t, date, "Never")
u.LastOnline = time.Now().Unix() - 10
date = u.GetReadableDate()
test.IsEqualString(t, date, "Online")
u.LastOnline = 1736276120
lastTz := os.Getenv("TZ")
err := os.Setenv("TZ", "Europe/Berlin")
test.IsNil(t, err)
date = u.GetReadableDate()
test.IsEqualString(t, date, "2025-01-07 19:55")
err = os.Setenv("TZ", lastTz)
test.IsNil(t, err)
}
func TestUserPermAll(t *testing.T) {
user := &User{}
user.GrantPermission(UserPermissionAll)
if !user.HasPermission(UserPermReplaceUploads) ||
!user.HasPermission(UserPermListOtherUploads) ||
!user.HasPermission(UserPermEditOtherUploads) ||
!user.HasPermission(UserPermDeleteOtherUploads) ||
!user.HasPermission(UserPermReplaceOtherUploads) ||
!user.HasPermission(UserPermManageLogs) ||
!user.HasPermission(UserPermManageApiKeys) ||
!user.HasPermission(UserPermManageUsers) {
t.Errorf("expected all permissions to be set")
}
}
// Helper function to check only one permission is set
func checkOnlyUserPermissionSet(t *testing.T, user *User, perm UserPermission) {
allPermissions := []struct {
perm UserPermission
permName string
}{
{UserPermReplaceUploads, "UserPermReplaceUploads"},
{UserPermListOtherUploads, "UserPermListOtherUploads"},
{UserPermEditOtherUploads, "UserPermEditOtherUploads"},
{UserPermDeleteOtherUploads, "UserPermDeleteOtherUploads"},
{UserPermReplaceOtherUploads, "UserPermReplaceOtherUploads"},
{UserPermManageLogs, "UserPermManageLogs"},
{UserPermManageApiKeys, "UserPermManageApiKeys"},
{UserPermManageUsers, "UserPermManageUsers"},
}
for _, p := range allPermissions {
if p.perm == perm {
if !user.HasPermission(p.perm) {
t.Errorf("expected permission %s to be set", p.permName)
}
} else {
if user.HasPermission(p.perm) {
t.Errorf("expected permission %s not to be set", p.permName)
}
}
}
}
func TestSetIndividualUserPermissions(t *testing.T) {
user := &User{}
// Test each individual permission
permissions := []struct {
perm UserPermission
permName string
}{
{UserPermReplaceUploads, "UserPermReplaceUploads"},
{UserPermListOtherUploads, "UserPermListOtherUploads"},
{UserPermEditOtherUploads, "UserPermEditOtherUploads"},
{UserPermDeleteOtherUploads, "UserPermDeleteOtherUploads"},
{UserPermReplaceOtherUploads, "UserPermReplaceOtherUploads"},
{UserPermManageLogs, "UserPermManageLogs"},
{UserPermManageApiKeys, "UserPermManageApiKeys"},
{UserPermManageUsers, "UserPermManageUsers"},
}
for _, p := range permissions {
user.Permissions = UserPermissionNone // reset permissions
user.GrantPermission(p.perm)
checkOnlyUserPermissionSet(t, user, p.perm)
}
}
// Helper function to check combined permissions are set
func checkCombinedUserPermissions(t *testing.T, user *User, perms []UserPermission) {
for _, perm := range perms {
if !user.HasPermission(perm) {
t.Errorf("expected permission %d to be set", perm)
}
}
}
func TestSetCombinedUserPermissions(t *testing.T) {
user := &User{}
allPermissions := []UserPermission{
UserPermReplaceUploads,
UserPermListOtherUploads,
UserPermEditOtherUploads,
UserPermDeleteOtherUploads,
UserPermReplaceOtherUploads,
UserPermManageLogs,
UserPermManageApiKeys,
UserPermManageUsers,
}
// Test setting permissions in combination
for i := 0; i < len(allPermissions); i++ {
user.Permissions = UserPermissionNone // reset permissions
for j := 0; j <= i; j++ {
user.GrantPermission(allPermissions[j])
}
checkCombinedUserPermissions(t, user, allPermissions[:i+1])
}
}
func TestUser_GetReadableUserLevel(t *testing.T) {
user := &User{
UserLevel: UserLevelSuperAdmin,
}
test.IsEqualString(t, user.GetReadableUserLevel(), "Super Admin")
user.UserLevel = UserLevelAdmin
test.IsEqualString(t, user.GetReadableUserLevel(), "Admin")
user.UserLevel = UserLevelUser
test.IsEqualString(t, user.GetReadableUserLevel(), "User")
user.UserLevel = 4
test.IsEqualString(t, user.GetReadableUserLevel(), "Invalid")
}
func TestUser_IsSuperAdmin(t *testing.T) {
user := &User{
UserLevel: UserLevelSuperAdmin,
}
test.IsEqualBool(t, user.IsSuperAdmin(), true)
user.UserLevel = UserLevelAdmin
test.IsEqualBool(t, user.IsSuperAdmin(), false)
user.UserLevel = UserLevelUser
test.IsEqualBool(t, user.IsSuperAdmin(), false)
user.UserLevel = 4
test.IsEqualBool(t, user.IsSuperAdmin(), false)
}
func TestUser_IsSameUser(t *testing.T) {
user := &User{
Id: 5,
}
test.IsEqualBool(t, user.IsSameUser(5), true)
test.IsEqualBool(t, user.IsSameUser(0), false)
}
func TestSetUserPermission(t *testing.T) {
user := &User{}
user.GrantPermission(UserPermListOtherUploads)
if !user.HasPermission(UserPermListOtherUploads) {
t.Errorf("expected permission %d to be set", UserPermListOtherUploads)
}
if user.HasPermission(UserPermReplaceOtherUploads) {
t.Errorf("expected permission %d to be not set", UserPermReplaceOtherUploads)
}
}
func TestRemoveUserPermission(t *testing.T) {
user := &User{}
user.GrantPermission(UserPermManageUsers)
if !user.HasPermission(UserPermManageUsers) {
t.Errorf("expected permission %d to be set", UserPermManageUsers)
}
user.RemovePermission(UserPermManageUsers)
if user.HasPermission(UserPermManageUsers) {
t.Errorf("expected permission %d to be removed", UserPermManageUsers)
}
}
func TestHasUserPermission(t *testing.T) {
user := &User{}
if !user.HasPermission(UserPermissionNone) {
t.Errorf("expected ApiPermNone to always return true")
}
if user.HasPermission(UserPermManageUsers) {
t.Errorf("expected permission %d not to be set", UserPermManageUsers)
}
user.GrantPermission(UserPermManageUsers)
if !user.HasPermission(UserPermManageUsers) {
t.Errorf("expected permission %d to be set", UserPermManageUsers)
}
if user.HasPermission(UserPermReplaceOtherUploads) {
t.Errorf("expected permission %d not to be set", UserPermReplaceOtherUploads)
}
}
func TestUser_HasPermissionReplace(t *testing.T) {
user := &User{}
if user.HasPermissionReplace() {
t.Errorf("expected replace permission to be not set")
}
user.GrantPermission(UserPermReplaceUploads)
if !user.HasPermissionReplace() {
t.Errorf("expected replace permission to be set")
}
}
func TestUser_HasPermissionListOtherUploads(t *testing.T) {
user := &User{}
test.IsEqualBool(t, user.HasPermissionListOtherUploads(), false)
user.GrantPermission(UserPermListOtherUploads)
test.IsEqualBool(t, user.HasPermissionListOtherUploads(), true)
}
func TestUser_HasPermissionEditOtherUploads(t *testing.T) {
user := &User{}
test.IsEqualBool(t, user.HasPermissionEditOtherUploads(), false)
user.GrantPermission(UserPermEditOtherUploads)
test.IsEqualBool(t, user.HasPermissionEditOtherUploads(), true)
}
func TestUser_HasPermissionDeleteOtherUploads(t *testing.T) {
user := &User{}
test.IsEqualBool(t, user.HasPermissionDeleteOtherUploads(), false)
user.GrantPermission(UserPermDeleteOtherUploads)
test.IsEqualBool(t, user.HasPermissionDeleteOtherUploads(), true)
}
func TestUser_HasPermissionReplaceOtherUploads(t *testing.T) {
user := &User{}
test.IsEqualBool(t, user.HasPermissionReplaceOtherUploads(), false)
user.GrantPermission(UserPermReplaceOtherUploads)
test.IsEqualBool(t, user.HasPermissionReplaceOtherUploads(), true)
}
func TestUser_HasPermissionManageLogs(t *testing.T) {
user := &User{}
test.IsEqualBool(t, user.HasPermissionManageLogs(), false)
user.GrantPermission(UserPermManageLogs)
test.IsEqualBool(t, user.HasPermissionManageLogs(), true)
}
func TestUser_HasPermissionManageApi(t *testing.T) {
user := &User{}
test.IsEqualBool(t, user.HasPermissionManageApi(), false)
user.GrantPermission(UserPermManageApiKeys)
test.IsEqualBool(t, user.HasPermissionManageApi(), true)
}
func TestUser_HasPermissionManageUsers(t *testing.T) {
user := &User{}
test.IsEqualBool(t, user.HasPermissionManageUsers(), false)
user.GrantPermission(UserPermManageUsers)
test.IsEqualBool(t, user.HasPermissionManageUsers(), true)
}
func TestUser_ToJson(t *testing.T) {
user := &User{
Id: 4,
Name: "Test User",
Permissions: UserPermissionAll,
UserLevel: UserLevelAdmin,
LastOnline: 1337,
Password: "1234",
ResetPassword: true,
}
test.IsEqualString(t, user.ToJson(), `{"id":4,"name":"Test User","permissions":255,"userLevel":1,"lastOnline":1337,"resetPassword":true}`)
}