Skip to content

Commit

Permalink
Add golden tests for onboarding
Browse files Browse the repository at this point in the history
  • Loading branch information
JvnSlv committed Feb 3, 2025
1 parent e0029cf commit fc3aea2
Show file tree
Hide file tree
Showing 15 changed files with 560 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{{> licence.dart }}

import 'package:flutter/material.dart';
import 'package:flutter_rx_bloc/flutter_rx_bloc.dart';
import 'package:provider/provider.dart';
import 'package:{{project_name}}/base/models/errors/error_model.dart';
import 'package:{{project_name}}/feature_onboarding_email_confirmation/blocs/onboarding_email_confirmation_bloc.dart';
import 'package:{{project_name}}/feature_onboarding_email_confirmation/views/onboarding_email_confirmation_page.dart';

import '../mock/onboarding_email_confirmation_mock.dart';

/// Change the parameters according the the needs of the test
Widget onboardingEmailConfirmationFactory({
bool? isLoading,
ErrorModel? errors,
String? email,
bool? isSendNewLinkActive,
}) =>
Scaffold(
body: MultiProvider(providers: [
RxBlocProvider<OnboardingEmailConfirmationBlocType>.value(
value: onboardingEmailConfirmationMockFactory(
isLoading: isLoading,
errors: errors,
email: email,
isSendNewLinkActive: isSendNewLinkActive,
),
),
], child: const OnboardingEmailConfirmationPage()),
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{{> licence.dart }}

import 'package:flutter/material.dart';
import 'package:flutter_rx_bloc/flutter_rx_bloc.dart';
import 'package:provider/provider.dart';
import 'package:{{project_name}}/base/models/errors/error_model.dart';
import 'package:{{project_name}}/base/models/user_model.dart';
import 'package:{{project_name}}/feature_onboarding_email_confirmation/blocs/onboarding_email_confirmed_bloc.dart';
import 'package:{{project_name}}/feature_onboarding_email_confirmation/views/onboarding_email_confirmed_page.dart';

import '../mock/onboarding_email_confirmed_mock.dart';

/// Change the parameters according the the needs of the test
Widget onboardingEmailConfirmedFactory({
bool? isLoading,
ErrorModel? errors,
UserModel? data,
}) =>
Scaffold(
body: MultiProvider(providers: [
RxBlocProvider<OnboardingEmailConfirmedBlocType>.value(
value: onboardingEmailConfirmedMockFactory(
isLoading: isLoading,
errors: errors,
data: data,
),
),
], child: const OnboardingEmailConfirmedPage()),
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{{> licence.dart }}

import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:rxdart/rxdart.dart';
import 'package:{{project_name}}/base/models/errors/error_model.dart';
import 'package:{{project_name}}/feature_onboarding_email_confirmation/blocs/onboarding_email_confirmation_bloc.dart';

import 'onboarding_email_confirmation_mock.mocks.dart';

@GenerateMocks([
OnboardingEmailConfirmationBlocStates,
OnboardingEmailConfirmationBlocEvents,
OnboardingEmailConfirmationBlocType
])
OnboardingEmailConfirmationBlocType onboardingEmailConfirmationMockFactory({
bool? isLoading,
ErrorModel? errors,
String? email,
bool? isSendNewLinkActive,
}) {
final blocMock = MockOnboardingEmailConfirmationBlocType();
final eventsMock = MockOnboardingEmailConfirmationBlocEvents();
final statesMock = MockOnboardingEmailConfirmationBlocStates();

when(blocMock.events).thenReturn(eventsMock);
when(blocMock.states).thenReturn(statesMock);

final isLoadingState = isLoading != null
? Stream.value(isLoading).shareReplay(maxSize: 1)
: const Stream<bool>.empty();

final errorsState = errors != null
? Stream.value(errors).shareReplay(maxSize: 1)
: const Stream<ErrorModel>.empty();

final openMailAppState = const Stream<void>.empty().publishReplay(maxSize: 1)
..connect();

final emailState = email != null
? Stream.value(email).shareReplay(maxSize: 1)
: const Stream<String>.empty();

final isSendNewLinkActiveState = isSendNewLinkActive != null
? Stream.value(isSendNewLinkActive).shareReplay(maxSize: 1)
: const Stream<bool>.empty();

when(statesMock.isLoading).thenAnswer((_) => isLoadingState);
when(statesMock.errors).thenAnswer((_) => errorsState);
when(statesMock.openMailApp).thenAnswer((_) => openMailAppState);
when(statesMock.email).thenAnswer((_) => emailState);
when(statesMock.isSendNewLinkActive)
.thenAnswer((_) => isSendNewLinkActiveState);

return blocMock;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
{{> licence.dart }}

import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:rxdart/rxdart.dart';
import 'package:{{project_name}}/base/models/errors/error_model.dart';
import 'package:{{project_name}}/base/models/user_model.dart';
import 'package:{{project_name}}/feature_onboarding_email_confirmation/blocs/onboarding_email_confirmed_bloc.dart';

import 'onboarding_email_confirmed_mock.mocks.dart';

@GenerateMocks([
OnboardingEmailConfirmedBlocStates,
OnboardingEmailConfirmedBlocEvents,
OnboardingEmailConfirmedBlocType
])
OnboardingEmailConfirmedBlocType onboardingEmailConfirmedMockFactory({
bool? isLoading,
ErrorModel? errors,
UserModel? data,
}) {
final blocMock = MockOnboardingEmailConfirmedBlocType();
final eventsMock = MockOnboardingEmailConfirmedBlocEvents();
final statesMock = MockOnboardingEmailConfirmedBlocStates();

when(blocMock.events).thenReturn(eventsMock);
when(blocMock.states).thenReturn(statesMock);

final isLoadingState = isLoading != null
? Stream.value(isLoading).shareReplay(maxSize: 1)
: const Stream<bool>.empty();

final errorsState = errors != null
? Stream.value(errors).shareReplay(maxSize: 1)
: const Stream<ErrorModel>.empty();

final dataState = (data != null
? Stream.value(data)
: const Stream<UserModel>.empty())
.publishReplay(maxSize: 1)
..connect();
final onRoutingState = const Stream<void>.empty().publishReplay(maxSize: 1)
..connect();

when(statesMock.isLoading).thenAnswer((_) => isLoadingState);
when(statesMock.errors).thenAnswer((_) => errorsState);
when(statesMock.data).thenAnswer((_) => dataState);
when(statesMock.onRouting).thenAnswer((_) => onRoutingState);

return blocMock;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{{> licence.dart }}

import 'package:{{project_name}}/base/models/confirmed_credentials_model.dart';
import 'package:{{project_name}}/base/models/user_model.dart';
import 'package:{{project_name}}/base/models/user_role.dart';

class Stubs {
static const email = 'email@example.com';
static const phone = '1234567890';
static const id = '1a2b3c';

static final confirmedCredentialsModel = ConfirmedCredentialsModel(
email: true,
phone: true,
);

static final user = UserModel(
id: id,
email: email,
phoneNumber: phone,
role: UserRole.user,
confirmedCredentials: confirmedCredentialsModel,
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{{> licence.dart }}

import 'package:{{project_name}}/base/models/errors/error_model.dart';

import '../../helpers/golden_helper.dart';
import '../factory/onboarding_email_confirmation_factory.dart';

void main() {
runGoldenTests([
buildScenario(
scenario: 'onboarding_email_confirmation_success',
widget: onboardingEmailConfirmationFactory(),
),
buildScenario(
scenario: 'onboarding_email_confirmation_loading',
customPumpBeforeTest: (tester) =>
tester.pump(const Duration(microseconds: 350)),
widget: onboardingEmailConfirmationFactory(
isLoading: true,
email: 'test@example.com',
),
),
buildScenario(
scenario: 'onboarding_email_confirmation_error',
widget: onboardingEmailConfirmationFactory(
errors: UnknownErrorModel(
exception: Exception('Something went wrong'),
),
),
),
]);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{{> licence.dart }}

import '../../helpers/golden_helper.dart';
import '../factory/onboarding_email_confirmed_factory.dart';
import '../stubs.dart';

void main() {
runGoldenTests([
buildScenario(
customPumpBeforeTest: (widgetTester) =>
widgetTester.pump(const Duration(milliseconds: 350)),
scenario: 'onboarding_email_confirmed_empty',
widget: onboardingEmailConfirmedFactory(),
),
buildScenario(
customPumpBeforeTest: (widgetTester) =>
widgetTester.pump(const Duration(milliseconds: 350)),
scenario: 'onboarding_email_confirmed_success',
widget: onboardingEmailConfirmedFactory(
data: Stubs.user,
),
),
buildScenario(
scenario: 'onboarding_email_confirmed_loading',
widget: onboardingEmailConfirmedFactory(
isLoading: true,
),
),
]);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{{> licence.dart }}

import 'package:flutter/material.dart';
import 'package:flutter_rx_bloc/flutter_rx_bloc.dart';
import 'package:provider/provider.dart';
import 'package:testapp/base/models/errors/error_model.dart';

import 'package:{{project_name}}/feature_onboarding_phone_confirm/blocs/onboarding_phone_confirm_bloc.dart';
import 'package:{{project_name}}/feature_onboarding_phone_confirm/views/onboarding_phone_confirm_page.dart';
import 'package:widget_toolkit_otp/widget_toolkit_otp.dart';

import '../mock/onboarding_phone_confirm_mock.dart';
import '../mock/onboarding_phone_sms_code_service_mock.dart';

/// Change the parameters according the the needs of the test
Widget onboardingPhoneConfirmFactory({
ErrorModel? errors,
}) =>
Scaffold(
body: MultiProvider(providers: [
Provider<SmsCodeService>.value(
value: createSmsCodeService(),
),
RxBlocProvider<OnboardingPhoneConfirmBlocType>.value(
value: onboardingPhoneConfirmMockFactory(
errors: errors,
),
),
], child: const OnboardingPhoneConfirmPage()),
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{{> licence.dart }}

import 'package:flutter/material.dart';
import 'package:flutter_rx_bloc/flutter_rx_bloc.dart';
import 'package:provider/provider.dart';
import 'package:{{project_name}}/base/models/country_code_model.dart';
import 'package:{{project_name}}/base/models/errors/error_model.dart';
import 'package:{{project_name}}/base/models/user_model.dart';
import 'package:{{project_name}}/feature_onboarding_phone_confirm/blocs/onboarding_phone_bloc.dart';
import 'package:{{project_name}}/feature_onboarding_phone_confirm/views/onboarding_phone_page.dart';

import '../mock/onboarding_phone_mock.dart';

/// Change the parameters according the the needs of the test
Widget onboardingPhoneFactory({
bool? isLoading,
UserModel? phoneSubmitted,
CountryCodeModel? countryCode,
String? phoneNumber,
ErrorModel? errors,
bool? showErrors,
}) =>
Scaffold(
body: MultiProvider(providers: [
RxBlocProvider<OnboardingPhoneBlocType>.value(
value: onboardingPhoneMockFactory(
isLoading: isLoading,
phoneSubmitted: phoneSubmitted,
countryCode: countryCode,
phoneNumber: phoneNumber,
errors: errors,
showErrors: showErrors,
),
),
], child: const OnboardingPhonePage()),
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{{> licence.dart }}

import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:rxdart/rxdart.dart';
import 'package:{{project_name}}/base/models/errors/error_model.dart';
import 'package:{{project_name}}/feature_onboarding_phone_confirm/blocs/onboarding_phone_confirm_bloc.dart';

import 'onboarding_phone_confirm_mock.mocks.dart';

@GenerateMocks([
OnboardingPhoneConfirmBlocStates,
OnboardingPhoneConfirmBlocEvents,
OnboardingPhoneConfirmBlocType
])
OnboardingPhoneConfirmBlocType onboardingPhoneConfirmMockFactory({
ErrorModel? errors,
}) {
final blocMock = MockOnboardingPhoneConfirmBlocType();
final eventsMock = MockOnboardingPhoneConfirmBlocEvents();
final statesMock = MockOnboardingPhoneConfirmBlocStates();

when(blocMock.events).thenReturn(eventsMock);
when(blocMock.states).thenReturn(statesMock);

final errorsState = errors != null
? Stream.value(errors).shareReplay(maxSize: 1)
: const Stream<ErrorModel>.empty();

final onRoutingState = const Stream<void>.empty().publishReplay(maxSize: 1)
..connect();

when(statesMock.errors).thenAnswer((_) => errorsState);
when(statesMock.onRouting).thenAnswer((_) => onRoutingState);

return blocMock;
}
Loading

0 comments on commit fc3aea2

Please sign in to comment.