add local

This commit is contained in:
2026-10-09 15:33:18 +07:00
parent 0210a0ed15
commit 2a1d7ca654
6 changed files with 90 additions and 12 deletions
+22
View File
@@ -0,0 +1,22 @@
package app
import (
"fmt"
"testing"
"evening_detective_server/internal/services/users_service"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func TestLocalAccountErrorStatus(t *testing.T) {
for _, test := range []struct{ name string }{{"email unavailable"}} {
t.Run(test.name, func(t *testing.T) {
err := userErrorStatus(fmt.Errorf("private detail: %w", users_service.ErrEmailUnavailable), "account failed")
if status.Code(err) != codes.FailedPrecondition || status.Convert(err).Message() != users_service.ErrEmailUnavailable.Error() {
t.Fatalf("status = %v", err)
}
})
}
}
+2
View File
@@ -11,6 +11,8 @@ import (
func userErrorStatus(err error, internalMessage string) error {
switch {
case errors.Is(err, users_service.ErrEmailUnavailable):
return status.Error(codes.FailedPrecondition, users_service.ErrEmailUnavailable.Error())
case errors.Is(err, users_service.ErrUserNotFound):
return status.Error(codes.NotFound, err.Error())
case errors.Is(err, users_service.ErrTermsNotAccepted), errors.Is(err, users_service.ErrInvalidEmail), errors.Is(err, users_service.ErrInvalidRole), errors.Is(err, users_service.ErrInvalidPasswordChange):
@@ -0,0 +1,34 @@
package users_service
import (
"context"
"errors"
"testing"
)
func TestLocalAccountOperationsDoNotChangeUsers(t *testing.T) {
for _, test := range []struct {
name string
run func(*UsersService) error
}{
{"signup", func(s *UsersService) error {
return s.AddUser(context.Background(), "Local", "local@example.com", true, true, "", "")
}},
{"password reset", func(s *UsersService) error {
return s.RefreshPassword(context.Background(), "local@example.com")
}},
} {
t.Run(test.name, func(t *testing.T) {
repo := newFakeRepo()
repo.seed("local@example.com", "unchanged-hash")
s := &UsersService{usersRepo: repo}
if err := test.run(s); !errors.Is(err, ErrEmailUnavailable) {
t.Fatalf("error = %v", err)
}
user, err := repo.GetUserByEmail(context.Background(), "local@example.com")
if err != nil || repo.userCount() != 1 || user.PasswordHash != "unchanged-hash" {
t.Fatalf("account changed: user=%v, error=%v", user, err)
}
})
}
}
@@ -76,6 +76,8 @@ func NewUsersService(
}
var (
// ErrEmailUnavailable indicates that email-based account operations are disabled.
ErrEmailUnavailable = errors.New("почтовые операции отключены на локальной площадке; обратитесь к организатору")
ErrTermsNotAccepted = errors.New("необходимо принять пользовательское соглашение и политику конфиденциальности")
// ErrInvalidEmail indicates that an email address is invalid.
ErrInvalidEmail = errors.New("некорректный email")
@@ -99,6 +101,9 @@ func (s *UsersService) AddUser(
ip string,
userAgent string,
) error {
if s.emailSender == nil {
return ErrEmailUnavailable
}
if !acceptTerms || !acceptPrivacy {
return ErrTermsNotAccepted
}
@@ -184,6 +189,9 @@ func (s *UsersService) RefreshPassword(
ctx context.Context,
email string,
) error {
if s.emailSender == nil {
return ErrEmailUnavailable
}
email = strings.TrimSpace(email)
if err := validateEmail(email); err != nil {
return err