Add connection service

master
Jonas Franz 4 years ago
parent afcfe33442
commit 830ba8634b
Signed by: JonasFranzDEV
GPG Key ID: 7293A220B7C38080
  1. 13
      lib/db_construction_site.dart
  2. 1
      lib/models/connection.g.dart
  3. 15
      lib/models/connection_type_converter.dart
  4. 19
      lib/models/connection_type_converter.g.dart
  5. 3
      lib/models/index.dart
  6. 6
      lib/models/region.dart
  7. 15
      lib/models/region_converter.dart
  8. 28
      lib/models/region_converter.g.dart
  9. 34
      lib/services/connection_service.dart
  10. 21
      test/db_construction_site_test.dart
  11. 6
      test/models/connection_test.dart

@ -1,7 +1,12 @@
library db_construction_site;
/// A Calculator.
class Calculator {
/// Returns [value] plus 1.
int addOne(int value) => value + 1;
import 'package:db_construction_site/services/connection_service.dart';
export 'models/index.dart';
class DBConstructionSite {
final ConnectionService connections;
DBConstructionSite({baseUrl = 'https://bauinfos.deutschebahn.com/app'})
: connections = ConnectionService(baseUrl);
}

@ -80,4 +80,5 @@ const _$RegionEnumMap = {
Region.rhinelandPalatinate: 'rheinland-pfalz',
Region.hesse: 'hessen',
Region.northrhineWestphalia: 'nrw',
Region.longDistance: 'fernverkehr',
};

@ -0,0 +1,15 @@
import 'package:json_annotation/json_annotation.dart';
import 'connection_type.dart';
part 'connection_type_converter.g.dart';
@JsonSerializable(createFactory: false)
class ConnectionTypeConverter {
final ConnectionType type;
const ConnectionTypeConverter(this.type);
@JsonKey(ignore: true)
String get value => _$ConnectionTypeConverterToJson(this)["type"];
}

@ -0,0 +1,19 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'connection_type_converter.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Map<String, dynamic> _$ConnectionTypeConverterToJson(
ConnectionTypeConverter instance) =>
<String, dynamic>{
'type': _$ConnectionTypeEnumMap[instance.type],
};
const _$ConnectionTypeEnumMap = {
ConnectionType.longDistance: 'fern',
ConnectionType.regional: 'regional',
ConnectionType.sBahn: 'sbahn',
};

@ -0,0 +1,3 @@
export 'connection.dart';
export 'region.dart';
export 'connection_type.dart';

@ -47,5 +47,9 @@ enum Region {
/// Northrhine-Westphalia
@JsonValue("nrw")
northrhineWestphalia
northrhineWestphalia,
/// Long distance trains with multiple regions
@JsonValue("fernverkehr")
longDistance,
}

@ -0,0 +1,15 @@
import 'package:json_annotation/json_annotation.dart';
import 'region.dart';
part 'region_converter.g.dart';
@JsonSerializable(createFactory: false)
class RegionConverter {
final Region region;
const RegionConverter(this.region);
@JsonKey(ignore: true)
String get value => _$RegionConverterToJson(this)["region"];
}

@ -0,0 +1,28 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'region_converter.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Map<String, dynamic> _$RegionConverterToJson(RegionConverter instance) =>
<String, dynamic>{
'region': _$RegionEnumMap[instance.region],
};
const _$RegionEnumMap = {
Region.lowerSaxonyBremen: 'niedersachen-bremen',
Region.north: 'norden',
Region.mecklenburgWesternPomerania: 'mvp',
Region.berlinBrandenburg: 'berlin-bb',
Region.saxonyAnhalt: 'sachsen-anhalt',
Region.saxony: 'sachsen',
Region.bavaria: 'bayern',
Region.thuringia: 'thueringen',
Region.badenWuerttemberg: 'baden-w',
Region.rhinelandPalatinate: 'rheinland-pfalz',
Region.hesse: 'hessen',
Region.northrhineWestphalia: 'nrw',
Region.longDistance: 'fernverkehr',
};

@ -0,0 +1,34 @@
import 'dart:convert';
import 'dart:io';
import 'package:db_construction_site/models/connection.dart';
import 'package:db_construction_site/models/connection_type.dart';
import 'package:db_construction_site/models/connection_type_converter.dart';
import 'package:db_construction_site/models/region.dart';
import 'package:db_construction_site/models/region_converter.dart';
import 'package:http/http.dart' as http;
class ConnectionService {
final String baseUrl;
const ConnectionService(this.baseUrl);
Future<List<Connection>> findConnections(Region region,
{ConnectionType connectionType}) async {
final regionValue = RegionConverter(region).value;
var url = '$baseUrl/list/${regionValue}';
if (connectionType != null) {
final connectionTypeValue = ConnectionTypeConverter(connectionType).value;
url += ',${connectionTypeValue}';
}
final result = await http.get(url);
if (result.statusCode ~/ 100 != 2) {
throw HttpException("unexpected status code ${result.statusCode}",
uri: result.request.url);
}
final List<dynamic> connections = JsonDecoder().convert(result.body);
return connections
.map((connection) => Connection.fromJson(connection))
.toList();
}
}

@ -3,11 +3,20 @@ import 'package:test/test.dart';
import 'package:db_construction_site/db_construction_site.dart';
void main() {
test('adds one to input values', () {
final calculator = Calculator();
expect(calculator.addOne(2), 3);
expect(calculator.addOne(-7), -6);
expect(calculator.addOne(0), 1);
expect(() => calculator.addOne(null), throwsNoSuchMethodError);
test('check if example request succeeds', () async {
final connections =
await DBConstructionSite().connections.findConnections(Region.hesse);
expect(connections.length, greaterThan(0));
});
test('check if invalid request fails', () async {
try {
await DBConstructionSite(baseUrl: 'https://noanurl.local')
.connections
.findConnections(Region.hesse);
fail("Request succeeds although it should fail");
} catch (e) {
// success
}
});
}

@ -1,8 +1,6 @@
import 'dart:convert';
import 'package:db_construction_site/models/connection.dart';
import 'package:db_construction_site/models/connection_type.dart';
import 'package:db_construction_site/models/region.dart';
import 'package:db_construction_site/db_construction_site.dart';
import 'package:test/test.dart';
void main() {
@ -56,4 +54,4 @@ void main() {
expect(connection.type, ConnectionType.regional);
expect(connection.region, Region.hesse);
});
}
}

Loading…
Cancel
Save