feat(app): смена сервера API и очистка данных устройства при выходе
Адрес бэкенда хранится в shared_preferences и читается до runApp; switchApiBaseUrl сбрасывает токены и кэш старого сервера. Выход стирает refresh-токен и sqlite-кэш ответов. Экран настроек переделан под разделы.
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
import 'package:fintracker_api/fintracker_api.dart';
|
||||
import 'package:fintracker_app/core/api/common_providers.dart';
|
||||
import 'package:fintracker_app/features/settings/settings_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
Future<void> _pump(WidgetTester tester, double width) async {
|
||||
SharedPreferences.setMockInitialValues({});
|
||||
tester.view.physicalSize = Size(width, 900);
|
||||
tester.view.devicePixelRatio = 1;
|
||||
addTearDown(tester.view.reset);
|
||||
await tester.pumpWidget(
|
||||
ProviderScope(
|
||||
overrides: [
|
||||
meProvider.overrideWith(
|
||||
(ref) async => UserOut(email: 'ada@example.com', id: 1),
|
||||
),
|
||||
],
|
||||
child: const MaterialApp(home: Scaffold(body: SettingsPage())),
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
}
|
||||
|
||||
void main() {
|
||||
testWidgets('tabs along the top, the tab\'s sections in a menu on the left', (
|
||||
tester,
|
||||
) async {
|
||||
await _pump(tester, 1200);
|
||||
|
||||
for (final tab in ['Аккаунт', 'Отображение', 'Сервер']) {
|
||||
expect(find.text(tab), findsOneWidget, reason: tab);
|
||||
}
|
||||
// the first tab opens on its first section
|
||||
expect(find.text('Приватные данные'), findsOneWidget);
|
||||
expect(find.text('Безопасность'), findsOneWidget);
|
||||
expect(find.text('ada@example.com'), findsOneWidget);
|
||||
|
||||
await tester.tap(find.text('Безопасность'));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('Выйти'), findsOneWidget);
|
||||
expect(find.text('ada@example.com'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('switching the tab resets to its first section', (tester) async {
|
||||
await _pump(tester, 1200);
|
||||
|
||||
await tester.tap(find.text('Безопасность'));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('Сервер'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.text('Адрес API'), findsWidgets);
|
||||
expect(find.text('О приложении'), findsOneWidget);
|
||||
expect(find.text('Изменить'), findsOneWidget);
|
||||
|
||||
await tester.tap(find.text('Отображение'));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('Тёмная'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('a narrow surface turns the menu into chips above the panel', (
|
||||
tester,
|
||||
) async {
|
||||
await _pump(tester, 500);
|
||||
|
||||
expect(find.byType(ChoiceChip), findsNWidgets(2));
|
||||
expect(find.text('ada@example.com'), findsOneWidget);
|
||||
await tester.tap(find.widgetWithText(ChoiceChip, 'Безопасность'));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('Выйти'), findsOneWidget);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user