Skip to content

Commit 82d5495

Browse files
committed
Add RocketRepository implementation
1 parent 6605672 commit 82d5495

File tree

3 files changed

+152
-3
lines changed

3 files changed

+152
-3
lines changed

lib/generated/l10n.dart

Lines changed: 0 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/repository/rocket_repository.dart

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import 'package:flutter_bloc_app_template/data/network/api_result.dart';
2+
import 'package:flutter_bloc_app_template/data/network/data_source/rocket_network_data_source.dart';
13
import 'package:flutter_bloc_app_template/index.dart';
4+
import 'package:flutter_bloc_app_template/models/rocket/rocket_ext.dart';
25

36
abstract class RocketRepository {
47
Future<List<RocketResource>> getRockets({
@@ -9,3 +12,40 @@ abstract class RocketRepository {
912

1013
Future<RocketResource> getRocket(String rocketId);
1114
}
15+
16+
class RocketRepositoryImpl implements RocketRepository {
17+
RocketRepositoryImpl(this._rocketDataSource);
18+
19+
final RocketDataSource _rocketDataSource;
20+
21+
@override
22+
Future<RocketResource> getRocket(String rocketId) async {
23+
final result = await _rocketDataSource.getRocket(rocketId);
24+
25+
return ApiResultWhen(result).when(
26+
success: (data) => data.toResource(),
27+
error: (message) => throw Exception(message),
28+
loading: () {
29+
throw Exception('Loading');
30+
},
31+
);
32+
}
33+
34+
@override
35+
Future<List<RocketResource>> getRockets(
36+
{bool? hasId = true, int? limit, int? offset}) async {
37+
final list = await _rocketDataSource.getRockets(
38+
hasId: hasId,
39+
limit: limit,
40+
offset: offset,
41+
);
42+
43+
return ApiResultWhen(list).when(
44+
success: (data) => data.map((e) => e.toResource()).toList(),
45+
error: (message) => throw Exception(message),
46+
loading: () {
47+
throw Exception('Loading');
48+
},
49+
);
50+
}
51+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import 'package:flutter_bloc_app_template/data/network/api_result.dart';
2+
import 'package:flutter_bloc_app_template/data/network/data_source/rocket_network_data_source.dart';
3+
import 'package:flutter_bloc_app_template/data/network/model/rocket/network_rocket_model.dart';
4+
import 'package:flutter_bloc_app_template/models/rocket/rocket_resource.dart';
5+
import 'package:flutter_bloc_app_template/repository/rocket_repository.dart';
6+
import 'package:flutter_test/flutter_test.dart';
7+
import 'package:mocktail/mocktail.dart';
8+
9+
class MockRocketDataSource extends Mock implements RocketDataSource {}
10+
11+
void main() {
12+
late RocketRepositoryImpl repository;
13+
late MockRocketDataSource mockDataSource;
14+
15+
setUp(() {
16+
mockDataSource = MockRocketDataSource();
17+
repository = RocketRepositoryImpl(mockDataSource);
18+
});
19+
20+
group('RocketRepositoryImpl', () {
21+
group('getRocket', () {
22+
test('returns RocketResource when success', () async {
23+
final networkRocket =
24+
const NetworkRocketModel(rocketId: 'falcon9', name: 'Falcon 9');
25+
when(() => mockDataSource.getRocket('falcon9')).thenAnswer(
26+
(_) async => ApiResult.success(networkRocket),
27+
);
28+
29+
final result = await repository.getRocket('falcon9');
30+
31+
expect(result, isA<RocketResource>());
32+
expect(result.rocketName, equals('Falcon 9'));
33+
});
34+
35+
test('throws Exception when error', () async {
36+
when(() => mockDataSource.getRocket('falcon9')).thenAnswer(
37+
(_) async => const ApiResult.error('Not found'),
38+
);
39+
40+
expect(
41+
() => repository.getRocket('falcon9'),
42+
throwsA(isA<Exception>()),
43+
);
44+
});
45+
46+
test('throws Exception when loading', () async {
47+
when(() => mockDataSource.getRocket('falcon9')).thenAnswer(
48+
(_) async => const ApiResult.loading(),
49+
);
50+
51+
expect(
52+
() => repository.getRocket('falcon9'),
53+
throwsA(isA<Exception>()),
54+
);
55+
});
56+
});
57+
58+
group('getRockets', () {
59+
test('returns list of RocketResource when success', () async {
60+
final networkRockets = [
61+
const NetworkRocketModel(rocketId: 'falcon9', name: 'Falcon 9'),
62+
const NetworkRocketModel(
63+
rocketId: 'falconheavy', name: 'Falcon Heavy'),
64+
];
65+
when(() => mockDataSource.getRockets(
66+
hasId: any(named: 'hasId'),
67+
limit: any(named: 'limit'),
68+
offset: any(named: 'offset'),
69+
)).thenAnswer(
70+
(_) async => ApiResult.success(networkRockets),
71+
);
72+
73+
final result = await repository.getRockets();
74+
75+
expect(result, isA<List<RocketResource>>());
76+
expect(result.length, 2);
77+
expect(result.first.rocketName, equals('Falcon 9'));
78+
expect(result.last.rocketName, equals('Falcon Heavy'));
79+
});
80+
81+
test('throws Exception when error', () async {
82+
when(() => mockDataSource.getRockets(
83+
hasId: any(named: 'hasId'),
84+
limit: any(named: 'limit'),
85+
offset: any(named: 'offset'),
86+
)).thenAnswer(
87+
(_) async => const ApiResult.error('Something went wrong'),
88+
);
89+
90+
expect(
91+
() => repository.getRockets(),
92+
throwsA(isA<Exception>()),
93+
);
94+
});
95+
96+
test('throws Exception when loading', () async {
97+
when(() => mockDataSource.getRockets(
98+
hasId: any(named: 'hasId'),
99+
limit: any(named: 'limit'),
100+
offset: any(named: 'offset'),
101+
)).thenAnswer(
102+
(_) async => const ApiResult.loading(),
103+
);
104+
105+
expect(
106+
() => repository.getRockets(),
107+
throwsA(isA<Exception>()),
108+
);
109+
});
110+
});
111+
});
112+
}

0 commit comments

Comments
 (0)