func (s *memStorage) CreatePassword(p storage.Password) (err error) { p.Email = strings.ToLower(p.Email) s.tx(func() { if _, ok := s.passwords[p.Email]; ok { err = storage.ErrAlreadyExists } else { s.passwords[p.Email] = p } }) return }
func (c *conn) CreatePassword(p storage.Password) error { p.Email = strings.ToLower(p.Email) _, err := c.Exec(` insert into password ( email, hash, username, user_id ) values ( $1, $2, $3, $4 ); `, p.Email, p.Hash, p.Username, p.UserID, ) if err != nil { return fmt.Errorf("insert password: %v", err) } return nil }
func testPasswordCRUD(t *testing.T, s storage.Storage) { // Use bcrypt.MinCost to keep the tests short. passwordHash, err := bcrypt.GenerateFromPassword([]byte("secret"), bcrypt.MinCost) if err != nil { t.Fatal(err) } password := storage.Password{ Email: "*****@*****.**", Hash: passwordHash, Username: "******", UserID: "foobar", } if err := s.CreatePassword(password); err != nil { t.Fatalf("create password token: %v", err) } getAndCompare := func(id string, want storage.Password) { gr, err := s.GetPassword(id) if err != nil { t.Errorf("get password %q: %v", id, err) return } if diff := pretty.Compare(want, gr); diff != "" { t.Errorf("password retrieved from storage did not match: %s", diff) } } getAndCompare("*****@*****.**", password) getAndCompare("*****@*****.**", password) // Emails should be case insensitive if err := s.UpdatePassword(password.Email, func(old storage.Password) (storage.Password, error) { old.Username = "******" return old, nil }); err != nil { t.Fatalf("failed to update auth request: %v", err) } password.Username = "******" getAndCompare("*****@*****.**", password) var passwordList []storage.Password passwordList = append(passwordList, password) listAndCompare := func(want []storage.Password) { passwords, err := s.ListPasswords() if err != nil { t.Errorf("list password: %v", err) return } sort.Sort(byEmail(want)) sort.Sort(byEmail(passwords)) if diff := pretty.Compare(want, passwords); diff != "" { t.Errorf("password list retrieved from storage did not match: %s", diff) } } listAndCompare(passwordList) if err := s.DeletePassword(password.Email); err != nil { t.Fatalf("failed to delete password: %v", err) } if _, err := s.GetPassword(password.Email); err != storage.ErrNotFound { t.Errorf("after deleting password expected storage.ErrNotFound, got %v", err) } }