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> delete(String path, {data, Options? options}) async { return Response(requestOptions: RequestOptions(path: path)); } @override Future> get(String path, {Options? options}) async { return Response(requestOptions: RequestOptions(path: path)); } @override Future> getSseLines( String path, { Map? headers, }) async { return const Stream.empty(); } @override Future> patch(String path, {data, Options? options}) async { return Response(requestOptions: RequestOptions(path: path)); } @override Future> post(String path, {data, Options? options}) async { return Response(requestOptions: RequestOptions(path: path)); } } class _FakeUsersApi extends UsersApi { _FakeUsersApi(super.client); int getMeCalls = 0; @override Future getMe() async { getMeCalls += 1; return const UserResponse( id: 'u1', username: 'Linksy', phone: '13800000000', ); } } class _FakeFriendsApi extends FriendsApi { _FakeFriendsApi(super.client); @override Future> getFriends() async { return const []; } } void main() { late _FakeUsersApi usersApi; setUp(() { final apiClient = _TestApiClient(); if (sl.isRegistered()) { sl.unregister(); } if (sl.isRegistered()) { sl.unregister(); } if (sl.isRegistered()) { sl.unregister(); } usersApi = _FakeUsersApi(apiClient); sl.registerSingleton(usersApi); sl.registerSingleton(_FakeFriendsApi(apiClient)); sl.registerSingleton(SettingsUserCache()); }); tearDown(() async { if (sl.isRegistered()) { await sl.unregister(); } if (sl.isRegistered()) { await sl.unregister(); } if (sl.isRegistered()) { await sl.unregister(); } }); 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); }); }