feat: 实现日历提醒 in-app fallback 机制及通知服务重构
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:social_app/core/api/i_api_client.dart';
|
||||
import 'package:social_app/core/di/injection.dart';
|
||||
import 'package:social_app/features/friends/data/friends_api.dart';
|
||||
import 'package:social_app/features/settings/data/services/settings_user_cache.dart';
|
||||
import 'package:social_app/features/settings/ui/screens/settings_screen.dart';
|
||||
import 'package:social_app/features/users/data/models/user_response.dart';
|
||||
import 'package:social_app/features/users/data/users_api.dart';
|
||||
|
||||
class _TestApiClient implements IApiClient {
|
||||
@override
|
||||
Future<Response<T>> delete<T>(String path, {data, Options? options}) async {
|
||||
return Response<T>(requestOptions: RequestOptions(path: path));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Response<T>> get<T>(String path, {Options? options}) async {
|
||||
return Response<T>(requestOptions: RequestOptions(path: path));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Stream<String>> getSseLines(
|
||||
String path, {
|
||||
Map<String, String>? headers,
|
||||
}) async {
|
||||
return const Stream<String>.empty();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Response<T>> patch<T>(String path, {data, Options? options}) async {
|
||||
return Response<T>(requestOptions: RequestOptions(path: path));
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Response<T>> post<T>(String path, {data, Options? options}) async {
|
||||
return Response<T>(requestOptions: RequestOptions(path: path));
|
||||
}
|
||||
}
|
||||
|
||||
class _FakeUsersApi extends UsersApi {
|
||||
_FakeUsersApi(super.client);
|
||||
|
||||
int getMeCalls = 0;
|
||||
|
||||
@override
|
||||
Future<UserResponse> getMe() async {
|
||||
getMeCalls += 1;
|
||||
return const UserResponse(
|
||||
id: 'u1',
|
||||
username: 'Linksy',
|
||||
phone: '13800000000',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _FakeFriendsApi extends FriendsApi {
|
||||
_FakeFriendsApi(super.client);
|
||||
|
||||
@override
|
||||
Future<List<FriendResponse>> getFriends() async {
|
||||
return const [];
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
late _FakeUsersApi usersApi;
|
||||
|
||||
setUp(() {
|
||||
final apiClient = _TestApiClient();
|
||||
if (sl.isRegistered<UsersApi>()) {
|
||||
sl.unregister<UsersApi>();
|
||||
}
|
||||
if (sl.isRegistered<FriendsApi>()) {
|
||||
sl.unregister<FriendsApi>();
|
||||
}
|
||||
if (sl.isRegistered<SettingsUserCache>()) {
|
||||
sl.unregister<SettingsUserCache>();
|
||||
}
|
||||
usersApi = _FakeUsersApi(apiClient);
|
||||
sl.registerSingleton<UsersApi>(usersApi);
|
||||
sl.registerSingleton<FriendsApi>(_FakeFriendsApi(apiClient));
|
||||
sl.registerSingleton<SettingsUserCache>(SettingsUserCache());
|
||||
});
|
||||
|
||||
tearDown(() async {
|
||||
if (sl.isRegistered<UsersApi>()) {
|
||||
await sl.unregister<UsersApi>();
|
||||
}
|
||||
if (sl.isRegistered<FriendsApi>()) {
|
||||
await sl.unregister<FriendsApi>();
|
||||
}
|
||||
if (sl.isRegistered<SettingsUserCache>()) {
|
||||
await sl.unregister<SettingsUserCache>();
|
||||
}
|
||||
});
|
||||
|
||||
testWidgets('settings screen removes account row and shows logout button', (
|
||||
tester,
|
||||
) async {
|
||||
await tester.pumpWidget(const MaterialApp(home: SettingsScreen()));
|
||||
await tester.pump();
|
||||
|
||||
expect(find.text('我的账户'), findsNothing);
|
||||
expect(find.text('退出登录'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('settings profile hero shows edit icon entry', (tester) async {
|
||||
await tester.pumpWidget(const MaterialApp(home: SettingsScreen()));
|
||||
await tester.pump();
|
||||
|
||||
expect(find.byKey(settingsProfileEditButtonKey), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('settings screen re-entry uses cached user', (tester) async {
|
||||
await tester.pumpWidget(const MaterialApp(home: SettingsScreen()));
|
||||
await tester.pump();
|
||||
await tester.pump();
|
||||
|
||||
await tester.pumpWidget(const SizedBox.shrink());
|
||||
await tester.pump();
|
||||
|
||||
await tester.pumpWidget(const MaterialApp(home: SettingsScreen()));
|
||||
await tester.pump();
|
||||
await tester.pump();
|
||||
|
||||
expect(usersApi.getMeCalls, 1);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user