feat(tests): test coverage is 69.2

This commit is contained in:
misha
2026-01-21 09:19:41 +03:00
parent 775d4fb80f
commit f6809a06b3
16 changed files with 5274 additions and 333 deletions

View File

@@ -1,11 +1,15 @@
import 'package:eatvio_app/core/app_config.dart';
import 'package:eatvio_app/core/app_initializer.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/token_storage.dart';
import 'package:eatvio_app/core/websockets/ws_manager.dart';
import 'package:eatvio_app/core/websockets/ws_service.dart';
import 'package:eatvio_app/features/chat/models/websocket_info_model.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'ws_manager_test.mocks.dart';
@@ -17,6 +21,8 @@ void main() {
});
setUp(() async {
SharedPreferences.setMockInitialValues({});
TokenStorage.clearCache();
await sl.reset();
sl.registerLazySingleton<AppConfig>(() => AppConfig(buildType: AppBuildType.tests)..setBaseUrl('http://localhost'));
});
@@ -25,7 +31,6 @@ void main() {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
await manager.initialize();
expect(manager, isNotNull);
@@ -86,5 +91,165 @@ void main() {
expect(manager.client, isNull);
expect(manager.userId, isNull);
});
test('initPrivateDirectChatChannel - создает канал для прямого чата', () async {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
const chatId = 'chat-123';
const token = 'test-token';
await TokenStorage.saveTokenInStorage(token);
// initPrivateDirectChatChannel требует, чтобы client был инициализирован
// Но так как мы не можем легко мокировать PusherChannelsClient,
// этот тест проверяет, что метод не выбрасывает исключение
// когда client равен null
expect(() => manager.initPrivateDirectChatChannel(chatId), returnsNormally);
});
test('initialize - обрабатывает ошибку при отсутствии токена', () async {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
// Убеждаемся, что токена нет
await TokenStorage.removeTokenInStorage();
// initialize должен обработать ошибку gracefully
await manager.initialize();
expect(manager.client, isNull);
});
test('initialize - обрабатывает ошибку при ошибке getWebsocket', () async {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
const token = 'test-token';
await TokenStorage.saveTokenInStorage(token);
when(wsService.getWebsocket()).thenThrow(Exception('Network error'));
// initialize должен обработать ошибку gracefully
await manager.initialize();
expect(manager.client, isNull);
});
test('initialize - устанавливает userId из WebsocketInfoModel', () async {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
const token = 'test-token';
const userId = 42;
await TokenStorage.saveTokenInStorage(token);
when(
wsService.getWebsocket(),
).thenAnswer((_) async => const WebsocketInfoModel(key: 'test-key', host: 'test-host', port: '443', cluster: 'test-cluster', userId: userId));
// initialize должен установить userId, но так как мы не можем
// полностью мокировать PusherChannelsClient, этот тест проверяет,
// что метод не выбрасывает исключение
await manager.initialize();
// userId может быть установлен только если client успешно создан
// В данном случае, так как мы не можем полностью мокировать client,
// мы просто проверяем, что метод не выбрасывает исключение
expect(manager, isNotNull);
});
test('clear - отписывается от всех каналов', () async {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
manager.userId = 1;
// clear должен отписаться от всех каналов
await manager.clear();
expect(manager.client, isNull);
expect(manager.userId, isNull);
});
test('initialize - не инициализирует повторно если client уже существует', () async {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
const token = 'test-token';
await TokenStorage.saveTokenInStorage(token);
when(
wsService.getWebsocket(),
).thenAnswer((_) async => const WebsocketInfoModel(key: 'test-key', host: 'test-host', port: '443', cluster: 'test-cluster', userId: 1));
// Первый вызов initialize
await manager.initialize();
// Второй вызов initialize не должен вызывать getWebsocket снова
// если client уже инициализирован
final initialClient = manager.client;
await manager.initialize();
// client должен остаться тем же (или null, если инициализация не удалась)
expect(manager.client, initialClient);
});
test('subscribeDirectChatChannel - подписывается на канал когда он существует', () {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
// Когда канал null, метод не должен выбрасывать исключение
manager.subscribeDirectChatChannel();
expect(manager, isNotNull);
});
test('unsubscribeDirectChatChannel - отписывается от канала когда он существует', () {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
// Когда канал null, метод не должен выбрасывать исключение
manager.unsubscribeDirectChatChannel();
expect(manager, isNotNull);
});
test('newMessagesStream - возвращает null когда канал не инициализирован', () {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
expect(manager.newMessagesStream, isNull);
});
test('newNotificationsStream - возвращает null когда канал не инициализирован', () {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
expect(manager.newNotificationsStream, isNull);
});
test('directChatStream - возвращает null когда канал не инициализирован', () {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
expect(manager.directChatStream, isNull);
});
test('clientTypingStream - возвращает null когда канал не инициализирован', () {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
expect(manager.clientTypingStream, isNull);
});
test('initialize - обрабатывает случай когда TokenStorage.haveTokenInStorage возвращает false', () async {
final wsService = MockWsService();
final manager = WsManager(wsService: wsService);
// Убеждаемся, что токена нет
await TokenStorage.removeTokenInStorage();
// initialize должен обработать отсутствие токена gracefully
await manager.initialize();
expect(manager.client, isNull);
});
});
}