Skip to content

Commit

Permalink
Merge pull request #992 from Prime-Holding/tests/onboarding-goldens
Browse files Browse the repository at this point in the history
Tests/onboarding goldens
  • Loading branch information
JvnSlv authored Feb 4, 2025
2 parents 774a113 + ae67bd5 commit 68b564e
Show file tree
Hide file tree
Showing 42 changed files with 569 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{{> licence.dart }}

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

import '../services/authentication_service.dart';
import '../services/users_service.dart';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import 'onboarding_service.dart';
/// Fake deep link for successful email confirmation.
/// Used for demo purposes, should be removed in a real app
const mockEmailDeepLinkSuccess =
'testapp://testapp/change-email/email-confirmed/11111111';
'{{project_name}}://{{project_name}}/change-email/email-confirmed/11111111';
const mockEmailDeepLinkError =
'testapp://testapp/change-email/email-confirmed/00000000';
'{{project_name}}://{{project_name}}/change-email/email-confirmed/00000000';

class EmailChangeService extends OnboardingService {
EmailChangeService(
Expand Down
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,
);
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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:{{project_name}}/base/models/errors/error_model.dart';

import 'package:{{project_name}}/feature_onboarding_phone_confirmation/blocs/onboarding_phone_confirm_bloc.dart';
import 'package:{{project_name}}/feature_onboarding_phone_confirmation/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_confirmation/blocs/onboarding_phone_bloc.dart';
import 'package:{{project_name}}/feature_onboarding_phone_confirmation/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_confirmation/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 68b564e

Please sign in to comment.