test(auth): add tests for all features

This commit is contained in:
2022-11-11 16:54:08 -05:00
parent 03a51b97ad
commit 38480d84f4
10 changed files with 1463 additions and 321 deletions
@@ -0,0 +1,335 @@
// Copyright (C) 2022 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:wyatt_architecture/wyatt_architecture.dart';
import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart';
import 'package:wyatt_form_bloc/wyatt_form_bloc.dart';
import 'package:wyatt_type_utils/wyatt_type_utils.dart';
class MockAuthenticationRepository extends Mock
implements AuthenticationRepository<int> {}
class MockAuthenticationCubit extends Mock implements AuthenticationCubit<int> {
}
class MockAccount extends Mock implements Account {}
class MockFormRepository extends Mock implements FormRepository {}
void main() {
const String invalidEmailString = 'invalid';
const String validEmailString = 'test@gmail.com';
group('PasswordResetCubit', () {
final WyattForm form = WyattFormImpl(
[
FormInput(AuthFormField.email, const Email.pure()),
FormInput(AuthFormField.password, const Password.pure())
],
name: AuthFormName.passwordResetForm,
);
late MockFormRepository formRepository;
late AuthenticationRepository<int> authenticationRepository;
setUp(() {
authenticationRepository = MockAuthenticationRepository();
formRepository = MockFormRepository();
when(
() => authenticationRepository.sendPasswordResetEmail(
email: any(named: 'email'),
),
).thenAnswer((_) async => const Ok(null));
when(
() => authenticationRepository.formRepository,
).thenAnswer((_) => formRepository);
when(
() => formRepository.accessForm(AuthFormName.passwordResetForm),
).thenAnswer((_) => form);
});
test('initial state is pure', () {
expect(
PasswordResetCubit(
authenticationRepository: authenticationRepository,
).state,
PasswordResetState(form: form),
);
});
group('emailChanged', () {
blocTest<PasswordResetCubit<int>, PasswordResetState>(
'emits [invalid] when email is invalid',
build: () => PasswordResetCubit(
authenticationRepository: authenticationRepository,
),
act: (cubit) => cubit.emailChanged(invalidEmailString),
expect: () => <PasswordResetState>[
PasswordResetState(
form: WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(invalidEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
status: FormStatus.invalid,
),
],
);
blocTest<PasswordResetCubit<int>, PasswordResetState>(
'emits [valid] when email is valid',
setUp: () {
when(
() => formRepository.accessForm(AuthFormName.passwordResetForm),
).thenAnswer(
(_) => WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.pure(),
),
],
name: AuthFormName.passwordResetForm,
),
);
},
build: () => PasswordResetCubit(
authenticationRepository: authenticationRepository,
),
seed: () => PasswordResetState(
form: WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.pure(),
),
],
name: AuthFormName.passwordResetForm,
),
status: FormStatus.invalid,
),
act: (cubit) => cubit.emailChanged(validEmailString),
expect: () => <PasswordResetState>[
PasswordResetState(
form: WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
status: FormStatus.valid,
),
],
);
});
group('submit', () {
blocTest<PasswordResetCubit<int>, PasswordResetState>(
'does nothing when status is not validated',
build: () => PasswordResetCubit(
authenticationRepository: authenticationRepository,
),
act: (cubit) => cubit.submit(),
expect: () => const <PasswordResetState>[],
);
blocTest<PasswordResetCubit<int>, PasswordResetState>(
'calls sendPasswordResetEmail with correct email',
setUp: () {
when(
() => formRepository.accessForm(AuthFormName.passwordResetForm),
).thenAnswer(
(_) => WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
);
},
build: () => PasswordResetCubit(
authenticationRepository: authenticationRepository,
),
seed: () => PasswordResetState(
form: WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
status: FormStatus.valid,
),
act: (cubit) => cubit.submit(),
verify: (_) {
verify(
() => authenticationRepository.sendPasswordResetEmail(
email: validEmailString,
),
).called(1);
},
);
blocTest<PasswordResetCubit<int>, PasswordResetState>(
'emits [submissionInProgress, submissionSuccess] '
'when sendPasswordResetEmail succeeds',
setUp: () {
when(
() => formRepository.accessForm(AuthFormName.passwordResetForm),
).thenAnswer(
(_) => WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
);
},
build: () => PasswordResetCubit(
authenticationRepository: authenticationRepository,
),
seed: () => PasswordResetState(
form: WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
status: FormStatus.valid,
),
act: (cubit) => cubit.submit(),
expect: () => <PasswordResetState>[
PasswordResetState(
form: WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
status: FormStatus.submissionInProgress,
),
PasswordResetState(
form: WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
status: FormStatus.submissionSuccess,
)
],
);
blocTest<PasswordResetCubit<int>, PasswordResetState>(
'emits [submissionInProgress, submissionFailure] '
'when sendPasswordResetEmail fails',
setUp: () {
when(
() => authenticationRepository.sendPasswordResetEmail(
email: any(named: 'email'),
),
).thenAnswer((_) async => Err(ServerException()));
when(
() => formRepository.accessForm(AuthFormName.passwordResetForm),
).thenAnswer(
(_) => WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
);
},
build: () => PasswordResetCubit(
authenticationRepository: authenticationRepository,
),
seed: () => PasswordResetState(
form: WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
status: FormStatus.valid,
),
act: (cubit) => cubit.submit(),
expect: () => <PasswordResetState>[
PasswordResetState(
form: WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
status: FormStatus.submissionInProgress,
),
PasswordResetState(
form: WyattFormImpl(
[
FormInput(
AuthFormField.email,
const Email.dirty(validEmailString),
),
],
name: AuthFormName.passwordResetForm,
),
status: FormStatus.submissionFailure,
)
],
);
});
});
}
@@ -0,0 +1,56 @@
// Copyright (C) 2022 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter_test/flutter_test.dart';
import 'package:wyatt_authentication_bloc/wyatt_authentication_bloc.dart';
import 'package:wyatt_form_bloc/wyatt_form_bloc.dart';
void main() {
final WyattForm form = WyattFormImpl(
[
FormInput(AuthFormField.email, const Email.pure()),
],
name: AuthFormName.passwordResetForm,
);
group('PasswordResetState', () {
test('supports value comparisons', () {
expect(
PasswordResetState(
form: form,
),
PasswordResetState(form: form),
);
});
test('returns same object when no properties are passed', () {
expect(
PasswordResetState(form: form).copyWith(),
PasswordResetState(form: form),
);
});
test('returns object with updated status when status is passed', () {
expect(
PasswordResetState(form: form).copyWith(status: FormStatus.invalid),
PasswordResetState(
form: form,
status: FormStatus.invalid,
),
);
});
});
}