feat(tests): increased tests coverage

This commit is contained in:
misha
2025-12-25 12:56:38 +03:00
parent 5b705dfb72
commit 99659f7ea1
132 changed files with 10304 additions and 6226 deletions

View File

@@ -0,0 +1,147 @@
import 'package:dio/dio.dart';
import 'package:eatvio_app/features/barcode/models/barcode_product_model.dart';
import 'package:eatvio_app/features/barcode/repositories/barcode_repository.dart';
import 'package:eatvio_app/features/barcode/services/barcode_service.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'barcode_repository_test.mocks.dart';
@GenerateNiceMocks([MockSpec<BarcodeService>(), MockSpec<Dio>()])
void main() {
group('BarcodeRepository', () {
late BarcodeRepository repository;
late MockBarcodeService mockService;
late MockDio mockDio;
setUp(() {
mockService = MockBarcodeService();
mockDio = MockDio();
repository = BarcodeRepository(barcodeService: mockService, dio: mockDio);
});
test('getProductByBarcode - возвращает успешный результат (200)', () async {
const barcode = '1234567890123';
final productData = {'GTIN': barcode, 'Описание (ru)': 'Test Product'};
final response = Response(
data: productData,
statusCode: 200,
requestOptions: RequestOptions(path: '/api/gsone/barcode/$barcode'),
);
when(mockDio.get('/api/gsone/barcode/$barcode')).thenAnswer((_) async => response);
final result = await repository.getProductByBarcode(barcode);
expect(result.type, BarcodeResultType.success);
expect(result.product, isNotNull);
expect(result.product!.description, 'Test Product');
verify(mockDio.get('/api/gsone/barcode/$barcode')).called(1);
});
test('getProductByBarcode - возвращает статус обработки (202)', () async {
const barcode = '1234567890123';
final taskData = {'task_id': 'task-123', 'status': 'processing'};
final response = Response(
data: taskData,
statusCode: 202,
requestOptions: RequestOptions(path: '/api/gsone/barcode/$barcode'),
);
when(mockDio.get('/api/gsone/barcode/$barcode')).thenAnswer((_) async => response);
final result = await repository.getProductByBarcode(barcode);
expect(result.type, BarcodeResultType.processing);
expect(result.taskId, equals('task-123'));
verify(mockDio.get('/api/gsone/barcode/$barcode')).called(1);
});
test('getProductByBarcode - обрабатывает DioException с 202 статусом', () async {
const barcode = '1234567890123';
final taskData = {'task_id': 'task-456', 'status': 'processing'};
final dioException = DioException(
requestOptions: RequestOptions(path: '/api/gsone/barcode/$barcode'),
response: Response(
data: taskData,
statusCode: 202,
requestOptions: RequestOptions(path: '/api/gsone/barcode/$barcode'),
),
);
when(mockDio.get('/api/gsone/barcode/$barcode')).thenThrow(dioException);
final result = await repository.getProductByBarcode(barcode);
expect(result.type, BarcodeResultType.processing);
expect(result.taskId, equals('task-456'));
});
test('getProductByBarcode - пробрасывает исключение при другой ошибке', () async {
const barcode = '1234567890123';
final dioException = DioException(
requestOptions: RequestOptions(path: '/api/gsone/barcode/$barcode'),
response: Response(
data: {'error': 'Not found'},
statusCode: 404,
requestOptions: RequestOptions(path: '/api/gsone/barcode/$barcode'),
),
);
when(mockDio.get('/api/gsone/barcode/$barcode')).thenThrow(dioException);
expect(() => repository.getProductByBarcode(barcode), throwsException);
});
test('getTaskStatus - возвращает completed статус', () async {
const taskId = 'task-123';
final productData = {'GTIN': '1234567890123', 'Описание (ru)': 'Test Product'};
final statusModel = BarcodeTaskStatusModel(status: 'completed', data: BarcodeProductModel.fromJson(productData));
when(mockService.getTaskStatus(taskId: taskId)).thenAnswer((_) async => statusModel);
final result = await repository.getTaskStatus(taskId);
expect(result.type, BarcodeTaskStatusType.completed);
expect(result.product, isNotNull);
expect(result.product!.description, 'Test Product');
verify(mockService.getTaskStatus(taskId: taskId)).called(1);
});
test('getTaskStatus - возвращает failed статус', () async {
const taskId = 'task-123';
const statusModel = BarcodeTaskStatusModel(status: 'failed', data: null);
when(mockService.getTaskStatus(taskId: taskId)).thenAnswer((_) async => statusModel);
final result = await repository.getTaskStatus(taskId);
expect(result.type, BarcodeTaskStatusType.failed);
expect(result.product, isNull);
verify(mockService.getTaskStatus(taskId: taskId)).called(1);
});
test('getTaskStatus - возвращает processing статус', () async {
const taskId = 'task-123';
const statusModel = BarcodeTaskStatusModel(status: 'processing', data: null);
when(mockService.getTaskStatus(taskId: taskId)).thenAnswer((_) async => statusModel);
final result = await repository.getTaskStatus(taskId);
expect(result.type, BarcodeTaskStatusType.processing);
expect(result.product, isNull);
verify(mockService.getTaskStatus(taskId: taskId)).called(1);
});
test('getTaskStatus - пробрасывает исключение при ошибке', () async {
const taskId = 'task-123';
final exception = Exception('Ошибка загрузки');
when(mockService.getTaskStatus(taskId: taskId)).thenThrow(exception);
expect(() => repository.getTaskStatus(taskId), throwsException);
});
});
}