Skip to content

Commit

Permalink
♻️ refactor: リポジトリのInterfaceがインフラ層に依存しないように修正
Browse files Browse the repository at this point in the history
Issue #145
  • Loading branch information
susatthi committed May 25, 2022
1 parent f087e1b commit cfe1a0c
Show file tree
Hide file tree
Showing 11 changed files with 59 additions and 20 deletions.
11 changes: 5 additions & 6 deletions lib/domain/repositories/app_data_repository.dart
Expand Up @@ -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<AppDataRepository>(
(ref) => ref.watch(hiveAppDataRepositoryProvider),
(ref) => throw UnimplementedError(),
);

/// アプリデータRepository
Expand All @@ -21,16 +20,16 @@ abstract class AppDataRepository {
AppDataKey.repoSearchReposOrder: RepoSearchReposOrder.desc,
};

/// リポジトリ検索用ソートを設定する
/// リポジトリ検索用ソート値を設定する
void setSearchReposSort(RepoSearchReposSort sort);

/// リポジトリ検索用ソートを返す
/// リポジトリ検索用ソート値を返す
RepoSearchReposSort getSearchReposSort();

/// リポジトリ検索用オーダーを設定する
/// リポジトリ検索用オーダー値を設定する
void setSearchReposOrder(RepoSearchReposOrder order);

/// リポジトリ検索用オーダーを設定する
/// リポジトリ検索用オーダー値を返す
RepoSearchReposOrder getSearchReposOrder();
}

Expand Down
3 changes: 1 addition & 2 deletions lib/domain/repositories/repo_repository.dart
Expand Up @@ -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<RepoRepository>(
(ref) => ref.watch(githubRepoRepositoryProvider),
(ref) => throw UnimplementedError(),
);

/// リポジトリRepository
Expand Down
3 changes: 3 additions & 0 deletions lib/infrastructure/github/api.dart
Expand Up @@ -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 {
Expand Down
5 changes: 1 addition & 4 deletions lib/infrastructure/github/repo_repository.dart
Expand Up @@ -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<GitHubRepoRepository>(
final githubRepoRepositoryProvider = Provider<RepoRepository>(
(ref) {
final githubHttpClient = ref.watch(githubHttpClientProvider);
return GitHubRepoRepository(
Expand Down
8 changes: 4 additions & 4 deletions lib/infrastructure/hive/app_data_repository.dart
Expand Up @@ -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<HiveAppDataRepository>(
final hiveAppDataRepositoryProvider = Provider<AppDataRepository>(
(ref) {
final box = Hive.box<dynamic>(hiveBoxNameAppData);
return HiveAppDataRepository(
Expand Down Expand Up @@ -69,6 +72,3 @@ class HiveAppDataRepository implements AppDataRepository {
return RepoSearchReposOrder.valueOf(name);
}
}

/// Hive の Box 名
const hiveBoxNameAppData = 'appData';
13 changes: 11 additions & 2 deletions lib/main.dart
Expand Up @@ -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';

Expand All @@ -21,8 +24,14 @@ Future<void> main() async {
await Hive.openBox<dynamic>(hiveBoxNameAppData);

runApp(
const ProviderScope(
child: GitHubSearchApp(),
ProviderScope(
overrides: [
appDataRepositoryProvider
.overrideWithProvider(hiveAppDataRepositoryProvider),
repoRepositoryProvider
.overrideWithProvider(githubRepoRepositoryProvider),
],
child: const GitHubSearchApp(),
),
);
}
9 changes: 9 additions & 0 deletions test/domain/repositories/app_data_repository_test.dart
Expand Up @@ -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');
Expand Down
9 changes: 9 additions & 0 deletions test/domain/repositories/repo_repository_test.dart
Expand Up @@ -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');
Expand Down
3 changes: 2 additions & 1 deletion test/infrastructure/github/repo_repository_test.dart
Expand Up @@ -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';
Expand All @@ -20,7 +21,7 @@ void main() {
),
);

late GitHubRepoRepository repository;
late RepoRepository repository;
setUp(() {
repository = mockProviderContainer().read(githubRepoRepositoryProvider);
useEnvironmentLocale();
Expand Down
3 changes: 2 additions & 1 deletion test/infrastructure/hive/app_data_repository_test.dart
Expand Up @@ -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';
Expand All @@ -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);
Expand Down
12 changes: 12 additions & 0 deletions test/test_utils/mocks.dart
Expand Up @@ -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;
Expand Down Expand Up @@ -152,6 +156,10 @@ Widget mockGitHubSearchApp({
}) {
return ProviderScope(
overrides: [
// リポジトリの実装をDI
appDataRepositoryProvider
.overrideWithProvider(hiveAppDataRepositoryProvider),
repoRepositoryProvider.overrideWithProvider(githubRepoRepositoryProvider),
// GitHubアクセストークンをダミー文字列にする
githubAccessTokenProvider.overrideWithValue('dummy'),
// モック版のHTTPクライアントを使う
Expand All @@ -172,6 +180,10 @@ ProviderContainer mockProviderContainer({
}) {
return ProviderContainer(
overrides: [
// リポジトリの実装をDI
appDataRepositoryProvider
.overrideWithProvider(hiveAppDataRepositoryProvider),
repoRepositoryProvider.overrideWithProvider(githubRepoRepositoryProvider),
// GitHubアクセストークンをダミー文字列にする
githubAccessTokenProvider.overrideWithValue('dummy'),
// モック版のHTTPクライアントを使う
Expand Down

0 comments on commit cfe1a0c

Please sign in to comment.