mirror of
https://dev.azure.com/TeilRad/sharee.bike%20App/_git/Code
synced 2025-07-03 10:26:31 +02:00
Version 3.0.381
This commit is contained in:
parent
f963c0a219
commit
3a363acf3a
1525 changed files with 60589 additions and 125098 deletions
|
@ -0,0 +1,39 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector.Filter;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Connector.Filter
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestIntersectFilter
|
||||
{
|
||||
[Test]
|
||||
public void TestDoFilter_Null()
|
||||
{
|
||||
var filter = new IntersectGroupFilter(new List<string> { "Tonk" });
|
||||
|
||||
Assert.That(filter.DoFilter(null).Count(), Is.EqualTo(1));
|
||||
Assert.That(
|
||||
filter.DoFilter(null).ToArray()[0], Is.EqualTo("Tonk"),
|
||||
"Do not apply filtering when null is passed as argement (null-filter).");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestDoFilter_Empty()
|
||||
{
|
||||
var filter = new IntersectGroupFilter(new List<string> { "Tonk" });
|
||||
|
||||
Assert.That(filter.DoFilter(new List<string>()).Count(), Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestDoFilter()
|
||||
{
|
||||
var filter = new IntersectGroupFilter(new List<string> { "FR_001", "FR_009" });
|
||||
|
||||
Assert.That(filter.DoFilter(new List<string> { "FR_001", "FR_007" }).Count(), Is.EqualTo(1));
|
||||
Assert.That(filter.DoFilter(new List<string> { "FR_001", "FR_007" }).ToArray()[0], Is.EqualTo("FR_001"));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector.Filter;
|
||||
using NUnit.Framework.Legacy;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Model.Connector.Filter
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestIntersectGroupFilterHelper
|
||||
{
|
||||
[Test]
|
||||
public void TestGetBikeCategory()
|
||||
{
|
||||
Assert.That(
|
||||
"Fr_300102".GetBikeCategory(), Is.EqualTo("300102").AsCollection);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestGetBikeCategoryEmpty()
|
||||
{
|
||||
Assert.That(
|
||||
"CAD_".GetBikeCategory(), Is.EqualTo("").AsCollection);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestToBikeCategory()
|
||||
{
|
||||
Assert.That(
|
||||
IntersectGroupFilterHelper.ToBikeCategory(new List<string> { "KN_300102", "Bla_XXX", "FR_777" }), Is.EqualTo(new List<string> { "300102", "777" }).AsCollection);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestToBikeCategoryEmpty()
|
||||
{
|
||||
Assert.That(
|
||||
IntersectGroupFilterHelper.ToBikeCategory(new List<string> { "KN_" }).Count(),
|
||||
Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestIntersectByGoupId()
|
||||
{
|
||||
Assert.That(
|
||||
new List<string> { "FR_300101", "XY_777" }.IntersectByGoupId(new List<string> { "XY_776", "KN_300101" }), Is.EqualTo(new List<string> { "FR_300101" }).AsCollection);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestIntersectByGoupId_Empty()
|
||||
{
|
||||
Assert.That(
|
||||
new List<string> { "FR_300102" }.IntersectByGoupId(new List<string> { "FR_300101" }), Is.EqualTo(new List<string>()).AsCollection);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestContainsGroupId_True()
|
||||
{
|
||||
Assert.That(
|
||||
new List<string> { "FR_300101", "XY_777" }.ContainsGroupId("KN_300101"),
|
||||
Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestContainsGroupId_False()
|
||||
{
|
||||
Assert.That(
|
||||
new List<string> { "FR_300101", "XY_777" }.ContainsGroupId("XY_776"),
|
||||
Is.False);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector.Filter;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Connector.Filter
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestNullFilter
|
||||
{
|
||||
[Test]
|
||||
public void TestDoFilter()
|
||||
{
|
||||
var filter = new NullGroupFilter();
|
||||
Assert.That(filter.DoFilter(null), Is.Null);
|
||||
Assert.That(filter.DoFilter(new List<string>()).Count(), Is.EqualTo(0));
|
||||
Assert.That(filter.DoFilter(new List<string> { "Hello" }).Count(), Is.EqualTo(1));
|
||||
}
|
||||
}
|
||||
}
|
336
SharedBusinessLogic.Tests/Model/Connector/TestBikeInfoFactory.cs
Normal file
336
SharedBusinessLogic.Tests/Model/Connector/TestBikeInfoFactory.cs
Normal file
|
@ -0,0 +1,336 @@
|
|||
using Newtonsoft.Json;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector.Updater;
|
||||
using ShareeBike.Repository.Response;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Model.Connector
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestBikeInfoFactory
|
||||
{
|
||||
[Test]
|
||||
public void TestCreate_Available_NoBc()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoAvailable>(
|
||||
@"{
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9"",
|
||||
""system"" : ""LOCK""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri),
|
||||
Is.Null,
|
||||
"BC- bikes (\"system\" : \"LOCK\") are no more supported.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreate_Available_InvalidState()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoAvailable>(
|
||||
@"{
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""reserved"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9"",
|
||||
""system"" : ""Ilockit""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri),
|
||||
Is.Null,
|
||||
"Invalid (\"state\" : \"reserved\") detected.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreate_Available_NoStation()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoAvailable>(
|
||||
@"{
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : """",
|
||||
""system"" : ""Ilockit""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri),
|
||||
Is.Null,
|
||||
"Station must not be null.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreate_Available_DefaultLock()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoAvailable>(
|
||||
@"{
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9"",
|
||||
""system"" : """"
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri).GetType(),
|
||||
Is.EqualTo(typeof(ShareeBike.Model.Bikes.BikeInfoNS.CopriLock.BikeInfo)),
|
||||
"Default lock by is BackendLock.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreate_Available_BluetoothLock()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoAvailable>(
|
||||
@"{
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9"",
|
||||
""system"" : ""Ilockit""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri).GetType(),
|
||||
Is.EqualTo(typeof(ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreate_Available_SigoLock()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoAvailable>(
|
||||
@"{
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9"",
|
||||
""system"" : ""SIGO""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri).GetType(),
|
||||
Is.EqualTo(typeof(ShareeBike.Model.Bikes.BikeInfoNS.CopriLock.BikeInfo)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreate_Available_CopriLock_FeedbackPending()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoAvailable>(
|
||||
@"{
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9"",
|
||||
""system"" : ""SIGO"",
|
||||
""co2saving"" : ""You saved tonns of co2!"",
|
||||
""user_miniquery"" : {
|
||||
""footer"" : ""Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"",
|
||||
""subtitle"" : ""Ihre drei Antworten werden anonym gespeichert."",
|
||||
""title"" : ""Bitte unterstützen Sie unsere Begleitforschung"",
|
||||
""questions"" : {
|
||||
""q1"" : {
|
||||
""quest_text"" : ""1. Was war der Hauptzweck dieser Ausleihe?"",
|
||||
""type"" : ""check_one"",
|
||||
""query"" : {
|
||||
""opt5"" : ""e. Ausprobieren"",
|
||||
""opt3"" : ""c. Lastentransport"",
|
||||
""opt6"" : ""f. Sonstiges"",
|
||||
""opt1"" : ""a. Einkauf"",
|
||||
""opt4"" : ""d. Freizeit"",
|
||||
""opt2"" : ""b. Kinderbeförderung""
|
||||
}
|
||||
},
|
||||
""q2"" : {
|
||||
""type"" : ""check_one"",
|
||||
""quest_text"" : ""2. Welches Verkehrsmittel hätten Sie ansonsten benutzt?"",
|
||||
""query"" : {
|
||||
""opt1"" : ""a. Auto"",
|
||||
""opt7"" : ""g. Sonstige"",
|
||||
""opt2"" : ""b. Motorrad oder Motorroller"",
|
||||
""opt4"" : ""d. Eigenes Fahrrad"",
|
||||
""opt6"" : ""f. Keines (ich hätte die Fahrt sonst nicht gemacht)"",
|
||||
""opt5"" : ""e. Zu Fuß"",
|
||||
""opt3"" : ""c. Bus oder Bahn""
|
||||
},
|
||||
},
|
||||
""q3"" : {
|
||||
""type"" : ""text"",
|
||||
""quest_text"" : ""3. Haben Sie Anmerkungen oder Anregungen?"",
|
||||
""query"" : {
|
||||
""opt1"" : """"
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}");
|
||||
|
||||
var bike = BikeInfoFactory.Create(bikeInfoResponse, ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri) as ShareeBike.Model.Bikes.BikeInfoNS.CopriLock.BikeInfo;
|
||||
|
||||
Assert.That(
|
||||
bike,
|
||||
Is.Not.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreate_ReservedOrBooked_NoBc()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoReservedOrBooked>(
|
||||
@"{
|
||||
""station"" : ""2"",
|
||||
""state"" : ""occupied"",
|
||||
""bike"" : ""20"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""start_time"" : ""2017-12-01 22:21:57.740069+01"",
|
||||
""timeCode"" : ""6603"",
|
||||
""system"" : ""LOCK""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, "a@b", () => new System.DateTime(), ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri),
|
||||
Is.Null,
|
||||
"BC- bikes (\"system\" : \"LOCK\") are no more supported.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreate_ReservedOrBooked_DefaultLock()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoReservedOrBooked>(
|
||||
@"{
|
||||
""station"" : ""2"",
|
||||
""state"" : ""occupied"",
|
||||
""bike"" : ""20"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""start_time"" : ""2017-12-01 22:21:57.740069+01"",
|
||||
""timeCode"" : ""6603"",
|
||||
""system"" : """"
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, "a@b", () => new System.DateTime(), ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri).GetType(),
|
||||
Is.EqualTo(typeof(ShareeBike.Model.Bikes.BikeInfoNS.CopriLock.BikeInfo)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreate_ReservedOrBooked_BluetoothLock()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoReservedOrBooked>(
|
||||
@"{
|
||||
""station"" : ""2"",
|
||||
""state"" : ""occupied"",
|
||||
""bike"" : ""20"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""start_time"" : ""2017-12-01 22:21:57.740069+01"",
|
||||
""timeCode"" : ""6603"",
|
||||
""system"" : ""Ilockit""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, "a@b", () => new System.DateTime(), ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri).GetType(),
|
||||
Is.EqualTo(typeof(ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo)));
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void TestCreate_ReservedOrBooked_SigoLock()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoReservedOrBooked>(
|
||||
@"{
|
||||
""station"" : ""2"",
|
||||
""state"" : ""occupied"",
|
||||
""bike"" : ""20"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""start_time"" : ""2017-12-01 22:21:57.740069+01"",
|
||||
""timeCode"" : ""6603"",
|
||||
""system"" : ""SIGO""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, "a@b", () => new System.DateTime(), ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri).GetType(),
|
||||
Is.EqualTo(typeof(ShareeBike.Model.Bikes.BikeInfoNS.CopriLock.BikeInfo)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreate_Available_CopriLock_FeedBackRequied()
|
||||
{
|
||||
var bikeInfoResponse = JsonConvert.DeserializeObject<BikeInfoAvailable>(
|
||||
@"{
|
||||
""rental_description"": {
|
||||
""reserve_timerange"": ""30 Min"",
|
||||
""name"": ""Lastenrad"",
|
||||
""rental_info"": {
|
||||
""2"": [
|
||||
""AGB"",
|
||||
""Mit der Mietrad Anmietung wird folgender Betreiber <a href='https://shareeapp-wue.copri.eu/site/agb.html' target='_blank'>AGB</a> zugestimmt (als Demo sharee AGB).""
|
||||
],
|
||||
""1"": [
|
||||
""Tracking"",
|
||||
""Ich stimme der Speicherung (Tracking) meiner Fahrstrecke zwecks wissenschaftlicher Auswertung und Berechnung der CO2-Einsparung zu!""
|
||||
]
|
||||
},
|
||||
""id"": ""5523"",
|
||||
""tarif_elements"": {
|
||||
""1"": [
|
||||
""Mietgebühr"",
|
||||
""3,00 € / 1 Std ""
|
||||
],
|
||||
""6"": [
|
||||
""Gratis Mietzeit"",
|
||||
""30 Min / Tag""
|
||||
],
|
||||
""4"": [
|
||||
""Max. Gebühr"",
|
||||
""15.00 € / Tag""
|
||||
]
|
||||
}
|
||||
},
|
||||
""uri_operator"": ""https://shareeapp-wue.copri.eu"",
|
||||
""state"": ""available"",
|
||||
""bike"": ""WUE5529"",
|
||||
""authed"": ""1"",
|
||||
""bike_group"": [
|
||||
""WUE300101""
|
||||
],
|
||||
""gps"": {
|
||||
""longitude"": null,
|
||||
""latitude"": null
|
||||
},
|
||||
""system"": ""sigo"",
|
||||
""tariff_description"": {
|
||||
""free_hours"": ""0.50"",
|
||||
""number"": ""5523"",
|
||||
""max_eur_per_day"": ""15.00"",
|
||||
""name"": ""Lastenrad"",
|
||||
""eur_per_hour"": ""3.00""
|
||||
},
|
||||
""station"": ""WUE9301"",
|
||||
""description"": ""sigolaster Bay"",
|
||||
""lock_state"": ""locked"",
|
||||
""co2saving"" : """"
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
BikeInfoFactory.Create(bikeInfoResponse, ShareeBike.Model.Bikes.BikeInfoNS.BC.DataSource.Copri)?.State?.Value,
|
||||
Is.EqualTo(ShareeBike.Model.State.InUseStateEnum.FeedbackPending),
|
||||
"Bikes with state booking state available in ");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestReservationTimeSpan()
|
||||
{
|
||||
var response = JsonConvertRethrow.DeserializeObject<RentalDescription>(SharedBusinessLogic.Tests.Repository.Response.TestRentalDescription.RENTALDESCRIPTIONRESPONSE_A_V4_1_23_03);
|
||||
|
||||
var rentalDescription = RentalDescriptionFactory.Create(response);
|
||||
|
||||
Assert.That(rentalDescription.MaxReservationTimeSpan.TotalMinutes, Is.EqualTo(30));
|
||||
}
|
||||
}
|
||||
}
|
179
SharedBusinessLogic.Tests/Model/Connector/TestCachedQuery.cs
Normal file
179
SharedBusinessLogic.Tests/Model/Connector/TestCachedQuery.cs
Normal file
|
@ -0,0 +1,179 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Model.Services.CopriApi;
|
||||
using ShareeBike.Repository;
|
||||
using ShareeBike.Repository.Response;
|
||||
using ShareeBike.Repository.Response.Stations;
|
||||
using ShareeBike.Services.CopriApi;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Connector.Query
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestCachedQuery
|
||||
{
|
||||
private const string BIKESAVAILABLE = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""bikes"" : {},
|
||||
""response_state"" : ""OK"",
|
||||
""apiserver"" : ""https://app.tink-konstanz.de"",
|
||||
""authcookie"" : """",
|
||||
""response"" : ""bikes_available"",
|
||||
""bikes"" : {
|
||||
""2352"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9""
|
||||
}
|
||||
}
|
||||
}";
|
||||
|
||||
/// <summary>
|
||||
/// Holds the response on stations_available request.
|
||||
/// </summary>
|
||||
/// <remarks> V1: Did not hold station_type entry.</remarks>
|
||||
private const string STATIONSALLV2 = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""stations"" : {
|
||||
""9"" : {
|
||||
""station"" : ""9"",
|
||||
""bike_soll"" : ""0"",
|
||||
""bike_ist"" : ""7"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.66756"", ""longitude"": ""9.16477"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """",
|
||||
""station_type"": {
|
||||
""Cargobike"": {
|
||||
""bike_count"": ""1"",
|
||||
""bike_group"": ""ShareeBike""
|
||||
},
|
||||
""Citybike"": {
|
||||
""bike_count"": ""0"",
|
||||
""bike_group"": ""FR300103""
|
||||
}
|
||||
}
|
||||
},
|
||||
""13"" : {
|
||||
""station"" : ""13"",
|
||||
""bike_soll"" : ""4"",
|
||||
""bike_ist"" : ""1"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657756"", ""longitude"": ""9.176084"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """"
|
||||
},
|
||||
""30"" : {
|
||||
""station"" : ""30"",
|
||||
""bike_soll"" : ""5"",
|
||||
""bike_ist"" : ""0"",
|
||||
""station_group"" : [ ""ShareeBike"", ""Citybike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : ""Test für Stadtradstation""
|
||||
}
|
||||
},
|
||||
""user_group"" : [ ""Citybike"", ""ShareeBike"" ],
|
||||
""response_state"" : ""OK"",
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""response"" : ""stations_all"",
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de""
|
||||
}";
|
||||
|
||||
private const string STATIONSALLEMPTY = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""stations"" : {
|
||||
},
|
||||
""user_group"" : [ ""Citybike"", ""ShareeBike"" ],
|
||||
""response_state"" : ""OK"",
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""response"" : ""stations_all"",
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de""
|
||||
}";
|
||||
|
||||
[Test]
|
||||
public async Task TestGetStations_StationsFromCache()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
server.GetStations(false).Returns(Task.Run(() => new Result<StationsAvailableResponse>(
|
||||
typeof(CopriCallsMonkeyStore),
|
||||
JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALLV2),
|
||||
new GeneralData(),
|
||||
new System.Exception("Bang when getting stations..."))));
|
||||
|
||||
var result = await new CachedQuery(server).GetBikesAndStationsAsync();
|
||||
|
||||
Assert.That(result.Response.StationsAll.Count, Is.EqualTo(3));
|
||||
Assert.That(result.Response.StationsAll["9"].BikeGroups.AvailableCount, Is.EqualTo(1));
|
||||
Assert.That(result.Response.BikesOccupied.Count, Is.EqualTo(0));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That(result.Exception.Message, Is.EqualTo("Bang when getting stations..."));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetStations()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
server.GetStations(false).Returns(Task.Run(() => new Result<StationsAvailableResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALLV2),
|
||||
new GeneralData())));
|
||||
|
||||
var result = await new CachedQuery(server).GetBikesAndStationsAsync();
|
||||
|
||||
Assert.That(result.Response.StationsAll.Count, Is.EqualTo(3));
|
||||
Assert.That(result.Response.StationsAll["9"].BikeGroups.AvailableCount, Is.EqualTo(1));
|
||||
Assert.That(result.Response.BikesOccupied.Count, Is.EqualTo(0), "There are no reserved or occupied bikes.");
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsHttps)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAsync()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var uri = new Uri("https://MyServer.com");
|
||||
var station = "MyStation";
|
||||
var bike = "MyBike";
|
||||
|
||||
var resultBikesAv = new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE),
|
||||
new GeneralData());
|
||||
|
||||
server.GetBikesAvailable(operatorUri: uri, stationId: station, bikeId: bike).Returns(Task.Run(() => resultBikesAv));
|
||||
|
||||
var result = await new CachedQuery(server).GetBikesAsync(uri, station, bike);
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(1));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsHttps)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
|
||||
await server.Received().GetBikesAvailable(operatorUri: uri, stationId: station, bikeId: bike);
|
||||
server.Received().AddToCache(resultBikesAv, operatorUri: uri, stationId: station, bikeId: bike);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupied()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var result = await new CachedQuery(server).GetBikesOccupiedAsync();
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(0));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That("Abfrage der reservierten/ gebuchten Räder nicht möglich. Kein Benutzer angemeldet.", Is.EqualTo(result.Exception.Message));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,935 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Model.Services.CopriApi;
|
||||
using ShareeBike.Repository;
|
||||
using ShareeBike.Repository.Response;
|
||||
using ShareeBike.Repository.Response.Stations;
|
||||
using ShareeBike.Services.CopriApi;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Model.Connector
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestCachedQueryLoggedIn
|
||||
{
|
||||
/// <summary>
|
||||
/// Verifies that available bikes are not considered to by kind of MyBikes.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupiedAsyncMyBikesNone()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var bikesAvailable = JsonConvert.DeserializeObject<BikesAvailableResponse>(@"
|
||||
{
|
||||
""bikes"": {
|
||||
""FR1005"": {
|
||||
""system"": ""Sigo"",
|
||||
""state"": ""available"",
|
||||
""bike"": ""FR1005"",
|
||||
""station"": ""REN0"",
|
||||
}
|
||||
},
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var bikesOccupied = JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(@"
|
||||
{
|
||||
""bikes_occupied"": { },
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var resultAvailable = new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsHttps), // Marks that response was taken from cache
|
||||
bikesAvailable,
|
||||
new GeneralData());
|
||||
|
||||
var resultOccupied = new Result<BikesReservedOccupiedResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
bikesOccupied,
|
||||
new GeneralData());
|
||||
|
||||
server.GetBikesAvailable(false).Returns(Task.FromResult(resultAvailable));
|
||||
server.GetBikesOccupied(false).Returns(Task.FromResult(resultOccupied));
|
||||
|
||||
var query = new CachedQueryLoggedIn(
|
||||
server,
|
||||
"SessionCookie",
|
||||
"Mail",
|
||||
() => new DateTime(2022, 7, 16));
|
||||
|
||||
var bikesResponse = await query.GetBikesOccupiedAsync();
|
||||
|
||||
Assert.That(
|
||||
bikesResponse.Response.Count,
|
||||
Is.EqualTo(0));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that available bikes with Co2Saving entry set are considered to by kind of MyBikes.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupiedAsyncMyBikesOneFeedbackPending()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var bikesAvailable = JsonConvert.DeserializeObject<BikesAvailableResponse>(@"
|
||||
{
|
||||
""bikes"": {
|
||||
""FR1005"": {
|
||||
""system"": ""Sigo"",
|
||||
""state"": ""available"",
|
||||
""bike"": ""FR1005"",
|
||||
""station"": ""REN0"",
|
||||
""co2saving"" : """"
|
||||
}
|
||||
},
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var bikesOccupied = JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(@"
|
||||
{
|
||||
""bikes_occupied"": { },
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var resultAvailable = new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
bikesAvailable,
|
||||
new GeneralData());
|
||||
|
||||
var resultOccupied = new Result<BikesReservedOccupiedResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
bikesOccupied,
|
||||
new GeneralData());
|
||||
|
||||
server.GetBikesAvailable(false).Returns(Task.FromResult(resultAvailable));
|
||||
server.GetBikesOccupied(false).Returns(Task.FromResult(resultOccupied));
|
||||
|
||||
var query = new CachedQueryLoggedIn(
|
||||
server,
|
||||
"SessionCookie",
|
||||
"Mail",
|
||||
() => new DateTime(2022, 7, 16));
|
||||
|
||||
var bikesResponse = await query.GetBikesOccupiedAsync();
|
||||
|
||||
Assert.That(
|
||||
bikesResponse.Response.Count,
|
||||
Is.EqualTo(1));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// .
|
||||
/// </summary>
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupiedAsyncMyBikesOneOccupied()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var bikesAvailable = JsonConvert.DeserializeObject<BikesAvailableResponse>(@"
|
||||
{
|
||||
""bikes"": { },
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var bikesOccupied = JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(@"
|
||||
{
|
||||
""bikes_occupied"": {
|
||||
""FR1005"": {
|
||||
""lock_state"": ""occupied"",
|
||||
""system"": ""Sigo"",
|
||||
""state"": ""occupied"",
|
||||
""bike"": ""FR1005"",
|
||||
""station"": ""REN0"",
|
||||
}
|
||||
},
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var resultAvailable = new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
bikesAvailable,
|
||||
new GeneralData());
|
||||
|
||||
var resultOccupied = new Result<BikesReservedOccupiedResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
bikesOccupied,
|
||||
new GeneralData());
|
||||
|
||||
server.GetBikesAvailable(false).Returns(Task.FromResult(resultAvailable)); // Get bikes from copri
|
||||
server.GetBikesOccupied(false).Returns(Task.FromResult(resultOccupied)); // Get bikes from cache
|
||||
|
||||
var query = new CachedQueryLoggedIn(
|
||||
server,
|
||||
"SessionCookie",
|
||||
"Mail",
|
||||
() => new DateTime(2022, 7, 16));
|
||||
|
||||
var bikesResponse = await query.GetBikesOccupiedAsync();
|
||||
|
||||
Assert.That(
|
||||
bikesResponse.Response.Count,
|
||||
Is.EqualTo(1));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Scenario: Call of GetBikesAvailable fails data is taken from cache.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupiedAsyncGetAvailableFailsMyBikeOneFeedbackPending()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var bikesAvailable = JsonConvert.DeserializeObject<BikesAvailableResponse>(@"
|
||||
{
|
||||
""bikes"": {
|
||||
""FR1005"": {
|
||||
""system"": ""Sigo"",
|
||||
""state"": ""available"",
|
||||
""bike"": ""FR1005"",
|
||||
""station"": ""REN0"",
|
||||
""co2saving"" : """"
|
||||
}
|
||||
},
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var bikesOccupied = JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(@"
|
||||
{
|
||||
""bikes_occupied"": { },
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var resultAvailable = new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsMonkeyStore),
|
||||
bikesAvailable,
|
||||
new GeneralData());
|
||||
|
||||
var resultOccupied = new Result<BikesReservedOccupiedResponse>(
|
||||
typeof(CopriCallsMonkeyStore),
|
||||
bikesOccupied,
|
||||
new GeneralData());
|
||||
|
||||
server.GetBikesAvailable(false).Returns(Task.FromResult(resultAvailable));
|
||||
server.GetBikesOccupied(true).Returns(Task.FromResult(resultOccupied));
|
||||
|
||||
var query = new CachedQueryLoggedIn(
|
||||
server,
|
||||
"SessionCookie",
|
||||
"Mail",
|
||||
() => new DateTime(2022, 7, 16));
|
||||
|
||||
var bikesResponse = await query.GetBikesOccupiedAsync();
|
||||
|
||||
Assert.That(
|
||||
bikesResponse.Response.Count,
|
||||
Is.EqualTo(1));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Scenario: Call of GetBikesAvailable succeeds but because call of GetBikesOccupied fails data is taken from cache.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupiedAsyncGetGetBikesOccupiedFailsMyBikeFeedbackPending()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var bikesAvailableCopri = JsonConvert.DeserializeObject<BikesAvailableResponse>(@"
|
||||
{
|
||||
""bikes"": { },
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var bikesAvailableCache = JsonConvert.DeserializeObject<BikesAvailableResponse>(@"
|
||||
{
|
||||
""bikes"": {
|
||||
""FR1005"": {
|
||||
""system"": ""Sigo"",
|
||||
""state"": ""available"",
|
||||
""bike"": ""FR1005"",
|
||||
""station"": ""REN0"",
|
||||
""co2saving"" : """"
|
||||
}
|
||||
},
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var bikesOccupied = JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(@"
|
||||
{
|
||||
""bikes_occupied"": { },
|
||||
""copri_version"": ""4.1.12.5"",
|
||||
}");
|
||||
|
||||
var resultAvailableCopri = new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsHttps), // Marks that response was taken from copri
|
||||
bikesAvailableCache,
|
||||
new GeneralData());
|
||||
|
||||
var resultAvailableCache = new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsMonkeyStore), // Marks that response was taken from cache
|
||||
bikesAvailableCache,
|
||||
new GeneralData());
|
||||
|
||||
var resultOccupied = new Result<BikesReservedOccupiedResponse>(
|
||||
typeof(CopriCallsMonkeyStore),
|
||||
bikesOccupied,
|
||||
new GeneralData());
|
||||
|
||||
server.GetBikesAvailable(false).Returns(Task.FromResult(resultAvailableCopri)); // Get bikes from copri
|
||||
server.GetBikesOccupied(false).Returns(Task.FromResult(resultOccupied)); // Get bikes from copri fails
|
||||
server.GetBikesAvailable(true).Returns(Task.FromResult(resultAvailableCache)); // Get bikes from cache
|
||||
|
||||
var query = new CachedQueryLoggedIn(
|
||||
server,
|
||||
"SessionCookie",
|
||||
"Mail",
|
||||
() => new DateTime(2022, 7, 16));
|
||||
|
||||
var bikesResponse = await query.GetBikesOccupiedAsync();
|
||||
|
||||
Assert.That(
|
||||
bikesResponse.Response.Count,
|
||||
Is.EqualTo(1));
|
||||
}
|
||||
|
||||
private const string BIKESAVAILABLE = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""bikes"" : {},
|
||||
""response_state"" : ""OK"",
|
||||
""apiserver"" : ""https://app.tink-konstanz.de"",
|
||||
""authcookie"" : """",
|
||||
""response"" : ""bikes_available"",
|
||||
""bikes"" : {
|
||||
""2352"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9""
|
||||
}
|
||||
}
|
||||
}";
|
||||
|
||||
private const string BIKESAVAILABLE2 = @"{
|
||||
""lang"" : ""de"",
|
||||
""user_group"" : [
|
||||
""FR300103"",
|
||||
""FR300101""
|
||||
],
|
||||
""uri_primary"" : ""https://shareeapp-primary.copri.eu"",
|
||||
""bikes_occupied"" : {
|
||||
""160317"" : {
|
||||
""station"" : ""FR101"",
|
||||
""bike_type"" : {
|
||||
""category"" : ""cargo"",
|
||||
""wheels"" : ""2""
|
||||
},
|
||||
""rental_minute_all"" : 2666,
|
||||
""description"" : ""Lastenrad Oliver Pieper"",
|
||||
""unit_price"" : ""2.00"",
|
||||
""end_time"" : ""2023-10-29 12:03:28"",
|
||||
""total_price"" : ""0.00"",
|
||||
""K_u"" : ""[72, 41, 3, -121, -121, -40, -125, -92, -70, -78, -12, -73, 11, -31, 108, 63, -22, 28, -73, 35, 0, 0, 0, 0]"",
|
||||
""real_clock"" : ""1 day 20:26"",
|
||||
""rentalog"" : """",
|
||||
""bike"" : ""FR1011"",
|
||||
""gps"" : {
|
||||
""latitude"" : ""47.9765599546954"",
|
||||
""longitude"" : ""7.82557798549533""
|
||||
},
|
||||
""request_time"" : ""2023-10-27 15:37:16.296418+02"",
|
||||
""aa_ride"" : ""0"",
|
||||
""state"" : ""occupied"",
|
||||
""lock_state"" : ""unlocked"",
|
||||
""K_seed"" : ""[-77, 79, -81, -34, 107, -34, -100, -29, 124, 30, -50, -63, -111, 0, 22, -19]"",
|
||||
""Ilockit_ID"" : ""ISHAREIT-2200536"",
|
||||
""system"" : ""Ilockit"",
|
||||
""computed_hours"" : ""44.1"",
|
||||
""freed_time"" : ""- 00:20"",
|
||||
""bike_group"" : [
|
||||
""FR300101""
|
||||
],
|
||||
""start_time"" : ""2023-10-27 15:37:24.371987+02"",
|
||||
""rental_description"" : {
|
||||
""tarif_elements"" : {
|
||||
""4"" : [
|
||||
""Max. Gebühr"",
|
||||
""24,00 € / 24 Std""
|
||||
],
|
||||
""1"" : [
|
||||
""Mietgebühr"",
|
||||
""2,00 € / 30 Min ""
|
||||
],
|
||||
""7"" : [
|
||||
""Aktuelle Mietzeit"",
|
||||
""1 Tag 20 Std 26 Min ""
|
||||
],
|
||||
""2"" : [
|
||||
""ab 2. Tag"",
|
||||
""3,00 € / 30 Min ""
|
||||
],
|
||||
""6"" : [
|
||||
""Gratis Mietzeit"",
|
||||
""20 Min / Tag""
|
||||
]
|
||||
},
|
||||
""reserve_timerange"" : ""15"",
|
||||
""name"" : ""E-Lastenrad private"",
|
||||
""id"" : ""5533""
|
||||
},
|
||||
""discount"" : ""-100%"",
|
||||
""uri_operator"" : ""https://shareeapp-fr01.copri.eu""
|
||||
}
|
||||
},
|
||||
""bike_info_html"" : ""site/bike_info_sharee_230922.html"",
|
||||
""agb_checked"" : ""1"",
|
||||
""user_tour"" : [],
|
||||
""last_used_operator"" : {
|
||||
""operator_name"" : ""TeilRad GmbH"",
|
||||
""operator_phone"" : ""+49 761 45370097"",
|
||||
""operator_email"" : ""hotline@sharee.bike"",
|
||||
""operator_hours"" : ""Bürozeiten: Montag, Mittwoch, Freitag 9-12 Uhr""
|
||||
},
|
||||
""user_id"" : ""ohauff@posteo.de"",
|
||||
""impress_html"" : ""site/impress_1.html"",
|
||||
""authcookie"" : ""5781_f172cf59108fe53e7524c841847fee69_shoo0faiNg"",
|
||||
""faq_app_fullurl"" : ""https://sharee.bike/faq/fahrrad-nutzung"",
|
||||
""tariff_info_html"" : ""site/tarif_info_sharee_230922.html"",
|
||||
""agb_html"" : ""site/agb_sharee_2.html"",
|
||||
""response"" : ""bikes_available"",
|
||||
""bikes"" : {
|
||||
""FR1545"" : {
|
||||
""Ilockit_GUID"" : ""00000000-0000-0000-0000-e38bf9d32234"",
|
||||
""description"" : ""C2-02-00545"",
|
||||
""lock_state"" : ""locked"",
|
||||
""system"" : ""Ilockit"",
|
||||
""Ilockit_ID"" : ""ISHAREIT-2200545"",
|
||||
""state"" : ""available"",
|
||||
""aa_ride"" : ""0"",
|
||||
""smartlock_type"" : {
|
||||
""battery"" : {
|
||||
""charge_current_percent"" : ""100""
|
||||
},
|
||||
""engine"" : {
|
||||
""manufacturer"" : ""Ilockit""
|
||||
}
|
||||
},
|
||||
""bike_type"" : {
|
||||
""battery"" : {
|
||||
""charge_max_bars"" : ""5"",
|
||||
""charge_current_bars"" : ""0"",
|
||||
""charge_current_percent"" : ""0"",
|
||||
""hidden"" : ""0"",
|
||||
""backend_accessible"" : ""0""
|
||||
},
|
||||
""engine"" : {
|
||||
""manufacturer"" : ""dummy""
|
||||
},
|
||||
""category"" : ""cargo"",
|
||||
""wheels"" : ""2""
|
||||
},
|
||||
""station"" : ""FR101"",
|
||||
""uri_operator"" : ""https://shareeapp-fr01.copri.eu"",
|
||||
""gps"" : {
|
||||
""latitude"" : ""47.9767844"",
|
||||
""longitude"" : ""7.8258182""
|
||||
},
|
||||
""bike"" : ""FR1545"",
|
||||
""bike_group"" : [
|
||||
""FR300101""
|
||||
],
|
||||
""authed"" : ""1"",
|
||||
""rental_description"" : {
|
||||
""id"" : ""5533"",
|
||||
""reserve_timerange"" : ""15"",
|
||||
""name"" : ""E-Lastenrad private"",
|
||||
""tarif_type"" : ""3"",
|
||||
""tarif_elements"" : {
|
||||
""6"" : [
|
||||
""Gratis Mietzeit"",
|
||||
""20 Min / Tag""
|
||||
],
|
||||
""2"" : [
|
||||
""ab 2. Tag"",
|
||||
""3,00 € / 30 Min ""
|
||||
],
|
||||
""4"" : [
|
||||
""Max. Gebühr"",
|
||||
""24,00 € / 24 Std""
|
||||
],
|
||||
""1"" : [
|
||||
""Mietgebühr"",
|
||||
""2,00 € / 30 Min ""
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
""FR1012"" : {
|
||||
""uri_operator"" : ""https://shareeapp-fr01.copri.eu"",
|
||||
""bike"" : ""FR1012"",
|
||||
""gps"" : {
|
||||
""latitude"" : ""47.998034725897"",
|
||||
""longitude"" : ""7.78498157858849""
|
||||
},
|
||||
""bike_group"" : [
|
||||
""FR300101""
|
||||
],
|
||||
""rental_description"" : {
|
||||
""rental_info"" : {
|
||||
""1"" : [
|
||||
""Tracking"",
|
||||
""Ich stimme der Speicherung (Tracking) meiner Fahrstrecke zwecks wissenschaftlicher Auswertung und Berechnung der CO2-Einsparung zu!""
|
||||
]
|
||||
},
|
||||
""tarif_elements"" : {
|
||||
""1"" : [
|
||||
""Mietgebühr"",
|
||||
""2,00 € / 30 Min ""
|
||||
],
|
||||
""4"" : [
|
||||
""Max. Gebühr"",
|
||||
""24,00 € / 24 Std""
|
||||
],
|
||||
""6"" : [
|
||||
""Gratis Mietzeit"",
|
||||
""20 Min / Tag""
|
||||
],
|
||||
""2"" : [
|
||||
""ab 2. Tag"",
|
||||
""3,00 € / 30 Min ""
|
||||
]
|
||||
},
|
||||
""reserve_timerange"" : ""15"",
|
||||
""name"" : ""E-Lastenrad private"",
|
||||
""id"" : ""5533"",
|
||||
""tarif_type"" : ""3""
|
||||
},
|
||||
""authed"" : ""1"",
|
||||
""description"" : ""Contributor-bike devel"",
|
||||
""Ilockit_GUID"" : ""00000000-0000-0000-0000-ef6655036de7"",
|
||||
""lock_state"" : ""locked"",
|
||||
""system"" : ""Ilockit"",
|
||||
""Ilockit_ID"" : ""ISHAREIT-2309492"",
|
||||
""state"" : ""available"",
|
||||
""bike_type"" : {
|
||||
""engine"" : {
|
||||
""manufacturer"" : ""dummy""
|
||||
},
|
||||
""battery"" : {
|
||||
""charge_current_bars"" : ""5"",
|
||||
""charge_max_bars"" : ""5"",
|
||||
""backend_accessible"" : ""0"",
|
||||
""charge_current_percent"" : ""100"",
|
||||
""hidden"" : ""0""
|
||||
},
|
||||
""category"" : ""cargo"",
|
||||
""wheels"" : ""2""
|
||||
},
|
||||
""smartlock_type"" : {
|
||||
""engine"" : {
|
||||
""manufacturer"" : ""Ilockit""
|
||||
},
|
||||
""battery"" : {
|
||||
""charge_current_percent"" : """"
|
||||
}
|
||||
},
|
||||
""aa_ride"" : ""0"",
|
||||
""station"" : ""FR103""
|
||||
},
|
||||
},
|
||||
""aowner"" : ""186"",
|
||||
""init_map"" : {
|
||||
""radius"" : ""2.9"",
|
||||
""center"" : {
|
||||
""longitude"" : ""7.825490"",
|
||||
""latitude"" : ""47.976634""
|
||||
}
|
||||
},
|
||||
""new_authcoo"" : ""0"",
|
||||
""apiserver"" : ""https://shareeapp-fr01.copri.eu"",
|
||||
""merchant_id"" : ""shoo0faiNg"",
|
||||
""privacy_html"" : ""site/privacy_sharee_2.html"",
|
||||
""response_state"" : ""OK, nothing todo"",
|
||||
""debuglevel"" : ""104"",
|
||||
""clearing_cache"" : ""0"",
|
||||
""copri_version"" : ""4.1.23.20"",
|
||||
""project_id"" : ""Freiburg""
|
||||
}";
|
||||
|
||||
private const string BIKESAVAILABLEEMPTY = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""bikes"" : {},
|
||||
""response_state"" : ""OK"",
|
||||
""apiserver"" : ""https://app.tink-konstanz.de"",
|
||||
""authcookie"" : """",
|
||||
""response"" : ""bikes_available"",
|
||||
""bikes"" : {
|
||||
}
|
||||
}";
|
||||
|
||||
private const string BIKESOCCUPIED = @"{
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""user_group"" : [ ""ShareeBike"" ],
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""response"" : ""user_bikes_occupied"",
|
||||
""response_state"" : ""OK"",
|
||||
""response_text"" : ""Die Liste der reservierten und gebuchten Fahrräder wurde erfolgreich geladen"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de"",
|
||||
""bikes_occupied"" : {
|
||||
""89004"" : {
|
||||
""start_time"" : ""2018-01-27 17:33:00.989464+01"",
|
||||
""station"" : ""9"",
|
||||
""unit_price"" : ""2.00"",
|
||||
""tariff_description"": {
|
||||
""free_hours"" : ""0.5"",
|
||||
""name"" : ""ShareeBike Tarif"",
|
||||
""max_eur_per_day"" : ""9.00""
|
||||
},
|
||||
""timeCode"" : ""2061"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""bike"" : ""4"",
|
||||
""total_price"" : ""20.00"",
|
||||
""state"" : ""requested"",
|
||||
""real_hours"" : ""66.05"",
|
||||
""bike_group"" : [ ""ShareeBike"" ],
|
||||
""now_time"" : ""2018-01-30 11:36:45"",
|
||||
""request_time"" : ""2018-01-27 17:33:00.989464+01"",
|
||||
""computed_hours"" : ""10.0""
|
||||
}
|
||||
}
|
||||
}";
|
||||
|
||||
private const string STATIONSALL = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""stations"" : {
|
||||
""5"" : {
|
||||
""station"" : ""5"",
|
||||
""bike_soll"" : ""0"",
|
||||
""bike_ist"" : ""7"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.66756"", ""longitude"": ""9.16477"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """"
|
||||
},
|
||||
""13"" : {
|
||||
""station"" : ""13"",
|
||||
""bike_soll"" : ""4"",
|
||||
""bike_ist"" : ""1"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657756"", ""longitude"": ""9.176084"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """"
|
||||
},
|
||||
""30"" : {
|
||||
""station"" : ""30"",
|
||||
""bike_soll"" : ""5"",
|
||||
""bike_ist"" : ""0"",
|
||||
""station_group"" : [ ""ShareeBike"", ""Citybike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : ""Test für Stadtradstation""
|
||||
}
|
||||
},
|
||||
""user_group"" : [ ""Citybike"", ""ShareeBike"" ],
|
||||
""response_state"" : ""OK"",
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""response"" : ""stations_all"",
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de""
|
||||
}";
|
||||
|
||||
/// <summary>
|
||||
/// Response updated (manually edited) combining JSON form responses <see cref="STATIONSALL"/> and <see cref="BIKESOCCUPIED"/>
|
||||
/// </summary>
|
||||
private const string STATIONSALLV2 = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""stations"" : {
|
||||
""5"" : {
|
||||
""station"" : ""5"",
|
||||
""bike_soll"" : ""0"",
|
||||
""bike_ist"" : ""7"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.66756"", ""longitude"": ""9.16477"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """"
|
||||
},
|
||||
""13"" : {
|
||||
""station"" : ""13"",
|
||||
""bike_soll"" : ""4"",
|
||||
""bike_ist"" : ""1"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657756"", ""longitude"": ""9.176084"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """"
|
||||
},
|
||||
""30"" : {
|
||||
""station"" : ""30"",
|
||||
""bike_soll"" : ""5"",
|
||||
""bike_ist"" : ""0"",
|
||||
""station_group"" : [ ""ShareeBike"", ""Citybike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : ""Test für Stadtradstation""
|
||||
}
|
||||
},
|
||||
""bikes_occupied"" : {
|
||||
""89004"" : {
|
||||
""start_time"" : ""2018-01-27 17:33:00.989464+01"",
|
||||
""station"" : ""9"",
|
||||
""unit_price"" : ""2.00"",
|
||||
""tariff_description"": {
|
||||
""free_hours"" : ""0.5"",
|
||||
""name"" : ""ShareeBike Tarif"",
|
||||
""max_eur_per_day"" : ""9.00""
|
||||
},
|
||||
""timeCode"" : ""2061"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""bike"" : ""4"",
|
||||
""total_price"" : ""20.00"",
|
||||
""state"" : ""requested"",
|
||||
""real_hours"" : ""66.05"",
|
||||
""bike_group"" : [ ""ShareeBike"" ],
|
||||
""now_time"" : ""2018-01-30 11:36:45"",
|
||||
""request_time"" : ""2018-01-27 17:33:00.989464+01"",
|
||||
""computed_hours"" : ""10.0""
|
||||
}
|
||||
},
|
||||
|
||||
""user_group"" : [ ""Citybike"", ""ShareeBike"" ],
|
||||
""response_state"" : ""OK"",
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""response"" : ""stations_all"",
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de""
|
||||
}";
|
||||
|
||||
private const string STATIONSALLEMPTY = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""stations"" : {
|
||||
},
|
||||
""user_group"" : [ ""Citybike"", ""ShareeBike"" ],
|
||||
""response_state"" : ""OK"",
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""response"" : ""stations_all"",
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de""
|
||||
}";
|
||||
|
||||
[Test]
|
||||
public async Task TestGetStations_StationsFromCache()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
server.GetStations(false).Returns(Task.Run(() => new Result<StationsAvailableResponse>(
|
||||
typeof(CopriCallsMonkeyStore),
|
||||
JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALLV2),
|
||||
new GeneralData(),
|
||||
new Exception("Bang when getting stations..."))));
|
||||
|
||||
var result = await new CachedQueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAndStationsAsync();
|
||||
|
||||
Assert.That(result.Response.StationsAll.Count, Is.EqualTo(3));
|
||||
Assert.That(result.Response.BikesOccupied.Count, Is.EqualTo(1));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That(result.Exception.Message, Is.EqualTo("Bang when getting stations..."));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetStations()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
server.GetStations(false).Returns(Task.Run(() => new Result<StationsAvailableResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALLV2),
|
||||
new GeneralData())));
|
||||
|
||||
var result = await new CachedQueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAndStationsAsync();
|
||||
|
||||
Assert.That(result.Response.StationsAll.Count, Is.EqualTo(3));
|
||||
Assert.That(result.Response.BikesOccupied.Count, Is.EqualTo(1));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsHttps)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAsync_BikesAvailableFromCache()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
server.GetBikesAvailable().Returns(Task.Run(() => new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsMonkeyStore),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE),
|
||||
new GeneralData(),
|
||||
new Exception("Bang, bikes avail..."))));
|
||||
|
||||
server.GetBikesOccupied(true).Returns(Task.Run(() => new Result<BikesReservedOccupiedResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED),
|
||||
new GeneralData())));
|
||||
|
||||
var result = await new CachedQueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAsync();
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(2));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That(result.Exception.Message, Is.EqualTo("Bang, bikes avail..."));
|
||||
|
||||
await server.Received().GetBikesAvailable();
|
||||
await server.Received().GetBikesOccupied(true);
|
||||
|
||||
server.DidNotReceive().AddToCache(Arg.Any<Result<BikesAvailableResponse>>());
|
||||
server.DidNotReceive().AddToCache(Arg.Any<Result<BikesReservedOccupiedResponse>>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAsync_BikesOccupiedFromCache()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
server.GetBikesAvailable(false).Returns(Task.Run(() => new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLEEMPTY),
|
||||
new GeneralData())));
|
||||
|
||||
server.GetBikesOccupied(false).Returns(Task.Run(() => new Result<BikesReservedOccupiedResponse>(
|
||||
typeof(CopriCallsMonkeyStore),
|
||||
JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED),
|
||||
new GeneralData(),
|
||||
new Exception("Bang, error bikes occupied"))));
|
||||
|
||||
server.GetBikesAvailable(true).Returns(Task.Run(() => new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsMonkeyStore),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE),
|
||||
new GeneralData())));
|
||||
|
||||
var result = await new CachedQueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAsync();
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(2));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That(result.Exception.Message, Is.EqualTo("Bang, error bikes occupied"));
|
||||
|
||||
await server.Received().GetBikesAvailable();
|
||||
await server.Received().GetBikesOccupied();
|
||||
|
||||
server.DidNotReceive().AddToCache(Arg.Any<Result<BikesAvailableResponse>>());
|
||||
server.DidNotReceive().AddToCache(Arg.Any< Result<BikesReservedOccupiedResponse>>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAsync([Values("", "MyBike")] string bikeFilter)
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var resultBikesAvailableResponse = new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE),
|
||||
new GeneralData());
|
||||
|
||||
var resultBikesOccupiedResponse = new Result<BikesReservedOccupiedResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED),
|
||||
new GeneralData());
|
||||
|
||||
server.GetBikesAvailable(bikeId: bikeFilter).Returns(Task.Run(() => resultBikesAvailableResponse));
|
||||
|
||||
server.GetBikesOccupied().Returns(Task.Run(() => resultBikesOccupiedResponse));
|
||||
|
||||
var result = await new CachedQueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAsync(bikeId: bikeFilter);
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(2));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsHttps)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
|
||||
await server.Received().GetBikesAvailable(bikeId: bikeFilter);
|
||||
await server.Received().GetBikesOccupied();
|
||||
server.Received().AddToCache(resultBikesAvailableResponse, bikeId: bikeFilter);
|
||||
server.Received().AddToCache(resultBikesOccupiedResponse);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupied()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
server.GetBikesAvailable().Returns(Task.Run(() => new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>("{}"),
|
||||
new GeneralData())));
|
||||
|
||||
server.GetBikesOccupied().Returns(Task.Run(() => new Result<BikesReservedOccupiedResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED),
|
||||
new GeneralData())));
|
||||
|
||||
var result = await new CachedQueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesOccupiedAsync();
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(1));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsHttps)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAsyncOperatorUri()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var resultBikesAvailableResponse = new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE2),
|
||||
new GeneralData());
|
||||
|
||||
var uri = new Uri("https://shareeapp-fr01.copri.eu//APIjsonserver");
|
||||
var station = "StationX";
|
||||
|
||||
server.GetBikesAvailable(operatorUri: Arg.Any<Uri>(), stationId: station).Returns(Task.Run(() => resultBikesAvailableResponse));
|
||||
|
||||
var result = await new CachedQueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAsync(uri, station);
|
||||
|
||||
await server.DidNotReceive().GetBikesOccupied();
|
||||
await server.DidNotReceive().GetBikesOccupied(Arg.Any<bool>());
|
||||
server.Received().AddToCache(Arg.Any<Result<BikesAvailableResponse>>(), Arg.Any<Uri>(), station);
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(3));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsHttps)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
|
||||
await server.Received().GetBikesAvailable(operatorUri: uri, stationId: station);
|
||||
server.Received().AddToCache(resultBikesAvailableResponse, operatorUri: uri, stationId: station);
|
||||
await server.DidNotReceive().GetBikesOccupied();
|
||||
server.DidNotReceive().AddToCache(Arg.Any<Result<BikesReservedOccupiedResponse>>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAsyncOperatorUriCache()
|
||||
{
|
||||
var server = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var uri = new Uri("https://shareeapp-fr01.copri.eu//APIjsonserver");
|
||||
|
||||
server.GetBikesAvailable(operatorUri: Arg.Any<Uri>()).Returns(Task.Run(() => new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsMonkeyStore),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE2),
|
||||
new GeneralData())));
|
||||
|
||||
var result = await new CachedQueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAsync(uri);
|
||||
|
||||
await server.Received().GetBikesAvailable(operatorUri: uri);
|
||||
await server.DidNotReceive().GetBikesOccupied();
|
||||
await server.DidNotReceive().GetBikesOccupied(Arg.Any<bool>());
|
||||
server.DidNotReceive().AddToCache(Arg.Any<Result<BikesAvailableResponse>>(), Arg.Any<Uri>());
|
||||
server.DidNotReceive().AddToCache(Arg.Any<Result<BikesReservedOccupiedResponse>>());
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(3));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
}
|
||||
}
|
||||
}
|
163
SharedBusinessLogic.Tests/Model/Connector/TestCachetimings.cs
Normal file
163
SharedBusinessLogic.Tests/Model/Connector/TestCachetimings.cs
Normal file
|
@ -0,0 +1,163 @@
|
|||
using System;
|
||||
using MonkeyCache.FileStore;
|
||||
using NUnit.Framework;
|
||||
using Serilog;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Model.Services.CopriApi.ServerUris;
|
||||
using ShareeBike.Repository;
|
||||
using UITest.Fixtures.Connector;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.Misc
|
||||
{
|
||||
[TestFixture]
|
||||
[Category(TestCopriCallsHttps.CATEGORY_REQUIRESCOPRI)]
|
||||
public class TestCachetimings
|
||||
{
|
||||
[Test]
|
||||
#if !NOLIVESERVER
|
||||
[Explicit("Run with care because this stress impact live system.")]
|
||||
//[Category(TestCopriCallsHttps.CATEGORY_USESLIVESERVER)]
|
||||
#elif !NODEVELSERVER
|
||||
[Category(TestCopriCallsHttps.CATEGORY_USESDEVELSERVER)]
|
||||
#endif
|
||||
public void TestCachedQuery_GetStationsAll(
|
||||
#if NOLIVESERVER
|
||||
[Values(CopriServerUriList.SHAREE_DEVEL)] string url,
|
||||
#elif NODEVELSERVER
|
||||
[Values(CopriServerUriList.SHAREE_LIVE)] string url,
|
||||
#else
|
||||
[Values(CopriServerUriList.SHAREE_DEVEL, CopriServerUriList.SHAREE_LIVE)] string url,
|
||||
#endif
|
||||
[Values(";", "6103_4da3044c8657a04ba60e2eaa753bc51a_;javaminister@gmail.com")] string cookieAndMail)
|
||||
{
|
||||
Barrel.ApplicationId = GetType().Name + nameof(TestCachedQuery_GetStationsAll);
|
||||
|
||||
Log.Logger = new LoggerConfiguration()
|
||||
.MinimumLevel.ControlledBy(new Serilog.Core.LoggingLevelSwitch(Serilog.Events.LogEventLevel.Error))
|
||||
.WriteTo.Debug()
|
||||
.CreateLogger();
|
||||
|
||||
var connector = ConnectorFactory.Create(
|
||||
true, // Is connected
|
||||
new Uri(url),
|
||||
new AppContextInfo("oiF2kahH" + nameof(TestCachedQuery_GetStationsAll), "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
cookieAndMail.Split(';')[0],
|
||||
cookieAndMail.Split(';')[1],
|
||||
expiresAfter: TimeSpan.FromSeconds(3)); // See task #97 for need of custom expiresAfter value.
|
||||
|
||||
var start = DateTime.Now;
|
||||
|
||||
var queryIndex = 1;
|
||||
while (DateTime.Now.Subtract(start).TotalSeconds < 60)
|
||||
{
|
||||
Log.ForContext<TestCachetimings>().Information($"Query #{queryIndex}");
|
||||
|
||||
var result = connector.Query.GetBikesAndStationsAsync().Result;
|
||||
Assert.That(result.Exception, Is.Null, $"Exception message: {result.Exception?.Message}");
|
||||
|
||||
queryIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
/// <remarks>
|
||||
/// From COPRI version v4.1 switched from ShareeBike devel https://tinkwwp.copri-bike.de/APIjsonserver to sharee devel https://shareeapp-primary.copri-bike.de/APIjsonserver
|
||||
/// </summary>
|
||||
/// <param name="uri"></param>
|
||||
/// <param name="cookieAndMail"></param>
|
||||
[Test]
|
||||
#if !NOLIVESERVER
|
||||
[Explicit("Run with care because this stress impact live system.")]
|
||||
//[Category(TestCopriCallsHttps.CATEGORY_USESLIVESERVER)]
|
||||
#elif !NODEVELSERVER
|
||||
[Category(TestCopriCallsHttps.CATEGORY_USESDEVELSERVER)]
|
||||
#endif
|
||||
public void TestCachedQuery_GetBikes(
|
||||
#if NOLIVESERVER
|
||||
[Values(CopriServerUriList.SHAREE_DEVEL)] string url,
|
||||
#elif NODEVELSERVER
|
||||
[Values(CopriServerUriList.SHAREE_LIVE)] string url,
|
||||
#else
|
||||
[Values(CopriServerUriList.SHAREE_DEVEL, CopriServerUriList.SHAREE_LIVE)] string url,
|
||||
#endif
|
||||
[Values(";", "6103_4da3044c8657a04ba60e2eaa753bc51a_;javaminister@gmail.com")] string cookieAndMail)
|
||||
{
|
||||
Barrel.ApplicationId = GetType().Name + nameof(TestCachedQuery_GetBikes);
|
||||
|
||||
Log.Logger = new LoggerConfiguration()
|
||||
.MinimumLevel.ControlledBy(new Serilog.Core.LoggingLevelSwitch(Serilog.Events.LogEventLevel.Error))
|
||||
.WriteTo.Debug()
|
||||
.CreateLogger();
|
||||
|
||||
var connector = ConnectorFactory.Create(
|
||||
true, // Is connected
|
||||
new Uri(url),
|
||||
new AppContextInfo("oiF2kahH" + nameof(TestCachedQuery_GetBikes), "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
cookieAndMail.Split(';')[0],
|
||||
cookieAndMail.Split(';')[1],
|
||||
expiresAfter: TimeSpan.FromSeconds(3)); // See task #97 for need of custom expiresAfter value.
|
||||
|
||||
var start = DateTime.Now;
|
||||
|
||||
var queryIndex = 1;
|
||||
while (DateTime.Now.Subtract(start).TotalSeconds < 60)
|
||||
{
|
||||
Log.ForContext<TestCachetimings>().Information($"Query #{queryIndex}");
|
||||
|
||||
var result = connector.Query.GetBikesAsync().Result;
|
||||
Assert.That(result.Exception, Is.Null, $"Exception message: {result.Exception?.Message}");
|
||||
|
||||
queryIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
#if !NOLIVESERVER
|
||||
[Explicit("Run with care because this stress impact live system.")]
|
||||
//[Category(TestCopriCallsHttps.CATEGORY_USESLIVESERVER)]
|
||||
#elif !NODEVELSERVER
|
||||
[Category(TestCopriCallsHttps.CATEGORY_USESDEVELSERVER)]
|
||||
#endif
|
||||
public void TestCachedQuery_GetBikesOccupied(
|
||||
#if NOLIVESERVER
|
||||
[Values(CopriServerUriList.SHAREE_DEVEL)] string url,
|
||||
#elif NODEVELSERVER
|
||||
[Values(CopriServerUriList.SHAREE_LIVE)] string url,
|
||||
#else
|
||||
[Values(CopriServerUriList.SHAREE_DEVEL, CopriServerUriList.SHAREE_LIVE)] string url,
|
||||
#endif
|
||||
[Values("6103_4da3044c8657a04ba60e2eaa753bc51a_;javaminister@gmail.com")] string cookieAndMail)
|
||||
{
|
||||
Barrel.ApplicationId = GetType().Name + nameof(TestCachedQuery_GetBikes);
|
||||
|
||||
Log.Logger = new LoggerConfiguration()
|
||||
.MinimumLevel.ControlledBy(new Serilog.Core.LoggingLevelSwitch(Serilog.Events.LogEventLevel.Verbose))
|
||||
.WriteTo.Debug()
|
||||
.WriteTo.File($"Log{nameof(TestCachedQuery_GetBikes)}.log")
|
||||
.CreateLogger();
|
||||
|
||||
var connector = ConnectorFactory.Create(
|
||||
true, // Is connected
|
||||
new Uri(url),
|
||||
new AppContextInfo("oiF2kahH" + nameof(TestCachedQuery_GetBikesOccupied), "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
cookieAndMail.Split(';')[0],
|
||||
cookieAndMail.Split(';')[1],
|
||||
expiresAfter: TimeSpan.FromSeconds(3)); // See task #97 for need of custom expiresAfter value.
|
||||
|
||||
var start = DateTime.Now;
|
||||
|
||||
var queryIndex = 1;
|
||||
while (DateTime.Now.Subtract(start).TotalSeconds < 60)
|
||||
{
|
||||
Log.ForContext<TestCachetimings>().Information($"Query #{queryIndex}");
|
||||
|
||||
var result = connector.Query.GetBikesOccupiedAsync().Result;
|
||||
Assert.That(result.Exception, Is.Null, $"Exception message: {result.Exception?.Message}");
|
||||
|
||||
queryIndex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using NSubstitute;
|
||||
using NSubstitute.ReceivedExtensions;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Repository;
|
||||
using ShareeBike.Repository.Exception;
|
||||
using ShareeBike.Repository.Response;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Connector
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestCommandLoggedIn
|
||||
{
|
||||
/// <summary> Verifies, that logout leads to expected call on copri server. </summary>
|
||||
[Test]
|
||||
public void TestDoLogout()
|
||||
{
|
||||
var l_oServer = Substitute.For<ICopriServer>();
|
||||
|
||||
l_oServer.DoAuthoutAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<AuthorizationoutResponse>("{ \"response_state\" : \"OK\", \"authcookie\" : \"1\"}")));
|
||||
|
||||
var l_oCmd = new CommandLoggedIn(l_oServer, "MeinKeks", "EMehl", () => DateTime.Now);
|
||||
|
||||
LoginStateChangedEventArgs l_oEventArgs = null;
|
||||
l_oCmd.LoginStateChanged += (sender, eventargs) => l_oEventArgs = eventargs;
|
||||
|
||||
l_oCmd.DoLogout().Wait();
|
||||
|
||||
|
||||
l_oServer.Received().DoAuthoutAsync();
|
||||
Assert.That(l_oEventArgs, Is.Not.Null);
|
||||
}
|
||||
|
||||
/// <summary> Verifies, that logout leads to expected call on copri server. </summary>
|
||||
[Test]
|
||||
public void TestDoLogout_AuthcookieNotDefined()
|
||||
{
|
||||
var l_oServer = Substitute.For<ICopriServer>();
|
||||
|
||||
l_oServer.When(x => x.DoAuthoutAsync()).Throw(new AuthcookieNotDefinedException("Testing action", JsonConvert.DeserializeObject<ResponseBase>(@"{ ""response_state"" : ""Some inner error description""}")));
|
||||
|
||||
var l_oCmd = new CommandLoggedIn(l_oServer, "MeinKeks", "EMehl", () => DateTime.Now);
|
||||
|
||||
LoginStateChangedEventArgs l_oEventArgs = null;
|
||||
l_oCmd.LoginStateChanged += (sender, eventargs) => l_oEventArgs = eventargs;
|
||||
|
||||
l_oCmd.DoLogout().Wait();
|
||||
|
||||
l_oServer.Received().DoAuthoutAsync();
|
||||
Assert.That(l_oEventArgs, Is.Not.Null);
|
||||
}
|
||||
|
||||
/// <summary> Verifies, that logout leads to expected call on copri server. </summary>
|
||||
[Test]
|
||||
public void TestDoLogout_Exception()
|
||||
{
|
||||
var l_oServer = Substitute.For<ICopriServer>();
|
||||
|
||||
l_oServer.When(x => x.DoAuthoutAsync()).Throw(new System.Exception("Sometheing went wrong."));
|
||||
|
||||
var l_oCmd = new CommandLoggedIn(l_oServer, "MeinKeks", "EMehl", () => DateTime.Now);
|
||||
|
||||
LoginStateChangedEventArgs l_oEventArgs = null;
|
||||
l_oCmd.LoginStateChanged += (sender, eventargs) => l_oEventArgs = eventargs;
|
||||
|
||||
Assert.Throws<AggregateException>(() => l_oCmd.DoLogout().Wait());
|
||||
|
||||
l_oServer.Received().DoAuthoutAsync();
|
||||
Assert.That(l_oEventArgs, Is.Null);
|
||||
}
|
||||
}
|
||||
}
|
90
SharedBusinessLogic.Tests/Model/Connector/TestConnector.cs
Normal file
90
SharedBusinessLogic.Tests/Model/Connector/TestConnector.cs
Normal file
|
@ -0,0 +1,90 @@
|
|||
using System;
|
||||
using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Model.Services.CopriApi;
|
||||
using ShareeBike.Repository;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Connector
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestConnector
|
||||
{
|
||||
/// <summary>
|
||||
/// Verifies that factory method returns correcty type depending on session cookie.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCommandFactory()
|
||||
{
|
||||
var l_oCopri = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
// Construct not logged in version of connector.
|
||||
var l_oCommand = new ShareeBike.Model.Connector.Connector(
|
||||
new System.Uri("http://1.2.3.4"),
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
"", // Not logged in
|
||||
"",
|
||||
server: l_oCopri).Command;
|
||||
|
||||
Assert.That(l_oCommand.GetType(), Is.EqualTo(typeof(Command)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that factory method returns correcty type depending on session cookie.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCommandFactory_LoggedIn()
|
||||
{
|
||||
var l_oCopri = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var l_oCommand = new ShareeBike.Model.Connector.Connector(
|
||||
new System.Uri("http://1.2.3.4"),
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
"123", // Logged in
|
||||
"a@b",
|
||||
server: l_oCopri).Command;
|
||||
|
||||
Assert.That(l_oCommand.GetType(), Is.EqualTo(typeof(CommandLoggedIn)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that factory method returns correcty type depending on session cookie.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestQueryFactory_CachedServer()
|
||||
{
|
||||
var l_oCopri = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var l_oQuery = new ShareeBike.Model.Connector.Connector(
|
||||
new Uri("http://1.2.3.4"),
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
"",
|
||||
"",
|
||||
server: l_oCopri).Query;
|
||||
|
||||
Assert.That(l_oQuery.GetType(), Is.EqualTo(typeof(CachedQuery)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that factory method returns correcty type depending on session cookie.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestQueryFactory_LoggedIn()
|
||||
{
|
||||
var l_oCopri = Substitute.For<ICachedCopriServer>();
|
||||
|
||||
var l_oQuery = new ShareeBike.Model.Connector.Connector(
|
||||
new System.Uri("http://1.2.3.4"),
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
"123",
|
||||
"a@b",
|
||||
server: l_oCopri).Query;
|
||||
|
||||
Assert.That(l_oQuery.GetType(), Is.EqualTo(typeof(CachedQueryLoggedIn)));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
using System;
|
||||
using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Repository;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Connector
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestConnectorCache
|
||||
{
|
||||
/// <summary>
|
||||
/// Verifies that factory method returns correcty type depending on session cookie.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCommandFactory()
|
||||
{
|
||||
var l_oCopri = Substitute.For<ICopriServer>();
|
||||
|
||||
// Construct not logged in version of connector.
|
||||
var l_oCommand = new ConnectorCache(
|
||||
new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)),
|
||||
null /*UI language */,
|
||||
"", // Not logged in
|
||||
"",
|
||||
server: l_oCopri).Command;
|
||||
|
||||
Assert.That(l_oCommand.GetType(), Is.EqualTo(typeof(Command)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that factory method returns correcty type depending on session cookie.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCommandFactory_LoggedIn()
|
||||
{
|
||||
var l_oCopri = Substitute.For<ICopriServer>();
|
||||
|
||||
var l_oCommand = new ConnectorCache(
|
||||
new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)),
|
||||
null /*UI language */,
|
||||
"123", // Logged in
|
||||
"a@b",
|
||||
server: l_oCopri).Command;
|
||||
|
||||
Assert.That(l_oCommand.GetType(), Is.EqualTo(typeof(CommandLoggedIn)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that factory method returns correcty type depending on session cookie.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestQueryFactory_CachedServer()
|
||||
{
|
||||
var l_oCopri = Substitute.For<ICopriServer>();
|
||||
|
||||
var l_oQuery = new ConnectorCache(
|
||||
new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)),
|
||||
null /*UI language */,
|
||||
"",
|
||||
"",
|
||||
server: l_oCopri).Query;
|
||||
|
||||
Assert.That(l_oQuery.GetType(), Is.EqualTo(typeof(ShareeBike.Model.Connector.Query)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that factory method returns correcty type depending on session cookie.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestQueryFactory_LoggedIn()
|
||||
{
|
||||
var l_oCopri = Substitute.For<ICopriServer>();
|
||||
|
||||
var l_oQuery = new ConnectorCache(
|
||||
new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)),
|
||||
null /*UI language */,
|
||||
"123",
|
||||
"a@b",
|
||||
server: l_oCopri).Query;
|
||||
|
||||
Assert.That(l_oQuery.GetType(), Is.EqualTo(typeof(QueryLoggedIn)));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
using System;
|
||||
using MonkeyCache.FileStore;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Repository;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Connector
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestConnectorFactory
|
||||
{
|
||||
[Test]
|
||||
public void TestCreate()
|
||||
{
|
||||
if (string.IsNullOrEmpty(Barrel.ApplicationId))
|
||||
{
|
||||
Barrel.ApplicationId = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
|
||||
}
|
||||
|
||||
var connector = ConnectorFactory.Create(false, new Uri("https://1.2.3.4"), new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), null /*UI language */, "123456789", "a@b");
|
||||
Assert.That(connector.GetType(), Is.EqualTo(typeof(ConnectorCache)));
|
||||
|
||||
connector = ConnectorFactory.Create(true, new Uri("https://1.2.3.4"), new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), null /*UI language */, "123456789", "a@b");
|
||||
Assert.That(connector.GetType(), Is.EqualTo(typeof(ShareeBike.Model.Connector.Connector)));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,163 @@
|
|||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Repository;
|
||||
using ShareeBike.Repository.Response;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Connector.Request
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestCopriCallsStatic
|
||||
{
|
||||
[Test]
|
||||
public void TestDeserializeObjectBikesAvailableValidResponse()
|
||||
{
|
||||
const string VALID_RESPONSE = @"
|
||||
{
|
||||
""shareejson"": {
|
||||
|
||||
""authcookie"": 0,
|
||||
""apiserver"": ""https://tinkwwp.copri-bike.de"",
|
||||
""response"": ""bikes_available"",
|
||||
""bikes"": {
|
||||
""3399"": {
|
||||
""description"": ""Cargo Trike"",
|
||||
""bike"": ""26"",
|
||||
""state"": ""available"",
|
||||
""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" },
|
||||
""station"" : ""4""
|
||||
|
||||
},
|
||||
},
|
||||
""response_state"": ""OK"",
|
||||
""copri_version"" : ""4.1.0.0""
|
||||
}
|
||||
}
|
||||
";
|
||||
|
||||
// Ensure that answer holds a valid bike.
|
||||
var l_oBike = CopriCallsStatic.DeserializeResponse<BikesAvailableResponse>(VALID_RESPONSE).bikes.FirstOrDefault().Value;
|
||||
Assert.That(l_oBike, Is.Not.Null, "Response must contain at leas one bike.");
|
||||
Assert.That(l_oBike.description.Length, Is.GreaterThan(0), "Bike description must never be empty.");
|
||||
Assert.That("26", Is.EqualTo(l_oBike.bike));
|
||||
Assert.That(
|
||||
l_oBike.station,
|
||||
Is.EqualTo("4"),
|
||||
"Station index must never be negative");
|
||||
Assert.That(l_oBike.state, Is.EqualTo("available"));
|
||||
Assert.That(l_oBike.gps, Is.Not.Null, "Gps position must never be empty.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestDeserializeObjectBikesAvailableValidResponse_NoDescription()
|
||||
{
|
||||
const string INVALID_RESPONSE = @"
|
||||
{
|
||||
""shareejson"": {
|
||||
|
||||
""authcookie"": 0,
|
||||
""apiserver"": ""https://tinkwwp.copri-bike.de"",
|
||||
""response"": ""bikes_available"",
|
||||
""bikes"": {
|
||||
""3399"": {
|
||||
""bike"": 26,
|
||||
""state"": ""available"",
|
||||
""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" },
|
||||
""station"" : 4
|
||||
|
||||
},
|
||||
},
|
||||
""response_state"": ""OK"",
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
}
|
||||
}
|
||||
";
|
||||
|
||||
// Ensure that answer holds a valid bike.
|
||||
var l_oBike = CopriCallsStatic.DeserializeResponse<BikesAvailableResponse>(INVALID_RESPONSE).bikes.FirstOrDefault().Value;
|
||||
Assert.That(l_oBike, Is.Not.Null, "Response must contain at leas one bike.");
|
||||
Assert.That(l_oBike.description, Is.Null);
|
||||
Assert.That(l_oBike.bike, Is.Not.Null);
|
||||
Assert.That(l_oBike.station, Is.Not.Null);
|
||||
Assert.That(l_oBike.state, Is.EqualTo("available"));
|
||||
Assert.That(l_oBike.gps, Is.Not.Null, "Gps position must never be empty.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestDeserializeObjectBikesAvailableValidResponse_NoBikeId()
|
||||
{
|
||||
const string VALID_RESPONSE = @"
|
||||
{
|
||||
""shareejson"": {
|
||||
|
||||
""authcookie"": 0,
|
||||
""apiserver"": ""https://tinkwwp.copri-bike.de"",
|
||||
""response"": ""bikes_available"",
|
||||
""bikes"": {
|
||||
""3399"": {
|
||||
""description"": ""Cargo Trike"",
|
||||
""state"": ""available"",
|
||||
""gps"" : { ""latitude"": ""47.6586936667"", ""longitude"": ""9.16863116667"" },
|
||||
""station"" : ""4""
|
||||
},
|
||||
},
|
||||
""response_state"": ""OK"",
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
}
|
||||
}";
|
||||
|
||||
// Ensure that answer holds a valid bike.
|
||||
var l_oBike = CopriCallsStatic.DeserializeResponse<BikesAvailableResponse>(VALID_RESPONSE).bikes.FirstOrDefault().Value;
|
||||
Assert.That(l_oBike, Is.Not.Null, "Response must contain at leas one bike.");
|
||||
Assert.That(l_oBike.description.Length, Is.GreaterThan(0), "Bike description must never be empty.");
|
||||
Assert.That(l_oBike.bike, Is.Null);
|
||||
Assert.That(l_oBike.station, Is.Not.Null);
|
||||
Assert.That(l_oBike.state, Is.EqualTo("available"));
|
||||
Assert.That(l_oBike.gps, Is.Not.Null, "Gps position must never be empty.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestDeserializeObjectBikesOccupiedValidResponse()
|
||||
{
|
||||
const string VALID_RESPONSE = @"
|
||||
{
|
||||
""shareejson"": {
|
||||
""response_state"": ""OK"",
|
||||
""bikes_occupied"": {
|
||||
""87781"": {
|
||||
""timeCode"": ""3630"",
|
||||
""state"": ""occupied"",
|
||||
""station"" : ""5"",
|
||||
""description"": ""Cargo Long"",
|
||||
""start_time"": ""2017-11-28 11:01:51.637747+01"",
|
||||
""bike"": ""8""
|
||||
},
|
||||
""87782"": {
|
||||
""timeCode"": ""2931"",
|
||||
""state"": ""occupied"",
|
||||
""station"" : ""4"",
|
||||
""description"": ""Cargo Long"",
|
||||
""start_time"": ""2017-11-28 13:06:55.147368+01"",
|
||||
""bike"": ""7""
|
||||
}
|
||||
},
|
||||
""authcookie"": ""b76b97e43a2d76b8499f32e6dd597af8"",
|
||||
""response"": ""user_bikes_occupied"",
|
||||
""apiserver"": ""https://tinkwwp.copri-bike.de"",
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
}
|
||||
}";
|
||||
|
||||
// Ensure that answer holds a valid bike.
|
||||
var l_oBike = CopriCallsStatic.DeserializeResponse<BikesReservedOccupiedResponse>(VALID_RESPONSE).bikes_occupied.FirstOrDefault().Value;
|
||||
Assert.That(l_oBike, Is.Not.Null, "Response must contain at leas one bike.");
|
||||
Assert.That(l_oBike.description.Length, Is.GreaterThan(0), "Bike description must never be empty.");
|
||||
Assert.That(l_oBike.bike, Is.Not.Null);
|
||||
Assert.That(l_oBike.station, Is.Not.Null);
|
||||
Assert.That(l_oBike.state.Length, Is.GreaterThan(0), "State info must never be null or empty.");
|
||||
// Todo: Requested bikes do not have a gps position. What is about booked bikes?
|
||||
// Assert.Greater(l_oBike.gps.Length, 0, "Gps position must never be empty.");
|
||||
Assert.That(l_oBike.start_time.Length, Is.GreaterThan(0), "Time when request/ booking was performed must never be null or empty.");
|
||||
Assert.That(l_oBike.timeCode.Length, Is.GreaterThan(0), "Booking code must never be null or empty.");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,708 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using MonkeyCache.FileStore;
|
||||
using Newtonsoft.Json;
|
||||
using NSubstitute;
|
||||
using NSubstitute.ExceptionExtensions;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Services.CopriApi;
|
||||
using ShareeBike.Repository;
|
||||
using ShareeBike.Repository.Exception;
|
||||
using ShareeBike.Repository.Response;
|
||||
using ShareeBike.Repository.Response.Stations;
|
||||
using ShareeBike.Services.CopriApi;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Connector
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestCopriProviderHttps
|
||||
{
|
||||
private const string BIKESAVAILABLE = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""bikes"" : {},
|
||||
""response_state"" : ""OK"",
|
||||
""apiserver"" : ""https://app.tink-konstanz.de"",
|
||||
""authcookie"" : """",
|
||||
""response"" : ""bikes_available"",
|
||||
""bikes"" : {
|
||||
""2352"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9""
|
||||
}
|
||||
}
|
||||
}";
|
||||
|
||||
private const string BIKESOCCUPIED = @"{
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""user_group"" : [ ""ShareeBike"" ],
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""response"" : ""user_bikes_occupied"",
|
||||
""response_state"" : ""OK"",
|
||||
""response_text"" : ""Die Liste der reservierten und gebuchten Fahrräder wurde erfolgreich geladen"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de"",
|
||||
""bikes_occupied"" : {
|
||||
""89004"" : {
|
||||
""start_time"" : ""2018-01-27 17:33:00.989464+01"",
|
||||
""station"" : ""9"",
|
||||
""unit_price"" : ""2.00"",
|
||||
""tariff_description"": {
|
||||
""free_hours"" : ""0.5"",
|
||||
""name"" : ""ShareeBike Tarif"",
|
||||
""max_eur_per_day"" : ""9.00""
|
||||
},
|
||||
""timeCode"" : ""2061"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""bike"" : ""4"",
|
||||
""total_price"" : ""20.00"",
|
||||
""state"" : ""requested"",
|
||||
""real_hours"" : ""66.05"",
|
||||
""bike_group"" : [ ""ShareeBike"" ],
|
||||
""now_time"" : ""2018-01-30 11:36:45"",
|
||||
""request_time"" : ""2018-01-27 17:33:00.989464+01"",
|
||||
""computed_hours"" : ""10.0""
|
||||
}
|
||||
}
|
||||
}";
|
||||
|
||||
private const string STATIONSALL = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""stations"" : {
|
||||
""5"" : {
|
||||
""station"" : ""5"",
|
||||
""bike_soll"" : ""0"",
|
||||
""bike_ist"" : ""7"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.66756"", ""longitude"": ""9.16477"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """"
|
||||
},
|
||||
""13"" : {
|
||||
""station"" : ""13"",
|
||||
""bike_soll"" : ""4"",
|
||||
""bike_ist"" : ""1"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657756"", ""longitude"": ""9.176084"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """"
|
||||
},
|
||||
""30"" : {
|
||||
""station"" : ""30"",
|
||||
""bike_soll"" : ""5"",
|
||||
""bike_ist"" : ""0"",
|
||||
""station_group"" : [ ""ShareeBike"", ""Citybike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : ""Test für Stadtradstation""
|
||||
}
|
||||
},
|
||||
""bikes_occupied"" : {},
|
||||
""user_group"" : [ ""Citybike"", ""ShareeBike"" ],
|
||||
""response_state"" : ""OK"",
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""response"" : ""stations_all"",
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de""
|
||||
}";
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAvailable_NotExpired()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsBikesAvailableExpired.Returns(false);
|
||||
cache.GetBikesAvailableAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE)));
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123", // Merchant id
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), // User agent
|
||||
null /*UI language */,
|
||||
sessionCookie: "456",
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var bikes = await provider.GetBikesAvailable();
|
||||
|
||||
Assert.That(bikes.Response.bikes.Count, Is.EqualTo(1));
|
||||
Assert.That(bikes.Source.Name, Is.EqualTo(typeof(CopriCallsMonkeyStore).Name));
|
||||
Assert.That(bikes.Exception, Is.Null);
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAvailable_ExpiredForceCache()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsBikesAvailableExpired.Returns(true);
|
||||
cache.GetBikesAvailableAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE)));
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123",
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var bikes = await provider.GetBikesAvailable(true);
|
||||
|
||||
Assert.That(bikes.Response.bikes.Count, Is.EqualTo(1));
|
||||
Assert.That(bikes.Source.Name, Is.EqualTo(typeof(CopriCallsMonkeyStore).Name));
|
||||
Assert.That(bikes.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAvailable_Expired()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsBikesAvailableExpired.Returns(true);
|
||||
https.GetBikesAvailableAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE)));
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123",
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var bikes = await provider.GetBikesAvailable();
|
||||
|
||||
Assert.That(bikes.Response.bikes.Count, Is.EqualTo(1));
|
||||
Assert.That(bikes.Source.Name, Is.EqualTo(typeof(CopriCallsHttps).Name));
|
||||
Assert.That(bikes.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAvailable_Exception()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsBikesAvailableExpired.Returns(true);
|
||||
cache.GetBikesAvailableAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE)));
|
||||
https.GetBikesAvailableAsync().Returns<BikesAvailableResponse>(x => { throw new WebConnectFailureException("Bang...", new System.Exception()); });
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123",
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var bikes = await provider.GetBikesAvailable();
|
||||
|
||||
Assert.That(bikes.Response.bikes.Count, Is.EqualTo(1));
|
||||
Assert.That(bikes.Source.Name, Is.EqualTo(typeof(CopriCallsMonkeyStore).Name));
|
||||
Assert.That(bikes.Exception.Message, Is.EqualTo("Bang..."));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupied_NotExpired()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsBikesOccupiedExpired.Returns(false);
|
||||
cache.GetBikesOccupiedAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED)));
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"12345678", // Merchant id
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), // User agent
|
||||
null /*UI language */,
|
||||
sessionCookie: "f782a208d9399291ba8d086b5dcc2509",
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var bikes = await provider.GetBikesOccupied();
|
||||
|
||||
Assert.That(bikes.Response.bikes_occupied.Count, Is.EqualTo(1));
|
||||
Assert.That(bikes.Source.Name, Is.EqualTo(typeof(CopriCallsMonkeyStore).Name));
|
||||
Assert.That(bikes.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupied_ExpiredForceCache()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsBikesOccupiedExpired.Returns(true);
|
||||
cache.GetBikesOccupiedAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED)));
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"12345678", // Merchant id
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), // User agent
|
||||
null /*UI language */,
|
||||
sessionCookie: "f782a208d9399291ba8d086b5dcc2509",
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var bikes = await provider.GetBikesOccupied(true);
|
||||
|
||||
Assert.That(bikes.Response.bikes_occupied.Count, Is.EqualTo(1));
|
||||
Assert.That(bikes.Source.Name, Is.EqualTo(typeof(CopriCallsMonkeyStore).Name));
|
||||
Assert.That(bikes.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupied_Expired()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsBikesOccupiedExpired.Returns(true);
|
||||
https.GetBikesOccupiedAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED)));
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"12345678", // Merchant id
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), // User agent
|
||||
null /*UI language */,
|
||||
sessionCookie: "f782a208d9399291ba8d086b5dcc2509",
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var bikes = await provider.GetBikesOccupied();
|
||||
|
||||
Assert.That(bikes.Response.bikes_occupied.Count, Is.EqualTo(1));
|
||||
Assert.That(bikes.Source.Name, Is.EqualTo(typeof(CopriCallsHttps).Name));
|
||||
Assert.That(bikes.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupied_Exception()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsBikesOccupiedExpired.Returns(true);
|
||||
cache.GetBikesOccupiedAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED)));
|
||||
https.GetBikesOccupiedAsync().Returns<BikesReservedOccupiedResponse>(x => { throw new WebConnectFailureException("Bang...", new System.Exception()); });
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"12345678", // Merchant id
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), // User agent
|
||||
null /*UI language */,
|
||||
sessionCookie: "f782a208d9399291ba8d086b5dcc2509",
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var bikes = await provider.GetBikesOccupied();
|
||||
|
||||
Assert.That(bikes.Response.bikes_occupied.Count, Is.EqualTo(1));
|
||||
Assert.That(bikes.Source.Name, Is.EqualTo(typeof(CopriCallsMonkeyStore).Name));
|
||||
Assert.That(bikes.Exception.Message, Is.EqualTo("Bang..."));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetStations_NotExpired()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsStationsExpired.Returns(false);
|
||||
cache.GetStationsAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALL)));
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123", // Merchant id
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), // User agent
|
||||
null /*UI language */,
|
||||
sessionCookie: "456", // cookie
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var stations = await provider.GetStations();
|
||||
|
||||
Assert.That(stations.Response.stations.Count, Is.EqualTo(3));
|
||||
Assert.That(stations.Source.Name, Is.EqualTo(typeof(CopriCallsMonkeyStore).Name));
|
||||
Assert.That(stations.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetStations_ExpiredForceCache()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsStationsExpired.Returns(true);
|
||||
cache.GetStationsAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALL)));
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123",
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var stations = await provider.GetStations(true);
|
||||
|
||||
Assert.That(stations.Response.stations.Count, Is.EqualTo(3));
|
||||
Assert.That(stations.Source.Name, Is.EqualTo(typeof(CopriCallsMonkeyStore).Name));
|
||||
Assert.That(stations.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetStations_Expired()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsStationsExpired.Returns(true);
|
||||
https.GetStationsAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALL)));
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123",
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var stations = await provider.GetStations();
|
||||
|
||||
Assert.That(stations.Response.stations.Count, Is.EqualTo(3));
|
||||
Assert.That(stations.Source.Name, Is.EqualTo(typeof(CopriCallsHttps).Name));
|
||||
Assert.That(stations.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetStations_Exception()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
cache.IsStationsExpired.Returns(true);
|
||||
cache.GetStationsAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALL)));
|
||||
https.GetStationsAsync().Returns<StationsAvailableResponse>(x => { throw new WebConnectFailureException("Bang...", new System.Exception()); });
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123",
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */,
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var stations = await provider.GetStations();
|
||||
|
||||
Assert.That(stations.Response.stations.Count, Is.EqualTo(3));
|
||||
Assert.That(stations.Source.Name, Is.EqualTo(typeof(CopriCallsMonkeyStore).Name));
|
||||
Assert.That(stations.Exception.Message, Is.EqualTo("Bang..."));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Test_AddToCache_Stations()
|
||||
{
|
||||
if (string.IsNullOrEmpty(Barrel.ApplicationId))
|
||||
{
|
||||
Barrel.ApplicationId = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
|
||||
}
|
||||
|
||||
Barrel.Current.EmptyAll();
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123456789",
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */);
|
||||
|
||||
var stations = await provider.GetStations(true);
|
||||
Assert.That(stations.Response.stations.Count, Is.EqualTo(0));
|
||||
|
||||
try
|
||||
{
|
||||
// Do not add if an exception occurred
|
||||
provider.AddToCache(new Result<StationsAvailableResponse>(typeof(CopriCallsHttps), JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALL), new GeneralData(), new System.Exception("Bang...")));
|
||||
stations = await provider.GetStations(true);
|
||||
Assert.That(stations.Response.stations.Count, Is.EqualTo(0));
|
||||
|
||||
// Do not add if results from cache
|
||||
provider.AddToCache(new Result<StationsAvailableResponse>(typeof(CopriCallsMonkeyStore), JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALL), new GeneralData()));
|
||||
stations = await provider.GetStations(true);
|
||||
Assert.That(stations.Response.stations.Count, Is.EqualTo(0));
|
||||
|
||||
// Add result
|
||||
provider.AddToCache(new Result<StationsAvailableResponse>(typeof(CopriCallsHttps), JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALL), new GeneralData()));
|
||||
stations = await provider.GetStations(true);
|
||||
Assert.That(stations.Response.stations.Count, Is.EqualTo(3));
|
||||
}
|
||||
finally
|
||||
{
|
||||
Barrel.Current.EmptyAll();
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Test_AddToCache()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("https://copri.net"),
|
||||
"MerchId",
|
||||
new AppContextInfo("MerchId", "Name", new Version()),
|
||||
"de-de",
|
||||
cacheServer: cache);
|
||||
|
||||
var uri = new Uri("https://Myserver.com");
|
||||
var station = "MyStation";
|
||||
var bike = "MyBike";
|
||||
|
||||
var result = new Result<BikesAvailableResponse>(typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE),
|
||||
new GeneralData());
|
||||
|
||||
provider.AddToCache(result, uri, station, bike);
|
||||
|
||||
cache.Received().AddToCache(result.Response, uri, station, bike);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Test_AddToCache_BikesAvailable()
|
||||
{
|
||||
if (string.IsNullOrEmpty(Barrel.ApplicationId))
|
||||
{
|
||||
Barrel.ApplicationId = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
|
||||
}
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123456789",
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)),
|
||||
null /*UI language */);
|
||||
|
||||
var bikes = await provider.GetBikesAvailable(true);
|
||||
Assert.That(bikes.Response.bikes.Count, Is.EqualTo(0));
|
||||
|
||||
try
|
||||
{
|
||||
// Do not add if an exception occurred
|
||||
provider.AddToCache(
|
||||
new Result<BikesAvailableResponse>(typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE),
|
||||
new GeneralData(),
|
||||
new System.Exception("Bang...")),
|
||||
stationId: "9");
|
||||
bikes = await provider.GetBikesAvailable(true, stationId: "9");
|
||||
Assert.That(bikes.Response.bikes.Count, Is.EqualTo(0));
|
||||
|
||||
// Do not add if results from cache
|
||||
provider.AddToCache(new Result<BikesAvailableResponse>(
|
||||
typeof(CopriCallsMonkeyStore),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE),
|
||||
new GeneralData()),
|
||||
stationId: "9");
|
||||
bikes = await provider.GetBikesAvailable(true, stationId: "9");
|
||||
Assert.That(bikes.Response.bikes.Count, Is.EqualTo(0));
|
||||
|
||||
// Add result
|
||||
provider.AddToCache(
|
||||
new Result<BikesAvailableResponse>(typeof(CopriCallsHttps),
|
||||
JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE),
|
||||
new GeneralData()),
|
||||
stationId: "9");
|
||||
|
||||
bikes = await provider.GetBikesAvailable(true, stationId: "9");
|
||||
Assert.That(bikes.Response.bikes.Count, Is.EqualTo(1));
|
||||
}
|
||||
finally
|
||||
{
|
||||
Barrel.Current.EmptyAll();
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Test_AddToCache_BikesOccupied()
|
||||
{
|
||||
if (string.IsNullOrEmpty(Barrel.ApplicationId))
|
||||
{
|
||||
Barrel.ApplicationId = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
|
||||
}
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("http://1.2.3.4"),
|
||||
"123456789",
|
||||
new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), // User agent
|
||||
null /* language */,
|
||||
sessionCookie: "876");
|
||||
|
||||
var bikes = await provider.GetBikesOccupied(true);
|
||||
Assert.That(bikes.Response.bikes_occupied.Count, Is.EqualTo(0));
|
||||
|
||||
try
|
||||
{
|
||||
// Do not add if an exception occurred
|
||||
provider.AddToCache(new Result<BikesReservedOccupiedResponse>(typeof(CopriCallsHttps), JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED), new GeneralData(), new System.Exception("Bang...")));
|
||||
bikes = await provider.GetBikesOccupied(true);
|
||||
Assert.That(bikes.Response.bikes_occupied.Count, Is.EqualTo(0));
|
||||
|
||||
// Do not add if results from cache
|
||||
provider.AddToCache(new Result<BikesReservedOccupiedResponse>(typeof(CopriCallsMonkeyStore), JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED), new GeneralData()));
|
||||
bikes = await provider.GetBikesOccupied(true);
|
||||
Assert.That(bikes.Response.bikes_occupied.Count, Is.EqualTo(0));
|
||||
|
||||
// Add result
|
||||
provider.AddToCache(new Result<BikesReservedOccupiedResponse>(typeof(CopriCallsHttps), JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED), new GeneralData()));
|
||||
bikes = await provider.GetBikesOccupied(true);
|
||||
Assert.That(bikes.Response.bikes_occupied.Count, Is.EqualTo(1));
|
||||
}
|
||||
finally
|
||||
{
|
||||
Barrel.Current.EmptyAll();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verify that cache updating functionality is called correctly.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public async Task TestDoReserveAsync()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("https://copri.net"),
|
||||
"MerchId",
|
||||
new AppContextInfo("MerchId", "Name", new Version()),
|
||||
"de-de",
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var uri = new Uri("https://Myserver.com");
|
||||
const string bikeId = "BikeNr12";
|
||||
|
||||
https.DoReserveAsync(bikeId, uri).Returns(Task.FromResult(JsonConvert.DeserializeObject<ReservationBookingResponse>(@"
|
||||
{
|
||||
bike : ""BikeNr12"",
|
||||
""bikes_occupied"" : {
|
||||
""BikeNr3"" : {
|
||||
""bike"" : ""BikeNr3"",
|
||||
""station"" : ""Freiburg City""
|
||||
},
|
||||
""BikeNr12"" : {
|
||||
""bike"" : ""BikeNr12"",
|
||||
""station"" : ""HomeSweetHome""
|
||||
}
|
||||
},
|
||||
""response_state"" : ""OK""
|
||||
}")));
|
||||
|
||||
await provider.DoReserveAsync(bikeId, uri);
|
||||
|
||||
cache.Received().Update(Arg.Is<BikeInfoReservedOrBooked>(x => x.station == "HomeSweetHome"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verify that cache updating functionality is not called in case of an exception being thrown.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestDoReserveAsyncException()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("https://copri.net"),
|
||||
"MerchId",
|
||||
new AppContextInfo("MerchId", "Name", new Version()),
|
||||
"de-de",
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var uri = new Uri("https://Myserver.com");
|
||||
const string bikeId = "BikeNr12";
|
||||
|
||||
https.DoReserveAsync(bikeId, uri).Throws(new System.Exception("Something went wrong..."));
|
||||
|
||||
Assert.That(async() => await provider.DoReserveAsync(bikeId, uri), Throws.Exception);
|
||||
|
||||
cache.DidNotReceive().Update(Arg.Any<BikeInfoReservedOrBooked>());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verify that cache updating functionality is called correctly.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public async Task TestDoBookAsyncAsync()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("https://copri.net"),
|
||||
"MerchId",
|
||||
new AppContextInfo("MerchId", "Name", new Version()),
|
||||
"de-de",
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var uri = new Uri("https://Myserver.com");
|
||||
const string bikeId = "BikeNr12";
|
||||
|
||||
https.DoBookAsync(uri, bikeId, new Guid(), 0).Returns(Task.FromResult(JsonConvert.DeserializeObject<ReservationBookingResponse>(@"
|
||||
{
|
||||
bike : ""BikeNr12"",
|
||||
""bikes_occupied"" : {
|
||||
""BikeNr3"" : {
|
||||
""bike"" : ""BikeNr3"",
|
||||
""station"" : ""Freiburg City""
|
||||
},
|
||||
""BikeNr12"" : {
|
||||
""bike"" : ""BikeNr12"",
|
||||
""station"" : ""HomeSweetHome""
|
||||
}
|
||||
},
|
||||
""response_state"" : ""OK""
|
||||
}")));
|
||||
|
||||
await provider.DoBookAsync(uri, bikeId, new Guid(), 0);
|
||||
|
||||
cache.Received().Update(Arg.Is<BikeInfoReservedOrBooked>(x => x.station == "HomeSweetHome"));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verify that cache updating functionality is not called in case of an exception being thrown.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestDoBookAsyncAsyncException()
|
||||
{
|
||||
var cache = Substitute.For<ICopriCache>();
|
||||
var https = Substitute.For<ICopriServer>();
|
||||
|
||||
var provider = new CopriProviderHttps(
|
||||
new Uri("https://copri.net"),
|
||||
"MerchId",
|
||||
new AppContextInfo("MerchId", "Name", new Version()),
|
||||
"de-de",
|
||||
cacheServer: cache,
|
||||
httpsServer: https);
|
||||
|
||||
var uri = new Uri("https://Myserver.com");
|
||||
const string bikeId = "BikeNr12";
|
||||
|
||||
https.DoBookAsync(uri, bikeId, new Guid(), 0).Throws(new System.Exception("Something went wrong..."));
|
||||
|
||||
Assert.That(async () => await provider.DoBookAsync(uri, bikeId, new Guid(), 0), Throws.Exception);
|
||||
|
||||
cache.DidNotReceive().Update(Arg.Any<BikeInfoReservedOrBooked>());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Bikes;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Model.Services.CopriApi;
|
||||
using ShareeBike.Repository;
|
||||
using ShareeBike.Services.CopriApi;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Model.Connector
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestFilteredConnector
|
||||
{
|
||||
[Test]
|
||||
public async Task TestGetBikesAsync()
|
||||
{
|
||||
var connector = Substitute.For<IConnector>();
|
||||
var filter = new FilteredConnector(new string[] { "" }, connector);
|
||||
var uri = new Uri("https://MyOperator.com");
|
||||
var station = "MyStation";
|
||||
var bike = "MyBike";
|
||||
|
||||
connector.Query.GetBikesAsync(uri, station, bike).Returns(Task.FromResult(new Result<BikeCollection>(
|
||||
typeof(CopriCallsHttps),
|
||||
new BikeCollection(),
|
||||
new GeneralData())));
|
||||
|
||||
await filter.Query.GetBikesAsync(uri, station, bike);
|
||||
|
||||
await connector.Received().Query.GetBikesAsync(uri, station, bike);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Bikes;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Model.Services.CopriApi;
|
||||
using ShareeBike.Repository;
|
||||
using ShareeBike.Services.CopriApi;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Model.Connector
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestNullFilterConnector
|
||||
{
|
||||
[Test]
|
||||
public async Task TestGetBikesAsync()
|
||||
{
|
||||
var connector = Substitute.For<IConnector>();
|
||||
var filter = new NullFilterConnector(connector);
|
||||
var uri = new Uri("https://MyOperator.com");
|
||||
var station = "MyStation";
|
||||
var bike = "MyBike";
|
||||
|
||||
connector.Query.GetBikesAsync(uri, station, bike).Returns(Task.FromResult(new Result<BikeCollection>(
|
||||
typeof(CopriCallsHttps),
|
||||
new BikeCollection(),
|
||||
new GeneralData())));
|
||||
|
||||
await filter.Query.GetBikesAsync(uri, station, bike);
|
||||
|
||||
await connector.Received().Query.GetBikesAsync(uri, station, bike);
|
||||
}
|
||||
}
|
||||
}
|
149
SharedBusinessLogic.Tests/Model/Connector/TestQuery.cs
Normal file
149
SharedBusinessLogic.Tests/Model/Connector/TestQuery.cs
Normal file
|
@ -0,0 +1,149 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Repository;
|
||||
using ShareeBike.Repository.Response;
|
||||
using ShareeBike.Repository.Response.Stations;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Query
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestQuery
|
||||
{
|
||||
private const string BIKESAVAILABLE = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""bikes"" : {},
|
||||
""response_state"" : ""OK"",
|
||||
""apiserver"" : ""https://app.tink-konstanz.de"",
|
||||
""authcookie"" : """",
|
||||
""response"" : ""bikes_available"",
|
||||
""bikes"" : {
|
||||
""2352"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9""
|
||||
}
|
||||
}
|
||||
}";
|
||||
|
||||
/// <summary>
|
||||
/// Holds the response on stations_available request.
|
||||
/// </summary>
|
||||
/// <remarks> V1: Did not hold station_type entry.</remarks>
|
||||
private const string STATIONSALLV2 = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""stations"" : {
|
||||
""9"" : {
|
||||
""station"" : ""9"",
|
||||
""bike_soll"" : ""0"",
|
||||
""bike_ist"" : ""7"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.66756"", ""longitude"": ""9.16477"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """",
|
||||
""station_type"": {
|
||||
""Cargobike"": {
|
||||
""bike_count"": ""1"",
|
||||
""bike_group"": ""ShareeBike""
|
||||
},
|
||||
""Citybike"": {
|
||||
""bike_count"": ""0"",
|
||||
""bike_group"": ""FR300103""
|
||||
}
|
||||
}
|
||||
},
|
||||
""13"" : {
|
||||
""station"" : ""13"",
|
||||
""bike_soll"" : ""4"",
|
||||
""bike_ist"" : ""1"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657756"", ""longitude"": ""9.176084"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """"
|
||||
},
|
||||
""30"" : {
|
||||
""station"" : ""30"",
|
||||
""bike_soll"" : ""5"",
|
||||
""bike_ist"" : ""0"",
|
||||
""station_group"" : [ ""ShareeBike"", ""Citybike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : ""Test für Stadtradstation""
|
||||
}
|
||||
},
|
||||
""user_group"" : [ ""Citybike"", ""ShareeBike"" ],
|
||||
""response_state"" : ""OK"",
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""response"" : ""stations_all"",
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de""
|
||||
}";
|
||||
|
||||
[Test]
|
||||
public async Task TestGetStations()
|
||||
{
|
||||
var server = Substitute.For<ICopriServer>();
|
||||
|
||||
server.GetStationsAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALLV2)));
|
||||
|
||||
var result = await new ShareeBike.Model.Connector.Query(server).GetBikesAndStationsAsync();
|
||||
|
||||
Assert.That(result.Response.StationsAll.Count, Is.EqualTo(3));
|
||||
Assert.That(result.Response.StationsAll["9"].BikeGroups.AvailableCount, Is.EqualTo(1));
|
||||
Assert.That(result.Response.BikesOccupied.Count, Is.EqualTo(0));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAsync()
|
||||
{
|
||||
var server = Substitute.For<ICopriServer>();
|
||||
|
||||
var uri = new Uri("https://Myserver.com");
|
||||
var station = "MyStation";
|
||||
var bike = "MyBike";
|
||||
|
||||
server.GetBikesAvailableAsync(uri, station, bike).Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE)));
|
||||
|
||||
var result = await new ShareeBike.Model.Connector.Query(server).GetBikesAsync(uri, station, bike);
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(1));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
|
||||
await server.Received().GetBikesAvailableAsync(uri, station, bike);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupied()
|
||||
{
|
||||
var server = Substitute.For<ICopriServer>();
|
||||
|
||||
var result = await new ShareeBike.Model.Connector.Query(server).GetBikesOccupiedAsync();
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(0));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That("Abfrage der reservierten/ gebuchten Räder fehlgeschlagen. Kein Benutzer angemeldet.", Is.EqualTo(result.Exception.Message));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAvailble()
|
||||
{
|
||||
var server = Substitute.For<ICopriServer>();
|
||||
server.GetBikesAvailableAsync(Arg.Any<Uri>(), Arg.Any<string>()).Returns(new BikesAvailableResponse());
|
||||
|
||||
var uri = new Uri("https://shareeapp-fr01.copri.eu//");
|
||||
var station = "FR101";
|
||||
|
||||
await new ShareeBike.Model.Connector.Query(server).GetBikesAsync(uri, station);
|
||||
|
||||
await server.Received().GetBikesAvailableAsync(uri, station);
|
||||
}
|
||||
}
|
||||
}
|
269
SharedBusinessLogic.Tests/Model/Connector/TestQueryLoggedIn.cs
Normal file
269
SharedBusinessLogic.Tests/Model/Connector/TestQueryLoggedIn.cs
Normal file
|
@ -0,0 +1,269 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Repository;
|
||||
using ShareeBike.Repository.Response;
|
||||
using ShareeBike.Repository.Response.Stations;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Fixtures.ObjectTests.Connector
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestQueryLoggedIn
|
||||
{
|
||||
private const string BIKESAVAILABLE = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""bikes"" : {},
|
||||
""response_state"" : ""OK"",
|
||||
""apiserver"" : ""https://app.tink-konstanz.de"",
|
||||
""authcookie"" : """",
|
||||
""response"" : ""bikes_available"",
|
||||
""bikes"" : {
|
||||
""2352"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9""
|
||||
}
|
||||
}
|
||||
}";
|
||||
|
||||
private const string BIKESOCCUPIED = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""user_group"" : [ ""ShareeBike"" ],
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""response"" : ""user_bikes_occupied"",
|
||||
""response_state"" : ""OK"",
|
||||
""response_text"" : ""Die Liste der reservierten und gebuchten Fahrräder wurde erfolgreich geladen"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de"",
|
||||
""bikes_occupied"" : {
|
||||
""89004"" : {
|
||||
""start_time"" : ""2018-01-27 17:33:00.989464+01"",
|
||||
""station"" : ""9"",
|
||||
""unit_price"" : ""2.00"",
|
||||
""tariff_description"": {
|
||||
""free_hours"" : ""0.5"",
|
||||
""name"" : ""ShareeBike Tarif"",
|
||||
""max_eur_per_day"" : ""9.00""
|
||||
},
|
||||
""timeCode"" : ""2061"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""bike"" : ""4"",
|
||||
""total_price"" : ""20.00"",
|
||||
""state"" : ""requested"",
|
||||
""real_hours"" : ""66.05"",
|
||||
""bike_group"" : [ ""ShareeBike"" ],
|
||||
""now_time"" : ""2018-01-30 11:36:45"",
|
||||
""request_time"" : ""2018-01-27 17:33:00.989464+01"",
|
||||
""computed_hours"" : ""10.0""
|
||||
}
|
||||
}
|
||||
}";
|
||||
|
||||
/// <summary>
|
||||
/// Holds the response on stations_available request.
|
||||
/// </summary>
|
||||
/// <remarks> V1: Did not hold station_type entry.</remarks>
|
||||
private const string STATIONSALLV2 = @"{
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""stations"" : {
|
||||
""9"" : {
|
||||
""station"" : ""9"",
|
||||
""bike_soll"" : ""0"",
|
||||
""bike_ist"" : ""7"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.66756"", ""longitude"": ""9.16477"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """",
|
||||
""station_type"": {
|
||||
""Cargobike"": {
|
||||
""bike_count"": ""1"",
|
||||
""bike_group"": ""ShareeBike""
|
||||
},
|
||||
""Citybike"": {
|
||||
""bike_count"": ""0"",
|
||||
""bike_group"": ""FR300103""
|
||||
}
|
||||
}
|
||||
},
|
||||
""13"" : {
|
||||
""station"" : ""13"",
|
||||
""bike_soll"" : ""4"",
|
||||
""bike_ist"" : ""1"",
|
||||
""station_group"" : [ ""ShareeBike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657756"", ""longitude"": ""9.176084"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : """"
|
||||
},
|
||||
""30"" : {
|
||||
""station"" : ""30"",
|
||||
""bike_soll"" : ""5"",
|
||||
""bike_ist"" : ""0"",
|
||||
""station_group"" : [ ""ShareeBike"", ""Citybike"" ],
|
||||
""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" },
|
||||
""state"" : ""available"",
|
||||
""description"" : ""Test für Stadtradstation""
|
||||
}
|
||||
},
|
||||
""bikes_occupied"" : {
|
||||
""89004"" : {
|
||||
""start_time"" : ""2018-01-27 17:33:00.989464+01"",
|
||||
""station"" : ""9"",
|
||||
""unit_price"" : ""2.00"",
|
||||
""tariff_description"": {
|
||||
""free_hours"" : ""0.5"",
|
||||
""name"" : ""ShareeBike Tarif"",
|
||||
""max_eur_per_day"" : ""9.00""
|
||||
},
|
||||
""timeCode"" : ""2061"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""bike"" : ""4"",
|
||||
""total_price"" : ""20.00"",
|
||||
""state"" : ""requested"",
|
||||
""real_hours"" : ""66.05"",
|
||||
""bike_group"" : [ ""ShareeBike"" ],
|
||||
""now_time"" : ""2018-01-30 11:36:45"",
|
||||
""request_time"" : ""2018-01-27 17:33:00.989464+01"",
|
||||
""computed_hours"" : ""10.0""
|
||||
}
|
||||
},
|
||||
""user_group"" : [ ""Citybike"", ""ShareeBike"" ],
|
||||
""response_state"" : ""OK"",
|
||||
""authcookie"" : ""6103_f782a208d9399291ba8d086b5dcc2509_12345678"",
|
||||
""debuglevel"" : ""2"",
|
||||
""response"" : ""stations_all"",
|
||||
""user_id"" : ""javaminister@gmail.com"",
|
||||
""apiserver"" : ""https://tinkwwp.copri-bike.de""
|
||||
}";
|
||||
|
||||
[Test]
|
||||
public async Task TestGetStations()
|
||||
{
|
||||
var server = Substitute.For<ICopriServer>();
|
||||
|
||||
server.GetStationsAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<StationsAvailableResponse>(STATIONSALLV2)));
|
||||
|
||||
var result = await new QueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAndStationsAsync();
|
||||
|
||||
Assert.That(result.Response.StationsAll.Count, Is.EqualTo(3));
|
||||
Assert.That(result.Response.StationsAll["9"].BikeGroups.AvailableCount, Is.EqualTo(1));
|
||||
Assert.That(result.Response.BikesOccupied.Count, Is.EqualTo(1));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAsync()
|
||||
{
|
||||
var server = Substitute.For<ICopriServer>();
|
||||
|
||||
var bike = "MyBike";
|
||||
|
||||
server.GetBikesAvailableAsync(bikeId: bike).Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE)));
|
||||
server.GetBikesOccupiedAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED)));
|
||||
|
||||
var result = await new QueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAsync(bikeId: bike);
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(2));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
|
||||
await server.Received().GetBikesAvailableAsync(bikeId: bike);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesOccupiedAsync()
|
||||
{
|
||||
var server = Substitute.For<ICopriServer>();
|
||||
|
||||
server.GetBikesAvailableAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesAvailableResponse>("{}")));
|
||||
|
||||
server.GetBikesOccupiedAsync().Returns(Task.Run(() => JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED)));
|
||||
|
||||
var result = await new QueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesOccupiedAsync();
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(1));
|
||||
Assert.That(result.Source, Is.EqualTo(typeof(CopriCallsMonkeyStore)));
|
||||
Assert.That(result.Exception, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAsyncOperatorUriNotNull()
|
||||
{
|
||||
var server = Substitute.For<ICopriServer>();
|
||||
|
||||
var responseBikesAvailable = JsonConvert.DeserializeObject<BikesAvailableResponse>(@"{
|
||||
""bikes"" : {
|
||||
""FR1011"" : {
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""FR1011"",
|
||||
""station"" : ""FR103"",
|
||||
}
|
||||
},
|
||||
""bikes_occupied"" : {
|
||||
""160373"" : {
|
||||
""bike"" : ""FR1012"",
|
||||
""station"" : ""FR103"",
|
||||
""state"" : ""occupied"",
|
||||
}
|
||||
},
|
||||
}");
|
||||
|
||||
server.GetBikesAvailableAsync(Arg.Any<Uri>(), Arg.Any<string>()).Returns(responseBikesAvailable);
|
||||
|
||||
var uri = new Uri("https://shareeapp-fr01.copri.eu//");
|
||||
var station = "FR101";
|
||||
|
||||
var result = await new QueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAsync(uri, station);
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(2));
|
||||
|
||||
await server.Received().GetBikesAvailableAsync(
|
||||
uri /* Uri is not null for use case show "bikes at station x" page */,
|
||||
station);
|
||||
await server.DidNotReceive().GetBikesOccupiedAsync();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TestGetBikesAsyncOperatorUriNull()
|
||||
{
|
||||
var server = Substitute.For<ICopriServer>();
|
||||
|
||||
var responseBikesAvailable = JsonConvert.DeserializeObject<BikesAvailableResponse>(@"{
|
||||
""bikes"" : {
|
||||
""FR1011"" : {
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""FR1011"",
|
||||
""station"" : ""FR103"",
|
||||
}
|
||||
},
|
||||
}");
|
||||
|
||||
var responseBikesOccupied = JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(@"{
|
||||
""bikes_occupied"" : {
|
||||
""160373"" : {
|
||||
""bike"" : ""FR1012"",
|
||||
""station"" : ""FR103"",
|
||||
""state"" : ""occupied"",
|
||||
}
|
||||
},
|
||||
}");
|
||||
|
||||
server.GetBikesAvailableAsync().Returns(responseBikesAvailable);
|
||||
server.GetBikesOccupiedAsync().Returns(responseBikesOccupied);
|
||||
|
||||
|
||||
var result = await new QueryLoggedIn(server, "123", "a@b", () => DateTime.Now).GetBikesAsync();
|
||||
|
||||
Assert.That(result.Response.Count, Is.EqualTo(2));
|
||||
|
||||
await server.Received().GetBikesAvailableAsync();
|
||||
await server.Received().GetBikesOccupiedAsync();
|
||||
}
|
||||
}
|
||||
}
|
1251
SharedBusinessLogic.Tests/Model/Connector/TestTextToTypeHelper.cs
Normal file
1251
SharedBusinessLogic.Tests/Model/Connector/TestTextToTypeHelper.cs
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,271 @@
|
|||
using Newtonsoft.Json;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector.Updater;
|
||||
using ShareeBike.Repository.Response;
|
||||
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Model.Connector.Updater
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestBookingFinishedModelFactory
|
||||
{
|
||||
/// <summary>
|
||||
/// COPRI response shortened, part not belonging to user_miniquery discarded.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCreateMiniSurvey_Co2Saving()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
|
||||
{
|
||||
""shareejson"" : {
|
||||
""bike_returned"" : {
|
||||
""co2saving"" : ""1,95 kg CO2""
|
||||
}
|
||||
}
|
||||
}");
|
||||
|
||||
var bookingFinshed = response.shareejson.Create();
|
||||
|
||||
Assert.That(
|
||||
bookingFinshed.Co2Saving,
|
||||
Is.EqualTo("1,95 kg CO2"));
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// COPRI response shortened, part not belonging to user_miniquery discarded.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCreateMiniSurvey()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
|
||||
{
|
||||
""shareejson"" : {
|
||||
""bike_returned"" : {
|
||||
},
|
||||
""user_miniquery"" : {
|
||||
""title"" : ""Bitte unterstützen Sie unsere Begleitforschung"",
|
||||
""footer"" : ""Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"",
|
||||
""questions"" : {
|
||||
""q3"" : {
|
||||
""quest_text"" : ""3. Haben Sie Anmerkungen oder Anregungen?"",
|
||||
""type"" : ""text"",
|
||||
""query"" : {
|
||||
""opt1"" : """"
|
||||
}
|
||||
},
|
||||
""q1"" : {
|
||||
""type"" : ""check_one"",
|
||||
""quest_text"" : ""1. Was war der Hauptzweck dieser Ausleihe?"",
|
||||
""query"" : {
|
||||
""opt2"" : ""b. Kinderbeförderung"",
|
||||
""opt5"" : ""e. Ausprobieren"",
|
||||
""opt4"" : ""d. Freizeit"",
|
||||
""opt1"" : ""a. Einkauf"",
|
||||
""opt3"" : ""c. Lastentransport"",
|
||||
""opt6"" : ""f. Sonstiges""
|
||||
}
|
||||
},
|
||||
""q2"" : {
|
||||
""type"" : ""check_one"",
|
||||
""quest_text"" : ""2. Welches Verkehrsmittel hätten Sie ansonsten benutzt?"",
|
||||
""query"" : {
|
||||
""opt6"" : ""f. Keines (ich hätte die Fahrt sonst nicht gemacht)"",
|
||||
""opt3"" : ""c. Bus oder Bahn"",
|
||||
""opt1"" : ""a. Auto"",
|
||||
""opt2"" : ""b. Motorrad oder Motorroller"",
|
||||
""opt7"" : ""g. Sonstige"",
|
||||
""opt4"" : ""d. Eigenes Fahrrad"",
|
||||
""opt5"" : ""e. Zu Fuß""
|
||||
}
|
||||
}
|
||||
},
|
||||
""subtitle"" : ""Ihre drei Antworten werden anonym gespeichert.""
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
");
|
||||
|
||||
var bookingFinished = response.shareejson.Create();
|
||||
|
||||
Assert.That(
|
||||
bookingFinished,
|
||||
Is.Not.Null);
|
||||
|
||||
Assert.That(
|
||||
bookingFinished.MiniSurvey.Title,
|
||||
Is.EqualTo("Bitte unterstützen Sie unsere Begleitforschung"));
|
||||
|
||||
Assert.That(
|
||||
bookingFinished.MiniSurvey.Subtitle,
|
||||
Is.EqualTo("Ihre drei Antworten werden anonym gespeichert."));
|
||||
|
||||
Assert.That(
|
||||
bookingFinished.MiniSurvey.Footer,
|
||||
Is.EqualTo("Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"));
|
||||
|
||||
Assert.That(
|
||||
bookingFinished.MiniSurvey.Questions.Count,
|
||||
Is.EqualTo(3));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// COPRI response shortened, part not belonging to user_miniquery discarded.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCreateMiniSurvey_Null()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
|
||||
{
|
||||
""shareejson"" : {
|
||||
""bike_returned"" : {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
");
|
||||
|
||||
var bookingFinshed = response.shareejson.Create();
|
||||
|
||||
Assert.That(
|
||||
bookingFinshed,
|
||||
Is.Not.Null);
|
||||
|
||||
Assert.That(
|
||||
bookingFinshed.MiniSurvey.Questions.Count,
|
||||
Is.EqualTo(0));
|
||||
|
||||
Assert.That(
|
||||
bookingFinshed.MiniSurvey.Title,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
bookingFinshed.MiniSurvey.Subtitle,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
bookingFinshed.MiniSurvey.Footer,
|
||||
Is.Null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// COPRI response shortened, part not belonging to user_miniquery discarded.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCreateMiniSurvey_EmptyQuery()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
|
||||
{
|
||||
""shareejson"" : {
|
||||
""user_miniquery"" : {
|
||||
},
|
||||
""bike_returned"" : {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
");
|
||||
|
||||
var bookingFinished = response.shareejson.Create();
|
||||
|
||||
Assert.That(
|
||||
bookingFinished,
|
||||
Is.Not.Null);
|
||||
|
||||
Assert.That(
|
||||
bookingFinished.MiniSurvey.Title,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
bookingFinished.MiniSurvey.Subtitle,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
bookingFinished.MiniSurvey.Footer,
|
||||
Is.Null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// COPRI response shortened, part not belonging to user_miniquery discarded.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCreateMiniSurvey_InvalidQuestion_KeyNull()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
|
||||
{
|
||||
""shareejson"" : {
|
||||
""bike_returned"" : {
|
||||
},
|
||||
""user_miniquery"" : {
|
||||
""title"" : ""Bitte unterstützen Sie unsere Begleitforschung"",
|
||||
""footer"" : ""Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"",
|
||||
""questions"" : {
|
||||
"""" : {
|
||||
""type"" : ""check_one"",
|
||||
""quest_text"" : ""1. Was war der Hauptzweck dieser Ausleihe?"",
|
||||
""query"" : {
|
||||
""opt2"" : ""b. Kinderbeförderung"",
|
||||
""opt5"" : ""e. Ausprobieren"",
|
||||
""opt4"" : ""d. Freizeit"",
|
||||
""opt1"" : ""a. Einkauf"",
|
||||
""opt3"" : ""c. Lastentransport"",
|
||||
""opt6"" : ""f. Sonstiges""
|
||||
}
|
||||
},
|
||||
},
|
||||
""subtitle"" : ""Ihre drei Antworten werden anonym gespeichert.""
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
");
|
||||
|
||||
var bookingFinised = response.shareejson.Create();
|
||||
|
||||
Assert.That(
|
||||
bookingFinised,
|
||||
Is.Not.Null);
|
||||
|
||||
Assert.That(
|
||||
bookingFinised.MiniSurvey.Questions.Count,
|
||||
Is.EqualTo(0));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// COPRI response shortened, part not belonging to user_miniquery discarded.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestCreateMiniSurvey_InvalidQuestion_ValueNull()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<ResponseContainer<DoReturnResponse>>(@"
|
||||
{
|
||||
""shareejson"" : {
|
||||
""bike_returned"" : {
|
||||
},
|
||||
""user_miniquery"" : {
|
||||
""title"" : ""Bitte unterstützen Sie unsere Begleitforschung"",
|
||||
""footer"" : ""Herzlichen Dank und viel Spaß bei der nächsten Fahrt!"",
|
||||
""questions"" : {
|
||||
""q1"" : {
|
||||
},
|
||||
},
|
||||
""subtitle"" : ""Ihre drei Antworten werden anonym gespeichert.""
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
");
|
||||
|
||||
var bookingFinished = response.shareejson.Create();
|
||||
|
||||
Assert.That(
|
||||
bookingFinished,
|
||||
Is.Not.Null);
|
||||
|
||||
Assert.That(
|
||||
bookingFinished.MiniSurvey.Questions.Count,
|
||||
Is.EqualTo(0));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,209 @@
|
|||
using Newtonsoft.Json;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Bikes.BikeInfoNS.DriveNS;
|
||||
using ShareeBike.Model.Connector.Updater;
|
||||
using ShareeBike.Repository.Response;
|
||||
using DriveType = ShareeBike.Model.Bikes.BikeInfoNS.DriveNS.DriveType;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Model.Connector.Updater
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestDriveFactory
|
||||
{
|
||||
[Test]
|
||||
public void TestEmpty()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<BikeType>(@"");
|
||||
|
||||
Assert.That(
|
||||
response.Create().Type,
|
||||
Is.EqualTo(DriveType.SoleHumanPowered));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Engine.Manufacturer,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.CurrentChargePercent,
|
||||
Is.NaN);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.CurrentChargeBars,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.MaxChargeBars,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.IsBackendAccessible,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.IsHidden,
|
||||
Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestEmptyEngine()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<BikeType>(@"
|
||||
{
|
||||
""category"" : ""cargo"",
|
||||
""wheels"" : ""2"",
|
||||
""engine"" : {
|
||||
}
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
response.Create().Type,
|
||||
Is.EqualTo(DriveType.SoleHumanPowered));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Engine.Manufacturer,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.CurrentChargePercent,
|
||||
Is.NaN);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.CurrentChargeBars,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.MaxChargeBars,
|
||||
Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestEngine()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<BikeType>(@"
|
||||
{
|
||||
""category"" : ""cargo"",
|
||||
""wheels"" : ""2"",
|
||||
""engine"" : {
|
||||
""manufacturer"" : ""dummy""
|
||||
}
|
||||
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
response.Create().Type,
|
||||
Is.EqualTo(DriveType.Pedelec));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Engine.Manufacturer,
|
||||
Is.EqualTo("dummy"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.CurrentChargePercent,
|
||||
Is.NaN);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.CurrentChargeBars,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.MaxChargeBars,
|
||||
Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestBatteryValues1()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<BikeType>(@"
|
||||
{
|
||||
""category"" : ""cargo"",
|
||||
""wheels"" : ""2"",
|
||||
""engine"" : {
|
||||
""manufacturer"" : ""dummy""
|
||||
},
|
||||
""battery"" : {
|
||||
""charge_current_bars"" : ""4"",
|
||||
""charge_max_bars"" : ""5"",
|
||||
""charge_current_percent"" : ""70"",
|
||||
""backend_accessible"" : ""0"",
|
||||
""hidden"" : ""0"",
|
||||
}
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
response.Create().Type,
|
||||
Is.EqualTo(DriveType.Pedelec));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Engine.Manufacturer,
|
||||
Is.EqualTo("dummy"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.CurrentChargePercent,
|
||||
Is.EqualTo(70.0));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.CurrentChargeBars,
|
||||
Is.EqualTo(4));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.MaxChargeBars,
|
||||
Is.EqualTo(5));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.IsBackendAccessible,
|
||||
Is.False);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.IsHidden,
|
||||
Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestBatteryValues2()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<BikeType>(@"
|
||||
{
|
||||
""category"" : ""cargo"",
|
||||
""wheels"" : ""2"",
|
||||
""engine"" : {
|
||||
""manufacturer"" : ""dummy2""
|
||||
},
|
||||
""battery"" : {
|
||||
""charge_current_bars"" : ""1"",
|
||||
""charge_max_bars"" : ""6"",
|
||||
""charge_current_percent"" : ""70.3"",
|
||||
""backend_accessible"" : ""1"",
|
||||
""hidden"" : ""1"",
|
||||
}
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
response.Create().Type,
|
||||
Is.EqualTo(DriveType.Pedelec));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Engine.Manufacturer,
|
||||
Is.EqualTo("dummy2"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.CurrentChargePercent,
|
||||
Is.EqualTo(70.3));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.CurrentChargeBars,
|
||||
Is.EqualTo(1));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.MaxChargeBars,
|
||||
Is.EqualTo(6));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.IsBackendAccessible,
|
||||
Is.True);
|
||||
|
||||
Assert.That(
|
||||
response.Create().Battery.IsHidden,
|
||||
Is.True);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,200 @@
|
|||
using Newtonsoft.Json;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector.Updater;
|
||||
using ShareeBike.Repository.Response;
|
||||
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Model.Connector.Updater
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestRentalDescription
|
||||
{
|
||||
|
||||
[Test]
|
||||
public void TestCreateRentalDescriptionEmpyJson()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<RentalDescription>(@"");
|
||||
|
||||
Assert.That(
|
||||
response.Create().Name,
|
||||
Is.Empty);
|
||||
|
||||
Assert.That(
|
||||
response.Create().TariffEntries.Count,
|
||||
Is.EqualTo(0));
|
||||
|
||||
Assert.That(
|
||||
response.Create().InfoEntries.Count,
|
||||
Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateRentalDescription()
|
||||
{
|
||||
var response = JsonConvertRethrow.DeserializeObject<RentalDescription>(
|
||||
@"{
|
||||
""id"": ""1"",
|
||||
""tarif_elements"" : {
|
||||
""6"": [
|
||||
""Gratis Mietzeit"",
|
||||
""30 Min / Tag""
|
||||
],
|
||||
""1"": [
|
||||
""Mietgebühr"",
|
||||
""2,00 € / 1 Std""
|
||||
],
|
||||
""4"": [
|
||||
""Max. Gebühr"",
|
||||
""40.00 € / Tag""
|
||||
]
|
||||
},
|
||||
""name"": ""REN E-Bike"",
|
||||
""rental_info"" : {
|
||||
""9"" : [
|
||||
""AGB"",
|
||||
""Mit der Mietrad Anmietung wird folgender Betreiber <a href='$varenv->{wwwhost}/site/agb.html' target='_blank'>AGB</a> zugestimmt""
|
||||
],
|
||||
""8"" : [
|
||||
""Tracking"",
|
||||
""Ich stimme der Speicherung (Tracking) meiner Fahrstrecke zwecks wissenschaftlicher Auswertung und Berechnung der CO2-Einsparung zu!""
|
||||
]
|
||||
}
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
response.Create().Name,
|
||||
Is.EqualTo("REN E-Bike"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().Id,
|
||||
Is.EqualTo(1));
|
||||
|
||||
Assert.That(
|
||||
response.Create().TariffEntries.Count,
|
||||
Is.EqualTo(3));
|
||||
|
||||
Assert.That(
|
||||
response.Create().InfoEntries.Count,
|
||||
Is.EqualTo(2));
|
||||
|
||||
Assert.That(
|
||||
response.Create().TariffEntries["1"].Description,
|
||||
Is.EqualTo("Mietgebühr"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().TariffEntries["1"].Value,
|
||||
Is.EqualTo("2,00 € / 1 Std"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().TariffEntries["4"].Description,
|
||||
Is.EqualTo("Max. Gebühr"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().TariffEntries["4"].Value,
|
||||
Is.EqualTo("40.00 € / Tag"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().TariffEntries["6"].Description,
|
||||
Is.EqualTo("Gratis Mietzeit"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().TariffEntries["6"].Value,
|
||||
Is.EqualTo("30 Min / Tag"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().InfoEntries["8"].Key,
|
||||
Is.EqualTo("Tracking"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().InfoEntries["8"].Value,
|
||||
Is.EqualTo("Ich stimme der Speicherung (Tracking) meiner Fahrstrecke zwecks wissenschaftlicher Auswertung und Berechnung der CO2-Einsparung zu!"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().InfoEntries["9"].Key,
|
||||
Is.EqualTo("AGB"));
|
||||
|
||||
Assert.That(
|
||||
response.Create().InfoEntries["9"].Value,
|
||||
Is.EqualTo("Mit der Mietrad Anmietung wird folgender Betreiber <a href='$varenv->{wwwhost}/site/agb.html' target='_blank'>AGB</a> zugestimmt"));
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void TestCreateRentalDescriptionDupeTarifElements()
|
||||
{
|
||||
var response = JsonConvertRethrow.DeserializeObject<RentalDescription>(
|
||||
@"{
|
||||
""id"": ""1"",
|
||||
""tarif_elements"" : {
|
||||
""6"": [
|
||||
""Gratis Mietzeit"",
|
||||
""30 Min / Tag""
|
||||
],
|
||||
""6"": [
|
||||
""Mietgebühr"",
|
||||
""2,00 € / 1 Std""
|
||||
],
|
||||
""4"": [
|
||||
""Max. Gebühr"",
|
||||
""40.00 € / Tag""
|
||||
]
|
||||
}
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
response.Create().TariffEntries.Count,
|
||||
Is.EqualTo(2));
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateRentalDescriptionDupeInfoElements()
|
||||
{
|
||||
var response = JsonConvertRethrow.DeserializeObject<RentalDescription>(
|
||||
@"{
|
||||
""rental_info"" : {
|
||||
""9"" : [
|
||||
""AGB"",
|
||||
""Mit der Mietrad Anmietung wird folgender Betreiber <a href='$varenv->{wwwhost}/site/agb.html' target='_blank'>AGB</a> zugestimmt""
|
||||
],
|
||||
""9"" : [
|
||||
""Tracking"",
|
||||
""Ich stimme der Speicherung (Tracking) meiner Fahrstrecke zwecks wissenschaftlicher Auswertung und Berechnung der CO2-Einsparung zu!""
|
||||
]
|
||||
}
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
response.Create().InfoEntries.Count,
|
||||
Is.EqualTo(1));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateRentalDescriptionsNoTariffElements()
|
||||
{
|
||||
var response = JsonConvertRethrow.DeserializeObject<RentalDescription>(
|
||||
@"{
|
||||
""rental_info"" : {
|
||||
}
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
response.Create().TariffEntries,
|
||||
Is.Not.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateRentalDescriptionsNoInfoElements()
|
||||
{
|
||||
var response = JsonConvertRethrow.DeserializeObject<RentalDescription>(
|
||||
@"{
|
||||
""rental_info"" : {
|
||||
}
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
response.Create().InfoEntries,
|
||||
Is.Not.Null);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,224 @@
|
|||
using NUnit.Framework;
|
||||
using ShareeBike.Model.Connector.Updater;
|
||||
using ShareeBike.Repository.Response;
|
||||
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Model.Connector.Updater
|
||||
{
|
||||
[TestFixture]
|
||||
public class TestTariffDescriptionFactory
|
||||
{
|
||||
[Test]
|
||||
public void TestCreateTariffDescription()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{
|
||||
""eur_per_hour"" : ""10.50"",
|
||||
""abo_eur_per_month"" : ""920.99"",
|
||||
""free_hours"" : ""1.50"",
|
||||
""number"" : ""5494"",
|
||||
""name"" : ""Tester Basic""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().Name,
|
||||
Is.EqualTo("Tester Basic"));
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().Id,
|
||||
Is.EqualTo(5494));
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().TariffEntries["1"].Value, // Free time per session
|
||||
Is.EqualTo("1.50 hour(s)/day")); // Did not contain unit before switching signature from TariffDescription to TariffDescription2.
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().TariffEntries["2"].Value, // FeeEuroPerHour
|
||||
Is.EqualTo("10.50 €/hour")); // Did not contain unit before switching signature from TariffDescription to TariffDescription2.
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().TariffEntries["4"].Value, // Abo euro per month
|
||||
Is.EqualTo("920.99 €/month"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_Name()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{
|
||||
""eur_per_hour"" : ""10.50"",
|
||||
""abo_eur_per_month"" : ""920.99"",
|
||||
""free_hours"" : ""1.50"",
|
||||
""number"" : ""5494"",
|
||||
""name"" : ""Tester Basic""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().Name,
|
||||
Is.EqualTo("Tester Basic"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_Number()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{
|
||||
""eur_per_hour"" : ""10.50"",
|
||||
""abo_eur_per_month"" : ""920.99"",
|
||||
""free_hours"" : ""1.50"",
|
||||
""number"" : ""5494"",
|
||||
""name"" : ""Tester Basic""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().Id,
|
||||
Is.EqualTo(5494));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_FreeTimePerSession()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{
|
||||
""eur_per_hour"" : ""10.50"",
|
||||
""abo_eur_per_month"" : ""920.99"",
|
||||
""free_hours"" : ""1.50"",
|
||||
""number"" : ""5494"",
|
||||
""name"" : ""Tester Basic""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().TariffEntries["1"].Value, // Free time per session
|
||||
Is.EqualTo("1.50 hour(s)/day")); // Did not contain unit before switching signature from TariffDescription to TariffDescription2.
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_FeeEuroPerHour()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{
|
||||
""eur_per_hour"" : ""10.50"",
|
||||
""abo_eur_per_month"" : ""920.99"",
|
||||
""free_hours"" : ""1.50"",
|
||||
""number"" : ""5494"",
|
||||
""name"" : ""Tester Basic""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().TariffEntries["2"].Value, // FeeEuroPerHour
|
||||
Is.EqualTo("10.50 €/hour")); // Did not contain unit before switching signature from TariffDescription to TariffDescription2.
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_AboEuroPerMonth()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{
|
||||
""eur_per_hour"" : ""10.50"",
|
||||
""abo_eur_per_month"" : ""920.99"",
|
||||
""free_hours"" : ""1.50"",
|
||||
""number"" : ""5494"",
|
||||
""name"" : ""Tester Basic""
|
||||
}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().TariffEntries["4"].Value, // Abo euro per month
|
||||
Is.EqualTo("920.99 €/month"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_Name_Empty()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().Name,
|
||||
Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_Number_Empty()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().Id,
|
||||
Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_FreeTimePerSession_Empty()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().TariffEntries.ContainsKey("1"), // Free time per session
|
||||
Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_FeeEuroPerHour_Empty()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().TariffEntries.ContainsKey("2"), // FeeEuroPerHour
|
||||
Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_AboEuroPerMonth_Empty()
|
||||
{
|
||||
var tariffDescription = JsonConvertRethrow.DeserializeObject<TariffDescription>(
|
||||
@"{}");
|
||||
|
||||
Assert.That(
|
||||
tariffDescription.Create().TariffEntries.ContainsKey("4"), // Abo euro per month
|
||||
Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_Name_Null()
|
||||
{
|
||||
Assert.That(
|
||||
TariffDescriptionFactory.Create(null).Name,
|
||||
Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_Number_Null()
|
||||
{
|
||||
Assert.That(
|
||||
TariffDescriptionFactory.Create(null).Id,
|
||||
Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_FreeTimePerSession_Null()
|
||||
{
|
||||
Assert.That(
|
||||
TariffDescriptionFactory.Create(null).TariffEntries.ContainsKey("1"), // Free time per session
|
||||
Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_FeeEuroPerHour_Null()
|
||||
{
|
||||
Assert.That(
|
||||
TariffDescriptionFactory.Create(null).TariffEntries.ContainsKey("2"), // FeeEuroPerHour
|
||||
Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCreateTariffDescription_AboEuroPerMonth_Null()
|
||||
{
|
||||
Assert.That(
|
||||
TariffDescriptionFactory.Create(null).TariffEntries.ContainsKey("4"), // Abo euro per month
|
||||
Is.False);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,841 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using NSubstitute;
|
||||
using NUnit.Framework;
|
||||
using ShareeBike.Model;
|
||||
using ShareeBike.Model.Bikes.BikeInfoNS.BC;
|
||||
using ShareeBike.Model.Bikes.BikeInfoNS.BikeNS;
|
||||
using ShareeBike.Model.Bikes.BikeInfoNS.DriveNS;
|
||||
using ShareeBike.Model.Connector;
|
||||
using ShareeBike.Model.Connector.Updater;
|
||||
using ShareeBike.Model.State;
|
||||
using ShareeBike.Model.User.Account;
|
||||
using ShareeBike.Repository;
|
||||
using ShareeBike.Repository.Response;
|
||||
using ShareeBike.Repository.Response.Stations;
|
||||
using ShareeBike.Services.BluetoothLock;
|
||||
using ShareeBike.Services.Geolocation;
|
||||
using ShareeBike.ViewModel;
|
||||
using Xamarin.Forms;
|
||||
using static ShareeBike.Repository.CopriCallsMemory;
|
||||
|
||||
namespace SharedBusinessLogic.Tests.Model.Connector.Updater
|
||||
{
|
||||
|
||||
[TestFixture]
|
||||
public class TestUpdaterJSON
|
||||
{
|
||||
[Test]
|
||||
public void TestGetAllStations()
|
||||
{
|
||||
var l_oStationsTarget = new CopriCallsMemory("MyMerchId", SampleSets.Set2, 1).GetStationsAsync().Result.GetStationsAllMutable();
|
||||
|
||||
Assert.That(l_oStationsTarget.Count, Is.EqualTo(9));
|
||||
|
||||
// Check first entry.
|
||||
Assert.That(l_oStationsTarget.GetById("4"), Is.Not.Null);
|
||||
Assert.That(string.Join(",", l_oStationsTarget.GetById("4").Group.ToArray()), Is.EqualTo("ShareeBike"));
|
||||
Assert.That(l_oStationsTarget.GetById("4").Id, Is.EqualTo("4"));
|
||||
Assert.That(l_oStationsTarget.GetById("4").Position.Latitude, Is.EqualTo(47.6586936667));
|
||||
Assert.That(l_oStationsTarget.GetById("4").Position.Longitude, Is.EqualTo(9.16863116667));
|
||||
|
||||
Assert.That(l_oStationsTarget.GetById("14"), Is.Not.Null);
|
||||
Assert.That(string.Join(",", l_oStationsTarget.GetById("14").Group.ToArray()), Is.EqualTo("Citybike"));
|
||||
|
||||
Assert.That(l_oStationsTarget.GetById("31"), Is.Not.Null);
|
||||
Assert.That(string.Join(",", l_oStationsTarget.GetById("31").Group.ToArray()), Is.EqualTo("ShareeBike,Citybike"));
|
||||
Assert.That(l_oStationsTarget.GetById("31").StationName, Is.EqualTo("Südstadt Station"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestGetAllStations_OperatorData()
|
||||
{
|
||||
var stations = JsonConvert.DeserializeObject<ResponseContainer<StationsAvailableResponse>>(STATIONS_AVAILABLE_LOGGEDIN_20210720).shareejson.GetStationsAllMutable();
|
||||
|
||||
var station = stations.FirstOrDefault(x => x.Id == "LV_3");
|
||||
Assert.That(
|
||||
station,
|
||||
Is.Not.Null,
|
||||
"Station LV_3 must exist.");
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.Color,
|
||||
Is.EqualTo(Color.FromHex("#006269")));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.Hours,
|
||||
Is.EqualTo(string.Empty));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.Name,
|
||||
Is.EqualTo("LastenVelo Freiburg"));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.MailAddressText,
|
||||
Is.EqualTo("info@lastenvelofreiburg.de"));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.PhoneNumberText,
|
||||
Is.EqualTo(string.Empty));
|
||||
|
||||
station = stations.FirstOrDefault(x => x.Id == "FR_105");
|
||||
Assert.That(
|
||||
station,
|
||||
Is.Not.Null,
|
||||
"Station FR_105 must exist.");
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.Color,
|
||||
Is.EqualTo(Color.FromHex("#009699")));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.Hours,
|
||||
Is.EqualTo("B<>rozeiten: Montag, Mittwoch, Freitag 9-12 Uhr"));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.Name,
|
||||
Is.EqualTo("sharee.bike | TeilRad GmbH"));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.MailAddressText,
|
||||
Is.EqualTo("hotline@sharee.bike"));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.PhoneNumberText,
|
||||
Is.EqualTo("+49 761 45370097"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestGetAllStations_OperatorData_NoOperatorData()
|
||||
{
|
||||
var stations = JsonConvert.DeserializeObject<ResponseContainer<StationsAvailableResponse>>(@"
|
||||
{
|
||||
""shareejson"": {
|
||||
""lang"": ""DE"",
|
||||
""impress_html"": ""site/impress.html"",
|
||||
""tariff_info_html"": ""site/tariff_info_1.html"",
|
||||
""debuglevel"": ""1"",
|
||||
""user_tour"": [
|
||||
null,
|
||||
""""
|
||||
],
|
||||
""response"": ""stations_available"",
|
||||
""user_id"": ""ohauff@posteo.de"",
|
||||
""stations"": {
|
||||
""LV_3"": {
|
||||
""service_tour"": ""LV_1"",
|
||||
""uri_operator"": ""https://shareeapp-lv.copri.eu"",
|
||||
""authed"": ""1"",
|
||||
""station"": ""LV_3"",
|
||||
""gps"": {
|
||||
""latitude"": ""47.9973"",
|
||||
""longitude"": ""7.8585""
|
||||
},
|
||||
""gps_radius"": ""100"",
|
||||
""description"": ""Katholische Akademie"",
|
||||
""state"": ""available"",
|
||||
""station_group"": [
|
||||
""LV_300005""
|
||||
]
|
||||
},
|
||||
},
|
||||
}
|
||||
}").shareejson.GetStationsAllMutable();
|
||||
|
||||
var station = stations.FirstOrDefault(x => x.Id == "LV_3");
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.Color,
|
||||
Is.Null);
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.Hours,
|
||||
Is.EqualTo(string.Empty));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.Name,
|
||||
Is.EqualTo(string.Empty));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.MailAddressText,
|
||||
Is.EqualTo(string.Empty));
|
||||
|
||||
Assert.That(
|
||||
station.OperatorData.PhoneNumberText,
|
||||
Is.EqualTo(string.Empty));
|
||||
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestUpdateBikesAvailable_BikeNr5GetBooked()
|
||||
{
|
||||
// Bike 5 is centered.
|
||||
var l_oBikesTarget = GetBikesAvailable(ShareeBikeApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 1).GetBikesAvailable(DataSource.Copri);
|
||||
|
||||
Assert.That(l_oBikesTarget.Count, Is.EqualTo(12), "Bike 5 is available an must be part of available bikes collection");
|
||||
|
||||
// Verify state of bike 5.
|
||||
Assert.That(l_oBikesTarget.GetById("5"), Is.Not.Null);
|
||||
Assert.That(l_oBikesTarget.GetById("5").Id, Is.EqualTo("5"));
|
||||
Assert.That(l_oBikesTarget.GetById("5").TypeOfBike, Is.EqualTo(TypeOfBike.Cargo));
|
||||
Assert.That(l_oBikesTarget.GetById("5").WheelType, Is.EqualTo(WheelType.Two));
|
||||
Assert.That(l_oBikesTarget.GetById("5").State.Value, Is.EqualTo(InUseStateEnum.Disposable));
|
||||
Assert.That(l_oBikesTarget.GetById("5").State.From, Is.Null); // Sommer/ Winterzeit!
|
||||
Assert.That(l_oBikesTarget.GetById("5").State.Code, Is.Null);
|
||||
|
||||
// Bike 5 is reserved.
|
||||
// Count of bikes must decrease and bike #5 no more in list of bikes.
|
||||
l_oBikesTarget = GetBikesAvailable(ShareeBikeApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 2).GetBikesAvailable(DataSource.Copri);
|
||||
|
||||
Assert.That(l_oBikesTarget.Count, Is.EqualTo(11), "One bike (nr. 5) got reserved");
|
||||
Assert.That(l_oBikesTarget.GetById("5"), Is.Null, "Bike 5 got requested and must not be part of available bikes collection");
|
||||
|
||||
// Bike 5 is booked.
|
||||
// Count of bikes must decrease and bike #5 no more in list of bikes.
|
||||
l_oBikesTarget = GetBikesAvailable(ShareeBikeApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 3).GetBikesAvailable(DataSource.Copri);
|
||||
|
||||
Assert.That(l_oBikesTarget.GetById("5"), Is.Null, "Bike 5 got booked and must not be part of available bikes collection");
|
||||
Assert.That(l_oBikesTarget.GetById("5"), Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestUpdateBikesOccupied_BikeNr5GetBooked()
|
||||
{
|
||||
var l_oBikesTarget = GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 1).GetBikesOccupied(
|
||||
"a@B",
|
||||
() => new DateTime(2017, 11, 28, 14, 8, 14), // Date time now for bikes which are reserved
|
||||
DataSource.Copri);
|
||||
|
||||
// Check initial count of bikes.
|
||||
Assert.That(
|
||||
l_oBikesTarget.Count, Is.EqualTo(2));
|
||||
|
||||
// Bike 5 is reserved
|
||||
l_oBikesTarget = GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 2).GetBikesOccupied(
|
||||
"a@B",
|
||||
() => new DateTime(2017, 11, 28, 14, 08, 36).Add(new TimeSpan(0, 2, 0)), // Date time now for bikes which are reserved
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(l_oBikesTarget.Count, Is.EqualTo(3), "One bike (nr. 5) got reserved");
|
||||
|
||||
Assert.That(l_oBikesTarget.GetById("5"), Is.Not.Null);
|
||||
Assert.That(l_oBikesTarget.GetById("5").State.Value, Is.EqualTo(InUseStateEnum.Reserved));
|
||||
Assert.That(l_oBikesTarget.GetById("5").Id, Is.EqualTo("5"));
|
||||
Assert.That(l_oBikesTarget.GetById("5").TypeOfBike, Is.EqualTo(TypeOfBike.Cargo));
|
||||
Assert.That(l_oBikesTarget.GetById("5").WheelType, Is.EqualTo(WheelType.Two));
|
||||
Assert.That(l_oBikesTarget.GetById("5").State.From, Is.EqualTo(DateTime.Parse("2017-11-28 14:07:13.745568+01"))); // Sommer/ Winterzeit!
|
||||
|
||||
|
||||
// Bike 5 is booked
|
||||
l_oBikesTarget = GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 3).GetBikesOccupied(
|
||||
"a@B",
|
||||
() => DateTime.Now,
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(l_oBikesTarget.Count, Is.EqualTo(3), "One bike (nr. 5) got booked");
|
||||
|
||||
Assert.That(l_oBikesTarget.GetById("5"), Is.Not.Null);
|
||||
Assert.That(l_oBikesTarget.GetById("5").State.Value, Is.EqualTo(InUseStateEnum.Booked));
|
||||
Assert.That(l_oBikesTarget.GetById("5").Id, Is.EqualTo("5"));
|
||||
Assert.That(l_oBikesTarget.GetById("5").TypeOfBike, Is.EqualTo(TypeOfBike.Cargo));
|
||||
Assert.That(l_oBikesTarget.GetById("5").WheelType, Is.EqualTo(WheelType.Two));
|
||||
Assert.That(l_oBikesTarget.GetById("5").State.From, Is.EqualTo(DateTime.Parse("2017 -11-28 14:08:32.756368+01"))); // Sommer/ Winterzeit!
|
||||
}
|
||||
|
||||
public void TestGetBikesAvailable_BikeNr5GetBooked()
|
||||
{
|
||||
// Bike 5 is centered.
|
||||
var l_oBikesTarget = GetBikesAvailable(ShareeBikeApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 1).GetBikesAvailable(DataSource.Copri);
|
||||
|
||||
Assert.That(l_oBikesTarget.Count, Is.EqualTo(11), "Bike 5 is available an must be part of available bikes collection");
|
||||
|
||||
// Verify state of bike 5.
|
||||
Assert.That(l_oBikesTarget.GetById("5"), Is.Not.Null);
|
||||
Assert.That(l_oBikesTarget.GetById("5").Id, Is.EqualTo("5"));
|
||||
Assert.That(l_oBikesTarget.GetById("5").TypeOfBike, Is.EqualTo(TypeOfBike.Cargo));
|
||||
Assert.That(l_oBikesTarget.GetById("5").WheelType, Is.EqualTo(WheelType.Two));
|
||||
Assert.That(l_oBikesTarget.GetById("5").State.Value, Is.EqualTo(InUseStateEnum.Disposable));
|
||||
Assert.That(l_oBikesTarget.GetById("5").State.From, Is.Null); // Sommer/ Winterzeit!
|
||||
Assert.That(l_oBikesTarget.GetById("5").State.Code, Is.Null);
|
||||
|
||||
// Bike 5 is reserved.
|
||||
// Count of bikes must decrease and bike #5 no more in list of bikes.
|
||||
l_oBikesTarget = GetBikesAvailable(ShareeBikeApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 2).GetBikesAvailable(DataSource.Copri);
|
||||
|
||||
Assert.That(l_oBikesTarget.Count, Is.EqualTo(10), "One bike (nr. 5) got reserved");
|
||||
Assert.That(l_oBikesTarget.GetById("5"), Is.Null, "Bike 5 got requested and must not be part of available bikes collection");
|
||||
|
||||
// Bike 5 is booked.
|
||||
// Count of bikes must decrease and bike #5 no more in list of bikes.
|
||||
l_oBikesTarget = GetBikesAvailable(ShareeBikeApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 3).GetBikesAvailable(DataSource.Copri);
|
||||
|
||||
Assert.That(l_oBikesTarget.GetById("5"), Is.Null, "Bike 5 got booked and must not be part of available bikes collection");
|
||||
Assert.That(l_oBikesTarget.GetById("5"), Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestGetBikesOccupied_BC_BikeNr5GetBooked()
|
||||
{
|
||||
var bikesTarget = GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 1).GetBikesOccupied(
|
||||
"a@B",
|
||||
() => new DateTime(2017, 11, 28, 14, 8, 14), // Date time now for bikes which are reserved
|
||||
DataSource.Copri);
|
||||
|
||||
// Check initial count of bikes.
|
||||
Assert.That(bikesTarget.Count, Is.EqualTo(2));
|
||||
|
||||
// Bike 5 is reserved
|
||||
bikesTarget = GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 2).GetBikesOccupied(
|
||||
"a@B",
|
||||
() => new DateTime(2017, 11, 28, 14, 08, 36).Add(new TimeSpan(0, 2, 0)), // Date time now for bikes which are reserved
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(bikesTarget.Count, Is.EqualTo(3), "One bike (nr. 5) got reserved");
|
||||
|
||||
Assert.That(bikesTarget.GetById("5"), Is.Not.Null);
|
||||
Assert.That(bikesTarget.GetById("5").State.Value, Is.EqualTo(InUseStateEnum.Reserved));
|
||||
Assert.That(bikesTarget.GetById("5").Id, Is.EqualTo("5"));
|
||||
Assert.That(bikesTarget.GetById("5").Description, Is.EqualTo("Cargo Long"));
|
||||
Assert.That(bikesTarget.GetById("5").TypeOfBike, Is.EqualTo(TypeOfBike.Cargo));
|
||||
Assert.That(bikesTarget.GetById("5").WheelType, Is.EqualTo(WheelType.Two));
|
||||
Assert.That(bikesTarget.GetById("5").State.From, Is.EqualTo(DateTime.Parse("2017-11-28 14:07:13.745568+01"))); // Sommer/ Winterzeit!
|
||||
|
||||
// Bike 5 is booked
|
||||
bikesTarget = GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 3).GetBikesOccupied(
|
||||
"a@B",
|
||||
() => DateTime.Now,
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(bikesTarget.Count, Is.EqualTo(3), "One bike (nr. 5) got booked");
|
||||
|
||||
Assert.That(bikesTarget.GetById("5"), Is.Not.Null);
|
||||
Assert.That(bikesTarget.GetById("5").State.Value, Is.EqualTo(InUseStateEnum.Booked));
|
||||
Assert.That(bikesTarget.GetById("5").Id, Is.EqualTo("5"));
|
||||
Assert.That(bikesTarget.GetById("5").Description, Is.EqualTo("Cargo Long"));
|
||||
Assert.That(bikesTarget.GetById("5").TypeOfBike, Is.EqualTo(TypeOfBike.Cargo));
|
||||
Assert.That(bikesTarget.GetById("5").WheelType, Is.EqualTo(WheelType.Two));
|
||||
Assert.That(bikesTarget.GetById("5").State.From, Is.EqualTo(DateTime.Parse("2017 -11-28 14:08:32.756368+01"))); // Sommer/ Winterzeit!
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestGetBikesOccupied_Bt_BikeNr5GetBooked()
|
||||
{
|
||||
var bikesTarget = GetBikesOccupied("5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH", SampleSets.ShareeFr01_Set1, 1).GetBikesOccupied(
|
||||
"a@B",
|
||||
() => new DateTime(2017, 11, 28, 14, 8, 14), // Date time now for bikes which are reserved
|
||||
DataSource.Copri);
|
||||
|
||||
// Check initial count of bikes.
|
||||
Assert.That(bikesTarget.Count, Is.EqualTo(2));
|
||||
|
||||
// Bike 5 is reserved
|
||||
bikesTarget = GetBikesOccupied("5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH", SampleSets.ShareeFr01_Set1, 2).GetBikesOccupied(
|
||||
"a@B",
|
||||
() => new DateTime(2017, 11, 28, 14, 08, 36).Add(new TimeSpan(0, 2, 0)), // Date time now for bikes which are reserved
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(bikesTarget.Count, Is.EqualTo(3), "One bike (nr. 5) got reserved");
|
||||
|
||||
var btBikeReserved = bikesTarget.GetById("FR_1004") as ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo;
|
||||
Assert.That(btBikeReserved, Is.Not.Null);
|
||||
Assert.That(bikesTarget.GetById("FR_1004").State.Value, Is.EqualTo(InUseStateEnum.Reserved));
|
||||
Assert.That(btBikeReserved.Id, Is.EqualTo("FR_1004"));
|
||||
Assert.That(btBikeReserved.Description, Is.EqualTo("Tester-bike Oliver 2"));
|
||||
Assert.That(btBikeReserved.TypeOfBike, Is.Null);
|
||||
Assert.That(btBikeReserved.WheelType, Is.Null);
|
||||
Assert.That(btBikeReserved.State.From, Is.EqualTo(DateTime.Parse("2021-07-04 17:46:36.237404+02"))); // Sommer/ Winterzeit!
|
||||
Assert.That(btBikeReserved.State.Code, Is.EqualTo(string.Empty), "Not needed for bt bikes.");
|
||||
Assert.That(
|
||||
btBikeReserved.TariffDescription.TariffEntries["2"].Value, // FeeEuroPerHour
|
||||
Is.EqualTo("3.00 €/hour"));
|
||||
Assert.That(
|
||||
btBikeReserved.TariffDescription.TariffEntries["3"].Value, // MaxFeeEuroPerDay
|
||||
Is.EqualTo("10.00 €/day"));
|
||||
Assert.That(btBikeReserved.TariffDescription.Id, Is.EqualTo(5494));
|
||||
Assert.That(btBikeReserved.TariffDescription.Name, Is.EqualTo("Tester Basic"));
|
||||
Assert.That(btBikeReserved.StationId, Is.EqualTo("FR_103"));
|
||||
Assert.That(btBikeReserved.LockInfo.Id, Is.EqualTo(2302373));
|
||||
Assert.That(btBikeReserved.OperatorUri.AbsoluteUri, Does.Contain("https://shareeapp-fr01.copri.eu"));
|
||||
Assert.That(btBikeReserved.Group.Count, Is.EqualTo(1));
|
||||
Assert.That(btBikeReserved.Group.ToArray()[0], Is.EqualTo("FR_300029"));
|
||||
|
||||
// Bike 5 is booked
|
||||
var btBikeRented = bikesTarget.GetById("1537") as ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo;
|
||||
|
||||
Assert.That(btBikeRented, Is.Not.Null);
|
||||
Assert.That(btBikeRented.State.Value, Is.EqualTo(InUseStateEnum.Booked));
|
||||
Assert.That(btBikeRented.Id, Is.EqualTo("1537"));
|
||||
Assert.That(btBikeRented.Description, Is.EqualTo("Oliver (Ilockit)"));
|
||||
Assert.That(btBikeRented.TypeOfBike, Is.Null);
|
||||
Assert.That(btBikeRented.WheelType, Is.Null);
|
||||
Assert.That(btBikeRented.State.From, Is.EqualTo(DateTime.Parse("2020-10-12 08:38:30.401679+02"))); // Sommer/ Winterzeit!
|
||||
Assert.That(btBikeRented.State.Code, Is.EqualTo(string.Empty), "Not needed for bt bikes.");
|
||||
Assert.That(
|
||||
btBikeRented.TariffDescription.TariffEntries["2"].Value, // FeeEuroPerHour
|
||||
Is.EqualTo("2.50 €/hour"));
|
||||
Assert.That(
|
||||
btBikeRented.TariffDescription.TariffEntries["3"].Value, // MaxFeeEuroPerDay
|
||||
Is.EqualTo("10.00 €/day"));
|
||||
Assert.That(btBikeRented.TariffDescription.Id, Is.EqualTo(5494));
|
||||
Assert.That(btBikeRented.TariffDescription.Name, Is.EqualTo("Tester Basic"));
|
||||
Assert.That(btBikeRented.StationId, Is.EqualTo("103"));
|
||||
Assert.That(btBikeRented.LockInfo.Id, Is.EqualTo(2200537));
|
||||
Assert.That(btBikeRented.OperatorUri.AbsoluteUri, Does.Contain("https://shareeapp-fr01.copri.eu"));
|
||||
Assert.That(btBikeRented.Group.Count, Is.EqualTo(1));
|
||||
Assert.That(btBikeRented.Group.ToArray()[0], Is.EqualTo("300029"));
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void TestGetBikesAvailable()
|
||||
{
|
||||
var bikesTarget = GetBikesAvailable(ShareeBikeApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 1).GetBikesAvailable(DataSource.Copri);
|
||||
|
||||
// Verify count of bikes
|
||||
Assert.That(bikesTarget.Count, Is.EqualTo(12));
|
||||
|
||||
// Verify properties of bike 5
|
||||
Assert.That(bikesTarget.GetById("5"), Is.Not.Null);
|
||||
Assert.That(bikesTarget.GetById("5").Id, Is.EqualTo("5"));
|
||||
Assert.That(bikesTarget.GetById("5").Group.ToArray()[0], Is.EqualTo("ShareeBike"));
|
||||
Assert.That(bikesTarget.GetById("5").TypeOfBike, Is.EqualTo(TypeOfBike.Cargo));
|
||||
Assert.That(bikesTarget.GetById("5").WheelType, Is.EqualTo(WheelType.Two));
|
||||
Assert.That(bikesTarget.GetById("5").State.Value, Is.EqualTo(InUseStateEnum.Disposable));
|
||||
Assert.That(bikesTarget.GetById("5").State.From, Is.Null); // Sommer/ Winterzeit!
|
||||
Assert.That(bikesTarget.GetById("5").State.Code, Is.Null);
|
||||
|
||||
// Verify properties of bike 52
|
||||
Assert.That(bikesTarget.GetById("52"), Is.Not.Null);
|
||||
Assert.That(bikesTarget.GetById("52").Id, Is.EqualTo("52"));
|
||||
Assert.That(bikesTarget.GetById("52").Group.ToArray()[0], Is.EqualTo("Citybike"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
// occupied bikes count should be 2!
|
||||
public void TestGetBikesOccupied()
|
||||
{
|
||||
var l_oBikesTarget = GetBikesOccupied(ShareeBikeApp.MerchantId, SampleSets.Set2, 1).GetBikesOccupied(
|
||||
"a@b",
|
||||
() => DateTime.Now,
|
||||
DataSource.Copri);
|
||||
|
||||
// Verify count of bikes
|
||||
Assert.That(l_oBikesTarget.Count, Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestGetBikesAll_BikesAvailbleResponse()
|
||||
{
|
||||
var availableResponse = JsonConvert.DeserializeObject<BikesAvailableResponse>(
|
||||
@"{
|
||||
""bikes"" : {
|
||||
""2352"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9"",
|
||||
""system"" : ""Ilockit""
|
||||
},
|
||||
""2379"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""19"",
|
||||
""gps"" : { ""latitude"": ""47.6597846667"", ""longitude"": ""9.177439"" },
|
||||
""station"" : ""3""
|
||||
}
|
||||
}
|
||||
}");
|
||||
|
||||
var bikes = BikeCollectionFactory.GetBikesAll(
|
||||
availableResponse?.bikes?.Values,
|
||||
null,
|
||||
"Heinz.Mustermann@posteo.de",
|
||||
() => DateTime.Now,
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(
|
||||
bikes.Count, Is.EqualTo(2));
|
||||
|
||||
Assert.That(
|
||||
bikes.Where(x => x is ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo).Count(), Is.EqualTo(1),
|
||||
"There must be one ILockitBike and one BC bike (BikeInfo class).");
|
||||
}
|
||||
[Test]
|
||||
public void TestGetBikesAll_BikesAvailbleResponse_InvalidState()
|
||||
{
|
||||
var availableResponse = JsonConvert.DeserializeObject<BikesAvailableResponse>(
|
||||
@"{
|
||||
""bikes"" : {
|
||||
""2352"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""reserved"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9""
|
||||
}
|
||||
}
|
||||
}");
|
||||
|
||||
var bikes = BikeCollectionFactory.GetBikesAll(
|
||||
availableResponse?.bikes?.Values,
|
||||
null,
|
||||
"Heinz.Mustermann@posteo.de",
|
||||
() => DateTime.Now,
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(
|
||||
bikes.Count, Is.EqualTo(0),
|
||||
"State of a element of BikesAvailableResponse must never be reserved.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestGetBikesAll_BikesAvailableResponse_InvalidStation()
|
||||
{
|
||||
var availableResponse = JsonConvert.DeserializeObject<BikesAvailableResponse>(
|
||||
@"{
|
||||
""bikes"" : {
|
||||
""2352"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : """"
|
||||
}
|
||||
}
|
||||
}");
|
||||
|
||||
var bikes = BikeCollectionFactory.GetBikesAll(
|
||||
availableResponse?.bikes?.Values,
|
||||
null,
|
||||
"Heinz.Mustermann@posteo.de",
|
||||
() => DateTime.Now,
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(
|
||||
bikes.Count, Is.EqualTo(0),
|
||||
"Station of a element of BikesAvailableResponse must always be defined.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestGetBikesAll_BikesAvailableResponse_DuplicateId()
|
||||
{
|
||||
var availableResponse = JsonConvert.DeserializeObject<BikesAvailableResponse>(
|
||||
@"{
|
||||
""bikes"" : {
|
||||
""2352"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.669888"", ""longitude"": ""9.167749"" },
|
||||
""station"" : ""9""
|
||||
},
|
||||
""2379"" : {
|
||||
""description"" : ""Cargo Long"",
|
||||
""state"" : ""available"",
|
||||
""bike"" : ""1"",
|
||||
""gps"" : { ""latitude"": ""47.6597846667"", ""longitude"": ""9.177439"" },
|
||||
""station"" : ""3""
|
||||
}
|
||||
}
|
||||
}");
|
||||
|
||||
var bikes = BikeCollectionFactory.GetBikesAll(
|
||||
availableResponse?.bikes?.Values,
|
||||
null,
|
||||
"Heinz.Mustermann@posteo.de",
|
||||
() => DateTime.Now,
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(
|
||||
bikes.Count, Is.EqualTo(0),
|
||||
"Ids of a elements of BikesAvailableResponse must be unique.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestGetBikesAll_BikesReservedOccupiedResponse_DuplicateId()
|
||||
{
|
||||
var reservedOccupiedResponse = JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(
|
||||
@"{
|
||||
""bikes_occupied"" : {
|
||||
""87785"" : {
|
||||
""station"" : ""2"",
|
||||
""state"" : ""occupied"",
|
||||
""bike"" : ""20"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""start_time"" : ""2017-12-01 22:21:57.740069+01"",
|
||||
""timeCode"" : ""6603""
|
||||
},
|
||||
""87782"" : {
|
||||
""station"" : ""4"",
|
||||
""state"" : ""occupied"",
|
||||
""bike"" : ""20"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""start_time"" : ""2017-11-28 13:06:55.147368+01"",
|
||||
""timeCode"" : ""2931""
|
||||
}
|
||||
}
|
||||
}");
|
||||
|
||||
var bikes = BikeCollectionFactory.GetBikesAll(
|
||||
null,
|
||||
reservedOccupiedResponse?.bikes_occupied?.Values,
|
||||
"Heinz.Mustermann@posteo.de",
|
||||
() => DateTime.Now,
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(
|
||||
bikes.Count, Is.EqualTo(0),
|
||||
"Ids of a elements of BikesAvailableResponse must be unique.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestGetBikesAll_BikesReservedOccupiedResponse()
|
||||
{
|
||||
var reservedOccupiedResponse = JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(
|
||||
@"{
|
||||
""bikes_occupied"" : {
|
||||
""87785"" : {
|
||||
""station"" : ""2"",
|
||||
""state"" : ""occupied"",
|
||||
""bike"" : ""20"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""start_time"" : ""2017-12-01 22:21:57.740069+01"",
|
||||
""timeCode"" : ""6603"",
|
||||
""system"" : ""Ilockit""
|
||||
},
|
||||
""87782"" : {
|
||||
""station"" : ""4"",
|
||||
""state"" : ""occupied"",
|
||||
""bike"" : ""7"",
|
||||
""description"" : ""Cargo Long"",
|
||||
""start_time"" : ""2017-11-28 13:06:55.147368+01"",
|
||||
""timeCode"" : ""2931""
|
||||
}
|
||||
}
|
||||
}");
|
||||
|
||||
var bikes = BikeCollectionFactory.GetBikesAll(
|
||||
null,
|
||||
reservedOccupiedResponse?.bikes_occupied?.Values,
|
||||
"Heinz.Mustermann@posteo.de",
|
||||
() => DateTime.Now,
|
||||
DataSource.Copri);
|
||||
|
||||
Assert.That(
|
||||
bikes.Count, Is.EqualTo(2),
|
||||
"Ids of a elements of BikesAvailableResponse must be unique.");
|
||||
|
||||
Assert.That(
|
||||
bikes.Where(x => x is ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo).Count(), Is.EqualTo(1),
|
||||
"There must be one ILockitBike and one BC bike (BikeInfo class).");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestLoad_Reserved_CalculateAuthKeys()
|
||||
{
|
||||
// Construct requested bike.
|
||||
var bike = new ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfoMutable(
|
||||
Substitute.For<IGeolocationService>(),
|
||||
Substitute.For<ILocksService>(),
|
||||
() => false /* not connected */,
|
||||
(_) => Substitute.For<IConnector>(),
|
||||
() => Substitute.For<IPollingUpdateTaskManager>(),
|
||||
new ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo(
|
||||
new ShareeBike.Model.Bikes.BikeInfoNS.BikeNS.Bike("17", LockModel.ILockIt),
|
||||
new DriveMutable(),
|
||||
DataSource.Copri,
|
||||
22,
|
||||
new Guid("0000f00d-1212-efde-1523-785fef13d123"),
|
||||
new[] { (byte)1, (byte)3, (byte)4 },
|
||||
new[] { (byte)11, (byte)3, (byte)1 },
|
||||
new[] { (byte)12, (byte)7, (byte)4 },
|
||||
DateTime.Now,
|
||||
"a@b",
|
||||
"1",
|
||||
null,
|
||||
null,
|
||||
() => DateTime.Now,
|
||||
false, /*isDemo*/
|
||||
null /*group*/),
|
||||
"My Station Name");
|
||||
|
||||
var response = JsonConvert.DeserializeObject<BikeInfoReservedOrBooked>(@"
|
||||
{
|
||||
""Ilockit_ID"": ""ISHAREIT+0815"",
|
||||
""state"": ""requested"",
|
||||
""start_time"": ""2018-01-27 17:33:00.989464+01"",
|
||||
""K_seed"": ""[-18, -80, 20, -90, 3, 69, 96, 4, -35, 75, -95, 102, 7, 121, -122, 15]"",
|
||||
""K_u"": ""[99, 104, 120, 121, 63, 99, -10, -110, 94, 70, 15, -112, -6, 101, 117, -90, -113, -54, -90, -95, 0, 0, 0, 0]"",
|
||||
}");
|
||||
|
||||
// Update from new auth keys.
|
||||
bike.Load(response, "a@b");
|
||||
|
||||
// Verify that keys are correctly updated.
|
||||
Assert.That(new byte[] { 256 - 18, 256 - 80, 20, 256 - 90, 3, 69, 96, 4, 256 - 35, 75, 256 - 95, 102, 7, 121, 256 - 122, 15 }.SequenceEqual(bike.LockInfo.Seed), Is.True);
|
||||
Assert.That(new byte[] { 99, 104, 120, 121, 63, 99, 256 - 10, 256 - 110, 94, 70, 15, 256 - 112, 256 - 6, 101, 117, 256 - 90, 256 - 113, 256 - 54, 256 - 90, 256 - 95, 0, 0, 0, 0 }.SequenceEqual(bike.LockInfo.UserKey), Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestLoad_Booked_CalculateAuthKeys()
|
||||
{
|
||||
// Construct occupied bike.
|
||||
var bike = new ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfoMutable(
|
||||
Substitute.For<IGeolocationService>(),
|
||||
Substitute.For<ILocksService>(),
|
||||
() => false /* not connected */,
|
||||
(_) => Substitute.For<IConnector>(),
|
||||
() => Substitute.For<IPollingUpdateTaskManager>(),
|
||||
new ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo(
|
||||
new ShareeBike.Model.Bikes.BikeInfoNS.BikeNS.Bike("17", LockModel.ILockIt),
|
||||
new DriveMutable(),
|
||||
DataSource.Copri,
|
||||
22,
|
||||
new Guid("0000f00d-1212-efde-1523-785fef13d123"),
|
||||
new[] { (byte)1, (byte)3, (byte)4 },
|
||||
new[] { (byte)11, (byte)3, (byte)1 },
|
||||
new[] { (byte)12, (byte)7, (byte)4 },
|
||||
DateTime.Now,
|
||||
"a@b",
|
||||
"1",
|
||||
null /*operator uri*/),
|
||||
"My Station Name");
|
||||
|
||||
var response = JsonConvert.DeserializeObject<BikeInfoReservedOrBooked>(@"
|
||||
{
|
||||
""Ilockit_ID"": ""ISHAREIT+0815"",
|
||||
""state"": ""occupied"",
|
||||
""start_time"": ""2018-01-27 17:33:00.989464+01"",
|
||||
""K_seed"": ""[-18, -80, 20, -90, 3, 69, 96, 4, -35, 75, -95, 102, 7, 121, -122, 15]"",
|
||||
""K_u"": ""[99, 104, 120, 121, 63, 99, -10, -110, 94, 70, 15, -112, -6, 101, 117, -90, -113, -54, -90, -95, 0, 0, 0, 0]"",
|
||||
}");
|
||||
|
||||
// Update from new auth keys.
|
||||
bike.Load(response, "a@b");
|
||||
|
||||
// Verify that keys are correctly updated.
|
||||
Assert.That(new byte[] { 256 - 18, 256 - 80, 20, 256 - 90, 3, 69, 96, 4, 256 - 35, 75, 256 - 95, 102, 7, 121, 256 - 122, 15 }.SequenceEqual(bike.LockInfo.Seed), Is.True);
|
||||
Assert.That(new byte[] { 99, 104, 120, 121, 63, 99, 256 - 10, 256 - 110, 94, 70, 15, 256 - 112, 256 - 6, 101, 117, 256 - 90, 256 - 113, 256 - 54, 256 - 90, 256 - 95, 0, 0, 0, 0 }.SequenceEqual(bike.LockInfo.UserKey), Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestLoad_Reserved_DoBook()
|
||||
{
|
||||
// Construct requested bike.
|
||||
var bike = new ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfoMutable(
|
||||
Substitute.For<IGeolocationService>(),
|
||||
Substitute.For<ILocksService>(),
|
||||
() => false /* not connected */,
|
||||
(_) => Substitute.For<IConnector>(),
|
||||
() => Substitute.For<IPollingUpdateTaskManager>(),
|
||||
new ShareeBike.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo(
|
||||
new ShareeBike.Model.Bikes.BikeInfoNS.BikeNS.Bike("17", LockModel.ILockIt),
|
||||
new DriveMutable(),
|
||||
DataSource.Copri,
|
||||
22,
|
||||
new Guid("0000f00d-1212-efde-1523-785fef13d123"),
|
||||
new[] { (byte)1, (byte)3, (byte)4 },
|
||||
new[] { (byte)11, (byte)3, (byte)1 },
|
||||
new[] { (byte)12, (byte)7, (byte)4 },
|
||||
DateTime.Now,
|
||||
"a@b",
|
||||
"1",
|
||||
null,
|
||||
null,
|
||||
() => DateTime.Now,
|
||||
false, /*isDemo*/
|
||||
null /*group*/),
|
||||
"My Station Name");
|
||||
|
||||
Assert.That(bike.State.Value, Is.EqualTo(InUseStateEnum.Reserved));
|
||||
|
||||
var response = JsonConvert.DeserializeObject<BikeInfoReservedOrBooked>(@"
|
||||
{
|
||||
""Ilockit_ID"": ""ISHAREIT+0815"",
|
||||
""state"": ""occupied"",
|
||||
""start_time"": ""2018-01-27 17:33:00.989464+01"",
|
||||
""K_seed"": ""[-18, -80, 20, -90, 3, 69, 96, 4, -35, 75, -95, 102, 7, 121, -122, 15]"",
|
||||
""K_u"": ""[99, 104, 120, 121, 63, 99, -10, -110, 94, 70, 15, -112, -6, 101, 117, -90, -113, -54, -90, -95, 0, 0, 0, 0]"",
|
||||
}");
|
||||
|
||||
// Update from new auth keys.
|
||||
bike.Load(response, "a@b");
|
||||
|
||||
Assert.That(bike.State.Value, Is.EqualTo(InUseStateEnum.Booked));
|
||||
}
|
||||
|
||||
/// <summary> Verifies loading a default user without special permissions.</summary>
|
||||
[Test]
|
||||
public void TestGetAccount_DebugLevelNone()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<AuthorizationResponse>(@"
|
||||
{
|
||||
""response_state"" : ""OK: nothing todo "",
|
||||
""user_group"" : [ ""300029"", ""300001"" ],
|
||||
""user_id"" : ""ohauff@posteo.de"",
|
||||
""authcookie"" : ""5781_f172cf59108fe53e7524c841847fee69_oiF2kahH"",
|
||||
""response"" : ""authorization"",
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""response_text"" : ""Herzlich willkommen im Fahrradmietsystem"",
|
||||
""debuglevel"" : ""0"",
|
||||
""apiserver"" : ""https://shareeapp-fr01.copri.eu""
|
||||
}");
|
||||
|
||||
var account = response.GetAccount("merch123", "hallo@welt", "0815");
|
||||
|
||||
Assert.That(
|
||||
account.DebugLevel,
|
||||
Is.EqualTo(Permissions.None));
|
||||
}
|
||||
|
||||
/// <summary> Verifies loading a admin user with all special permissions.</summary>
|
||||
[Test]
|
||||
public void TestGetAccount_DebugLevelAll()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<AuthorizationResponse>(@"
|
||||
{
|
||||
""response_state"" : ""OK: nothing todo "",
|
||||
""user_group"" : [ ""300029"", ""300001"" ],
|
||||
""user_id"" : ""ohauff@posteo.de"",
|
||||
""authcookie"" : ""5781_f172cf59108fe53e7524c841847fee69_oiF2kahH"",
|
||||
""response"" : ""authorization"",
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""response_text"" : ""Herzlich willkommen im Fahrradmietsystem"",
|
||||
""debuglevel"" : ""1"",
|
||||
""apiserver"" : ""https://shareeapp-fr01.copri.eu""
|
||||
}");
|
||||
|
||||
var account = response.GetAccount("merch123", "hallo@welt", "0815");
|
||||
|
||||
Assert.That(
|
||||
account.DebugLevel,
|
||||
Is.EqualTo(Permissions.All));
|
||||
}
|
||||
|
||||
/// <summary> Verifies loading a admin user with all special permissions.</summary>
|
||||
[Test]
|
||||
public void TestGetAccount_DebugLevel_Logging()
|
||||
{
|
||||
var response = JsonConvert.DeserializeObject<AuthorizationResponse>(@"
|
||||
{
|
||||
""response_state"" : ""OK: nothing todo "",
|
||||
""user_group"" : [ ""300029"", ""300001"" ],
|
||||
""user_id"" : ""ohauff@posteo.de"",
|
||||
""authcookie"" : ""5781_f172cf59108fe53e7524c841847fee69_oiF2kahH"",
|
||||
""response"" : ""authorization"",
|
||||
""copri_version"" : ""4.1.0.0"",
|
||||
""response_text"" : ""Herzlich willkommen im Fahrradmietsystem"",
|
||||
""debuglevel"" : ""64"",
|
||||
""apiserver"" : ""https://shareeapp-fr01.copri.eu""
|
||||
}");
|
||||
|
||||
var account = response.GetAccount("merch123", "hallo@welt", "0815");
|
||||
|
||||
Assert.That(
|
||||
account.DebugLevel,
|
||||
Is.EqualTo(Permissions.PickLoggingLevel));
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue