Files
rasadyar_application/packages/chicken/test/integration/poultry_science_integration_test.dart

642 lines
19 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:rasadyar_chicken/data/data_source/remote/poultry_science/poultry_science_remote.dart';
import 'package:rasadyar_chicken/data/models/poultry_export/poultry_export.dart';
import 'package:rasadyar_chicken/data/models/request/kill_registration/kill_registration.dart';
import 'package:rasadyar_chicken/data/models/response/all_poultry/all_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/approved_price/approved_price.dart';
import 'package:rasadyar_chicken/data/models/response/hatching/hatching_models.dart';
import 'package:rasadyar_chicken/data/models/response/hatching_report/hatching_report.dart';
import 'package:rasadyar_chicken/data/models/response/kill_house_poultry/kill_house_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/kill_request_poultry/kill_request_poultry.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_farm/poultry_farm.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_hatching/poultry_hatching.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_order/poultry_order.dart';
import 'package:rasadyar_chicken/data/models/response/poultry_science/home_poultry_science/home_poultry_science_model.dart';
import 'package:rasadyar_chicken/data/models/response/sell_for_freezing/sell_for_freezing.dart';
import 'package:rasadyar_chicken/data/repositories/poultry_science/poultry_science_repository_imp.dart';
import 'package:rasadyar_core/core.dart';
class MockPoultryScienceRemoteDataSource extends Mock
implements PoultryScienceRemoteDatasource {}
void main() {
late PoultryScienceRepositoryImp poultryScienceRepository;
late MockPoultryScienceRemoteDataSource mockRemote;
setUp(() {
mockRemote = MockPoultryScienceRemoteDataSource();
poultryScienceRepository = PoultryScienceRepositoryImp(mockRemote);
});
group('Poultry Science Integration Tests', () {
const token = 'test-token';
group('Complete Poultry Science Home Flow', () {
test('should complete full poultry science home workflow', () async {
// Arrange
const type = 'hatching';
final expectedHomeModel = HomePoultryScienceModel(
farmCount: 5,
hatchingCount: 1000,
hatchingQuantity: 500,
hatchingLeftOver: 200,
hatchingLosses: 50,
hatchingKilledQuantity: 250,
hatchingMaxAge: 45,
hatchingMinAge: 30,
);
final expectedHatching = [
HatchingModel(
id: 1,
key: 'hatching-1',
date: '2024-01-01',
quantity: 100,
state: 'active',
),
];
final expectedHatchingPagination = PaginationModel<HatchingModel>(
results: expectedHatching,
count: 1,
next: null,
previous: null,
);
// Mock the flow
when(
() => mockRemote.getHomePoultryScience(token: token, type: type),
).thenAnswer((_) async => expectedHomeModel);
when(
() => mockRemote.getHatchingPoultry(
token: token,
queryParameters: any(named: 'queryParameters'),
),
).thenAnswer((_) async => expectedHatchingPagination);
// Act - Step 1: Get home poultry science data
final homeModel = await poultryScienceRepository.getHomePoultry(
token: token,
type: type,
);
// Act - Step 2: Get hatching poultry data
final hatchingData = await poultryScienceRepository.getHatchingPoultry(
token: token,
queryParameters: {'page': '1', 'limit': '10'},
);
// Assert
expect(homeModel, equals(expectedHomeModel));
expect(hatchingData, equals(expectedHatchingPagination));
verify(
() => mockRemote.getHomePoultryScience(token: token, type: type),
).called(1);
verify(
() => mockRemote.getHatchingPoultry(
token: token,
queryParameters: any(named: 'queryParameters'),
),
).called(1);
});
});
group('Hatching Report Management Flow', () {
test('should complete hatching report management workflow', () async {
// Arrange
final queryParameters = {'page': '1', 'limit': '10'};
final expectedReports = [
HatchingReport(
id: 1,
key: 'report-1',
date: DateTime.parse('2024-01-01'),
state: 'completed',
),
];
final expectedPagination = PaginationModel<HatchingReport>(
results: expectedReports,
count: 1,
next: null,
previous: null,
);
final mockFormData = MockFormData();
// Mock the flow
when(
() => mockRemote.getPoultryScienceReport(
token: token,
queryParameters: queryParameters,
),
).thenAnswer((_) async => expectedPagination);
when(
() => mockRemote.submitPoultryScienceReport(
token: token,
data: mockFormData,
onSendProgress: any(named: 'onSendProgress'),
),
).thenAnswer((_) async {});
// Act - Step 1: Get hatching reports
final reports = await poultryScienceRepository.getHatchingPoultryReport(
token: token,
queryParameters: queryParameters,
);
// Act - Step 2: Submit new report
await poultryScienceRepository.submitPoultryScienceReport(
token: token,
data: mockFormData,
);
// Assert
expect(reports, equals(expectedPagination));
verify(
() => mockRemote.getPoultryScienceReport(
token: token,
queryParameters: queryParameters,
),
).called(1);
verify(
() => mockRemote.submitPoultryScienceReport(
token: token,
data: mockFormData,
onSendProgress: any(named: 'onSendProgress'),
),
).called(1);
});
});
group('Poultry Farm Management Flow', () {
test('should complete poultry farm management workflow', () async {
// Arrange
final queryParameters = {'page': '1', 'limit': '10'};
final expectedFarms = [
PoultryFarm(
id: 1,
key: 'farm-1',
unitName: 'Farm 1',
totalCapacity: 1000,
cityName: 'Tehran',
),
];
final expectedPagination = PaginationModel<PoultryFarm>(
results: expectedFarms,
count: 1,
next: null,
previous: null,
);
// Mock the flow
when(
() => mockRemote.getPoultryScienceFarmList(
token: token,
queryParameters: queryParameters,
),
).thenAnswer((_) async => expectedPagination);
// Act
final farms = await poultryScienceRepository.getPoultryScienceFarmList(
token: token,
queryParameters: queryParameters,
);
// Assert
expect(farms, equals(expectedPagination));
verify(
() => mockRemote.getPoultryScienceFarmList(
token: token,
queryParameters: queryParameters,
),
).called(1);
});
});
group('Pricing and Market Data Flow', () {
test('should complete pricing and market data workflow', () async {
// Arrange
final queryParameters = {'date': '2024-01-01'};
final expectedApprovedPrice = ApprovedPrice(
approved: true,
lowestPrice: 45000.0,
highestPrice: 55000.0,
lowestWeight: 1.5,
highestWeight: 2.5,
);
final expectedSellForFreezing = SellForFreezing(permission: true);
final expectedPoultryExport = PoultryExport(
key: 'export-key',
allow: true,
limitationStatus: false,
limitation: 100.0,
);
// Mock the flow
when(
() => mockRemote.getApprovedPrice(
token: token,
queryParameters: queryParameters,
),
).thenAnswer((_) async => expectedApprovedPrice);
when(
() => mockRemote.getSellForFreezing(
token: token,
queryParameters: queryParameters,
),
).thenAnswer((_) async => expectedSellForFreezing);
when(
() => mockRemote.getPoultryExport(
token: token,
queryParameters: queryParameters,
),
).thenAnswer((_) async => expectedPoultryExport);
// Act - Step 1: Get approved price
final approvedPrice = await poultryScienceRepository.getApprovedPrice(
token: token,
queryParameters: queryParameters,
);
// Act - Step 2: Get sell for freezing data
final sellForFreezing = await poultryScienceRepository
.getSellForFreezing(token: token, queryParameters: queryParameters);
// Act - Step 3: Get poultry export data
final poultryExport = await poultryScienceRepository.getPoultryExport(
token: token,
queryParameters: queryParameters,
);
// Assert
expect(approvedPrice, equals(expectedApprovedPrice));
expect(sellForFreezing, equals(expectedSellForFreezing));
expect(poultryExport, equals(expectedPoultryExport));
verify(
() => mockRemote.getApprovedPrice(
token: token,
queryParameters: queryParameters,
),
).called(1);
verify(
() => mockRemote.getSellForFreezing(
token: token,
queryParameters: queryParameters,
),
).called(1);
verify(
() => mockRemote.getPoultryExport(
token: token,
queryParameters: queryParameters,
),
).called(1);
});
});
group('Kill Registration Flow', () {
test('should complete kill registration workflow', () async {
// Arrange
final queryParameters = {'page': '1', 'limit': '10'};
final expectedKillRequests = [
KillRequestPoultry(
key: 'kill-request-1',
unitName: 'Farm 1',
totalCapacity: 1000,
cityName: 'Tehran',
provinceName: 'Tehran',
),
];
final expectedKillHouses = [
KillHousePoultry(
name: 'Kill House 1',
killer: true,
fullname: 'Kill House Manager',
quantitySum: 500,
firstQuantity: 100,
poultryQuantitySum: 400,
killReqKey: 'killhouse-1',
),
];
final expectedPoultryHatching = [
PoultryHatching(
key: 'hatching-1',
quantity: 100,
losses: 5,
leftOver: 95,
killedQuantity: 50,
state: 'active',
date: '2024-01-01',
age: 30,
),
];
final killRegistrationRequest = KillRegistrationRequest(
killReqKey: 'registration-key',
operatorKey: 'operator-1',
poultryHatchingKey: 'hatching-1',
quantity: 100,
sendDate: '2024-01-01',
chickenBreed: 'Broiler',
indexWeight: 2.0,
losses: '5',
freezing: false,
export: false,
cash: true,
credit: false,
role: 'farmer',
poultryKey: 'poultry-1',
amount: 100000,
financialOperation: 'cash',
freeSaleInProvince: true,
confirmPoultryMobile: '09123456789',
);
// Mock the flow
when(
() => mockRemote.getUserPoultry(
token: token,
queryParameters: queryParameters,
),
).thenAnswer(
(_) async => expectedKillRequests.cast<KillRequestPoultry>(),
);
when(
() => mockRemote.getKillHouseList(
token: token,
queryParameters: queryParameters,
),
).thenAnswer((_) async => expectedKillHouses.cast<KillHousePoultry>());
when(
() => mockRemote.getPoultryHatching(
token: token,
queryParameters: queryParameters,
),
).thenAnswer(
(_) async => expectedPoultryHatching.cast<PoultryHatching>(),
);
when(
() => mockRemote.submitKillRegistration(
token: token,
request: killRegistrationRequest,
),
).thenAnswer((_) async {});
// Act - Step 1: Get user poultry
final killRequests = await poultryScienceRepository.getUserPoultry(
token: token,
queryParameters: queryParameters,
);
// Act - Step 2: Get kill house list
final killHouses = await poultryScienceRepository.getKillHouseList(
token: token,
queryParameters: queryParameters,
);
// Act - Step 3: Get poultry hatching
final poultryHatching = await poultryScienceRepository
.getPoultryHatching(token: token, queryParameters: queryParameters);
// Act - Step 4: Submit kill registration
await poultryScienceRepository.submitKillRegistration(
token: token,
request: killRegistrationRequest,
);
// Assert
expect(killRequests, equals(expectedKillRequests));
expect(killHouses, equals(expectedKillHouses));
expect(poultryHatching, equals(expectedPoultryHatching));
verify(
() => mockRemote.getUserPoultry(
token: token,
queryParameters: queryParameters,
),
).called(1);
verify(
() => mockRemote.getKillHouseList(
token: token,
queryParameters: queryParameters,
),
).called(1);
verify(
() => mockRemote.getPoultryHatching(
token: token,
queryParameters: queryParameters,
),
).called(1);
verify(
() => mockRemote.submitKillRegistration(
token: token,
request: killRegistrationRequest,
),
).called(1);
});
});
group('Poultry Order Management Flow', () {
test('should complete poultry order management workflow', () async {
// Arrange
final queryParameters = {'page': '1', 'limit': '10'};
const orderId = 'order-1';
final expectedOrders = [
PoultryOrder(
key: 'order-1',
id: 1,
orderCode: 1001,
createDate: '2024-01-01',
sendDate: '2024-01-02',
quantity: 100,
firstQuantity: 100,
amount: 5000000.0,
finalState: 'pending',
provinceState: 'pending',
stateProcess: 'processing',
freeSaleInProvince: true,
freezing: false,
export: false,
market: true,
),
];
final expectedPagination = PaginationModel<PoultryOrder>(
count: 1,
next: null,
previous: null,
results: expectedOrders,
);
// Mock the flow
when(
() => mockRemote.getPoultryOderList(
token: token,
queryParameters: queryParameters,
),
).thenAnswer((_) async => expectedPagination);
when(
() => mockRemote.deletePoultryOder(token: token, orderId: orderId),
).thenAnswer((_) async {});
// Act - Step 1: Get poultry orders
final orders = await poultryScienceRepository.getPoultryOderList(
token: token,
queryParameters: queryParameters,
);
// Act - Step 2: Delete poultry order
await poultryScienceRepository.deletePoultryOder(
token: token,
orderId: orderId,
);
// Assert
expect(orders, equals(expectedPagination));
verify(
() => mockRemote.getPoultryOderList(
token: token,
queryParameters: queryParameters,
),
).called(1);
verify(
() => mockRemote.deletePoultryOder(token: token, orderId: orderId),
).called(1);
});
});
group('All Poultry Data Flow', () {
test('should complete all poultry data retrieval workflow', () async {
// Arrange
final queryParameters = {'type': 'all'};
final expectedAllPoultry = [
AllPoultry(
key: 'poultry-1',
unitName: 'Poultry Farm 1',
lastHatchingRemainQuantity: 100,
provinceAllowSellFree: true,
),
];
// Mock the flow
when(
() => mockRemote.getAllPoultry(
token: token,
queryParameters: queryParameters,
),
).thenAnswer((_) async => expectedAllPoultry.cast<AllPoultry>());
// Act
final allPoultry = await poultryScienceRepository.getAllPoultry(
token: token,
queryParameters: queryParameters,
);
// Assert
expect(allPoultry, equals(expectedAllPoultry));
verify(
() => mockRemote.getAllPoultry(
token: token,
queryParameters: queryParameters,
),
).called(1);
});
});
group('Error Handling in Poultry Science Workflow', () {
test('should handle home poultry data retrieval failure', () async {
// Arrange
const type = 'hatching';
when(
() => mockRemote.getHomePoultryScience(token: token, type: type),
).thenAnswer((_) async => null);
// Act
final homeModel = await poultryScienceRepository.getHomePoultry(
token: token,
type: type,
);
// Assert
expect(homeModel, isNull);
verify(
() => mockRemote.getHomePoultryScience(token: token, type: type),
).called(1);
});
test('should handle kill registration submission failure', () async {
// Arrange
final killRegistrationRequest = KillRegistrationRequest(
killReqKey: 'registration-key',
operatorKey: 'operator-1',
poultryHatchingKey: 'hatching-1',
quantity: 100,
sendDate: '2024-01-01',
chickenBreed: 'Broiler',
indexWeight: 2.0,
losses: '5',
freezing: false,
export: false,
cash: true,
credit: false,
role: 'farmer',
poultryKey: 'poultry-1',
amount: 100000,
financialOperation: 'cash',
freeSaleInProvince: true,
confirmPoultryMobile: '09123456789',
);
when(
() => mockRemote.submitKillRegistration(
token: token,
request: killRegistrationRequest,
),
).thenThrow(Exception('Kill registration submission failed'));
// Act & Assert
expect(
() => poultryScienceRepository.submitKillRegistration(
token: token,
request: killRegistrationRequest,
),
throwsA(isA<Exception>()),
);
verify(
() => mockRemote.submitKillRegistration(
token: token,
request: killRegistrationRequest,
),
).called(1);
});
});
});
}
// Mock FormData class
class MockFormData extends Mock implements FormData {}