Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
File renamed without changes.
25 changes: 24 additions & 1 deletion internal/users/users.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package users

import (
"errors"
"fmt"
"net/mail"
)

var ErrNoResultFound = errors.New("no result found")

type User struct {
FirstName string
LastName string
Expand All @@ -24,7 +27,16 @@ func (m *Manager) AddUser(firstName string, lastName string, email string) error
return fmt.Errorf("invalid first name: %q", firstName)
}
if lastName == "" {
return fmt.Errorf("invalid last name:%q", lastName)
return fmt.Errorf("invalid last name: %q", lastName)
}

existinguser, err := m.GetUserByName(firstName, lastName)
if err != nil && !errors.Is(err, ErrNoResultFound) {
return fmt.Errorf("error getting user by name: %v", err)
}

if existinguser != nil {
return errors.New("user already exists")
}

parsedAddress, err := mail.ParseAddress(email)
Expand All @@ -42,3 +54,14 @@ func (m *Manager) AddUser(firstName string, lastName string, email string) error

return nil
}

func (m *Manager) GetUserByName(first string, last string) (*User, error) {
for i, user := range m.users {
if user.FirstName == first && user.LastName == last {
result := &m.users[i]
return result, nil
}
}

return nil, ErrNoResultFound
}
131 changes: 130 additions & 1 deletion internal/users/users_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func TestAddUserFirstName(t *testing.T) {
testLastName := "smith"
testEmail, err := mail.ParseAddress("foo@bar.com")
if err != nil {
t.Errorf("no error returned when adding invalid email %v", err)
t.Errorf("no error returned when adding first name %v", err)
}

err = testManager.AddUser(testFirstName, testLastName, testEmail.String())
Expand All @@ -88,3 +88,132 @@ func TestAddUserFirstName(t *testing.T) {
t.Fatalf("bad test manager count: expected 1 user, got %v", len(testManager.users))
}
}

func TestAddUserLastName(t *testing.T) {
testManager := NewManager()

testFirstName := "jhon"
testLastName := ""
testEmail, err := mail.ParseAddress("foo@bar.com")
if err != nil {
t.Errorf("no error returned when adding last name %v", err)
}

err = testManager.AddUser(testFirstName, testLastName, testEmail.String())
if err == nil {
t.Errorf("no error returned or invalid email")
} else {
expectedErr := "invalid last name: \"\""
if err.Error() != expectedErr {
t.Errorf("error mismatch: expected %v, got %v", expectedErr, err)
}
}

if len(testManager.users) > 0 {
t.Fatalf("bad test manager count: expected 1 user, got %v", len(testManager.users))
}
}

func TestAddUserDuplicateName(t *testing.T) {
testManager := NewManager()

testFirstName := "jhon"
testLastName := "smith"
testEmail, err := mail.ParseAddress("foo@bar.com")
if err != nil {
t.Errorf("no error returned when adding duplicate name %v", err)
}

err = testManager.AddUser(testFirstName, testLastName, testEmail.String())
if err != nil {
t.Errorf("error creating user")
}

err = testManager.AddUser(testFirstName, testLastName, testEmail.String())
if err == nil {
t.Errorf("error creating duplicate user")
} else {
expectedErr := "user already exists"
if err.Error() != expectedErr {
t.Errorf("error mismatch: expected %v, got %v", expectedErr, err)
}
}

if len(testManager.users) != 1 {
t.Errorf("bad test manager count: expected %d user, got %d", 1, len(testManager.users))
}
}

func TestGetUserByName(t *testing.T) {
testManager := NewManager()

err := testManager.AddUser("foo", "bar", "f.foo@bar.com")
if err != nil {
t.Fatalf("error adding test user: %v", err)
}
err = testManager.AddUser("bari", "foo", "bar@bar.com")
if err != nil {
t.Fatalf("error adding test user: %v", err)
}
err = testManager.AddUser("barz", "foo", "barz@bar.com")
if err != nil {
t.Fatalf("error adding test user: %v", err)
}
err = testManager.AddUser("fozz", "foo", "fooz@bar.com")
if err != nil {
t.Fatalf("error adding test user: %v", err)
}

tests := map[string]struct {
first string
last string
expected *User
expectedError error
}{
"simple lookup": {
first: "foo",
last: "bar",
expected: &testManager.users[0],
expectedError: nil,
},
"last element lookup": {
first: "bari",
last: "foo",
expected: &testManager.users[3],
expectedError: nil,
},
"no match lookup": {
first: "rgdf",
last: "rgter",
expected: nil,
expectedError: ErrNoResultFound,
},
"partial match lookup": {
first: "fozz",
last: "fozz",
expected: nil,
expectedError: ErrNoResultFound,
},
"empty first name": {
first: "",
last: "fozz",
expected: nil,
expectedError: ErrNoResultFound,
},
"empty last name": {
first: "fozz",
last: "",
expected: nil,
expectedError: ErrNoResultFound,
},
}

for name, test := range tests {
result, err := testManager.GetUserByName(test.first, test.last)
if err != test.expectedError {
t.Errorf("%s: invalid result:\nexpected: %v\ngot: %v", name, result, test.expected)
return
}
}

}
Loading