Skip to content

Commit a3ab822

Browse files
Merge pull request #68 from hoangnguyen92dn/release/0.3.0
Release - 0.3.0
2 parents 78a0ebe + f05c03a commit a3ab822

File tree

77 files changed

+12259
-296
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+12259
-296
lines changed

assets/images/ic_arrow_left.svg

Lines changed: 5 additions & 0 deletions
Loading

assets/images/ic_arrow_right.svg

Lines changed: 5 additions & 0 deletions
Loading

assets/images/ic_close.svg

Lines changed: 21 additions & 0 deletions
Loading

integration_test/fake_data/fake_data.dart

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class FakeResponseModel extends Equatable {
2121

2222
const String keySignIn = 'signIn';
2323
const String keyUserProfile = 'userProfile';
24+
const String keySurveys = 'surveys';
25+
const String keySurveyDetails = 'surveyDetails';
2426

2527
class FakeData {
2628
FakeData._();
@@ -34,12 +36,22 @@ class FakeData {
3436
keySignIn: FakeResponseModel(
3537
200,
3638
await FileUtil.loadFile(
37-
'integration_test/fake_data/fake_sign_in_response.json'),
39+
'test_resource/fake_response/fake_sign_in_response.json'),
3840
),
3941
keyUserProfile: FakeResponseModel(
4042
200,
4143
await FileUtil.loadFile(
42-
'integration_test/fake_data/fake_user_profile_response.json'),
44+
'test_resource/fake_response/fake_user_profile_response.json'),
45+
),
46+
keySurveys: FakeResponseModel(
47+
200,
48+
await FileUtil.loadFile(
49+
'test_resource/fake_response/fake_surveys_response.json'),
50+
),
51+
keySurveyDetails: FakeResponseModel(
52+
200,
53+
await FileUtil.loadFile(
54+
'test_resource/fake_response/fake_survey_details_response.json'),
4355
),
4456
});
4557
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:retrofit/retrofit.dart';
3+
import 'package:survey_flutter_ic/api/response/survey_details_response.dart';
4+
import 'package:survey_flutter_ic/api/response/surveys_response.dart';
5+
import 'package:survey_flutter_ic/api/service/survey_service.dart';
6+
7+
import '../fake_data.dart';
8+
9+
class FakeSurveyService extends Fake implements SurveyService {
10+
@override
11+
Future<SurveysResponse> getSurveys(
12+
@Path('number') int number,
13+
@Path('size') int size,
14+
) async {
15+
final response = FakeData.apiAndResponse[keySurveys]!;
16+
if (response.statusCode != 200) {
17+
throw generateDioError(response.statusCode);
18+
}
19+
return SurveysResponse.fromJson(response.json);
20+
}
21+
22+
@override
23+
Future<SurveyDetailsResponse> getSurveyDetails(@Path('id') String id) async {
24+
final response = FakeData.apiAndResponse[keySurveyDetails]!;
25+
if (response.statusCode != 200) {
26+
throw generateDioError(response.statusCode);
27+
}
28+
return SurveyDetailsResponse.fromJson(response.json);
29+
}
30+
}

integration_test/fake_data/fake_services/fake_user_service.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import '../fake_data.dart';
77
class FakeUserService extends Fake implements UserService {
88
@override
99
Future<ProfileResponse> getProfile() async {
10-
await Future.delayed(const Duration(seconds: 5));
1110
final response = FakeData.apiAndResponse[keyUserProfile]!;
1211
if (response.statusCode != 200) {
1312
throw generateDioError(response.statusCode);
Lines changed: 64 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import 'package:flutter/material.dart';
12
import 'package:flutter_test/flutter_test.dart';
23
import 'package:integration_test/integration_test.dart';
3-
import 'package:survey_flutter_ic/ui/home/home_screen.dart';
4+
import 'package:survey_flutter_ic/navigation/app_router.dart';
45
import 'package:survey_flutter_ic/ui/home/home_widget_id.dart';
6+
import 'package:survey_flutter_ic/widget/pager_indicator.dart';
57

8+
import 'fake_data/fake_data.dart';
69
import 'utils/test_util.dart';
710

811
void main() {
@@ -12,24 +15,79 @@ void main() {
1215

1316
void homeScreenTest() {
1417
group('Home Page', () {
15-
late Finder profileAvatar;
18+
late Finder profileAvatarImage;
19+
late Finder headerTodayText;
20+
late Finder surveysPagerIndicator;
21+
late Finder surveyBackgroundContainer;
22+
late Finder surveyTitleText;
23+
late Finder surveyDescriptionText;
24+
late Finder surveyDetailsButton;
1625

1726
setUpAll(() async {
1827
await TestUtil.setupTestEnvironment();
1928
});
2029

2130
setUp(() {
22-
profileAvatar = find.byKey(HomeWidgetId.profileAvatarImage);
31+
profileAvatarImage = find.byKey(HomeWidgetId.profileAvatarImage);
32+
headerTodayText = find.byKey(HomeWidgetId.headerTodayText);
33+
surveysPagerIndicator = find.byKey(HomeWidgetId.surveysPagerIndicator);
34+
surveyBackgroundContainer =
35+
find.byKey(HomeWidgetId.surveyBackgroundContainer);
36+
surveyTitleText = find.byKey(HomeWidgetId.surveyTitleText);
37+
surveyDescriptionText = find.byKey(HomeWidgetId.surveyDescriptionText);
38+
surveyDetailsButton = find.byKey(HomeWidgetId.surveyDetailsButton);
2339
});
2440

2541
testWidgets(
2642
"When the home screen shown, it displays the Home screen correctly",
2743
(WidgetTester tester) async {
28-
await tester
29-
.pumpWidget(TestUtil.pumpWidgetWithShellApp(const HomeScreen()));
44+
await FakeData.initDefault();
45+
await tester.pumpWidget(
46+
TestUtil.pumpWidgetWithRoutePath(RoutePath.home.routePath));
3047
await tester.pumpAndSettle();
3148

32-
expect(profileAvatar, findsOneWidget);
49+
expect(profileAvatarImage, findsOneWidget);
50+
expect(headerTodayText, findsOneWidget);
51+
expect(surveysPagerIndicator, findsOneWidget);
52+
expect(surveyBackgroundContainer, findsOneWidget);
53+
expect(surveyTitleText, findsOneWidget);
54+
expect(surveyDescriptionText, findsOneWidget);
55+
expect(surveyDetailsButton, findsOneWidget);
56+
});
57+
58+
// TODO: Refactor this test to use the FakeData
59+
testWidgets("When the home screen shown, it binds the Survey correctly",
60+
(WidgetTester tester) async {
61+
await FakeData.initDefault();
62+
await tester.pumpWidget(
63+
TestUtil.pumpWidgetWithRoutePath(RoutePath.home.routePath));
64+
await tester.pumpAndSettle();
65+
66+
const surveyBackground = BoxDecoration(
67+
image: DecorationImage(
68+
image: NetworkImage('https://example.com/fake-image.pngl'),
69+
fit: BoxFit.cover,
70+
),
71+
);
72+
expect(
73+
tester.widget<Container>(surveyBackgroundContainer).decoration,
74+
surveyBackground,
75+
);
76+
77+
expect(
78+
tester.widget<Text>(surveyTitleText).data,
79+
'Fake Survey Title',
80+
);
81+
82+
expect(
83+
tester.widget<Text>(surveyDescriptionText).data,
84+
'Fake Survey Description',
85+
);
86+
87+
expect(
88+
tester.widget<PagerIndicator>(surveysPagerIndicator).pagerIndicatorSize,
89+
2,
90+
);
3391
});
3492
});
3593
}

integration_test/sign_in_screen_test.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'package:flutter_test/flutter_test.dart';
22
import 'package:integration_test/integration_test.dart';
3-
import 'package:survey_flutter_ic/navigation/route.dart';
3+
import 'package:survey_flutter_ic/navigation/app_router.dart';
44
import 'package:survey_flutter_ic/ui/signin/sign_in_widget_id.dart';
55

66
import 'fake_data/fake_data.dart';
@@ -30,8 +30,8 @@ void signInTest() {
3030
testWidgets(
3131
"When the sign in screen shown, it displays the Sign In screen correctly",
3232
(WidgetTester tester) async {
33-
await tester
34-
.pumpWidget(TestUtil.pumpWidgetWithRoutePath(routePathSignInScreen));
33+
await tester.pumpWidget(
34+
TestUtil.pumpWidgetWithRoutePath(RoutePath.signIn.routePath));
3535

3636
expect(emailField, findsOneWidget);
3737
expect(passwordField, findsOneWidget);
@@ -42,8 +42,8 @@ void signInTest() {
4242
"When sign in with valid email and password, it navigate to Home screen",
4343
(WidgetTester tester) async {
4444
await FakeData.initDefault();
45-
await tester
46-
.pumpWidget(TestUtil.pumpWidgetWithRoutePath(routePathSignInScreen));
45+
await tester.pumpWidget(
46+
TestUtil.pumpWidgetWithRoutePath(RoutePath.signIn.routePath));
4747
await tester.enterText(emailField, 'valid@example.com');
4848
await tester.enterText(passwordField, '1111111');
4949
await tester.tap(signInButton);
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import 'package:flutter/widgets.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:integration_test/integration_test.dart';
4+
import 'package:survey_flutter_ic/ui/details/survey_details_widget_id.dart';
5+
import 'package:survey_flutter_ic/ui/surveys/survey_ui_model.dart';
6+
import 'package:survey_flutter_ic/widget/flat_button_text.dart';
7+
8+
import 'fake_data/fake_data.dart';
9+
import 'utils/test_util.dart';
10+
11+
void main() {
12+
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
13+
surveyDetailsScreenTest();
14+
}
15+
16+
void surveyDetailsScreenTest() {
17+
group('Survey Details Page', () {
18+
const survey = SurveyUiModel(
19+
id: 'id',
20+
title: 'Fake Survey Title',
21+
description: 'Fake Survey Description',
22+
isActive: true,
23+
coverImageUrl: 'https://example.com/fake-image.png',
24+
largeCoverImageUrl: 'https://example.com/fake-image.pngl',
25+
createdAt: 'createdAt',
26+
surveyType: 'surveyType');
27+
28+
late Finder backButton;
29+
late Finder surveyBackgroundContainer;
30+
late Finder surveyTitleText;
31+
late Finder surveyDescriptionText;
32+
late Finder startSurveyButton;
33+
34+
setUpAll(() async {
35+
await TestUtil.setupTestEnvironment();
36+
});
37+
38+
setUp(() {
39+
backButton = find.byKey(SurveyDetailsWidgetId.backButton);
40+
surveyBackgroundContainer =
41+
find.byKey(SurveyDetailsWidgetId.surveyBackgroundContainer);
42+
surveyTitleText = find.byKey(SurveyDetailsWidgetId.surveyTitleText);
43+
surveyDescriptionText =
44+
find.byKey(SurveyDetailsWidgetId.surveyDescriptionText);
45+
startSurveyButton = find.byKey(SurveyDetailsWidgetId.startSurveyButton);
46+
});
47+
48+
testWidgets(
49+
"When the survey details screen shown, it displays the survey details screen correctly",
50+
(WidgetTester tester) async {
51+
await FakeData.initDefault();
52+
await tester.pumpWidget(
53+
TestUtil.pumpWidgetWithRoutePath('/home/details', extra: survey));
54+
await tester.pumpAndSettle();
55+
56+
expect(backButton, findsOneWidget);
57+
expect(surveyBackgroundContainer, findsOneWidget);
58+
expect(surveyTitleText, findsOneWidget);
59+
expect(surveyDescriptionText, findsOneWidget);
60+
expect(startSurveyButton, findsOneWidget);
61+
});
62+
63+
testWidgets(
64+
"When the survey details screen shown, it binds the Survey correctly",
65+
(WidgetTester tester) async {
66+
await FakeData.initDefault();
67+
await tester.pumpWidget(
68+
TestUtil.pumpWidgetWithRoutePath('/home/details', extra: survey));
69+
await tester.pumpAndSettle();
70+
71+
const surveyBackground = BoxDecoration(
72+
image: DecorationImage(
73+
image: NetworkImage('https://example.com/fake-image.pngl'),
74+
fit: BoxFit.cover,
75+
),
76+
);
77+
expect(
78+
tester.widget<Container>(surveyBackgroundContainer).decoration,
79+
surveyBackground,
80+
);
81+
82+
expect(
83+
tester.widget<Text>(surveyTitleText).data,
84+
'Fake Survey Title',
85+
);
86+
87+
expect(
88+
tester.widget<Text>(surveyDescriptionText).data,
89+
'Fake Survey Description',
90+
);
91+
92+
expect(
93+
tester.widget<FlatButtonText>(startSurveyButton).text,
94+
'Start survey',
95+
);
96+
});
97+
});
98+
}

0 commit comments

Comments
 (0)