Skip to content

Commit 16308c6

Browse files
committed
Add roadster service
1 parent 7695161 commit 16308c6

File tree

6 files changed

+205
-0
lines changed

6 files changed

+205
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import 'package:flutter_bloc_app_template/data/network/api_result.dart';
2+
import 'package:flutter_bloc_app_template/data/network/model/roadster/network_roadster_model.dart';
3+
import 'package:flutter_bloc_app_template/data/network/service/roadster/roadster_service.dart';
4+
5+
abstract class RoadsterDataSource {
6+
Future<ApiResult<NetworkRoadsterModel>> getRoadster();
7+
}
8+
9+
class RoadsterNetworkDataSource implements RoadsterDataSource {
10+
RoadsterNetworkDataSource(this._service);
11+
12+
final RoadsterService _service;
13+
14+
@override
15+
Future<ApiResult<NetworkRoadsterModel>> getRoadster() async {
16+
try {
17+
final result = await _service.fetchRoadster();
18+
return ApiResult.success(result);
19+
} catch (e) {
20+
return Future.value(ApiResult.error(e.toString()));
21+
}
22+
}
23+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
const String baseUrl = 'https://api.spacexdata.com/v3/';
2+
const String baseUrlVersion4 = 'https://api.spacexdata.com/v4/';
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import 'package:dio/dio.dart';
2+
import 'package:flutter_bloc_app_template/data/network/model/roadster/network_roadster_model.dart';
3+
import 'package:flutter_bloc_app_template/data/network/service/constants.dart';
4+
import 'package:retrofit/retrofit.dart';
5+
6+
part 'roadster_service.g.dart';
7+
8+
@RestApi(baseUrl: baseUrlVersion4)
9+
abstract class RoadsterService {
10+
factory RoadsterService(Dio dio) = _RoadsterService;
11+
12+
@GET('roadster}')
13+
Future<NetworkRoadsterModel> fetchRoadster();
14+
}

lib/data/network/service/roadster/roadster_service.g.dart

Lines changed: 75 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"name": "Elon Musk's Tesla Roadster",
3+
"launch_date_utc": "2018-02-06T20:45:00.000Z",
4+
"launch_date_unix": 1517949900,
5+
"launch_mass_kg": 1350,
6+
"launch_mass_lbs": 2976,
7+
"norad_id": 43205,
8+
"epoch_jd": 2459914.263888889,
9+
"orbit_type": "heliocentric",
10+
"apoapsis_au": 1.664332332453025,
11+
"periapsis_au": 0.986015924224046,
12+
"semi_major_axis_au": 57.70686413577451,
13+
"eccentricity": 0.2559348215918733,
14+
"inclination": 1.075052357364693,
15+
"longitude": 316.9112133411523,
16+
"periapsis_arg": 177.75981116285,
17+
"period_days": 557.1958197697352,
18+
"speed_kph": 9520.88362029108,
19+
"speed_mph": 5916.000976023889,
20+
"earth_distance_km": 320593735.82924163,
21+
"earth_distance_mi": 199207650.2259517,
22+
"mars_distance_km": 395640511.90355814,
23+
"mars_distance_mi": 245839540.52202582,
24+
"flickr_images": [
25+
"https://farm5.staticflickr.com/4615/40143096241_11128929df_b.jpg",
26+
"https://farm5.staticflickr.com/4702/40110298232_91b32d0cc0_b.jpg",
27+
"https://farm5.staticflickr.com/4676/40110297852_5e794b3258_b.jpg",
28+
"https://farm5.staticflickr.com/4745/40110304192_6e3e9a7a1b_b.jpg"
29+
],
30+
"wikipedia": "https://en.wikipedia.org/wiki/Elon_Musk%27s_Tesla_Roadster",
31+
"video": "https://youtu.be/wbSwFU6tY1c",
32+
"details": "Elon Musk's Tesla Roadster is an electric sports car that served as the dummy payload for the February 2018 Falcon Heavy test flight and is now an artificial satellite of the Sun. Starman, a mannequin dressed in a spacesuit, occupies the driver's seat. The car and rocket are products of Tesla and SpaceX. This 2008-model Roadster was previously used by Musk for commuting, and is the only consumer car sent into space.",
33+
"id": "5eb75f0842fea42237d7f3f4"
34+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import 'package:flutter_bloc_app_template/data/network/api_result.dart';
2+
import 'package:flutter_bloc_app_template/data/network/data_source/roadster_network_data_source.dart';
3+
import 'package:flutter_bloc_app_template/data/network/model/roadster/network_roadster_model.dart';
4+
import 'package:flutter_bloc_app_template/data/network/service/roadster/roadster_service.dart';
5+
import 'package:flutter_test/flutter_test.dart';
6+
import 'package:mocktail/mocktail.dart';
7+
8+
import '../../fixtures_reader.dart';
9+
10+
class MockRoadsterService extends Mock implements RoadsterService {}
11+
12+
void main() {
13+
late RoadsterService service;
14+
late RoadsterDataSource dataSource;
15+
16+
setUp(() async {
17+
registerFallbackValue(Uri());
18+
service = MockRoadsterService();
19+
dataSource = RoadsterNetworkDataSource(service);
20+
});
21+
22+
group('fetchRoadster', () {
23+
final mockResponse = NetworkRoadsterModel.fromJson(
24+
'roadster/roadster.json'.toFixtureObject());
25+
26+
test(
27+
'should perform a GET request on /roadster and return a NetworkRoadsterModel',
28+
() async {
29+
// arrange
30+
when(
31+
() => service.fetchRoadster(),
32+
).thenAnswer(
33+
(_) async => Future.value(mockResponse),
34+
);
35+
36+
// act
37+
final call = await dataSource.getRoadster();
38+
// assert
39+
verify(() => service.fetchRoadster());
40+
expect(call, isA<Success<NetworkRoadsterModel>>());
41+
verifyNoMoreInteractions(service);
42+
},
43+
);
44+
test('should perform a GET request on /roadster and return an error',
45+
() async {
46+
// arrange
47+
when(() => service.fetchRoadster()).thenThrow(Exception('Server error'));
48+
49+
// act
50+
final call = await dataSource.getRoadster();
51+
52+
// assert
53+
expect(call, isA<Error<NetworkRoadsterModel>>());
54+
verify(() => service.fetchRoadster());
55+
verifyNoMoreInteractions(service);
56+
});
57+
});
58+
}

0 commit comments

Comments
 (0)