feat: Introduce comprehensive unit tests for models and BLoCs using mockito and bloc_test, and refine TripBloc error handling.
Some checks failed
Deploy to Play Store / build_and_deploy (push) Has been cancelled
Some checks failed
Deploy to Play Store / build_and_deploy (push) Has been cancelled
This commit is contained in:
108
test/blocs/group_bloc_test.dart
Normal file
108
test/blocs/group_bloc_test.dart
Normal file
@@ -0,0 +1,108 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:bloc_test/bloc_test.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:travel_mate/blocs/group/group_bloc.dart';
|
||||
import 'package:travel_mate/blocs/group/group_event.dart';
|
||||
import 'package:travel_mate/blocs/group/group_state.dart';
|
||||
import 'package:travel_mate/repositories/group_repository.dart';
|
||||
import 'package:travel_mate/models/group.dart';
|
||||
import 'package:travel_mate/models/group_member.dart';
|
||||
|
||||
import 'group_bloc_test.mocks.dart';
|
||||
|
||||
@GenerateMocks([GroupRepository])
|
||||
void main() {
|
||||
group('GroupBloc', () {
|
||||
late MockGroupRepository mockGroupRepository;
|
||||
late GroupBloc groupBloc;
|
||||
|
||||
final group = Group(
|
||||
id: 'group1',
|
||||
name: 'Test Group',
|
||||
tripId: 'trip1',
|
||||
createdBy: 'user1',
|
||||
);
|
||||
|
||||
setUp(() {
|
||||
mockGroupRepository = MockGroupRepository();
|
||||
groupBloc = GroupBloc(mockGroupRepository);
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
groupBloc.close();
|
||||
});
|
||||
|
||||
test('initial state is GroupInitial', () {
|
||||
expect(groupBloc.state, GroupInitial());
|
||||
});
|
||||
|
||||
// LoadGroupsByUserId - Stream test
|
||||
// Stream mocking is a bit verbose with Mockito. We simulate stream behavior.
|
||||
blocTest<GroupBloc, GroupState>(
|
||||
'emits [GroupLoading, GroupsLoaded] when LoadGroupsByUserId is added',
|
||||
setUp: () {
|
||||
when(
|
||||
mockGroupRepository.getGroupsByUserId('user1'),
|
||||
).thenAnswer((_) => Stream.value([group]));
|
||||
},
|
||||
build: () => groupBloc,
|
||||
act: (bloc) => bloc.add(LoadGroupsByUserId('user1')),
|
||||
expect: () => [
|
||||
GroupLoading(),
|
||||
GroupsLoaded([group]),
|
||||
],
|
||||
);
|
||||
|
||||
blocTest<GroupBloc, GroupState>(
|
||||
'emits [GroupLoading, GroupError] when LoadGroupsByUserId stream errors',
|
||||
setUp: () {
|
||||
when(
|
||||
mockGroupRepository.getGroupsByUserId('user1'),
|
||||
).thenAnswer((_) => Stream.error('Error loading groups'));
|
||||
},
|
||||
build: () => groupBloc,
|
||||
act: (bloc) => bloc.add(LoadGroupsByUserId('user1')),
|
||||
expect: () => [GroupLoading(), GroupError('Error loading groups')],
|
||||
);
|
||||
|
||||
// CreateGroup
|
||||
blocTest<GroupBloc, GroupState>(
|
||||
'emits [GroupLoading, GroupCreated, GroupOperationSuccess] when CreateGroup is added',
|
||||
setUp: () {
|
||||
when(
|
||||
mockGroupRepository.createGroupWithMembers(
|
||||
group: anyNamed('group'),
|
||||
members: anyNamed('members'),
|
||||
),
|
||||
).thenAnswer((_) async => 'group1');
|
||||
},
|
||||
build: () => groupBloc,
|
||||
act: (bloc) => bloc.add(CreateGroup(group)),
|
||||
expect: () => [
|
||||
GroupLoading(),
|
||||
GroupCreated(groupId: 'group1'),
|
||||
GroupOperationSuccess('Group created successfully'),
|
||||
],
|
||||
);
|
||||
|
||||
// AddMemberToGroup
|
||||
final member = GroupMember(
|
||||
userId: 'user2',
|
||||
firstName: 'Bob',
|
||||
role: 'member',
|
||||
joinedAt: DateTime.now(),
|
||||
);
|
||||
blocTest<GroupBloc, GroupState>(
|
||||
'emits [GroupOperationSuccess] when AddMemberToGroup is added',
|
||||
setUp: () {
|
||||
when(
|
||||
mockGroupRepository.addMember('group1', member),
|
||||
).thenAnswer((_) async {});
|
||||
},
|
||||
build: () => groupBloc,
|
||||
act: (bloc) => bloc.add(AddMemberToGroup('group1', member)),
|
||||
expect: () => [GroupOperationSuccess('Member added')],
|
||||
);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user