diff --git a/data/file_system_store.go b/data/file_system_store.go index d53b064..efb232f 100644 --- a/data/file_system_store.go +++ b/data/file_system_store.go @@ -183,6 +183,18 @@ func (f *FileSystemStore) GetUsers() ([]models.User, error) { return users, nil } +func (f *FileSystemStore) ValidateUserCredentials(email, password string) bool { + user, err := f.GetUserByEmail(email) + if err != nil { + return false + } + err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)) + if err != nil { + return false + } + return true +} + func (f *FileSystemStore) getTasksFromFile() ([]models.Task, error) { var tasks []models.Task err := f.decoder.Decode(&tasks) diff --git a/data/file_system_store_test.go b/data/file_system_store_test.go index 62dd8ac..d85d25f 100644 --- a/data/file_system_store_test.go +++ b/data/file_system_store_test.go @@ -254,4 +254,70 @@ func TestFileSystemStoreUsers(t *testing.T) { assert.HasNoError(t, err) assert.Equals(t, users, initialUsers) }) + + t.Run("ValidateUserCredentials", func(t *testing.T) { + createUserDTO := models.NewCreateUserDTO( + "Claude Aldric", + "cvaldric@gmail.com", + "Caput Draconis", + ) + hashedPassword, err := bcrypt.GenerateFromPassword( + []byte(createUserDTO.Password), + bcrypt.DefaultCost, + ) + assert.HasNoError(t, err) + + initialUsers := []models.User{ + models.User{ + Id: 1, + Name: "Claude Aldric", + Email: "cvaldric@gmail.com", + Password: string(hashedPassword), + }, + } + jsonUsers, err := utils.ConvertToJSON(initialUsers) + assert.HasNoError(t, err) + + database, cleanDatabase := testutils.CreateTempFile(t, string(jsonUsers)) + defer cleanDatabase() + + store, err := data.NewFileSystemStore(database) + assert.HasNoError(t, err) + + tests := []struct { + name string + email string + password string + want bool + }{ + { + name: "when provided valid credentials", + email: "cvaldric@gmail.com", + password: "Caput Draconis", + want: true, + }, + { + name: "when provided an invalid password", + email: "cvaldric@gmail.com", + password: "password", + want: false, + }, + { + name: "when provided an invalid email", + email: "doesnotexist@email.com", + password: "Caput Draconis", + want: false, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + assert.Equals( + t, + store.ValidateUserCredentials(test.email, test.password), + test.want, + ) + }) + } + }) } diff --git a/data/sqlite_store.go b/data/sqlite_store.go index 1e0b102..eec2185 100644 --- a/data/sqlite_store.go +++ b/data/sqlite_store.go @@ -155,7 +155,6 @@ func (s *SqliteStore) ValidateUserCredentials(email, password string) bool { } err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)) if err != nil { - log.Printf("error with the password validation: %v\n", err) return false } return true diff --git a/testutils/mock_store.go b/testutils/mock_store.go index 4c23995..fd969cd 100644 --- a/testutils/mock_store.go +++ b/testutils/mock_store.go @@ -14,18 +14,19 @@ var initialMockStoreTasks = []models.Task{*models.NewTask(1, "Pack clothes")} var forcedError = errors.New("forced error") type mockStore struct { - CreateTaskCalls int - CreateUserCalls int - GetTaskByIdCalls int - GetTasksCalls int - GetUserByEmailCalls int - GetUsersCalls int - Tasks []models.Task - UpdateTaskCalls int - Users []models.User - lastTaskId int - lastUserId int - shouldForceError bool + CreateTaskCalls int + CreateUserCalls int + GetTaskByIdCalls int + GetTasksCalls int + GetUserByEmailCalls int + GetUsersCalls int + Tasks []models.Task + UpdateTaskCalls int + Users []models.User + ValidateUserCredentialsCalls int + lastTaskId int + lastUserId int + shouldForceError bool } func NewMockStore(shouldError bool) *mockStore { @@ -142,6 +143,14 @@ func (m *mockStore) GetUsers() ([]models.User, error) { return m.Users, nil } +func (m *mockStore) ValidateUserCredentials(username, password string) bool { + m.ValidateUserCredentialsCalls++ + if m.shouldForceError { + return false + } + return true +} + func (m *mockStore) getNewTaskId() int { newTaskId := m.lastTaskId + 1 m.lastTaskId++