test: add unit tests for poultry repository and searchable dropdown functionalities
- Introduced tests for `PoultryScienceRepositoryImp` to validate delegated remote calls. - Added comprehensive tests for `SearchableDropdownLogic` covering selection, overlay, and search logic. - Enhanced `SearchableDropdown` widget tests for multi-select, label building, and overlay management.
This commit is contained in:
@@ -323,7 +323,7 @@ void main() {
|
||||
).thenAnswer((_) async => mockResponse);
|
||||
|
||||
// Act
|
||||
await authRemoteDataSource.submitUserInfo(userInfo);
|
||||
await authRemoteDataSource.stewardAppLogin(token: 'test-token', queryParameters: userInfo);
|
||||
|
||||
// Assert
|
||||
verify(
|
||||
|
||||
@@ -146,45 +146,6 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
group('submitUserInfo', () {
|
||||
test(
|
||||
'should call remote submitUserInfo with correct parameters',
|
||||
() async {
|
||||
// Arrange
|
||||
const phone = '09123456789';
|
||||
const deviceName = 'Test Device';
|
||||
final expectedData = {'mobile': phone, 'device_name': deviceName};
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.submitUserInfo(any()),
|
||||
).thenAnswer((_) async {});
|
||||
|
||||
// Act
|
||||
await authRepository.submitUserInfo(
|
||||
phone: phone,
|
||||
deviceName: deviceName,
|
||||
);
|
||||
|
||||
// Assert
|
||||
verify(() => mockAuthRemote.submitUserInfo(expectedData)).called(1);
|
||||
},
|
||||
);
|
||||
|
||||
test('should call remote submitUserInfo without device name', () async {
|
||||
// Arrange
|
||||
const phone = '09123456789';
|
||||
final expectedData = {'mobile': phone, 'device_name': null};
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.submitUserInfo(any()),
|
||||
).thenAnswer((_) async {});
|
||||
|
||||
// Act
|
||||
await authRepository.submitUserInfo(phone: phone);
|
||||
|
||||
// Assert
|
||||
verify(() => mockAuthRemote.submitUserInfo(expectedData)).called(1);
|
||||
});
|
||||
});
|
||||
// submitUserInfo removed from API; covered by stewardAppLogin at remote layer
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
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/request/kill_registration/kill_registration.dart';
|
||||
import 'package:rasadyar_chicken/data/repositories/poultry_science/poultry_science_repository_imp.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
|
||||
class _MockRemote extends Mock implements PoultryScienceRemoteDatasource {}
|
||||
|
||||
void main() {
|
||||
setUpAll(() {
|
||||
registerFallbackValue(FormData());
|
||||
registerFallbackValue(const KillRegistrationRequest());
|
||||
registerFallbackValue(<String, dynamic>{});
|
||||
});
|
||||
|
||||
group('PoultryScienceRepositoryImp', () {
|
||||
late _MockRemote remote;
|
||||
late PoultryScienceRepositoryImp repo;
|
||||
|
||||
setUp(() {
|
||||
remote = _MockRemote();
|
||||
repo = PoultryScienceRepositoryImp(remote);
|
||||
});
|
||||
|
||||
test('getHomePoultry delegates', () async {
|
||||
when(() => remote.getHomePoultryScience(token: any(named: 'token'), type: any(named: 'type')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getHomePoultry(token: 't', type: 'x');
|
||||
expect(res, null);
|
||||
verify(() => remote.getHomePoultryScience(token: 't', type: 'x')).called(1);
|
||||
});
|
||||
|
||||
test('getHatchingPoultry delegates', () async {
|
||||
when(() => remote.getHatchingPoultry(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getHatchingPoultry(token: 't', queryParameters: {'a': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getHatchingPoultry(token: 't', queryParameters: {'a': 1})).called(1);
|
||||
});
|
||||
|
||||
test('submitPoultryScienceReport delegates', () async {
|
||||
when(() => remote.submitPoultryScienceReport(token: any(named: 'token'), data: any(named: 'data'), onSendProgress: any(named: 'onSendProgress')))
|
||||
.thenAnswer((_) async {});
|
||||
await repo.submitPoultryScienceReport(token: 't', data: FormData());
|
||||
verify(() => remote.submitPoultryScienceReport(token: 't', data: any(named: 'data'), onSendProgress: any(named: 'onSendProgress'))).called(1);
|
||||
});
|
||||
|
||||
test('getHatchingPoultryReport delegates', () async {
|
||||
when(() => remote.getPoultryScienceReport(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getHatchingPoultryReport(token: 't', queryParameters: {'q': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getPoultryScienceReport(token: 't', queryParameters: {'q': 1})).called(1);
|
||||
});
|
||||
|
||||
test('getPoultryScienceFarmList delegates', () async {
|
||||
when(() => remote.getPoultryScienceFarmList(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getPoultryScienceFarmList(token: 't', queryParameters: {'p': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getPoultryScienceFarmList(token: 't', queryParameters: {'p': 1})).called(1);
|
||||
});
|
||||
|
||||
test('getApprovedPrice delegates', () async {
|
||||
when(() => remote.getApprovedPrice(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getApprovedPrice(token: 't', queryParameters: {'a': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getApprovedPrice(token: 't', queryParameters: {'a': 1})).called(1);
|
||||
});
|
||||
|
||||
test('getAllPoultry delegates', () async {
|
||||
when(() => remote.getAllPoultry(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getAllPoultry(token: 't', queryParameters: {'a': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getAllPoultry(token: 't', queryParameters: {'a': 1})).called(1);
|
||||
});
|
||||
|
||||
test('getSellForFreezing delegates', () async {
|
||||
when(() => remote.getSellForFreezing(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getSellForFreezing(token: 't', queryParameters: {'a': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getSellForFreezing(token: 't', queryParameters: {'a': 1})).called(1);
|
||||
});
|
||||
|
||||
test('getPoultryExport delegates', () async {
|
||||
when(() => remote.getPoultryExport(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getPoultryExport(token: 't', queryParameters: {'a': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getPoultryExport(token: 't', queryParameters: {'a': 1})).called(1);
|
||||
});
|
||||
|
||||
test('getUserPoultry delegates', () async {
|
||||
when(() => remote.getUserPoultry(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getUserPoultry(token: 't', queryParameters: {'a': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getUserPoultry(token: 't', queryParameters: {'a': 1})).called(1);
|
||||
});
|
||||
|
||||
test('getPoultryHatching delegates', () async {
|
||||
when(() => remote.getPoultryHatching(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getPoultryHatching(token: 't', queryParameters: {'a': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getPoultryHatching(token: 't', queryParameters: {'a': 1})).called(1);
|
||||
});
|
||||
|
||||
test('getKillHouseList delegates', () async {
|
||||
when(() => remote.getKillHouseList(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getKillHouseList(token: 't', queryParameters: {'a': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getKillHouseList(token: 't', queryParameters: {'a': 1})).called(1);
|
||||
});
|
||||
|
||||
test('submitKillRegistration delegates', () async {
|
||||
when(() => remote.submitKillRegistration(token: any(named: 'token'), request: any(named: 'request')))
|
||||
.thenAnswer((_) async {});
|
||||
await repo.submitKillRegistration(token: 't', request: const KillRegistrationRequest());
|
||||
verify(() => remote.submitKillRegistration(token: 't', request: any(named: 'request'))).called(1);
|
||||
});
|
||||
|
||||
test('getPoultryOderList delegates', () async {
|
||||
when(() => remote.getPoultryOderList(token: any(named: 'token'), queryParameters: any(named: 'queryParameters')))
|
||||
.thenAnswer((_) async => null);
|
||||
final res = await repo.getPoultryOderList(token: 't', queryParameters: {'a': 1});
|
||||
expect(res, null);
|
||||
verify(() => remote.getPoultryOderList(token: 't', queryParameters: {'a': 1})).called(1);
|
||||
});
|
||||
|
||||
test('deletePoultryOder delegates', () async {
|
||||
when(() => remote.deletePoultryOder(token: any(named: 'token'), orderId: any(named: 'orderId')))
|
||||
.thenAnswer((_) async {});
|
||||
await repo.deletePoultryOder(token: 't', orderId: 'id');
|
||||
verify(() => remote.deletePoultryOder(token: 't', orderId: 'id')).called(1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@ import 'package:rasadyar_chicken/data/data_source/remote/auth/auth_remote.dart';
|
||||
import 'package:rasadyar_chicken/data/models/response/user_info/user_info_model.dart';
|
||||
import 'package:rasadyar_chicken/data/models/response/user_profile_model/user_profile_model.dart';
|
||||
import 'package:rasadyar_chicken/data/repositories/auth/auth_repository_imp.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
|
||||
class MockAuthRemoteDataSource extends Mock implements AuthRemoteDataSource {}
|
||||
|
||||
@@ -22,7 +21,6 @@ void main() {
|
||||
test('should complete full login flow successfully', () async {
|
||||
// Arrange
|
||||
const phoneNumber = '09123456789';
|
||||
const deviceName = 'Test Device';
|
||||
final authRequest = {
|
||||
'username': 'test@example.com',
|
||||
'password': 'password',
|
||||
@@ -48,28 +46,18 @@ void main() {
|
||||
|
||||
// Mock the flow
|
||||
when(
|
||||
() => mockAuthRemote.getUserInfo(phoneNumber),
|
||||
() => mockAuthRemote.getUserInfo(phoneNumber),
|
||||
).thenAnswer((_) async => expectedUserInfo);
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.submitUserInfo(any()),
|
||||
).thenAnswer((_) async {});
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.login(authRequest: authRequest),
|
||||
() => mockAuthRemote.login(authRequest: authRequest),
|
||||
).thenAnswer((_) async => expectedUserProfile);
|
||||
|
||||
// Act - Step 1: Get user info
|
||||
final userInfo = await authRepository.getUserInfo(phoneNumber);
|
||||
expect(userInfo, equals(expectedUserInfo));
|
||||
|
||||
// Act - Step 2: Submit user info
|
||||
await authRepository.submitUserInfo(
|
||||
phone: phoneNumber,
|
||||
deviceName: deviceName,
|
||||
);
|
||||
|
||||
// Act - Step 3: Login
|
||||
// Act - Step 2: Login
|
||||
final userProfile = await authRepository.login(
|
||||
authRequest: authRequest,
|
||||
);
|
||||
@@ -77,7 +65,6 @@ void main() {
|
||||
// Assert
|
||||
expect(userProfile, equals(expectedUserProfile));
|
||||
verify(() => mockAuthRemote.getUserInfo(phoneNumber)).called(1);
|
||||
//verify(() => mockAuthRemote.submitUserInfo(any())).called(1);
|
||||
verify(() => mockAuthRemote.login(authRequest: authRequest)).called(1);
|
||||
});
|
||||
|
||||
@@ -100,11 +87,11 @@ void main() {
|
||||
|
||||
// Mock the flow
|
||||
when(
|
||||
() => mockAuthRemote.hasAuthenticated(),
|
||||
() => mockAuthRemote.hasAuthenticated(),
|
||||
).thenAnswer((_) async => false);
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.login(authRequest: authRequest),
|
||||
() => mockAuthRemote.login(authRequest: authRequest),
|
||||
).thenAnswer((_) async => expectedUserProfile);
|
||||
|
||||
// Act - Step 1: Check authentication status
|
||||
@@ -129,7 +116,7 @@ void main() {
|
||||
const phoneNumber = '09123456789';
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.getUserInfo(phoneNumber),
|
||||
() => mockAuthRemote.getUserInfo(phoneNumber),
|
||||
).thenAnswer((_) async => null);
|
||||
|
||||
// Act
|
||||
@@ -143,7 +130,6 @@ void main() {
|
||||
test('should handle login failure after successful user info', () async {
|
||||
// Arrange
|
||||
const phoneNumber = '09123456789';
|
||||
const deviceName = 'Test Device';
|
||||
final authRequest = {
|
||||
'username': 'test@example.com',
|
||||
'password': 'wrong',
|
||||
@@ -158,28 +144,18 @@ void main() {
|
||||
|
||||
// Mock the flow
|
||||
when(
|
||||
() => mockAuthRemote.getUserInfo(phoneNumber),
|
||||
() => mockAuthRemote.getUserInfo(phoneNumber),
|
||||
).thenAnswer((_) async => expectedUserInfo);
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.submitUserInfo(any()),
|
||||
).thenAnswer((_) async {});
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.login(authRequest: authRequest),
|
||||
() => mockAuthRemote.login(authRequest: authRequest),
|
||||
).thenAnswer((_) async => null);
|
||||
|
||||
// Act - Step 1: Get user info (success)
|
||||
final userInfo = await authRepository.getUserInfo(phoneNumber);
|
||||
expect(userInfo, equals(expectedUserInfo));
|
||||
|
||||
// Act - Step 2: Submit user info (success)
|
||||
await authRepository.submitUserInfo(
|
||||
phone: phoneNumber,
|
||||
deviceName: deviceName,
|
||||
);
|
||||
|
||||
// Act - Step 3: Login (failure)
|
||||
// Act - Step 2: Login (failure)
|
||||
final userProfile = await authRepository.login(
|
||||
authRequest: authRequest,
|
||||
);
|
||||
@@ -187,7 +163,6 @@ void main() {
|
||||
// Assert
|
||||
expect(userProfile, isNull);
|
||||
verify(() => mockAuthRemote.getUserInfo(phoneNumber)).called(1);
|
||||
verify(() => mockAuthRemote.submitUserInfo(any())).called(1);
|
||||
verify(() => mockAuthRemote.login(authRequest: authRequest)).called(1);
|
||||
});
|
||||
});
|
||||
@@ -209,7 +184,7 @@ void main() {
|
||||
test('should track authentication state correctly', () async {
|
||||
// Arrange
|
||||
when(
|
||||
() => mockAuthRemote.hasAuthenticated(),
|
||||
() => mockAuthRemote.hasAuthenticated(),
|
||||
).thenAnswer((_) async => true);
|
||||
|
||||
// Act
|
||||
@@ -223,7 +198,7 @@ void main() {
|
||||
test('should handle authentication state changes', () async {
|
||||
// Arrange
|
||||
when(
|
||||
() => mockAuthRemote.hasAuthenticated(),
|
||||
() => mockAuthRemote.hasAuthenticated(),
|
||||
).thenAnswer((_) async => false);
|
||||
|
||||
// Act
|
||||
@@ -236,40 +211,23 @@ void main() {
|
||||
});
|
||||
|
||||
group('User Info Management', () {
|
||||
test('should handle user info submission without device name', () async {
|
||||
test('should get user info by phone', () async {
|
||||
// Arrange
|
||||
const phone = '09123456789';
|
||||
final expectedData = {'mobile': phone, 'device_name': null};
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.submitUserInfo(any()),
|
||||
).thenAnswer((_) async {});
|
||||
|
||||
// Act
|
||||
await authRepository.submitUserInfo(phone: phone);
|
||||
|
||||
// Assert
|
||||
verify(() => mockAuthRemote.submitUserInfo(expectedData)).called(1);
|
||||
});
|
||||
|
||||
test('should handle user info submission with device name', () async {
|
||||
// Arrange
|
||||
const phone = '09123456789';
|
||||
const deviceName = 'Test Device';
|
||||
final expectedData = {'mobile': phone, 'device_name': deviceName};
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.submitUserInfo(any()),
|
||||
).thenAnswer((_) async {});
|
||||
|
||||
// Act
|
||||
await authRepository.submitUserInfo(
|
||||
phone: phone,
|
||||
deviceName: deviceName,
|
||||
final expectedUserInfo = UserInfoModel(
|
||||
isUser: true,
|
||||
address: 'Test Address',
|
||||
backend: 'test-backend',
|
||||
apiKey: 'test-api-key',
|
||||
);
|
||||
|
||||
when(
|
||||
() => mockAuthRemote.getUserInfo(phone),
|
||||
).thenAnswer((_) async => expectedUserInfo);
|
||||
// Act
|
||||
final res = await authRepository.getUserInfo(phone);
|
||||
// Assert
|
||||
verify(() => mockAuthRemote.submitUserInfo(expectedData)).called(1);
|
||||
expect(res, expectedUserInfo);
|
||||
verify(() => mockAuthRemote.getUserInfo(phone)).called(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user