149 lines
4.5 KiB
Dart
149 lines
4.5 KiB
Dart
import 'package:dio/dio.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:social_app/core/cache/hybrid_cache_store.dart';
|
|
import 'package:social_app/core/cache/memory_cache_store.dart';
|
|
import 'package:social_app/core/cache/persistent_cache_store.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/data/services/user_profile_cache_repository.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>();
|
|
}
|
|
if (sl.isRegistered<UserProfileCacheRepository>()) {
|
|
sl.unregister<UserProfileCacheRepository>();
|
|
}
|
|
usersApi = _FakeUsersApi(apiClient);
|
|
final repository = UserProfileCacheRepository(
|
|
store: HybridCacheStore(
|
|
memory: MemoryCacheStore(),
|
|
persistent: PersistentCacheStore(),
|
|
),
|
|
remoteLoader: usersApi.getMe,
|
|
);
|
|
sl.registerSingleton<UsersApi>(usersApi);
|
|
sl.registerSingleton<FriendsApi>(_FakeFriendsApi(apiClient));
|
|
sl.registerSingleton<UserProfileCacheRepository>(repository);
|
|
sl.registerSingleton<SettingsUserCache>(SettingsUserCache(repository));
|
|
});
|
|
|
|
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>();
|
|
}
|
|
if (sl.isRegistered<UserProfileCacheRepository>()) {
|
|
await sl.unregister<UserProfileCacheRepository>();
|
|
}
|
|
});
|
|
|
|
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);
|
|
});
|
|
}
|