Merge remote-tracking branch 'upstream/main' into issue-1089

This commit is contained in:
misha
2026-10-21 15:03:59 +03:00
7 changed files with 267 additions and 37 deletions

View File

@@ -61,6 +61,23 @@ void main() {
expect(() => interceptor.onError(error, handler), throwsA(isA<Error>()));
});
test('onError - 405 с missing: [email] без navigator-контекста отклоняет запрос без падения', () async {
final requestOptions = RequestOptions(path: '/test');
final response = Response(requestOptions: requestOptions, statusCode: 405, data: {'type': 'unverificated_phone', 'reason': 'verification_required', 'missing': ['email']});
final error = DioException(requestOptions: requestOptions, response: response, type: DioExceptionType.badResponse);
final handler = MockErrorInterceptorHandler();
when(() => handler.reject(any())).thenReturn(null);
// В тестах AppRouter.navigatorKey.currentContext == null: email-ветка должна это пережить.
interceptor.onError(error, handler);
// onError объявлен как void, дожидаемся завершения асинхронной обработки.
await Future.delayed(const Duration(milliseconds: 100));
verify(() => handler.reject(any())).called(1);
});
test('onError - пропускает другие ошибки', () async {
final requestOptions = RequestOptions(path: '/', method: 'GET', baseUrl: 'http://localhost');
final response = Response(requestOptions: requestOptions, statusCode: 404, data: {});

View File

@@ -0,0 +1,91 @@
import 'package:eatvio_app/core/interceptors/verification_requirement.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('VerificationRequirement.tryParse', () {
test('missing: [email] — не хватает только почты', () {
final requirement = VerificationRequirement.tryParse({
'type': 'unverificated_phone',
'missing': ['email'],
});
expect(requirement, isNotNull);
expect(requirement!.needsEmail, isTrue);
expect(requirement.needsPhone, isFalse);
expect(requirement.missing, [VerificationChannel.email]);
});
test('missing: [phone] — не хватает только телефона', () {
final requirement = VerificationRequirement.tryParse({
'type': 'unverificated_phone',
'missing': ['phone'],
});
expect(requirement, isNotNull);
expect(requirement!.needsPhone, isTrue);
expect(requirement.needsEmail, isFalse);
expect(requirement.missing, [VerificationChannel.phone]);
});
test('missing: [phone, email] — не хватает обоих каналов', () {
final requirement = VerificationRequirement.tryParse({
'type': 'unverificated_phone',
'missing': ['phone', 'email'],
});
expect(requirement, isNotNull);
expect(requirement!.needsPhone, isTrue);
expect(requirement.needsEmail, isTrue);
});
test('missing отсутствует — legacy-контракт «телефон»', () {
final requirement = VerificationRequirement.tryParse({
'type': 'unverificated_phone',
});
expect(requirement, isNotNull);
expect(requirement!.needsPhone, isTrue);
expect(requirement.needsEmail, isFalse);
expect(requirement.missing, [VerificationChannel.phone]);
});
test('missing пустой — legacy-контракт «телефон»', () {
final requirement = VerificationRequirement.tryParse({
'type': 'unverificated_phone',
'missing': [],
});
expect(requirement, isNotNull);
expect(requirement!.needsPhone, isTrue);
expect(requirement.needsEmail, isFalse);
});
test('неизвестное значение в missing игнорируется', () {
final requirement = VerificationRequirement.tryParse({
'type': 'unverificated_phone',
'missing': ['email', 'telegram'],
});
expect(requirement, isNotNull);
expect(requirement!.needsEmail, isTrue);
expect(requirement.needsPhone, isFalse);
expect(requirement.missing, [VerificationChannel.email]);
});
test('data не Map — null', () {
expect(VerificationRequirement.tryParse(null), isNull);
expect(VerificationRequirement.tryParse('unverificated_phone'), isNull);
expect(VerificationRequirement.tryParse(['email']), isNull);
});
test('type не unverificated_phone — null', () {
expect(
VerificationRequirement.tryParse({
'type': 'other',
'missing': ['email'],
}),
isNull,
);
});
});
}