forked from eatvio/eatvio_app
feat(tests): increased tests coverage
This commit is contained in:
147
test/features/barcode/repositories/barcode_repository_test.dart
Normal file
147
test/features/barcode/repositories/barcode_repository_test.dart
Normal 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);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user