diff --git a/.gitignore b/.gitignore index 899de41..0122a41 100644 --- a/.gitignore +++ b/.gitignore @@ -168,4 +168,5 @@ app.*.symbols *.freezed.dart *.g.dart */di.config.dart -*.mocks.dart \ No newline at end of file +*.mocks.dart +lib/core/di/di.config.dart diff --git a/test/search_data_source_test.dart b/test/layers/data/datasource/search_data_source_test.dart similarity index 100% rename from test/search_data_source_test.dart rename to test/layers/data/datasource/search_data_source_test.dart diff --git a/test/layers/domain/fakes/fake_book_domain.dart b/test/layers/domain/fakes/fake_book_domain.dart new file mode 100644 index 0000000..e7aa8a9 --- /dev/null +++ b/test/layers/domain/fakes/fake_book_domain.dart @@ -0,0 +1,10 @@ +import 'package:mibook/layers/domain/models/book_list_domain.dart'; + +final fakeBookDomain = BookDomain( + id: 'id', + title: 'title', + description: 'description', + thumbnail: 'thumbnail', + authors: [], + kind: 'kind', +); diff --git a/test/layers/domain/fakes/fake_book_list_domain.dart b/test/layers/domain/fakes/fake_book_list_domain.dart new file mode 100644 index 0000000..8c7a890 --- /dev/null +++ b/test/layers/domain/fakes/fake_book_list_domain.dart @@ -0,0 +1,9 @@ + +import 'package:mibook/layers/domain/models/book_list_domain.dart'; + +import 'fake_book_domain.dart'; + +final fakeBookListDomain = BookListDomain( + totalItems: 1, + books: [fakeBookDomain], +); diff --git a/test/layers/domain/get_book_details_test.dart b/test/layers/domain/get_book_details_test.dart new file mode 100644 index 0000000..ee5165e --- /dev/null +++ b/test/layers/domain/get_book_details_test.dart @@ -0,0 +1,52 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:mibook/layers/domain/repository/search_repository.dart'; +import 'package:mibook/layers/domain/usecases/get_book_details.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'fakes/fake_book_domain.dart'; + +@GenerateNiceMocks([MockSpec()]) +import 'get_book_details_test.mocks.dart'; + +void main() { + late MockISearchRepository mockSearchRepository; + late GetBookDetails getBookDetails; + + setUp(() { + mockSearchRepository = MockISearchRepository(); + getBookDetails = GetBookDetails( + mockSearchRepository, + ); + }); + + group('GetBookDetails', () { + test('call returns BookDetails on success', () async { + when( + mockSearchRepository.searchById( + id: 'id', + ), + ).thenAnswer((_) async => Future.value(fakeBookDomain)); + + final result = await getBookDetails.call(id: 'id'); + expect(result, fakeBookDomain); + }); + + test('call returns BookDetails on failure', () async { + when( + mockSearchRepository.searchById( + id: 'id', + ), + ).thenThrow(Exception('Something went wrong')); + + var error = false; + try { + await getBookDetails.call(id: 'id'); + error = false; + } catch (e) { + error = true; + } + + expect(error, isTrue); + }); + }); +} diff --git a/test/layers/domain/search_books_test.dart b/test/layers/domain/search_books_test.dart new file mode 100644 index 0000000..ab033ac --- /dev/null +++ b/test/layers/domain/search_books_test.dart @@ -0,0 +1,61 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:mibook/layers/domain/repository/search_repository.dart'; +import 'package:mibook/layers/domain/usecases/search_books.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'fakes/fake_book_list_domain.dart'; + +@GenerateNiceMocks([MockSpec()]) +import 'search_books_test.mocks.dart'; + +void main() { + late MockISearchRepository mockSearchRepository; + late SearchBooks searchBooks; + + setUp(() { + mockSearchRepository = MockISearchRepository(); + searchBooks = SearchBooks( + mockSearchRepository, + ); + }); + + group('SearchBooks', () { + test('call returns BookListDomain on success', () async { + when( + mockSearchRepository.searchByTitle( + initTitle: 'initTitle', + startIndex: 0, + ), + ).thenAnswer((_) async => Future.value(fakeBookListDomain)); + + final result = await searchBooks.call( + initTitle: 'initTitle', + startIndex: 0, + ); + expect(result, fakeBookListDomain); + }); + + test('call returns BookListDomain on failure', () async { + when( + mockSearchRepository.searchByTitle( + initTitle: 'initTitle', + startIndex: 0, + ), + ).thenThrow(Exception('Something went wrong')); + + var error = false; + try { + await searchBooks.call( + initTitle: 'initTitle', + startIndex: 0, + ); + error = false; + } catch (e) { + error = true; + } + + expect(error, isTrue); + }); + }); +}