mirror of
https://github.com/steveiliop56/tinyauth.git
synced 2025-10-27 20:25:41 +00:00
164 lines
5.7 KiB
Go
164 lines
5.7 KiB
Go
package utils_test
|
|
|
|
import (
|
|
"os"
|
|
"testing"
|
|
"tinyauth/internal/utils"
|
|
|
|
"gotest.tools/v3/assert"
|
|
)
|
|
|
|
func TestGetUsers(t *testing.T) {
|
|
// Setup
|
|
file, err := os.Create("/tmp/tinyauth_users_test.txt")
|
|
assert.NilError(t, err)
|
|
|
|
_, err = file.WriteString(" user1:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G \n user2:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G ") // Spacing is on purpose
|
|
assert.NilError(t, err)
|
|
|
|
err = file.Close()
|
|
assert.NilError(t, err)
|
|
defer os.Remove("/tmp/tinyauth_users_test.txt")
|
|
|
|
// Test file
|
|
users, err := utils.GetUsers("", "/tmp/tinyauth_users_test.txt")
|
|
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, 2, len(users))
|
|
|
|
assert.Equal(t, "user1", users[0].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[0].Password)
|
|
assert.Equal(t, "user2", users[1].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[1].Password)
|
|
|
|
// Test config
|
|
users, err = utils.GetUsers("user3:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G,user4:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", "")
|
|
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, 2, len(users))
|
|
|
|
assert.Equal(t, "user3", users[0].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[0].Password)
|
|
assert.Equal(t, "user4", users[1].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[1].Password)
|
|
|
|
// Test both
|
|
users, err = utils.GetUsers("user5:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", "/tmp/tinyauth_users_test.txt")
|
|
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, 3, len(users))
|
|
|
|
assert.Equal(t, "user5", users[0].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[0].Password)
|
|
assert.Equal(t, "user1", users[1].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[1].Password)
|
|
assert.Equal(t, "user2", users[2].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[2].Password)
|
|
|
|
// Test empty
|
|
users, err = utils.GetUsers("", "")
|
|
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, 0, len(users))
|
|
|
|
// Test non-existent file
|
|
users, err = utils.GetUsers("", "/tmp/non_existent_file.txt")
|
|
|
|
assert.ErrorContains(t, err, "no such file or directory")
|
|
|
|
assert.Equal(t, 0, len(users))
|
|
}
|
|
|
|
func TestParseUsers(t *testing.T) {
|
|
// Valid users
|
|
users, err := utils.ParseUsers("user1:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G,user2:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G:ABCDEF") // user2 has TOTP
|
|
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, 2, len(users))
|
|
|
|
assert.Equal(t, "user1", users[0].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[0].Password)
|
|
assert.Equal(t, "", users[0].TotpSecret)
|
|
assert.Equal(t, "user2", users[1].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[1].Password)
|
|
assert.Equal(t, "ABCDEF", users[1].TotpSecret)
|
|
|
|
// Valid weirdly spaced users
|
|
users, err = utils.ParseUsers(" user1:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G , user2:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G:ABCDEF ") // Spacing is on purpose
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, 2, len(users))
|
|
|
|
assert.Equal(t, "user1", users[0].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[0].Password)
|
|
assert.Equal(t, "", users[0].TotpSecret)
|
|
assert.Equal(t, "user2", users[1].Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", users[1].Password)
|
|
assert.Equal(t, "ABCDEF", users[1].TotpSecret)
|
|
}
|
|
|
|
func TestParseUser(t *testing.T) {
|
|
// Valid user without TOTP
|
|
user, err := utils.ParseUser("user1:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G")
|
|
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, "user1", user.Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", user.Password)
|
|
assert.Equal(t, "", user.TotpSecret)
|
|
|
|
// Valid user with TOTP
|
|
user, err = utils.ParseUser("user2:$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G:ABCDEF")
|
|
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, "user2", user.Username)
|
|
assert.Equal(t, "$2a$10$Mz5xhkfSJUtPWkzCd/TdaePh9CaXc5QcGII5wIMPLSR46eTwma30G", user.Password)
|
|
assert.Equal(t, "ABCDEF", user.TotpSecret)
|
|
|
|
// Valid user with $$ in password
|
|
user, err = utils.ParseUser("user3:pa$$word123")
|
|
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, "user3", user.Username)
|
|
assert.Equal(t, "pa$word123", user.Password)
|
|
assert.Equal(t, "", user.TotpSecret)
|
|
|
|
// User with spaces
|
|
user, err = utils.ParseUser(" user4 : password123 : TOTPSECRET ")
|
|
|
|
assert.NilError(t, err)
|
|
|
|
assert.Equal(t, "user4", user.Username)
|
|
assert.Equal(t, "password123", user.Password)
|
|
assert.Equal(t, "TOTPSECRET", user.TotpSecret)
|
|
|
|
// Invalid users
|
|
_, err = utils.ParseUser("user1") // Missing password
|
|
assert.ErrorContains(t, err, "invalid user format")
|
|
|
|
_, err = utils.ParseUser("user1:")
|
|
assert.ErrorContains(t, err, "invalid user format")
|
|
|
|
_, err = utils.ParseUser(":password123")
|
|
assert.ErrorContains(t, err, "invalid user format")
|
|
|
|
_, err = utils.ParseUser("user1:password123:ABC:EXTRA") // Too many parts
|
|
assert.ErrorContains(t, err, "invalid user format")
|
|
|
|
_, err = utils.ParseUser("user1::ABC")
|
|
assert.ErrorContains(t, err, "invalid user format")
|
|
|
|
_, err = utils.ParseUser(":password123:ABC")
|
|
assert.ErrorContains(t, err, "invalid user format")
|
|
|
|
_, err = utils.ParseUser(" : : ")
|
|
assert.ErrorContains(t, err, "invalid user format")
|
|
}
|