Skip to content
This repository has been archived by the owner on May 31, 2021. It is now read-only.

Commit

Permalink
Added more UI tests
Browse files Browse the repository at this point in the history
See PR #124
  • Loading branch information
ryuash committed Aug 16, 2020
1 parent 9ebdd3e commit 2bc80f9
Show file tree
Hide file tree
Showing 39 changed files with 2,150 additions and 7 deletions.
Expand Up @@ -41,7 +41,7 @@ class AccountNameRow extends StatelessWidget {
SizedBox(width: 3),
// user.isVerified
// ? customIcon(context,
// icon: AppIcon.blueTick,
// icon: AppIcon.blueTick,
// istwitterIcon: true,
// iconColor: AppColor.primary,
// size: 13,
Expand Down
Expand Up @@ -19,20 +19,23 @@ class ReportPopupBloc extends Bloc<ReportPopupEvent, ReportPopupState> {
final Post _post;

final BlockUserUseCase _blockUserUseCase;

final ReportPostUseCase _reportPostUseCase;
ReportPopupBloc({
@required Post post,
@required BlockUserUseCase blockUserUseCase,
@required ReportPostUseCase reportPostUseCase,
}) : assert(post != null),
_post = post,
assert(blockUserUseCase != null),
_blockUserUseCase = blockUserUseCase;
_blockUserUseCase = blockUserUseCase,
assert(reportPostUseCase != null),
_reportPostUseCase = reportPostUseCase;

factory ReportPopupBloc.create(Post post) {
return ReportPopupBloc(
post: post,
blockUserUseCase: Injector.get(),
);
post: post,
blockUserUseCase: Injector.get(),
reportPostUseCase: Injector.get());
}

@override
Expand Down Expand Up @@ -93,6 +96,6 @@ Additional notes: ${currentState.otherText}
);

// Send the report email
await FlutterEmailSender.send(email);
await _reportPostUseCase.send(email);
}
}
1 change: 1 addition & 0 deletions lib/usecases/dependency_injection.dart
Expand Up @@ -92,6 +92,7 @@ class UseCaseModule implements Module {
userRepository: injector.get(),
postsRepository: injector.get(),
))
..bindFactory((injector, params) => ReportPostUseCase())

// Settings use cases
..bindFactory((injector, params) => SaveSettingUseCase(
Expand Down
1 change: 1 addition & 0 deletions lib/usecases/posts/export.dart
Expand Up @@ -11,3 +11,4 @@ export 'usecase_save_post.dart';
export 'usecase_sync.dart';
export 'usecase_update_posts_status.dart';
export 'usecase_vote_poll.dart';
export 'usecase_report_post.dart';
9 changes: 9 additions & 0 deletions lib/usecases/posts/usecase_report_post.dart
@@ -0,0 +1,9 @@
import 'package:flutter_email_sender/flutter_email_sender.dart';

/// Sends and email about a post reported
class ReportPostUseCase {
/// Syncs the locally stored data to the chain.
Future<void> send(Email email) async {
await FlutterEmailSender.send(email);
}
}
3 changes: 3 additions & 0 deletions test/ui/helper.dart
Expand Up @@ -26,6 +26,9 @@ class MockNotificationsBloc
extends MockBloc<NotificationsEvent, NotificationsState>
implements NotificationsBloc {}

class MockPostDetailsBloc extends MockBloc<PostDetailsEvent, PostDetailsState>
implements PostDetailsBloc {}

/// widget wrapper to make testable
Widget makeTestableWidget({Widget child, theme = 'light'}) {
return MediaQuery(
Expand Down
86 changes: 86 additions & 0 deletions test/ui/screens/post_details_screen/index_test.dart
@@ -0,0 +1,86 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mockito/mockito.dart';
import 'package:mooncake/ui/ui.dart';
import '../../helper.dart';
import 'package:mooncake/ui/screens/post_details_screen/widgets/export.dart';
import '../../../mocks/mocks.dart';
import 'package:mooncake/entities/entities.dart';

void main() {
MockPostDetailsBloc mockPostDetailsBloc = MockPostDetailsBloc();
MockAccountBloc mockAccountBloc = MockAccountBloc();
MockNavigatorBloc mockNavigatorBloc = MockNavigatorBloc();
MooncakeAccount userAccount = MooncakeAccount(
profilePicUri: "https://example.com/avatar.png",
moniker: "john-doe",
cosmosAccount: CosmosAccount(
accountNumber: 153,
address: "desmos1ew60ztvqxlf5kjjyyzxf7hummlwdadgesu3725",
coins: [
StdCoin(amount: "10000", denom: "udaric"),
],
sequence: 45,
),
);
testWidgets('PostDetailsScreen: Displays correctly',
(WidgetTester tester) async {
when(mockPostDetailsBloc.state).thenReturn(PostDetailsLoaded.first(
user: userAccount,
post: testPost,
comments: testPosts,
));

when(mockAccountBloc.state).thenReturn(LoggedIn.initial(userAccount));

await tester.pumpWidget(
makeTestableWidget(
child: MultiBlocProvider(
providers: [
BlocProvider<PostDetailsBloc>(
create: (_) => mockPostDetailsBloc,
),
BlocProvider<AccountBloc>(
create: (_) => mockAccountBloc,
),
BlocProvider<NavigatorBloc>(
create: (_) => mockNavigatorBloc,
),
],
child: PostDetailsScreen(),
),
),
);

await tester.pumpAndSettle();
expect(find.byType(PostDetailsMainContent), findsOneWidget);
});

testWidgets('PostDetailsScreen: Displays Loading correctly',
(WidgetTester tester) async {
when(mockPostDetailsBloc.state).thenReturn(LoadingPostDetails());

await tester.pumpWidget(
makeTestableWidget(
child: MultiBlocProvider(
providers: [
BlocProvider<PostDetailsBloc>(
create: (_) => mockPostDetailsBloc,
),
BlocProvider<AccountBloc>(
create: (_) => mockAccountBloc,
),
BlocProvider<NavigatorBloc>(
create: (_) => mockNavigatorBloc,
),
],
child: PostDetailsScreen(),
),
),
);

await tester.pump(const Duration(seconds: 5));
expect(find.byType(PostDetailsMainContent), findsNothing);
expect(find.byType(PostDetailsLoading), findsOneWidget);
});
}
@@ -0,0 +1,22 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:mooncake/ui/ui.dart';
import 'package:flutter/material.dart';
import '../../../../helper.dart';
import 'package:mooncake/ui/screens/post_details_screen/widgets/export.dart';

void main() {
testWidgets('PostDetailsLoading: Displays correctly',
(WidgetTester tester) async {
await tester.pumpWidget(
makeTestableWidget(
child: PostDetailsLoading(),
),
);

await tester.pump(const Duration(seconds: 3));

expect(find.byType(LoadingIndicator), findsOneWidget);
expect(find.byType(Column), findsOneWidget);
expect(find.text('loadingPost'), findsOneWidget);
});
}
@@ -0,0 +1,89 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mockito/mockito.dart';
import 'package:mooncake/ui/ui.dart';
import '../../../../helper.dart';
import 'package:mooncake/ui/screens/post_details_screen/widgets/export.dart';
import '../../../../../mocks/mocks.dart';
import 'package:mooncake/entities/entities.dart';
import 'package:mooncake/ui/widgets/post_content/widgets/export.dart';
import 'package:mooncake/ui/screens/post_details_screen/widgets/post_details_main_content/widgets/export.dart';
import 'package:mooncake/ui/screens/post_details_screen/widgets/post_details_main_content/widgets/post_comments_list/widgets/export.dart';
import 'package:mooncake/ui/screens/post_details_screen/widgets/post_details_main_content/widgets/post_details_reactions_list/widgets/export.dart';

void main() {
testWidgets('PostDetailsMainContent: Displays correctly',
(WidgetTester tester) async {
MockPostDetailsBloc mockPostDetailsBloc = MockPostDetailsBloc();
MockAccountBloc mockAccountBloc = MockAccountBloc();
MockNavigatorBloc mockNavigatorBloc = MockNavigatorBloc();
MooncakeAccount userAccount = MooncakeAccount(
profilePicUri: "https://example.com/avatar.png",
moniker: "john-doe",
cosmosAccount: CosmosAccount(
accountNumber: 153,
address: "desmos1ew60ztvqxlf5kjjyyzxf7hummlwdadgesu3725",
coins: [
StdCoin(amount: "10000", denom: "udaric"),
],
sequence: 45,
),
);

when(mockPostDetailsBloc.state).thenReturn(PostDetailsLoaded.first(
user: userAccount,
post: testPost,
comments: testPosts,
));

when(mockAccountBloc.state).thenReturn(LoggedIn.initial(userAccount));

await tester.pumpWidget(
makeTestableWidget(
child: MultiBlocProvider(
providers: [
BlocProvider<PostDetailsBloc>(
create: (_) => mockPostDetailsBloc,
),
BlocProvider<AccountBloc>(
create: (_) => mockAccountBloc,
),
BlocProvider<NavigatorBloc>(
create: (_) => mockNavigatorBloc,
),
],
child: PostDetailsMainContent(),
),
),
);

await tester.pumpAndSettle();
expect(find.byType(PostMessage), findsWidgets);
expect(find.byType(LinkPreview), findsNothing);
expect(find.byType(PostItemHeader), findsWidgets);
expect(find.byType(AccountAvatar), findsWidgets);
expect(find.text(testPosts[0].owner.screenName), findsWidgets);
expect(find.byType(InkWell), findsWidgets);
expect(find.byType(PostReactionItem), findsNothing);
expect(find.byType(PostDetailsReactionsList), findsNothing);
expect(
find.descendant(
of: find.byType(PostCommentsList),
matching: find.byType(PostCommentItem),
),
findsWidgets,
);

// expect(find.byIcon(MooncakeIcons.poll), findsOneWidget);

await tester.tap(find
.descendant(
of: find.byType(PostCommentsList),
matching: find.byType(PostCommentItem),
)
.first);
await tester.pumpAndSettle();
expect(verify(mockNavigatorBloc.add(any)).callCount, 1);
});
}
34 changes: 34 additions & 0 deletions test/ui/screens/recover_account_screen/index_test.dart
@@ -0,0 +1,34 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mockito/mockito.dart';
import 'package:mooncake/ui/ui.dart';
import '../../helper.dart';
import 'package:flutter/material.dart';

void main() {
MockRecoverAccountBloc mockRecoverAccountBloc = MockRecoverAccountBloc();
testWidgets('PostDetailsScreen: Displays correctly',
(WidgetTester tester) async {
when(mockRecoverAccountBloc.state)
.thenReturn(RecoverAccountState.initial());

await tester.pumpWidget(
makeTestableWidget(
child: MultiBlocProvider(
providers: [
BlocProvider<RecoverAccountBloc>(
create: (_) => mockRecoverAccountBloc,
),
],
child: RecoverAccountScreen(),
),
),
);

await tester.pumpAndSettle();
expect(find.byType(AppBar), findsOneWidget);
expect(find.byType(RecoverAccountMainContent), findsOneWidget);
expect(find.byType(RecoverAccountWordsList), findsOneWidget);
expect(find.text("recoverScreenTitle"), findsOneWidget);
});
}

0 comments on commit 2bc80f9

Please sign in to comment.