149 lines
4.6 KiB
Dart
149 lines
4.6 KiB
Dart
import 'package:bloc_test/bloc_test.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:formz/formz.dart';
|
|
import 'package:mocktail/mocktail.dart';
|
|
import 'package:social_app/core/form_inputs/form_inputs.dart';
|
|
import 'package:social_app/features/auth/data/auth_repository.dart';
|
|
import 'package:social_app/features/auth/data/models/auth_response.dart';
|
|
import 'package:social_app/features/auth/data/models/signup_request.dart';
|
|
import 'package:social_app/features/auth/presentation/cubits/register_cubit.dart';
|
|
import 'package:social_app/core/api/api_exception.dart';
|
|
|
|
class MockAuthRepository extends Mock implements AuthRepository {}
|
|
|
|
void main() {
|
|
late RegisterCubit cubit;
|
|
late MockAuthRepository mockRepository;
|
|
|
|
setUp(() {
|
|
mockRepository = MockAuthRepository();
|
|
cubit = RegisterCubit(mockRepository);
|
|
registerFallbackValue(
|
|
SignupStartRequest(username: '', email: '', password: ''),
|
|
);
|
|
});
|
|
|
|
tearDown(() {
|
|
cubit.close();
|
|
});
|
|
|
|
group('RegisterCubit', () {
|
|
test('initial state has pure status', () {
|
|
expect(cubit.state.status, FormzSubmissionStatus.initial);
|
|
});
|
|
|
|
blocTest<RegisterCubit, RegisterState>(
|
|
'usernameChanged updates username',
|
|
build: () => cubit,
|
|
act: (c) => c.usernameChanged('testuser'),
|
|
expect: () => [isA<RegisterState>()],
|
|
);
|
|
|
|
blocTest<RegisterCubit, RegisterState>(
|
|
'emailChanged updates email',
|
|
build: () => cubit,
|
|
act: (c) => c.emailChanged('test@example.com'),
|
|
expect: () => [isA<RegisterState>()],
|
|
);
|
|
|
|
blocTest<RegisterCubit, RegisterState>(
|
|
'passwordChanged updates password',
|
|
build: () => cubit,
|
|
act: (c) => c.passwordChanged('password123'),
|
|
expect: () => [isA<RegisterState>()],
|
|
);
|
|
});
|
|
|
|
group('sendCodeSilently', () {
|
|
blocTest<RegisterCubit, RegisterState>(
|
|
'sets isSending to true then false on success',
|
|
build: () => cubit,
|
|
seed: () => RegisterState(
|
|
username: const Username.dirty('testuser'),
|
|
email: const Email.dirty('test@example.com'),
|
|
password: const Password.dirty('password123'),
|
|
),
|
|
setUp: () {
|
|
when(() => mockRepository.signupStart(any())).thenAnswer(
|
|
(_) async => SignupStartResponse(
|
|
status: 'ok',
|
|
email: 'test@example.com',
|
|
message: 'Code sent',
|
|
),
|
|
);
|
|
},
|
|
act: (c) => c.sendCodeSilently(),
|
|
expect: () => [
|
|
predicate<RegisterState>((state) => state.isSending == true),
|
|
predicate<RegisterState>(
|
|
(state) =>
|
|
state.isSending == false &&
|
|
state.codeSent == true &&
|
|
state.pendingEmail == 'test@example.com' &&
|
|
state.errorMessage == null,
|
|
),
|
|
],
|
|
verify: (_) {
|
|
verify(() => mockRepository.signupStart(any())).called(1);
|
|
},
|
|
);
|
|
|
|
blocTest<RegisterCubit, RegisterState>(
|
|
'restores isSending to false and sets errorMessage on error',
|
|
build: () => cubit,
|
|
seed: () => RegisterState(
|
|
username: const Username.dirty('testuser'),
|
|
email: const Email.dirty('test@example.com'),
|
|
password: const Password.dirty('password123'),
|
|
),
|
|
setUp: () {
|
|
when(
|
|
() => mockRepository.signupStart(any()),
|
|
).thenThrow(ServerException('Network error'));
|
|
},
|
|
act: (c) => c.sendCodeSilently(),
|
|
expect: () => [
|
|
predicate<RegisterState>((state) => state.isSending == true),
|
|
predicate<RegisterState>(
|
|
(state) =>
|
|
state.isSending == false && state.errorMessage == 'Network error',
|
|
),
|
|
],
|
|
verify: (_) {
|
|
verify(() => mockRepository.signupStart(any())).called(1);
|
|
},
|
|
);
|
|
|
|
blocTest<RegisterCubit, RegisterState>(
|
|
'does not call signupStart when input is invalid',
|
|
build: () => cubit,
|
|
seed: () => RegisterState(
|
|
username: const Username.dirty(''),
|
|
email: const Email.dirty('invalid'),
|
|
password: const Password.dirty(''),
|
|
),
|
|
act: (c) => c.sendCodeSilently(),
|
|
expect: () => [],
|
|
verify: (_) {
|
|
verifyNever(() => mockRepository.signupStart(any()));
|
|
},
|
|
);
|
|
|
|
blocTest<RegisterCubit, RegisterState>(
|
|
'returns early when isSending is true',
|
|
build: () => cubit,
|
|
seed: () => RegisterState(
|
|
username: const Username.dirty('testuser'),
|
|
email: const Email.dirty('test@example.com'),
|
|
password: const Password.dirty('password123'),
|
|
isSending: true,
|
|
),
|
|
act: (c) => c.sendCodeSilently(),
|
|
expect: () => [],
|
|
verify: (_) {
|
|
verifyNever(() => mockRepository.signupStart(any()));
|
|
},
|
|
);
|
|
});
|
|
}
|