github.com/monkeswag33/noter-go@v0.0.0-20220505233910-9d72ccb0bdb6/cmd/new/user_test.go (about)

     1  package new
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/monkeswag33/noter-go/argon2"
     7  	"github.com/monkeswag33/noter-go/db"
     8  	"github.com/monkeswag33/noter-go/errordef"
     9  	"github.com/stretchr/testify/assert"
    10  	passwordvalidator "github.com/wagslane/go-password-validator"
    11  )
    12  
    13  type userValidationTester struct {
    14  	username       string
    15  	password       string
    16  	validator      func(string) error
    17  	expectedResult error
    18  }
    19  
    20  func TestCreateUser(t *testing.T) {
    21  	var username string = "testcreateuser"
    22  	user, err := createUser([]string{username}, password)
    23  	assert.NoError(t, err)
    24  	assert.NoError(t, insertUser(user))
    25  	assert.Equal(t, user.Username, username)
    26  	matches, err := argon2.VerifyPass(password, user.Password)
    27  	assert.NoError(t, err)
    28  	assert.True(t, matches)
    29  }
    30  
    31  func TestUserValidator(t *testing.T) {
    32  	var username string = "testusernamevalidator"
    33  	var user db.User = db.User{
    34  		Username: username,
    35  		Password: password,
    36  	}
    37  	assert.NoError(t, database.CreateUser(&user))
    38  	var testCases []userValidationTester = []userValidationTester{
    39  		// Usernames
    40  		{
    41  			username:       "hi", // Too short
    42  			validator:      newUserValidateUsername,
    43  			expectedResult: errordef.ErrUsernameTooShort,
    44  		},
    45  		{
    46  			username:       username, // Already exists
    47  			validator:      newUserValidateUsername,
    48  			expectedResult: errordef.ErrUserAlreadyExists,
    49  		},
    50  		{
    51  			username:       "test$*!#", // Must contain only alphanumeric characters
    52  			validator:      newUserValidateUsername,
    53  			expectedResult: errordef.ErrUsernameMustContainAlphaNumeric,
    54  		},
    55  		{
    56  			username:       "validusername123",
    57  			validator:      newUserValidateUsername,
    58  			expectedResult: nil,
    59  		},
    60  		// Passwords
    61  		{
    62  			password:       "short", // Too short
    63  			validator:      newUserValidatePassword,
    64  			expectedResult: errordef.ErrPasswordTooShort,
    65  		},
    66  		{
    67  			password:       "password", // insecure
    68  			validator:      newUserValidatePassword,
    69  			expectedResult: passwordvalidator.Validate("password", minEntropyBits),
    70  		},
    71  		{
    72  			password:       password, // Valid password
    73  			validator:      newUserValidatePassword,
    74  			expectedResult: nil,
    75  		},
    76  	}
    77  	for _, testCase := range testCases {
    78  		var argument string = testCase.username
    79  		if len(testCase.password) != 0 {
    80  			argument = testCase.password
    81  		}
    82  		assert.Equal(t, testCase.validator(argument), testCase.expectedResult)
    83  	}
    84  }