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

This commit is contained in:
Van Leemput Dayron
2025-12-05 11:55:20 +01:00
parent 9b11836409
commit cac0770467
17 changed files with 1608 additions and 48 deletions

View 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')],
);
});
}