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 }