Skip to content

Commit f32011b

Browse files
committed
fix: repository methods
1 parent 9ef77bd commit f32011b

File tree

7 files changed

+137
-0
lines changed

7 files changed

+137
-0
lines changed

lib/core/error/exception.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class ServerException implements Exception {}
2+
3+
class CacheException implements Exception {}

lib/core/error/failures.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,15 @@ import 'package:equatable/equatable.dart';
33
abstract class Failure extends Equatable {
44
Failure([List properites = const <dynamic>[]]) : super();
55
}
6+
7+
class ServerFailure extends Failure {
8+
@override
9+
// TODO: implement props
10+
List<Object> get props => throw UnimplementedError();
11+
}
12+
13+
class CacheFailure extends Failure {
14+
@override
15+
// TODO: implement props
16+
List<Object> get props => throw UnimplementedError();
17+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
abstract class NetworkInfo {
2+
Future<bool> get isConnected;
3+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import 'package:tdd_number_trivia/features/number_trivia/data/models/number_trivia_model.dart';
2+
3+
abstract class NumberTriviaLocalDataSource {
4+
/// Gets the cached [NumberTriviaModel] which was gotten the last time
5+
/// the user had an internet connection.
6+
///
7+
/// Throws [NoLocalDataException] if no cached data is present.
8+
Future<NumberTriviaModel> etLastNumberTrivia();
9+
10+
Future<void> cacheNumberTrivia(NumberTriviaModel triviaToCache);
11+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import 'package:tdd_number_trivia/features/number_trivia/data/models/number_trivia_model.dart';
2+
3+
abstract class NumberTriviaRemoteDataSource {
4+
/// Calls the http://numbersapi.com/{number} endpoint.
5+
///
6+
/// Throws a [ServerException] for all error codes.
7+
Future<NumberTriviaModel> getConcreteNumberTrivia(int number);
8+
9+
/// Calls the http://numbersapi.com/random endpoint.
10+
///
11+
/// Throws a [ServerException] for all error codes.
12+
Future<NumberTriviaModel> getRandomNumberTrivia();
13+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import 'package:flutter/foundation.dart';
2+
import 'package:tdd_number_trivia/core/platform/network_info.dart';
3+
import 'package:tdd_number_trivia/features/number_trivia/data/datasources/number_trivia_local_data_source.dart';
4+
import 'package:tdd_number_trivia/features/number_trivia/data/datasources/number_trivia_remote_data_source.dart';
5+
import 'package:tdd_number_trivia/features/number_trivia/domain/entities/number_trivia.dart';
6+
import 'package:tdd_number_trivia/core/error/failures.dart';
7+
import 'package:dartz/dartz.dart';
8+
import 'package:tdd_number_trivia/features/number_trivia/domain/repositories/number_trivia_repository.dart';
9+
10+
class NumberTriviaRepositoryImpl implements NumberTriviaRepository {
11+
final NumberTriviaRemoteDataSource remoteDataSource;
12+
final NumberTriviaLocalDataSource localDataSource;
13+
final NetworkInfo networkInfo;
14+
15+
NumberTriviaRepositoryImpl(
16+
{@required this.remoteDataSource,
17+
@required this.localDataSource,
18+
@required this.networkInfo});
19+
20+
@override
21+
Future<Either<Failure, NumberTrivia>> getConcreteNumberTrivia({int number}) {
22+
networkInfo.isConnected;
23+
return null;
24+
}
25+
26+
@override
27+
Future<Either<Failure, NumberTrivia>> getRandomNumberTrivia() {
28+
return null;
29+
}
30+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import 'package:mockito/mockito.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:tdd_number_trivia/core/platform/network_info.dart';
4+
import 'package:tdd_number_trivia/features/number_trivia/data/datasources/number_trivia_local_data_source.dart';
5+
import 'package:tdd_number_trivia/features/number_trivia/data/datasources/number_trivia_remote_data_source.dart';
6+
import 'package:tdd_number_trivia/features/number_trivia/data/models/number_trivia_model.dart';
7+
import 'package:tdd_number_trivia/features/number_trivia/data/repositories/number_tirivia_repository_impl.dart';
8+
9+
class MockRemoteDataSource extends Mock
10+
implements NumberTriviaRemoteDataSource {}
11+
12+
class MockLocalDataSource extends Mock implements NumberTriviaLocalDataSource {}
13+
14+
class MockNetworkInfo extends Mock implements NetworkInfo {}
15+
16+
void main() {
17+
NumberTriviaRepositoryImpl numberTriviaRepositoryImpl;
18+
MockRemoteDataSource mockRemoteDataSource;
19+
MockLocalDataSource mockLocalDataSource;
20+
MockNetworkInfo mockNetworkInfo;
21+
22+
setUp(() {
23+
mockLocalDataSource = MockLocalDataSource();
24+
mockRemoteDataSource = MockRemoteDataSource();
25+
mockNetworkInfo = MockNetworkInfo();
26+
numberTriviaRepositoryImpl = NumberTriviaRepositoryImpl(
27+
remoteDataSource: mockRemoteDataSource,
28+
localDataSource: mockLocalDataSource,
29+
networkInfo: mockNetworkInfo);
30+
});
31+
32+
group("getConcreteNumberTrivia", () {
33+
final tNumber = 1;
34+
final tNumberTriviaModel =
35+
NumberTriviaModel(number: tNumber, text: "Hello");
36+
test("should check if device is online", () async {
37+
when(mockNetworkInfo.isConnected).thenAnswer((_) async => true);
38+
39+
numberTriviaRepositoryImpl.getConcreteNumberTrivia(number: tNumber);
40+
41+
verify(mockNetworkInfo.isConnected);
42+
});
43+
44+
group("device is online", () {
45+
setUp(() {
46+
when(mockNetworkInfo.isConnected)
47+
.thenAnswer((realInvocation) async => true);
48+
});
49+
50+
test(
51+
"should return remote data when the call to remote data source is successful",
52+
() async {
53+
when(mockRemoteDataSource.getConcreteNumberTrivia(any))
54+
.thenAnswer((realInvocation) async => tNumberTriviaModel);
55+
});
56+
});
57+
58+
group("device is offline", () {
59+
setUp(() {
60+
when(mockNetworkInfo.isConnected)
61+
.thenAnswer((realInvocation) async => false);
62+
});
63+
});
64+
});
65+
}

0 commit comments

Comments
 (0)