diff --git a/lib/domain/repositories/app_data_repository.dart b/lib/domain/repositories/app_data_repository.dart index ba2d7cec..2d0fc541 100644 --- a/lib/domain/repositories/app_data_repository.dart +++ b/lib/domain/repositories/app_data_repository.dart @@ -4,13 +4,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import '../../../infrastructure/hive/app_data_repository.dart'; import '../entities/repo_search_repos_order.dart'; import '../entities/repo_search_repos_sort.dart'; /// アプリデータRepositoryプロバイダー final appDataRepositoryProvider = Provider( - (ref) => ref.watch(hiveAppDataRepositoryProvider), + (ref) => throw UnimplementedError(), ); /// アプリデータRepository @@ -21,16 +20,16 @@ abstract class AppDataRepository { AppDataKey.repoSearchReposOrder: RepoSearchReposOrder.desc, }; - /// リポジトリ検索用ソートを設定する + /// リポジトリ検索用ソート値を設定する void setSearchReposSort(RepoSearchReposSort sort); - /// リポジトリ検索用ソートを返す + /// リポジトリ検索用ソート値を返す RepoSearchReposSort getSearchReposSort(); - /// リポジトリ検索用オーダーを設定する + /// リポジトリ検索用オーダー値を設定する void setSearchReposOrder(RepoSearchReposOrder order); - /// リポジトリ検索用オーダーを設定する + /// リポジトリ検索用オーダー値を返す RepoSearchReposOrder getSearchReposOrder(); } diff --git a/lib/domain/repositories/repo_repository.dart b/lib/domain/repositories/repo_repository.dart index 23098fc6..3b32a98f 100644 --- a/lib/domain/repositories/repo_repository.dart +++ b/lib/domain/repositories/repo_repository.dart @@ -4,14 +4,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import '../../infrastructure/github/repo_repository.dart'; import '../entities/repo.dart'; import '../entities/repo_search_repos_order.dart'; import '../entities/repo_search_repos_sort.dart'; import '../entities/search_repos_result.dart'; final repoRepositoryProvider = Provider( - (ref) => ref.watch(githubRepoRepositoryProvider), + (ref) => throw UnimplementedError(), ); /// リポジトリRepository diff --git a/lib/infrastructure/github/api.dart b/lib/infrastructure/github/api.dart index 62f06bfe..bac2aa5b 100644 --- a/lib/infrastructure/github/api.dart +++ b/lib/infrastructure/github/api.dart @@ -5,6 +5,9 @@ import '../../domain/entities/repo_search_repos_order.dart'; import '../../domain/entities/repo_search_repos_sort.dart'; +/// GitHub の URL +const githubSiteUrl = 'https://github.com'; + /// GitHub API の定義 /// 各APIはUriを返す class GitHubApi { diff --git a/lib/infrastructure/github/repo_repository.dart b/lib/infrastructure/github/repo_repository.dart index e9bcc060..6be6d0fb 100644 --- a/lib/infrastructure/github/repo_repository.dart +++ b/lib/infrastructure/github/repo_repository.dart @@ -15,11 +15,8 @@ import 'http_client.dart'; import 'json_object/repo/repo.dart'; import 'json_object/search_repos_result/search_repos_result.dart'; -/// GitHub の URL -const githubSiteUrl = 'https://github.com'; - /// GitHubAPI版リポジトリRepositoryプロバイダー -final githubRepoRepositoryProvider = Provider( +final githubRepoRepositoryProvider = Provider( (ref) { final githubHttpClient = ref.watch(githubHttpClientProvider); return GitHubRepoRepository( diff --git a/lib/infrastructure/hive/app_data_repository.dart b/lib/infrastructure/hive/app_data_repository.dart index 0c89587a..c1a73797 100644 --- a/lib/infrastructure/hive/app_data_repository.dart +++ b/lib/infrastructure/hive/app_data_repository.dart @@ -9,8 +9,11 @@ import '../../domain/entities/repo_search_repos_order.dart'; import '../../domain/entities/repo_search_repos_sort.dart'; import '../../domain/repositories/app_data_repository.dart'; +/// Hive の Box 名 +const hiveBoxNameAppData = 'appData'; + /// Hive版アプリデータRepositoryプロバイダー -final hiveAppDataRepositoryProvider = Provider( +final hiveAppDataRepositoryProvider = Provider( (ref) { final box = Hive.box(hiveBoxNameAppData); return HiveAppDataRepository( @@ -69,6 +72,3 @@ class HiveAppDataRepository implements AppDataRepository { return RepoSearchReposOrder.valueOf(name); } } - -/// Hive の Box 名 -const hiveBoxNameAppData = 'appData'; diff --git a/lib/main.dart b/lib/main.dart index f97ea9d5..73855202 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,6 +7,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'config/app.dart'; +import 'domain/repositories/app_data_repository.dart'; +import 'domain/repositories/repo_repository.dart'; +import 'infrastructure/github/repo_repository.dart'; import 'infrastructure/hive/app_data_repository.dart'; import 'localizations/strings.g.dart'; @@ -21,8 +24,14 @@ Future main() async { await Hive.openBox(hiveBoxNameAppData); runApp( - const ProviderScope( - child: GitHubSearchApp(), + ProviderScope( + overrides: [ + appDataRepositoryProvider + .overrideWithProvider(hiveAppDataRepositoryProvider), + repoRepositoryProvider + .overrideWithProvider(githubRepoRepositoryProvider), + ], + child: const GitHubSearchApp(), ), ); } diff --git a/test/domain/repositories/app_data_repository_test.dart b/test/domain/repositories/app_data_repository_test.dart index 6bca64a3..391c96fa 100644 --- a/test/domain/repositories/app_data_repository_test.dart +++ b/test/domain/repositories/app_data_repository_test.dart @@ -26,6 +26,15 @@ void main() { }); group('appDataRepositoryProvider', () { + test('DIする前はUnimplementedErrorがthrowされるはず', () async { + Object? exception; + try { + ProviderContainer().read(appDataRepositoryProvider); + } on ProviderException catch (e) { + exception = e.exception; + } + expect(exception is UnimplementedError, true); + }); test('appDataRepositoryProviderからHiveAppDataRepositoryが取得できるはず', () async { final appDataRepository = container.read(appDataRepositoryProvider); expect(appDataRepository.runtimeType.toString(), 'HiveAppDataRepository'); diff --git a/test/domain/repositories/repo_repository_test.dart b/test/domain/repositories/repo_repository_test.dart index 0ecfa40f..66b3ab00 100644 --- a/test/domain/repositories/repo_repository_test.dart +++ b/test/domain/repositories/repo_repository_test.dart @@ -19,6 +19,15 @@ void main() { }); group('repoRepositoryProvider', () { + test('DIする前はUnimplementedErrorがthrowされるはず', () async { + Object? exception; + try { + ProviderContainer().read(repoRepositoryProvider); + } on ProviderException catch (e) { + exception = e.exception; + } + expect(exception is UnimplementedError, true); + }); test('repoRepositoryProviderからGitHubRepoRepositoryが取得できるはず', () async { final repoRepository = container.read(repoRepositoryProvider); expect(repoRepository.runtimeType.toString(), 'GitHubRepoRepository'); diff --git a/test/infrastructure/github/repo_repository_test.dart b/test/infrastructure/github/repo_repository_test.dart index 94aff6d6..19e7ebf2 100644 --- a/test/infrastructure/github/repo_repository_test.dart +++ b/test/infrastructure/github/repo_repository_test.dart @@ -5,6 +5,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:github_search/domain/entities/repo_search_repos_order.dart'; import 'package:github_search/domain/entities/repo_search_repos_sort.dart'; +import 'package:github_search/domain/repositories/repo_repository.dart'; import 'package:github_search/infrastructure/github/exception.dart'; import 'package:github_search/infrastructure/github/json_object/repo/repo.dart'; import 'package:github_search/infrastructure/github/repo_repository.dart'; @@ -20,7 +21,7 @@ void main() { ), ); - late GitHubRepoRepository repository; + late RepoRepository repository; setUp(() { repository = mockProviderContainer().read(githubRepoRepositoryProvider); useEnvironmentLocale(); diff --git a/test/infrastructure/hive/app_data_repository_test.dart b/test/infrastructure/hive/app_data_repository_test.dart index 05b4e43e..f659f130 100644 --- a/test/infrastructure/hive/app_data_repository_test.dart +++ b/test/infrastructure/hive/app_data_repository_test.dart @@ -7,6 +7,7 @@ import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:github_search/domain/entities/repo_search_repos_order.dart'; import 'package:github_search/domain/entities/repo_search_repos_sort.dart'; +import 'package:github_search/domain/repositories/app_data_repository.dart'; import 'package:github_search/infrastructure/hive/app_data_repository.dart'; import '../../test_utils/hive.dart'; @@ -15,7 +16,7 @@ import '../../test_utils/mocks.dart'; void main() { late Directory tmpDir; - late HiveAppDataRepository repository; + late AppDataRepository repository; setUp(() async { tmpDir = await openAppDataBox(); repository = mockProviderContainer().read(hiveAppDataRepositoryProvider); diff --git a/test/test_utils/mocks.dart b/test/test_utils/mocks.dart index db33202d..2b061e9c 100644 --- a/test/test_utils/mocks.dart +++ b/test/test_utils/mocks.dart @@ -7,7 +7,11 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:github_search/config/app.dart'; +import 'package:github_search/domain/repositories/app_data_repository.dart'; +import 'package:github_search/domain/repositories/repo_repository.dart'; import 'package:github_search/infrastructure/github/http_client.dart'; +import 'package:github_search/infrastructure/github/repo_repository.dart'; +import 'package:github_search/infrastructure/hive/app_data_repository.dart'; import 'package:github_search/presentation/repo/components/search_repos_query.dart'; import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; @@ -152,6 +156,10 @@ Widget mockGitHubSearchApp({ }) { return ProviderScope( overrides: [ + // リポジトリの実装をDI + appDataRepositoryProvider + .overrideWithProvider(hiveAppDataRepositoryProvider), + repoRepositoryProvider.overrideWithProvider(githubRepoRepositoryProvider), // GitHubアクセストークンをダミー文字列にする githubAccessTokenProvider.overrideWithValue('dummy'), // モック版のHTTPクライアントを使う @@ -172,6 +180,10 @@ ProviderContainer mockProviderContainer({ }) { return ProviderContainer( overrides: [ + // リポジトリの実装をDI + appDataRepositoryProvider + .overrideWithProvider(hiveAppDataRepositoryProvider), + repoRepositoryProvider.overrideWithProvider(githubRepoRepositoryProvider), // GitHubアクセストークンをダミー文字列にする githubAccessTokenProvider.overrideWithValue('dummy'), // モック版のHTTPクライアントを使う