237 lines
5.6 KiB
Go
237 lines
5.6 KiB
Go
// Package user manages the users for the application.
|
|
//
|
|
// sn - https://github.com/sn
|
|
package user
|
|
|
|
import (
|
|
"log"
|
|
"net/mail"
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/sn/service/helpers"
|
|
)
|
|
|
|
func TestCheckPassword(t *testing.T) {
|
|
users := GetAll()
|
|
u := FindByID(users[0].ID)
|
|
correctPassword := "1@E4s67890"
|
|
incorrectPassword := "s3cret"
|
|
|
|
if !CheckPassword(u, correctPassword) {
|
|
t.Error("Expected password success, got failure.")
|
|
}
|
|
|
|
if CheckPassword(u, incorrectPassword) {
|
|
t.Error("Expected password failure, got success.")
|
|
}
|
|
}
|
|
|
|
func TestGetAll(t *testing.T) {
|
|
users := GetAll()
|
|
if len(users) == 0 {
|
|
t.Error("Incorrect users length.")
|
|
}
|
|
}
|
|
|
|
func TestFindByID(t *testing.T) {
|
|
users := GetAll()
|
|
knownID := users[0].ID
|
|
unknownID := helpers.GenerateUUID()
|
|
|
|
if u := FindByID(knownID); len(u.ID) == 0 {
|
|
t.Error("Expected known user ID, got unknown user ID.")
|
|
}
|
|
|
|
if u := FindByID(unknownID); len(u.ID) > 0 {
|
|
t.Error("Expected unknown user ID, got known user ID.")
|
|
}
|
|
}
|
|
|
|
func TestFindByAddress(t *testing.T) {
|
|
users := GetAll()
|
|
knownAddress, err := mail.ParseAddress(users[0].Address.Address)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
unknownAddress, err := mail.ParseAddress("test@example.com")
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
if u := FindByAddress(knownAddress); len(u.ID) == 0 {
|
|
t.Error("Expected known address, got unknown address.")
|
|
}
|
|
|
|
if u := FindByAddress(unknownAddress); len(u.ID) > 0 {
|
|
t.Error("Expected unknown address, got known address.")
|
|
}
|
|
}
|
|
|
|
func TestFindByUsername(t *testing.T) {
|
|
users := GetAll()
|
|
knownUsername := users[0].Username
|
|
unknownUsername := "unknown-username"
|
|
|
|
if u := FindByUsername(knownUsername); len(u.ID) == 0 {
|
|
t.Error("Expected known user, got unknown user.")
|
|
}
|
|
|
|
if u := FindByUsername(unknownUsername); len(u.ID) > 0 {
|
|
t.Error("Expected unknown user, got known user.")
|
|
}
|
|
}
|
|
|
|
func TestValidate(t *testing.T) {
|
|
address, err := mail.ParseAddress("test@example.com")
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
u := User{Username: "", Password: "123456789", Address: address}
|
|
if err := Validate(u); err == nil { // Complains about username length == 0
|
|
t.Error(err)
|
|
}
|
|
u.Username = "@@"
|
|
if err := Validate(u); err == nil { // Complains about illegal characters
|
|
t.Error(err)
|
|
}
|
|
u.Username = "zg"
|
|
if err := Validate(u); err == nil { // Complains about length
|
|
t.Error(err)
|
|
}
|
|
u.Password = "aaaaaaaaaa"
|
|
if err := Validate(u); err == nil { // Complains about digits
|
|
}
|
|
u.Password = "0123456789"
|
|
if err := Validate(u); err == nil { // Complains about lowercase
|
|
t.Error(err)
|
|
}
|
|
u.Password = "01234s6789"
|
|
if err := Validate(u); err == nil { // Complains about uppercase
|
|
t.Error(err)
|
|
}
|
|
u.Password = "01z34S6789"
|
|
if err := Validate(u); err == nil { // Complains about special characters
|
|
t.Error(err)
|
|
}
|
|
u.Password = "@1z34S6789"
|
|
if err := Validate(u); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
func TestCreate(t *testing.T) {
|
|
users := GetAll()
|
|
password := "S3crET!@#$"
|
|
address, err := mail.ParseAddress(users[0].Address.Address + ".com")
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
currentUserCount := len(users)
|
|
u := Create(User{Username: "zzg", Password: password, Address: address})
|
|
if len(GetAll()) == currentUserCount {
|
|
t.Error("User wasn't created.")
|
|
}
|
|
if u.Created.IsZero() {
|
|
t.Error("User creation time not set.")
|
|
}
|
|
if !CheckPassword(u, password) {
|
|
t.Error("User password incorrectly set.")
|
|
}
|
|
}
|
|
|
|
func TestUpdate(t *testing.T) {
|
|
users := GetAll()
|
|
address, err := mail.ParseAddress("zg@zk.gd")
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
u := Update(User{})
|
|
if len(u.ID) != 0 {
|
|
t.Error("Patch fail should return empty user.")
|
|
}
|
|
userBeforeUpdate := FindByID(users[0].ID)
|
|
updatedUser := User{ID: users[0].ID, Username: "zgg", Password: "S3crET!@#$", Address: address}
|
|
u = Update(updatedUser)
|
|
if len(u.ID) == 0 {
|
|
t.Error("User was not found.")
|
|
}
|
|
if u.Username != updatedUser.Username {
|
|
t.Error("Username was not updated.")
|
|
}
|
|
if !CheckPassword(u, updatedUser.Password) {
|
|
t.Error("Password was not updated.")
|
|
}
|
|
if u.Address.Address != updatedUser.Address.Address {
|
|
t.Error("Email was not updated.")
|
|
}
|
|
if u.Updated.Sub(userBeforeUpdate.Updated) == 0 {
|
|
t.Error("Last Updated not updated.")
|
|
}
|
|
}
|
|
|
|
func TestPatch(t *testing.T) {
|
|
users := GetAll()
|
|
address, err := mail.ParseAddress("zzg@zk.gd")
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
u := Patch(User{})
|
|
if len(u.ID) != 0 {
|
|
t.Error("Patch fail should return empty user.")
|
|
}
|
|
userToPatch := FindByID(users[0].ID)
|
|
userToPatch.Username = "zzg"
|
|
userToPatch.Password = "S3crET!@#$"
|
|
userToPatch.Address = address
|
|
u = Patch(userToPatch)
|
|
if len(u.ID) == 0 {
|
|
t.Error("User was not found.")
|
|
}
|
|
if u.Username != userToPatch.Username {
|
|
t.Error("Username was not patched.")
|
|
}
|
|
if !CheckPassword(u, userToPatch.Password) {
|
|
t.Error("Password was not patched.")
|
|
}
|
|
if u.Address.Address != userToPatch.Address.Address {
|
|
t.Error("Email was not patched.")
|
|
}
|
|
if u.Updated.Sub(userToPatch.Updated) == 0 {
|
|
t.Error("Last Updated not patched.")
|
|
}
|
|
}
|
|
|
|
func TestDelete(t *testing.T) {
|
|
users := GetAll()
|
|
u := User{}
|
|
err := Delete(u.ID)
|
|
if err.Error() != "Not found" {
|
|
t.Error("Delete fail should return empty user.")
|
|
}
|
|
u = FindByID(users[0].ID)
|
|
err = Delete(u.ID)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
if users[0].ID == u.ID {
|
|
t.Error("User was not deleted.")
|
|
}
|
|
}
|
|
|
|
func TestMain(m *testing.M) {
|
|
usernames := [4]string{"alex", "blake", "corey", "devon"}
|
|
for _, un := range usernames {
|
|
addr, err := mail.ParseAddress(strings.Title(un) + "<" + un + "@example.com>")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
u := User{Username: un, Password: "1@E4s67890", Address: addr, Created: time.Now()}
|
|
_ = Create(u)
|
|
}
|
|
|
|
os.Exit(m.Run())
|
|
}
|