sharee.bike-App/SharedBusinessLogic.Tests/Model/Connector/Updater/TestUpdaterJSON.cs
2024-04-09 12:53:23 +02:00

841 lines
34 KiB
C#
Raw Blame History

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));
}
}
}