Skip to content

Commit 1e124e6

Browse files
committed
EMail validation
1 parent 91b4405 commit 1e124e6

File tree

4 files changed

+308
-10
lines changed

4 files changed

+308
-10
lines changed

tests/test_yookassa_api.pas

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ TTestYooKassa = class(TTestCase)
7474
procedure TestLogging;
7575
procedure TestMarkCodeInfoValidation;
7676
procedure TestPhoneValidation;
77+
procedure TestEmailValidation;
78+
procedure TestEmailAndPhoneValidationTogether;
7779
end;
7880

7981
implementation
@@ -819,6 +821,163 @@ procedure TTestYooKassa.TestPhoneValidation;
819821
end;
820822
end;
821823

824+
procedure TTestYooKassa.TestEmailValidation;
825+
var
826+
User: TYookassaUser;
827+
begin
828+
User := TYookassaUser.Create;
829+
try
830+
// Валидные форматы email с нормализацией
831+
User.Email := 'User@Example.Com';
832+
AssertEquals('user@example.com', User.Email);
833+
834+
User.Email := 'user_name@sub.domain.org';
835+
AssertEquals('user_name@sub.domain.org', User.Email);
836+
837+
User.Email := 'test-email@domain-name.com';
838+
AssertEquals('test-email@domain-name.com', User.Email);
839+
840+
// Пустой email должен работать
841+
User.Email := '';
842+
AssertEquals('', User.Email);
843+
844+
// Невалидные email должны вызывать исключение
845+
try
846+
User.Email := 'invalid-email'; // Нет @
847+
Fail('Should raise validation error for missing @');
848+
except
849+
on EYooKassaValidationError do
850+
; // Expected
851+
end;
852+
853+
try
854+
User.Email := 'user@@domain.com'; // Двойной @
855+
Fail('Should raise validation error for double @');
856+
except
857+
on EYooKassaValidationError do
858+
; // Expected
859+
end;
860+
861+
try
862+
User.Email := '@domain.com'; // Нет локальной части
863+
Fail('Should raise validation error for missing local part');
864+
except
865+
on EYooKassaValidationError do
866+
; // Expected
867+
end;
868+
869+
try
870+
User.Email := 'user@'; // Нет доменной части
871+
Fail('Should raise validation error for missing domain');
872+
except
873+
on EYooKassaValidationError do
874+
; // Expected
875+
end;
876+
877+
try
878+
User.Email := 'user@domain'; // Нет TLD
879+
Fail('Should raise validation error for missing TLD');
880+
except
881+
on EYooKassaValidationError do
882+
; // Expected
883+
end;
884+
885+
try
886+
User.Email := '.user@domain.com'; // Локальная часть начинается с точки
887+
Fail('Should raise validation error for local part starting with dot');
888+
except
889+
on EYooKassaValidationError do
890+
; // Expected
891+
end;
892+
893+
try
894+
User.Email := 'user.@domain.com'; // Локальная часть заканчивается точкой
895+
Fail('Should raise validation error for local part ending with dot');
896+
except
897+
on EYooKassaValidationError do
898+
; // Expected
899+
end;
900+
901+
try
902+
User.Email := 'user@.domain.com'; // Домен начинается с точки
903+
Fail('Should raise validation error for domain starting with dot');
904+
except
905+
on EYooKassaValidationError do
906+
; // Expected
907+
end;
908+
909+
try
910+
User.Email := 'user@domain.com.'; // Домен заканчивается точкой
911+
Fail('Should raise validation error for domain ending with dot');
912+
except
913+
on EYooKassaValidationError do
914+
; // Expected
915+
end;
916+
917+
try
918+
User.Email := 'user with spaces@domain.com'; // Пробелы в локальной части
919+
Fail('Should raise validation error for spaces in local part');
920+
except
921+
on EYooKassaValidationError do
922+
; // Expected
923+
end;
924+
925+
try
926+
User.Email := 'user@domain with spaces.com'; // Пробелы в домене
927+
Fail('Should raise validation error for spaces in domain');
928+
except
929+
on EYooKassaValidationError do
930+
; // Expected
931+
end;
932+
933+
finally
934+
User.Free;
935+
end;
936+
end;
937+
938+
procedure TTestYooKassa.TestEmailAndPhoneValidationTogether;
939+
var
940+
User: TYookassaUser;
941+
Receipt: TYookassaReceipt;
942+
JSON: TJSONObject;
943+
begin
944+
// Тестируем совместное использование валидации email и phone
945+
User := TYookassaUser.Create;
946+
try
947+
// Валидация и нормализация обоих полей
948+
User.Email := 'TEST.User@EXAMPLE.COM';
949+
User.Phone := '+7 (900) 123-45-67';
950+
951+
AssertEquals('test.user@example.com', User.Email);
952+
AssertEquals('79001234567', User.Phone);
953+
954+
// Тест в составе чека
955+
Receipt := TYookassaReceipt.Create;
956+
try
957+
Receipt.Customer.Email := ' Customer@TEST.RU ';
958+
Receipt.Customer.Phone := '8-900-123-45-67';
959+
960+
AssertEquals('customer@test.ru', Receipt.Customer.Email);
961+
AssertEquals('79001234567', Receipt.Customer.Phone);
962+
963+
// Проверяем что в JSON попадают нормализованные значения
964+
JSON := Receipt.ToJSON;
965+
try
966+
AssertEquals('customer@test.ru', JSON.Objects['customer'].Get('email', ''));
967+
AssertEquals('79001234567', JSON.Objects['customer'].Get('phone', ''));
968+
finally
969+
JSON.Free;
970+
end;
971+
972+
finally
973+
Receipt.Free;
974+
end;
975+
976+
finally
977+
User.Free;
978+
end;
979+
end;
980+
822981
initialization
823982
RegisterTest(TTestYooKassa);
824983

yookassa_constants.pas

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,12 @@ interface
185185
_ERR_REFUND_ID_REQUIRED = 'For refund receipt, either PaymentId or RefundId must be specified';
186186
_ERR_HTTP_METHOD_NOT_SUPPORTED = 'HTTP method not supported: %s';
187187
_ERR_INVALID_PHONE_FORMAT = '%s "%s" is not in valid ITU-T E.164 format. Expected format: 79001234567';
188+
_ERR_INVALID_EMAIL_FORMAT = '%s "%s" is not in valid email format. Expected format: user@example.com';
189+
190+
// Validation Limits для email (НОВОЕ)
191+
_MAX_EMAIL_LENGTH = 254;
192+
_MAX_LOCAL_PART_LENGTH = 64;
193+
_MAX_DOMAIN_PART_LENGTH = 253;
188194

189195
// Response Messages
190196
_RESPONSE_STATUS_OK = '{"status": "ok"}';

yookassa_models.pas

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ TYookassaUser = class(TYookassaAPIObject)
115115
FFullName: String;
116116
FINN: String;
117117
FPhone: String;
118+
procedure SetEmail(const AValue: String);
118119
procedure SetPhone(const AValue: String);
119120
public
120121
function ToJSON: TJSONObject; override;
@@ -126,7 +127,7 @@ TYookassaUser = class(TYookassaAPIObject)
126127
property INN: String read FINN write FINN;
127128
{ Электронная почта пользователя для отправки чека. Обязательный параметр, если используете Чеки от ЮKassa
128129
или если используете другое решение (стороннюю онлайн-кассу, чеки самозанятых) и не передаете phone. }
129-
property Email: String read FEmail write FEmail;
130+
property Email: String read FEmail write SetEmail;
130131
{ Телефон пользователя для отправки чека. Указывается в формате ITU-T E.164, например 79000000000.
131132
Обязательный параметр, если не передан email }
132133
property Phone: String read FPhone write SetPhone;
@@ -546,6 +547,15 @@ procedure TYookassaUser.SetPhone(const AValue: String);
546547
FPhone := aTempPhone;
547548
end;
548549

550+
procedure TYookassaUser.SetEmail(const AValue: String);
551+
var
552+
aTempEmail: string;
553+
begin
554+
aTempEmail := AValue;
555+
TYookassaEmailValidator.ValidateAndNormalizeEmail(aTempEmail, 'Customer');
556+
FEmail := aTempEmail;
557+
end;
558+
549559
function TYookassaUser.ToJSON: TJSONObject;
550560
begin
551561
Result := TJSONObject.Create;

0 commit comments

Comments
 (0)