Skip to content

Commit 1a6b360

Browse files
committed
[#31] Add unit test
1 parent 269871b commit 1a6b360

File tree

8 files changed

+146
-39
lines changed

8 files changed

+146
-39
lines changed

lib/di/interceptor/app_interceptor.dart

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,9 @@ class AppInterceptor extends Interceptor {
1717
Future onRequest(
1818
RequestOptions options, RequestInterceptorHandler handler) async {
1919
if (_requireAuthenticate) {
20-
final apiTokenModel =
21-
await _secureStorage?.getValue(key: SecureStorageKey.apiToken);
22-
if (apiTokenModel is ApiToken) {
23-
final accessToken = apiTokenModel.accessToken;
24-
final tokenType = apiTokenModel.tokenType;
25-
26-
27-
if (accessToken.isNotEmpty && tokenType.isNotEmpty) {
28-
final authorizationHeader = '$tokenType $accessToken';
29-
options.headers
30-
.putIfAbsent(_headerAuthorization, () => authorizationHeader);
31-
}
32-
}
20+
// TODO header authorization here
21+
// options.headers
22+
// .putIfAbsent(HEADER_AUTHORIZATION, () => "");
3323
}
3424
return super.onRequest(options, handler);
3525
}

lib/model/survey_model.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,12 @@ class SurveyModel extends Equatable {
3838
description: description,
3939
coverImageUrl: coverImageUrl,
4040
);
41+
42+
const SurveyModel.dummy()
43+
: this(
44+
id: "id",
45+
title: "title",
46+
description: "description",
47+
coverImageUrl: "coverImageUrl",
48+
);
4149
}

lib/screens/home/home_screen.dart

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import 'dart:ffi';
2-
31
import 'package:flutter/material.dart';
42
import 'package:flutter_riverpod/flutter_riverpod.dart';
53
import 'package:survey_flutter/model/survey_model.dart';
@@ -56,20 +54,20 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
5654
final errorMessage = ref.watch(_errorStreamProvider).value ?? "";
5755

5856
if (errorMessage.isNotEmpty) {
59-
showAlertDialog(
60-
context: context,
61-
title: context.localizations.errorText,
62-
message: errorMessage,
63-
actions: [
64-
TextButton(
65-
style: ButtonStyle(
66-
foregroundColor: MaterialStateProperty.all(Colors.black),
67-
),
68-
child: Text(context.localizations.okText),
69-
onPressed: () => Navigator.pop(context),
70-
)
71-
],
72-
);
57+
showAlertDialog(
58+
context: context,
59+
title: context.localizations.errorText,
60+
message: errorMessage,
61+
actions: [
62+
TextButton(
63+
style: ButtonStyle(
64+
foregroundColor: MaterialStateProperty.all(Colors.black),
65+
),
66+
child: Text(context.localizations.okText),
67+
onPressed: () => Navigator.pop(context),
68+
)
69+
],
70+
);
7371
}
7472
return Scaffold(
7573
body: Stack(

lib/screens/home/home_view_model.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class HomeViewModel extends StateNotifier<HomeState> {
5353
}
5454
}
5555

56-
void loadCachedSurveys() async {
56+
void loadCachedSurveys() async {
5757
final result = await _getCachedSurveysUseCase.call();
5858
if (result is Success<List<SurveyModel>>) {
5959
final cachedSurveys =

test/api/repositories/survey_repository_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ void main() {
3131

3232
final result =
3333
await surveyRepository.getSurveys(pageSize: 0, pageNumber: 0);
34-
expect(result, surveysResponse.toSurveysContainerModel());
34+
expect(result, surveysResponse.toSurveysContainerModel().surveys);
3535
});
3636

3737
test('when getting surveys fails throws NetworkExceptions', () async {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:mockito/mockito.dart';
3+
import 'package:survey_flutter/model/survey_model.dart';
4+
import 'package:survey_flutter/usecases/base/base_use_case.dart';
5+
import 'package:survey_flutter/usecases/get_cached_surveys_use_case.dart';
6+
7+
import '../../mocks/generate_mocks.mocks.dart';
8+
9+
void main() {
10+
group('GetCachedSurveysUseCaseTest', () {
11+
late MockSurveyStorage mockSurveyStorage;
12+
late GetCachedSurveysUseCase getCachedSurveysUseCase;
13+
14+
setUp(() async {
15+
mockSurveyStorage = MockSurveyStorage();
16+
getCachedSurveysUseCase = GetCachedSurveysUseCase(mockSurveyStorage);
17+
});
18+
19+
test(
20+
'When fetching cached surveys returns cached surveys',
21+
() async {
22+
final surveys = <SurveyModel>[];
23+
final successResult = Success<List<SurveyModel>>(surveys);
24+
when(mockSurveyStorage.getSurveys())
25+
.thenAnswer((_) async => successResult.value);
26+
final result = await getCachedSurveysUseCase.call();
27+
expect(result, isA<Success<List<SurveyModel>>>());
28+
expect((result as Success<List<SurveyModel>>).value, surveys);
29+
},
30+
);
31+
});
32+
}

test/api/usecases/get_surveys_user_case_test.dart

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:flutter_test/flutter_test.dart';
22
import 'package:mockito/mockito.dart';
3+
import 'package:survey_flutter/model/survey_model.dart';
34
import 'package:survey_flutter/model/surveys_container_model.dart';
45
import 'package:survey_flutter/usecases/base/base_use_case.dart';
56
import 'package:survey_flutter/usecases/get_surveys_use_case.dart';
@@ -17,24 +18,20 @@ void main() {
1718
});
1819

1920
test('When getting surveys is successful returns Success ', () async {
20-
final surveysContainerModel = SurveysContainerModel.dummy();
21+
final surveysModel = SurveysContainerModel.dummy().surveys;
2122
final surveysParams = SurveysParams(pageNumber: 0, pageSize: 10);
2223
when(mockRepository.getSurveys(pageNumber: 0, pageSize: 10))
23-
.thenAnswer((_) async => surveysContainerModel);
24-
24+
.thenAnswer((_) async => surveysModel);
2525
final result = await getSurveysUseCase(surveysParams);
26-
27-
expect(result, isA<Success<SurveysContainerModel>>());
26+
expect(result, isA<Success<List<SurveyModel>>>());
2827
});
2928

3029
test('returns Failed when getting surveys fails', () async {
3130
final surveysParams = SurveysParams(pageNumber: 0, pageSize: 10);
32-
3331
when(mockRepository.getSurveys(pageNumber: 0, pageSize: 10))
3432
.thenThrow(Exception());
3533
final result = await getSurveysUseCase(surveysParams);
36-
37-
expect(result, isA<Failed<SurveysContainerModel>>());
34+
expect(result, isA<Failed<List<SurveyModel>>>());
3835
});
3936
});
4037
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import 'package:flutter_riverpod/flutter_riverpod.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:mockito/mockito.dart';
4+
import 'package:survey_flutter/api/exception/network_exceptions.dart';
5+
import 'package:survey_flutter/model/survey_model.dart';
6+
import 'package:survey_flutter/screens/home/home_state.dart';
7+
import 'package:survey_flutter/screens/home/home_view_model.dart';
8+
import 'package:survey_flutter/usecases/base/base_use_case.dart';
9+
import 'package:survey_flutter/usecases/get_cached_surveys_use_case.dart';
10+
import 'package:survey_flutter/usecases/get_surveys_use_case.dart';
11+
12+
import '../../mocks/generate_mocks.mocks.dart'; // Import your generated mocks
13+
14+
void main() {
15+
group('HomeViewModel', () {
16+
late MockGetCachedSurveysUseCase mockGetCachedSurveysUseCase;
17+
late MockGetSurveysUseCase mockGetSurveysUseCase;
18+
late HomeViewModel homeViewModel;
19+
late ProviderContainer providerContainer;
20+
21+
final List<SurveyModel> surveys = <SurveyModel>[
22+
const SurveyModel.dummy(),
23+
const SurveyModel.dummy(),
24+
];
25+
26+
final UseCaseException exception =
27+
UseCaseException(const NetworkExceptions.unauthorisedRequest());
28+
29+
setUp(() {
30+
mockGetCachedSurveysUseCase = MockGetCachedSurveysUseCase();
31+
mockGetSurveysUseCase = MockGetSurveysUseCase();
32+
33+
providerContainer = ProviderContainer(
34+
overrides: [
35+
getCachedSurveysUseCaseProvider
36+
.overrideWithValue(mockGetCachedSurveysUseCase),
37+
getSurveysUseCaseProvider.overrideWithValue(mockGetSurveysUseCase),
38+
],
39+
);
40+
homeViewModel = providerContainer.read(homeViewModelProvider.notifier);
41+
});
42+
43+
test('loads surveys successfully and emits LoadSurveysSuccess state', () async {
44+
when(mockGetSurveysUseCase.call(any)).thenAnswer(
45+
(_) async => Success(surveys),
46+
);
47+
final surveysStream = homeViewModel.surveys;
48+
homeViewModel.loadSurveys();
49+
expect(surveysStream, emitsInOrder([surveys]));
50+
},
51+
);
52+
53+
test('loads cached surveys successfully and emits LoadCachedSurveysSuccess state', () async {
54+
when(mockGetCachedSurveysUseCase.call())
55+
.thenAnswer((_) => Future.value(Success(surveys)));
56+
final surveysStream = homeViewModel.surveys;
57+
final stateStream = homeViewModel.stream;
58+
homeViewModel.loadCachedSurveys();
59+
expect(surveysStream, emitsInOrder([surveys]));
60+
expect(stateStream,
61+
emitsInOrder([const HomeState.loadCachedSurveysSuccess()]));
62+
},
63+
);
64+
65+
test('loads surveys with error and emits error state', () async {
66+
when(mockGetSurveysUseCase.call(any)).thenAnswer(
67+
(_) async => Failed(exception),
68+
);
69+
final errorStream = homeViewModel.error;
70+
homeViewModel.loadSurveys();
71+
expect(
72+
errorStream,
73+
emitsInOrder(
74+
[NetworkExceptions.getErrorMessage(exception.actualException)],
75+
),
76+
);
77+
},
78+
);
79+
80+
tearDown(() { providerContainer.dispose(); });
81+
});
82+
}

0 commit comments

Comments
 (0)