forked from eatvio/eatvio_app
feat(payments): phase 3 test added
This commit is contained in:
27
lib/features/payment/repositories/sbp_repository.dart
Normal file
27
lib/features/payment/repositories/sbp_repository.dart
Normal file
@@ -0,0 +1,27 @@
|
||||
import 'package:eatvio_app/features/payment/services/sbp_service.dart';
|
||||
import 'package:sbp/models/c2bmembers_model.dart';
|
||||
|
||||
/// Репозиторий оплаты по СБП: обёртка над [SbpService] с graceful-обработкой
|
||||
/// ошибок нативного плагина (отсутствие установленных банков, недоступность
|
||||
/// сервисов на устройстве, в т.ч. на Huawei HMS и т.п.).
|
||||
///
|
||||
/// Возвращает управляемые значения вместо проброса исключений, чтобы UI мог
|
||||
/// показать fallback (например, открыть checkout_url в браузере/WebView).
|
||||
class SbpRepository {
|
||||
final SbpService sbpService;
|
||||
|
||||
SbpRepository({required this.sbpService});
|
||||
|
||||
/// Возвращает установленные банки СБП либо пустой список при ошибке плагина.
|
||||
Future<List<C2bmemberModel>> getInstalledBanks() async {
|
||||
return await sbpService.getInstalledBanks();
|
||||
}
|
||||
|
||||
/// Открывает банк для оплаты. Возвращает `false` при ошибке плагина.
|
||||
Future<bool> openBank({
|
||||
required String url,
|
||||
required C2bmemberModel bank,
|
||||
}) async {
|
||||
return await sbpService.openBank(url: url, bank: bank);
|
||||
}
|
||||
}
|
||||
43
lib/features/payment/services/sbp_service.dart
Normal file
43
lib/features/payment/services/sbp_service.dart
Normal file
@@ -0,0 +1,43 @@
|
||||
import 'package:sbp/data/c2bmembers_data.dart';
|
||||
import 'package:sbp/models/c2bmembers_model.dart';
|
||||
import 'package:sbp/sbp.dart' as sbp;
|
||||
|
||||
/// Контракт обёртки над нативным плагином СБП (Система Быстрых Платежей).
|
||||
///
|
||||
/// Статичные методы класса [Sbp] из пакета `sbp` работают через MethodChannel,
|
||||
/// поэтому не поддаются прямому мокированию в тестах. Этот интерфейс вводится
|
||||
/// для тестируемости и возможности подмены реализации (см. [SbpServiceImpl]).
|
||||
abstract class SbpService {
|
||||
/// Возвращает список банков, установленных на устройстве пользователя
|
||||
/// и поддерживающих оплату по СБП.
|
||||
Future<List<C2bmemberModel>> getInstalledBanks();
|
||||
|
||||
/// Открывает банковское приложение [bank] для оплаты по ссылке [url]
|
||||
/// (checkout_url вида `https://qr.nspk.ru/...`).
|
||||
///
|
||||
/// Возвращает `true`, если приложение банка успешно запущено.
|
||||
Future<bool> openBank({required String url, required C2bmemberModel bank});
|
||||
}
|
||||
|
||||
/// Реализация [SbpService], делегирующая вызовы в статичные методы пакета `sbp`.
|
||||
class SbpServiceImpl implements SbpService {
|
||||
const SbpServiceImpl();
|
||||
|
||||
@override
|
||||
Future<List<C2bmemberModel>> getInstalledBanks() {
|
||||
// Используем встроенный справочник банков c2bmembersData (получаемый с
|
||||
// https://qr.nspk.ru/proxyapp/c2bmembers.json) и фильтруем только те, что
|
||||
// установлены на устройстве. Локальные иконки/названия включены, чтобы UI
|
||||
// не зависел от сетевой загрузки логотипов.
|
||||
return sbp.Sbp.getInstalledBanks(
|
||||
C2bmembersModel.fromJson(c2bmembersData),
|
||||
useAndroidLocalIcons: true,
|
||||
useAndroidLocalNames: true,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> openBank({required String url, required C2bmemberModel bank}) {
|
||||
return sbp.Sbp.openBank(url, bank);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user