Skip to content

Commit 8edd5b5

Browse files
Merge pull request #80 from hoangnguyen92dn/release/0.4.0
Release - 0.4.0
2 parents a3ab822 + d902641 commit 8edd5b5

File tree

73 files changed

+1997
-232
lines changed

Some content is hidden

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

73 files changed

+1997
-232
lines changed

assets/colors/colors.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@
22
<resource>
33
<color name="gray">#FF15151A</color>
44
<color name="black20">#33000000</color>
5+
<color name="eerie_black">#FF1E1E1E</color>
6+
<color name="blue">#FF007AFF</color>
57
</resource>

integration_test/fake_data/fake_data.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const String keySignIn = 'signIn';
2323
const String keyUserProfile = 'userProfile';
2424
const String keySurveys = 'surveys';
2525
const String keySurveyDetails = 'surveyDetails';
26+
const String keySubmitSurvey = 'submitSurvey';
2627

2728
class FakeData {
2829
FakeData._();
@@ -53,6 +54,11 @@ class FakeData {
5354
await FileUtil.loadFile(
5455
'test_resource/fake_response/fake_survey_details_response.json'),
5556
),
57+
keySubmitSurvey: FakeResponseModel(
58+
200,
59+
await FileUtil.loadFile(
60+
'test_resource/fake_response/fake_submit_survey_response.json'),
61+
),
5662
});
5763
}
5864

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:survey_flutter_ic/database/dto/survey_dto.dart';
3+
import 'package:survey_flutter_ic/database/persistence/survey_persistence.dart';
4+
5+
class FakeSurveyPersistence extends Fake implements SurveyPersistence {
6+
@override
7+
Future<List<SurveyDto>> getSurveys() async {
8+
return List.empty();
9+
}
10+
11+
@override
12+
Future<void> add(List<SurveyDto> surveys) async {
13+
return Future.value();
14+
}
15+
16+
@override
17+
Future<void> clear() async {
18+
return Future.value();
19+
}
20+
}

integration_test/fake_data/fake_services/fake_survey_service.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter_test/flutter_test.dart';
22
import 'package:retrofit/retrofit.dart';
3+
import 'package:survey_flutter_ic/api/request/submit_survey_request.dart';
34
import 'package:survey_flutter_ic/api/response/survey_details_response.dart';
45
import 'package:survey_flutter_ic/api/response/surveys_response.dart';
56
import 'package:survey_flutter_ic/api/service/survey_service.dart';
@@ -27,4 +28,15 @@ class FakeSurveyService extends Fake implements SurveyService {
2728
}
2829
return SurveyDetailsResponse.fromJson(response.json);
2930
}
31+
32+
@override
33+
Future<void> submitSurvey(
34+
@Body() SubmitSurveyRequest body,
35+
) async {
36+
final response = FakeData.apiAndResponse[keySubmitSurvey]!;
37+
if (response.statusCode != 200) {
38+
throw generateDioError(response.statusCode);
39+
}
40+
return Future.value();
41+
}
3042
}

integration_test/survey_questions_screen_test.dart

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ void surveyQuestionsScreenTest() {
1818
late Finder questionIndicator;
1919
late Finder questionText;
2020
late Finder nextQuestionButton;
21+
late Finder submitButton;
2122
late Finder answerDropdown;
2223
late Finder answerRating;
2324
late Finder answerEmoji;
2425
late Finder answerSmiley;
2526
late Finder answerNps;
2627
late Finder answerTextArea;
2728
late Finder answerForm;
29+
late Finder answerMultipleChoices;
30+
late Finder quitSurveyConfirmationDialog;
2831

2932
setUpAll(() async {
3033
await TestUtil.setupTestEnvironment();
@@ -38,13 +41,18 @@ void surveyQuestionsScreenTest() {
3841
questionText = find.byKey(SurveyQuestionsWidgetId.questionText);
3942
nextQuestionButton =
4043
find.byKey(SurveyQuestionsWidgetId.nextQuestionButton);
44+
submitButton = find.byKey(SurveyQuestionsWidgetId.submitButton);
4145
answerDropdown = find.byKey(SurveyQuestionsWidgetId.answersDropdown);
4246
answerRating = find.byKey(SurveyQuestionsWidgetId.answersRating);
4347
answerEmoji = find.byKey(SurveyQuestionsWidgetId.answersEmoji);
4448
answerSmiley = find.byKey(SurveyQuestionsWidgetId.answersSmiley);
4549
answerNps = find.byKey(SurveyQuestionsWidgetId.answersNps);
4650
answerTextArea = find.byKey(SurveyQuestionsWidgetId.answersTextArea);
4751
answerForm = find.byKey(SurveyQuestionsWidgetId.answersForm);
52+
answerMultipleChoices =
53+
find.byKey(SurveyQuestionsWidgetId.answersMultipleChoices);
54+
quitSurveyConfirmationDialog =
55+
find.byKey(SurveyQuestionsWidgetId.quitSurveyConfirmationDialog);
4856
});
4957

5058
Future nextQuestionTest(
@@ -86,6 +94,8 @@ void surveyQuestionsScreenTest() {
8694
expect(answerNps, findsNothing);
8795
expect(answerTextArea, findsNothing);
8896
expect(answerForm, findsNothing);
97+
expect(answerMultipleChoices, findsNothing);
98+
expect(quitSurveyConfirmationDialog, findsNothing);
8999
});
90100

91101
testWidgets(
@@ -133,69 +143,123 @@ void surveyQuestionsScreenTest() {
133143
await answerTest(answerNps, findsNothing);
134144
await answerTest(answerTextArea, findsNothing);
135145
await answerTest(answerForm, findsNothing);
146+
await answerTest(answerMultipleChoices, findsOneWidget);
147+
await answerTest(nextQuestionButton, findsOneWidget);
148+
await answerTest(submitButton, findsNothing);
136149

137150
await nextQuestionTest(tester, '3/12');
138151
await answerTest(answerDropdown, findsNothing);
139152
await answerTest(answerEmoji, findsNothing);
140153
await answerTest(answerNps, findsNothing);
141154
await answerTest(answerTextArea, findsNothing);
142155
await answerTest(answerForm, findsNothing);
156+
await answerTest(answerMultipleChoices, findsOneWidget);
157+
await answerTest(nextQuestionButton, findsOneWidget);
158+
await answerTest(submitButton, findsNothing);
143159

144160
await nextQuestionTest(tester, '4/12');
145161
await answerTest(answerDropdown, findsNothing);
146162
await answerTest(answerEmoji, findsNothing);
147163
await answerTest(answerNps, findsOneWidget);
148164
await answerTest(answerTextArea, findsNothing);
149165
await answerTest(answerForm, findsNothing);
166+
await answerTest(answerMultipleChoices, findsNothing);
167+
await answerTest(nextQuestionButton, findsOneWidget);
168+
await answerTest(submitButton, findsNothing);
150169

151170
await nextQuestionTest(tester, '5/12');
152171
await answerTest(answerDropdown, findsNothing);
153172
await answerTest(answerEmoji, findsOneWidget);
154173
await answerTest(answerNps, findsNothing);
155174
await answerTest(answerTextArea, findsNothing);
156175
await answerTest(answerForm, findsNothing);
176+
await answerTest(answerMultipleChoices, findsNothing);
177+
await answerTest(nextQuestionButton, findsOneWidget);
178+
await answerTest(submitButton, findsNothing);
157179

158180
await nextQuestionTest(tester, '6/12');
159181
await answerTest(answerDropdown, findsNothing);
160182
await answerTest(answerEmoji, findsOneWidget);
161183
await answerTest(answerNps, findsNothing);
162184
await answerTest(answerTextArea, findsNothing);
163185
await answerTest(answerForm, findsNothing);
186+
await answerTest(answerMultipleChoices, findsNothing);
187+
await answerTest(nextQuestionButton, findsOneWidget);
188+
await answerTest(submitButton, findsNothing);
164189

165190
await nextQuestionTest(tester, '7/12');
166191
await answerTest(answerDropdown, findsNothing);
167192
await answerTest(answerEmoji, findsOneWidget);
168193
await answerTest(answerNps, findsNothing);
169194
await answerTest(answerTextArea, findsNothing);
170195
await answerTest(answerForm, findsNothing);
196+
await answerTest(answerMultipleChoices, findsNothing);
197+
await answerTest(nextQuestionButton, findsOneWidget);
198+
await answerTest(submitButton, findsNothing);
171199

172200
await nextQuestionTest(tester, '8/12');
173201
await answerTest(answerDropdown, findsNothing);
174202
await answerTest(answerEmoji, findsOneWidget);
175203
await answerTest(answerNps, findsNothing);
176204
await answerTest(answerTextArea, findsNothing);
177205
await answerTest(answerForm, findsNothing);
206+
await answerTest(answerMultipleChoices, findsNothing);
207+
await answerTest(nextQuestionButton, findsOneWidget);
208+
await answerTest(submitButton, findsNothing);
178209

179210
await nextQuestionTest(tester, '9/12');
180211
await answerTest(answerDropdown, findsNothing);
181212
await answerTest(answerEmoji, findsNothing);
182213
await answerTest(answerNps, findsNothing);
183214
await answerTest(answerTextArea, findsOneWidget);
184215
await answerTest(answerForm, findsNothing);
216+
await answerTest(answerMultipleChoices, findsNothing);
217+
await answerTest(nextQuestionButton, findsOneWidget);
218+
await answerTest(submitButton, findsNothing);
185219

186220
await nextQuestionTest(tester, '10/12');
187221
await answerTest(answerDropdown, findsOneWidget);
188222
await answerTest(answerEmoji, findsNothing);
189223
await answerTest(answerNps, findsNothing);
190224
await answerTest(answerTextArea, findsNothing);
191225
await answerTest(answerForm, findsNothing);
226+
await answerTest(answerMultipleChoices, findsNothing);
227+
await answerTest(nextQuestionButton, findsOneWidget);
228+
await answerTest(submitButton, findsNothing);
192229

193230
await nextQuestionTest(tester, '11/12');
194231
await answerTest(answerDropdown, findsNothing);
195232
await answerTest(answerEmoji, findsNothing);
196233
await answerTest(answerNps, findsNothing);
197234
await answerTest(answerTextArea, findsNothing);
198235
await answerTest(answerForm, findsOneWidget);
236+
await answerTest(answerMultipleChoices, findsNothing);
237+
await answerTest(nextQuestionButton, findsOneWidget);
238+
await answerTest(submitButton, findsNothing);
239+
240+
await nextQuestionTest(tester, '12/12');
241+
await answerTest(answerDropdown, findsNothing);
242+
await answerTest(answerEmoji, findsNothing);
243+
await answerTest(answerNps, findsNothing);
244+
await answerTest(answerTextArea, findsNothing);
245+
await answerTest(answerForm, findsNothing);
246+
await answerTest(answerMultipleChoices, findsNothing);
247+
await answerTest(nextQuestionButton, findsNothing);
248+
await answerTest(submitButton, findsOneWidget);
249+
});
250+
251+
testWidgets(
252+
"When click on the close button, it displays the confirmation dialog correctly",
253+
(WidgetTester tester) async {
254+
await FakeData.initDefault();
255+
await tester
256+
.pumpWidget(TestUtil.pumpWidgetWithRoutePath('/home/questions/1'));
257+
await tester.pumpAndSettle();
258+
259+
await tester.tap(closeSurveyButton);
260+
await tester.pumpAndSettle();
261+
262+
expect(quitSurveyConfirmationDialog, findsOneWidget);
199263
});
200264
});
201265
}

integration_test/utils/test_util.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import 'package:package_info_plus/package_info_plus.dart';
66
import 'package:survey_flutter_ic/api/repository/auth_repository.dart';
77
import 'package:survey_flutter_ic/api/repository/survey_repository.dart';
88
import 'package:survey_flutter_ic/api/repository/user_repository.dart';
9+
import 'package:survey_flutter_ic/database/hive_persistence.dart';
910
import 'package:survey_flutter_ic/di/provider/di.dart';
1011
import 'package:survey_flutter_ic/main.dart';
1112
import 'package:survey_flutter_ic/navigation/app_router.dart';
1213

14+
import '../fake_data/fake_persistence/fake_survey_persistence.dart';
1315
import '../fake_data/fake_services/fake_auth_service.dart';
1416
import '../fake_data/fake_services/fake_survey_service.dart';
1517
import '../fake_data/fake_services/fake_user_service.dart';
@@ -64,7 +66,9 @@ class TestUtil {
6466

6567
static Future setupTestEnvironment() async {
6668
_initDependencies();
67-
configureInjection();
69+
await initHivePersistence();
70+
71+
await configureInjection();
6872
getIt.allowReassignment = true;
6973

7074
// FIXME: Can not mock the Service layer
@@ -76,7 +80,9 @@ class TestUtil {
7680
AuthRepositoryImpl(FakeAuthService()));
7781
getIt.registerSingleton<UserRepository>(
7882
UserRepositoryImpl(FakeUserService()));
79-
getIt.registerSingleton<SurveyRepository>(
80-
SurveyRepositoryImpl(FakeSurveyService()));
83+
getIt.registerSingleton<SurveyRepository>(SurveyRepositoryImpl(
84+
FakeSurveyService(),
85+
FakeSurveyPersistence(),
86+
));
8187
}
8288
}

lib/api/repository/auth_repository.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:injectable/injectable.dart';
2+
import 'package:survey_flutter_ic/api/request/sign_out_request.dart';
23

34
import '../../env.dart';
45
import '../../model/auth_model.dart';
@@ -19,6 +20,10 @@ abstract class AuthRepository {
1920
Future<AuthModel> refreshToken({
2021
required String refreshToken,
2122
});
23+
24+
Future<void> signOut({
25+
required String token,
26+
});
2227
}
2328

2429
@Singleton(as: AuthRepository)
@@ -64,4 +69,20 @@ class AuthRepositoryImpl extends AuthRepository {
6469
throw NetworkExceptions.fromDioException(exception);
6570
}
6671
}
72+
73+
@override
74+
Future<void> signOut({required String token}) async {
75+
try {
76+
final response = await _authService.signOut(
77+
SignOutRequest(
78+
token: token,
79+
clientId: Env.clientId,
80+
clientSecret: Env.clientSecret,
81+
),
82+
);
83+
return response;
84+
} catch (exception) {
85+
throw NetworkExceptions.fromDioException(exception);
86+
}
87+
}
6788
}

0 commit comments

Comments
 (0)