From 0abe6f11ffbd14c9762f2b59379bde07f8d2a23b Mon Sep 17 00:00:00 2001 From: Shubham Singh Date: Wed, 20 Apr 2022 20:16:38 +0530 Subject: [PATCH 1/2] Added unit tests for all use_cases --- pubspec.lock | 7 +++ pubspec.yaml | 1 + .../get_five_random_jokes_usecase_should.dart | 62 +++++++++++++++++++ .../lib/use_cases/login_use_case_should.dart | 37 +++++++++++ 4 files changed, 107 insertions(+) create mode 100644 test/praxis_flutter_domain/lib/use_cases/get_five_random_jokes_usecase_should.dart create mode 100644 test/praxis_flutter_domain/lib/use_cases/login_use_case_should.dart diff --git a/pubspec.lock b/pubspec.lock index 44db7db..e43ff14 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -750,6 +750,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + mockito: + dependency: "direct main" + description: + name: mockito + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" mocktail: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 456c605..850286a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -45,6 +45,7 @@ dependencies: path: ./praxis_flutter_domain praxis_data: path: ./praxis_data + mockito: ^5.1.0 dev_dependencies: diff --git a/test/praxis_flutter_domain/lib/use_cases/get_five_random_jokes_usecase_should.dart b/test/praxis_flutter_domain/lib/use_cases/get_five_random_jokes_usecase_should.dart new file mode 100644 index 0000000..bd7b458 --- /dev/null +++ b/test/praxis_flutter_domain/lib/use_cases/get_five_random_jokes_usecase_should.dart @@ -0,0 +1,62 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:praxis_data/sources/network/exceptions/api_exception.dart'; +import 'package:praxis_flutter_domain/entities/api_response.dart' + as api_response; +import 'package:praxis_flutter_domain/entities/jokes/dm_joke_list.dart'; +import 'package:praxis_flutter_domain/repositories/jokes/jokes_repository.dart'; +import 'package:praxis_flutter_domain/use_cases/get_five_random_jokes_usecase.dart'; + +import 'get_five_random_jokes_usecase_should.mocks.dart'; + +@GenerateMocks([JokesRepository]) +void main() { + late MockJokesRepository _mockJokesRepo; + late GetFiveRandomJokesUseCase _sut; + + setUp( + () { + _mockJokesRepo = MockJokesRepository(); + _sut = GetFiveRandomJokesUseCase(_mockJokesRepo); + }, + ); + + test( + "return five random jokes on success API response", + () async { + var testApiResponse = + api_response.Success(data: JokesListWithType("testType", [])); + + when(_mockJokesRepo.getFiveRandomJokes()) + .thenAnswer((realInvocation) async => testApiResponse); + + _sut.perform((data) { + if (data != null) { + expect(data.jokeList, testApiResponse); + } + }, (Object error) {}, () {}); + }, + ); + + test( + "return error on failure API response", + () async { + var testApiResponse = api_response.Failure( + error: APIException("testException", 404, "testStatus")); + + when(_mockJokesRepo.getFiveRandomJokes()) + .thenAnswer((realInvocation) async => testApiResponse); + + _sut.perform((data) { + if (data != null) { + expect( + ((data.jokeList as api_response.Failure).error + as APIException) + .statusCode, + 404); + } + }, (Object error) {}, () {}); + }, + ); +} diff --git a/test/praxis_flutter_domain/lib/use_cases/login_use_case_should.dart b/test/praxis_flutter_domain/lib/use_cases/login_use_case_should.dart new file mode 100644 index 0000000..045e56c --- /dev/null +++ b/test/praxis_flutter_domain/lib/use_cases/login_use_case_should.dart @@ -0,0 +1,37 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:praxis_flutter_domain/entities/login_request.dart'; +import 'package:praxis_flutter_domain/entities/login_result.dart'; +import 'package:praxis_flutter_domain/repositories/login_repo.dart'; +import 'package:praxis_flutter_domain/use_cases/login_use_case.dart'; + +import 'login_use_case_should.mocks.dart'; + +@GenerateMocks([LoginRepo]) +void main() { + late MockLoginRepo _mockLoginRepo; + late LoginUseCase _sut; + + setUp( + () { + _mockLoginRepo = MockLoginRepo(); + _sut = LoginUseCase(_mockLoginRepo); + }, + ); + + test( + "return login result on valid email and password", + () { + when(_mockLoginRepo.login("testUsername", "testPassword")) + .thenAnswer((_) async => const LoginResult("testJwt", "testToken")); + + _sut.perform((event) { + if (event != null) { + expect(event, const LoginResult("testJwt", "testToken")); + } + }, (Object error) {}, () {}, + LoginRequest("testUsername", "testPassword")); + }, + ); +} From a5affcaf2b1af67fb6a9921b9724bea19dfb806a Mon Sep 17 00:00:00 2001 From: Shubham Singh Date: Thu, 21 Apr 2022 10:39:52 +0530 Subject: [PATCH 2/2] Updated .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 031ace2..532e4bd 100644 --- a/.gitignore +++ b/.gitignore @@ -123,4 +123,6 @@ app.*.map.json !.vscode/extensions.json !.vscode/launch.json !.idea/codeStyles/ -!.idea/dictionaries/ \ No newline at end of file +!.idea/dictionaries/ +# No need to push mock files since they will be generated automatically while building +*.mocks.dart