Skip to content

Commit 3307ec1

Browse files
committed
implementation data: datasources
1 parent 2a19d0b commit 3307ec1

File tree

7 files changed

+125
-0
lines changed

7 files changed

+125
-0
lines changed

lib/core/http_client/http_client.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
abstract class HttpClient {
3+
Future<HttpResponse> get(String url);
4+
Future<HttpResponse> post(String url, {required Map<String,dynamic> body});
5+
}
6+
7+
class HttpResponse {
8+
final dynamic data;
9+
final int? statusCode;
10+
HttpResponse({
11+
required this.data,
12+
this.statusCode,
13+
});
14+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'package:http/http.dart' as http;
2+
import 'package:nasa/core/http_client/http_client.dart';
3+
4+
class HttpImplementation implements HttpClient {
5+
final client = http.Client();
6+
@override
7+
Future<HttpResponse> get(String url) async {
8+
final response = await client.get(Uri.parse(url));
9+
return HttpResponse(data: response.body, statusCode: response.statusCode);
10+
}
11+
12+
@override
13+
Future<HttpResponse> post(String url, {required Map<String, dynamic> body}) {
14+
// TODO: implement post
15+
throw UnimplementedError();
16+
}
17+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class DateToStringConverter {
2+
static String convert(DateTime date) {
3+
var dateSplitted = date.toString().split(' ');
4+
print(dateSplitted);
5+
return dateSplitted.first;
6+
}
7+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class NasaApiKeys {
2+
static String apiKey = 'DEMO_KEY';
3+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
class NasaEndPoints {
2+
static String apod(String apiKey, String date) =>
3+
"https://api.nasas.gov/planetary/apod?api key=$apiKey&date=$date";
4+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'dart:convert';
2+
3+
import 'package:nasa/core/http_client/http_client.dart';
4+
import 'package:nasa/core/usecase/errors/exceptions.dart';
5+
import 'package:nasa/core/utils/converters/date_to_string_converter.dart';
6+
import 'package:nasa/core/utils/keys/nasa_api_keys.dart';
7+
import 'package:nasa/features/data/datasources/space_media_datasource.dart';
8+
import 'package:nasa/features/data/models/space_media_model.dart';
9+
10+
import 'endpoints/nasa_endpoints.dart';
11+
12+
class NasaDatasourceImplementation implements ISpaceMediaDatasource {
13+
final HttpClient client;
14+
15+
NasaDatasourceImplementation(this.client);
16+
17+
@override
18+
Future<SpaceMediaModel> getSpaceMediaFromDate(DateTime date) async {
19+
final response = await client.get(NasaEndPoints.apod(
20+
NasaApiKeys.apiKey, DateToStringConverter.convert(date)));
21+
if (response.statusCode == 200) {
22+
return SpaceMediaModel.fromJson(jsonDecode(response.data));
23+
} else {
24+
throw ServerException();
25+
}
26+
}
27+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:mocktail/mocktail.dart';
3+
import 'package:nasa/core/http_client/http_client.dart';
4+
import 'package:nasa/core/usecase/errors/exceptions.dart';
5+
import 'package:nasa/features/data/datasources/space_media_datasource.dart';
6+
import 'package:nasa/features/data/datasources/space_media_datasource_implementation.dart';
7+
import 'package:nasa/features/data/models/space_media_model.dart';
8+
9+
import '../../../mocks/space_media_mock.dart';
10+
11+
class HttpClientMock extends Mock implements HttpClient {}
12+
13+
void main() {
14+
late ISpaceMediaDatasource datasource;
15+
late HttpClient client;
16+
17+
setUp(() {
18+
client = HttpClientMock();
19+
datasource = NasaDatasourceImplementation(client);
20+
});
21+
final tDateTime = DateTime(2021, 02, 02);
22+
final urlExpected = "https://apod.nasa.gov/apod/ap210924.html";
23+
void successMock() {
24+
when(() => client.get(any())).thenAnswer(
25+
(_) async => HttpResponse(data: spaceMediaMock, statusCode: 200));
26+
}
27+
28+
test('should call the get method with correct url', () async {
29+
successMock();
30+
31+
await datasource.getSpaceMediaFromDate(tDateTime);
32+
verify(() => client.get(urlExpected)).called(1);
33+
});
34+
35+
test('should return a SpaceMediaModel when is success', () async {
36+
successMock();
37+
38+
final tSpaceMediaModelExpected = SpaceMediaModel(
39+
description: "Meteors can be colurful",
40+
mediaType: "image",
41+
title: "A corlorful quadrantid",
42+
mediaUrl: "http://aadasdd.com.br");
43+
final result = await datasource.getSpaceMediaFromDate(tDateTime);
44+
expect(result, tSpaceMediaModelExpected);
45+
});
46+
test('should throw a ServerException when the call is unsuccessful', ()async{
47+
when(() => client.get(any())).thenAnswer((_)async => HttpResponse(data: 'something went wrong', statusCode: 400));
48+
49+
final result = datasource.getSpaceMediaFromDate(tDateTime);
50+
51+
expect(()=> result, throwsA(ServerException()));
52+
});
53+
}

0 commit comments

Comments
 (0)