Skip to content

Instantly share code, notes, and snippets.

@mbaka-bilal
Last active December 16, 2023 13:11
Show Gist options
  • Save mbaka-bilal/169549d003532e7d98dc3c46ee502ad1 to your computer and use it in GitHub Desktop.
Save mbaka-bilal/169549d003532e7d98dc3c46ee502ad1 to your computer and use it in GitHub Desktop.
bloc test failing
///The error
Expected: [
AuthenticationState:AuthenticationState(RequestStatus.initial, RequestStatus.loading, RequestStatus.initial, null, null, null, null),
AuthenticationState:AuthenticationState(RequestStatus.initial, RequestStatus.failed, RequestStatus.initial, null, An unknown error has occurred, null, null)
]
Actual: [
AuthenticationState:AuthenticationState(RequestStatus.loading, RequestStatus.initial, RequestStatus.initial, null, null, null, null),
AuthenticationState:AuthenticationState(RequestStatus.failed, RequestStatus.initial, RequestStatus.initial, null, An unknown error has occurred, null, null)
]
Which: at location [0] is AuthenticationState:<AuthenticationState(RequestStatus.loading, RequestStatus.initial, RequestStatus.initial, null, null, null, null)> instead of AuthenticationState:<AuthenticationState(RequestStatus.initial, RequestStatus.loading, RequestStatus.initial, null, null, null, null)>
///The test
class MockAuthenticationRepository extends Mock
implements AuthenticationRepository {}
void main() {
late AuthenticationBloc authenticationBloc;
late MockAuthenticationRepository mockAuthenticationRepository;
setUp(() {
mockAuthenticationRepository = MockAuthenticationRepository();
authenticationBloc = AuthenticationBloc(
authenticationRepository: mockAuthenticationRepository);
});
tearDown(() => authenticationBloc.close());
group("login/signup with phone number", () {
blocTest("failed login/signup",
wait: const Duration(seconds: 1),
build: () => authenticationBloc,
act: (bloc) {
when(() => mockAuthenticationRepository
.signInWithPhoneNumber("123456789"))
.thenAnswer((invocation) async => const NetworkResponse(
status: RequestStatus.failed,
data: Constants.unknownErrorMessage));
bloc.add(const RequestOtp(phoneNumber: '123456789'));
},
expect: () => [
const AuthenticationState(
signInWithPhoneNumberStatus: RequestStatus.loading),
const AuthenticationState(
errorText: Constants.unknownErrorMessage,
signInWithPhoneNumberStatus: RequestStatus.failed)
]);
});
}
///The state class
class AuthenticationState extends Equatable {
final RequestStatus requestOtpStatus;
final RequestStatus signInWithPhoneNumberStatus;
final RequestStatus verifySignInWithPhoneNumberStatus;
final String? verificationId;
final String? errorText;
final int? resendToken;
final UserCredential? userCredential;
const AuthenticationState({
this.requestOtpStatus = RequestStatus.initial,
this.verifySignInWithPhoneNumberStatus = RequestStatus.initial,
this.signInWithPhoneNumberStatus = RequestStatus.initial,
this.verificationId,
this.errorText,
this.resendToken,
this.userCredential,
});
AuthenticationState copyWith({
RequestStatus? signInWithPhoneNumberStatus,
RequestStatus? verifySignInWithPhoneNumberStatus,
String? verificationId,
String? errorText,
int? resendToken,
UserCredential? userCredential,
}) {
return AuthenticationState(
requestOtpStatus:
signInWithPhoneNumberStatus ?? this.signInWithPhoneNumberStatus,
verifySignInWithPhoneNumberStatus: verifySignInWithPhoneNumberStatus ??
this.verifySignInWithPhoneNumberStatus,
verificationId: verificationId ?? this.verificationId,
errorText: errorText ?? this.errorText,
resendToken: resendToken ?? this.resendToken,
userCredential: userCredential ?? this.userCredential,
);
}
@override
List<Object?> get props => [
requestOtpStatus,
signInWithPhoneNumberStatus,
verifySignInWithPhoneNumberStatus,
verificationId,
errorText,
resendToken,
userCredential,
];
}
///The bloc
class AuthenticationBloc extends Bloc<OnboardingEvent, AuthenticationState> {
AuthenticationBloc({required this.authenticationRepository})
: super(const AuthenticationState()) {
on<RequestOtp>(_mapRequestOtpEventToState);
on<VerifyOtp>(_mapVerifyOtpEventToState);
on<ResendOtp>(_mapResendOtpEventToState);
}
final AuthenticationRepository authenticationRepository;
void _mapRequestOtpEventToState(
RequestOtp event, Emitter<AuthenticationState> emit) async {
emit(state.copyWith(signInWithPhoneNumberStatus: RequestStatus.loading));
final response =
await authenticationRepository.signInWithPhoneNumber(event.phoneNumber);
if (response.status != RequestStatus.success) {
final data = response.data;
emit(state.copyWith(
signInWithPhoneNumberStatus: response.status, errorText: data));
} else {
//success
final data = response.data as List<dynamic>;
emit(state.copyWith(
signInWithPhoneNumberStatus: response.status,
verificationId: data[0],
resendToken: data[1]));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment