using System; using System.Linq; using Newtonsoft.Json; using NSubstitute; using NUnit.Framework; using TINK.Model; using TINK.Model.Bikes; using TINK.Model.Bikes.BikeInfoNS.BC; using TINK.Model.Bikes.BikeInfoNS.BikeNS; using TINK.Model.Bikes.BikeInfoNS.DriveNS; using TINK.Model.Connector; using TINK.Model.Connector.Updater; using TINK.Model.State; using TINK.Model.User.Account; using TINK.Repository; using TINK.Repository.Response; using TINK.Repository.Response.Stations; using TINK.Services.BluetoothLock; using TINK.Services.Geolocation; using TINK.ViewModel; using Xamarin.Forms; using static TINK.Repository.CopriCallsMemory; namespace TestShareeLib.Model.Connector.Updater { [TestFixture] public class TestUpdaterJSON { [Test] public void TestGetAllStations() { var l_oStationsTarget = new CopriCallsMemory("MyMerchId", SampleSets.Set2, 1).GetStationsAsync().Result.GetStationsAllMutable(); Assert.AreEqual(9, l_oStationsTarget.Count); // Check first entry. Assert.NotNull(l_oStationsTarget.GetById("4")); Assert.AreEqual("TINK", string.Join(",", l_oStationsTarget.GetById("4").Group.ToArray())); Assert.AreEqual("4", l_oStationsTarget.GetById("4").Id); Assert.AreEqual(47.6586936667, l_oStationsTarget.GetById("4").Position.Latitude); Assert.AreEqual(9.16863116667, l_oStationsTarget.GetById("4").Position.Longitude); Assert.NotNull(l_oStationsTarget.GetById("14")); Assert.AreEqual("Konrad", string.Join(",", l_oStationsTarget.GetById("14").Group.ToArray())); Assert.NotNull(l_oStationsTarget.GetById("31")); Assert.AreEqual("TINK,Konrad", string.Join(",", l_oStationsTarget.GetById("31").Group.ToArray())); Assert.AreEqual("Südstadt Station", l_oStationsTarget.GetById("31").StationName); } [Test] public void TestGetAllStations_OperatorData() { var stations = JsonConvert.DeserializeObject>(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>(@" { ""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(TinkApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 1).GetBikesAvailable(DataSource.Copri); Assert.AreEqual(12, l_oBikesTarget.Count, "Bike 5 is available an must be part of available bikes collection"); // Verify state of bike 5. Assert.NotNull(l_oBikesTarget.GetById("5")); Assert.AreEqual("5", l_oBikesTarget.GetById("5").Id); Assert.AreEqual(TypeOfBike.Cargo, l_oBikesTarget.GetById("5").TypeOfBike); Assert.AreEqual(WheelType.Two, l_oBikesTarget.GetById("5").WheelType); Assert.AreEqual(InUseStateEnum.Disposable, l_oBikesTarget.GetById("5").State.Value); Assert.IsNull(l_oBikesTarget.GetById("5").State.From); // Sommer/ Winterzeit! Assert.IsNull(l_oBikesTarget.GetById("5").State.Code); // Bike 5 is reserved. // Count of bikes must decrease and bike #5 no more in list of bikes. l_oBikesTarget = GetBikesAvailable(TinkApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 2).GetBikesAvailable(DataSource.Copri); Assert.AreEqual(11, l_oBikesTarget.Count, "One bike (nr. 5) got reserved"); Assert.Null(l_oBikesTarget.GetById("5"), "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(TinkApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 3).GetBikesAvailable(DataSource.Copri); Assert.Null(l_oBikesTarget.GetById("5"), "Bike 5 got booked and must not be part of available bikes collection"); Assert.IsNull(l_oBikesTarget.GetById("5")); } [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.AreEqual( 2, l_oBikesTarget.Count); // 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.AreEqual(3, l_oBikesTarget.Count, "One bike (nr. 5) got reserved"); Assert.NotNull(l_oBikesTarget.GetById("5")); Assert.AreEqual(InUseStateEnum.Reserved, l_oBikesTarget.GetById("5").State.Value); Assert.AreEqual("5", l_oBikesTarget.GetById("5").Id); Assert.AreEqual(TypeOfBike.Cargo, l_oBikesTarget.GetById("5").TypeOfBike); Assert.AreEqual(WheelType.Two, l_oBikesTarget.GetById("5").WheelType); Assert.AreEqual(DateTime.Parse("2017-11-28 14:07:13.745568+01"), l_oBikesTarget.GetById("5").State.From); // Sommer/ Winterzeit! // Bike 5 is booked l_oBikesTarget = GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 3).GetBikesOccupied( "a@B", () => DateTime.Now, DataSource.Copri); Assert.AreEqual(3, l_oBikesTarget.Count, "One bike (nr. 5) got booked"); Assert.IsNotNull(l_oBikesTarget.GetById("5")); Assert.AreEqual(InUseStateEnum.Booked, l_oBikesTarget.GetById("5").State.Value); Assert.AreEqual("5", l_oBikesTarget.GetById("5").Id); Assert.AreEqual(TypeOfBike.Cargo, l_oBikesTarget.GetById("5").TypeOfBike); Assert.AreEqual(WheelType.Two, l_oBikesTarget.GetById("5").WheelType); Assert.AreEqual(DateTime.Parse("2017 -11-28 14:08:32.756368+01"), l_oBikesTarget.GetById("5").State.From); // Sommer/ Winterzeit! } public void TestGetBikesAvailable_BikeNr5GetBooked() { // Bike 5 is centered. var l_oBikesTarget = GetBikesAvailable(TinkApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 1).GetBikesAvailable(DataSource.Copri); Assert.AreEqual(11, l_oBikesTarget.Count, "Bike 5 is available an must be part of available bikes collection"); // Verify state of bike 5. Assert.NotNull(l_oBikesTarget.GetById("5")); Assert.AreEqual(5, l_oBikesTarget.GetById("5").Id); Assert.AreEqual(TypeOfBike.Cargo, l_oBikesTarget.GetById("5").TypeOfBike); Assert.AreEqual(WheelType.Two, l_oBikesTarget.GetById("5").WheelType); Assert.AreEqual(InUseStateEnum.Disposable, l_oBikesTarget.GetById("5").State.Value); Assert.IsNull(l_oBikesTarget.GetById("5").State.From); // Sommer/ Winterzeit! Assert.IsNull(l_oBikesTarget.GetById("5").State.Code); // Bike 5 is reserved. // Count of bikes must decrease and bike #5 no more in list of bikes. l_oBikesTarget = GetBikesAvailable(TinkApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 2).GetBikesAvailable(DataSource.Copri); Assert.AreEqual(10, l_oBikesTarget.Count, "One bike (nr. 5) got reserved"); Assert.Null(l_oBikesTarget.GetById("5"), "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(TinkApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 3).GetBikesAvailable(DataSource.Copri); Assert.Null(l_oBikesTarget.GetById("5"), "Bike 5 got booked and must not be part of available bikes collection"); Assert.IsNull(l_oBikesTarget.GetById("5")); } [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.AreEqual(2, bikesTarget.Count); // 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.AreEqual(3, bikesTarget.Count, "One bike (nr. 5) got reserved"); Assert.NotNull(bikesTarget.GetById("5")); Assert.AreEqual(InUseStateEnum.Reserved, bikesTarget.GetById("5").State.Value); Assert.AreEqual("5", bikesTarget.GetById("5").Id); Assert.AreEqual("Cargo Long", bikesTarget.GetById("5").Description); Assert.AreEqual(TypeOfBike.Cargo, bikesTarget.GetById("5").TypeOfBike); Assert.AreEqual(WheelType.Two, bikesTarget.GetById("5").WheelType); Assert.AreEqual(DateTime.Parse("2017-11-28 14:07:13.745568+01"), bikesTarget.GetById("5").State.From); // Sommer/ Winterzeit! // Bike 5 is booked bikesTarget = GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 3).GetBikesOccupied( "a@B", () => DateTime.Now, DataSource.Copri); Assert.AreEqual(3, bikesTarget.Count, "One bike (nr. 5) got booked"); Assert.IsNotNull(bikesTarget.GetById("5")); Assert.AreEqual(InUseStateEnum.Booked, bikesTarget.GetById("5").State.Value); Assert.AreEqual("5", bikesTarget.GetById("5").Id); Assert.AreEqual("Cargo Long", bikesTarget.GetById("5").Description); Assert.AreEqual(TypeOfBike.Cargo, bikesTarget.GetById("5").TypeOfBike); Assert.AreEqual(WheelType.Two, bikesTarget.GetById("5").WheelType); Assert.AreEqual(DateTime.Parse("2017 -11-28 14:08:32.756368+01"), bikesTarget.GetById("5").State.From); // 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.AreEqual(2, bikesTarget.Count); // 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.AreEqual(3, bikesTarget.Count, "One bike (nr. 5) got reserved"); var btBikeReserved = bikesTarget.GetById("FR_1004") as TINK.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo; Assert.NotNull(btBikeReserved); Assert.AreEqual(InUseStateEnum.Reserved, bikesTarget.GetById("FR_1004").State.Value); Assert.AreEqual("FR_1004", btBikeReserved.Id); Assert.AreEqual("Tester-bike Oliver 2", btBikeReserved.Description); Assert.That(btBikeReserved.TypeOfBike, Is.Null); Assert.That(btBikeReserved.WheelType, Is.Null); Assert.AreEqual(DateTime.Parse("2021-07-04 17:46:36.237404+02"), btBikeReserved.State.From); // 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 TINK.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo; Assert.IsNotNull(btBikeRented); Assert.AreEqual(InUseStateEnum.Booked, btBikeRented.State.Value); Assert.AreEqual("1537", btBikeRented.Id); Assert.AreEqual("Oliver (Ilockit)", btBikeRented.Description); Assert.That(btBikeRented.TypeOfBike, Is.Null); Assert.That(btBikeRented.WheelType, Is.Null); Assert.AreEqual(DateTime.Parse("2020-10-12 08:38:30.401679+02"), btBikeRented.State.From); // Sommer/ Winterzeit! Assert.AreEqual(string.Empty, btBikeRented.State.Code, "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(TinkApp.MerchantId, sampleSet: SampleSets.Set2, stageIndex: 1).GetBikesAvailable(DataSource.Copri); // Verify count of bikes Assert.AreEqual(12, bikesTarget.Count); // Verify properties of bike 5 Assert.NotNull(bikesTarget.GetById("5")); Assert.AreEqual("5", bikesTarget.GetById("5").Id); Assert.AreEqual("TINK", bikesTarget.GetById("5").Group.ToArray()[0]); Assert.AreEqual(TypeOfBike.Cargo, bikesTarget.GetById("5").TypeOfBike); Assert.AreEqual(WheelType.Two, bikesTarget.GetById("5").WheelType); Assert.AreEqual(InUseStateEnum.Disposable, bikesTarget.GetById("5").State.Value); Assert.IsNull(bikesTarget.GetById("5").State.From); // Sommer/ Winterzeit! Assert.IsNull(bikesTarget.GetById("5").State.Code); // Verify properties of bike 52 Assert.NotNull(bikesTarget.GetById("52")); Assert.AreEqual("52", bikesTarget.GetById("52").Id); Assert.AreEqual("Konrad", bikesTarget.GetById("52").Group.ToArray()[0]); } [Test] public void TestGetBikesOccupied() { var l_oBikesTarget = GetBikesOccupied(TinkApp.MerchantId, SampleSets.Set2, 1).GetBikesOccupied( "a@b", () => DateTime.Now, DataSource.Copri); // Verify count of bikes Assert.AreEqual(2, l_oBikesTarget.Count); } [Test] public void TestGetBikesAll_BikesAvailbleResponse() { var availableResponse = JsonConvert.DeserializeObject( @"{ ""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.AreEqual( 2, bikes.Count); Assert.AreEqual( 1, bikes.Where(x => x is TINK.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo).Count(), "There must be one ILockitBike and one BC bike (BikeInfo class)."); } [Test] public void TestGetBikesAll_BikesAvailbleResponse_InvalidState() { var availableResponse = JsonConvert.DeserializeObject( @"{ ""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.AreEqual( 0, bikes.Count, "State of a element of BikesAvailableResponse must never be reserved."); } [Test] public void TestGetBikesAll_BikesAvailableResponse_InvalidStation() { var availableResponse = JsonConvert.DeserializeObject( @"{ ""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.AreEqual( 0, bikes.Count, "Station of a element of BikesAvailableResponse must always be defined."); } [Test] public void TestGetBikesAll_BikesAvailableResponse_DuplicateId() { var availableResponse = JsonConvert.DeserializeObject( @"{ ""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.AreEqual( 0, bikes.Count, "Ids of a elements of BikesAvailableResponse must be unique."); } [Test] public void TestGetBikesAll_BikesReservedOccupiedResponse_DuplicateId() { var reservedOccupiedResponse = JsonConvert.DeserializeObject( @"{ ""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.AreEqual( 0, bikes.Count, "Ids of a elements of BikesAvailableResponse must be unique."); } [Test] public void TestGetBikesAll_BikesReservedOccupiedResponse() { var reservedOccupiedResponse = JsonConvert.DeserializeObject( @"{ ""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.AreEqual( 2, bikes.Count, "Ids of a elements of BikesAvailableResponse must be unique."); Assert.AreEqual( 1, bikes.Where(x => x is TINK.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo).Count(), "There must be one ILockitBike and one BC bike (BikeInfo class)."); } [Test] public void TestLoad_Reserved_CalculateAuthKeys() { // Construct requested bike. var bike = new TINK.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfoMutable( Substitute.For(), Substitute.For(), () => false /* not connected */, (_) => Substitute.For(), () => Substitute.For(), new TINK.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo( new TINK.Model.Bikes.BikeInfoNS.BikeNS.Bike("17", LockModel.ILockIt), new Drive(), 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(@" { ""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.IsTrue(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)); Assert.IsTrue(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)); } [Test] public void TestLoad_Booked_CalculateAuthKeys() { // Construct occupied bike. var bike = new TINK.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfoMutable( Substitute.For(), Substitute.For(), () => false /* not connected */, (_) => Substitute.For(), () => Substitute.For(), new TINK.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo( new TINK.Model.Bikes.BikeInfoNS.BikeNS.Bike("17", LockModel.ILockIt), new Drive(), 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(@" { ""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.IsTrue(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)); Assert.IsTrue(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)); } [Test] public void TestLoad_Reserved_DoBook() { // Construct requested bike. var bike = new TINK.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfoMutable( Substitute.For(), Substitute.For(), () => false /* not connected */, (_) => Substitute.For(), () => Substitute.For(), new TINK.Model.Bikes.BikeInfoNS.BluetoothLock.BikeInfo( new TINK.Model.Bikes.BikeInfoNS.BikeNS.Bike("17", LockModel.ILockIt), new Drive(), 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.AreEqual(InUseStateEnum.Reserved, bike.State.Value); var response = JsonConvert.DeserializeObject(@" { ""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.AreEqual(InUseStateEnum.Booked, bike.State.Value); } /// Verifies loading a default user without special permissions. [Test] public void TestGetAccount_DebugLevelNone() { var response = JsonConvert.DeserializeObject(@" { ""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)); } /// Verifies loading a admin user with all special permissions. [Test] public void TestGetAccount_DebugLevelAll() { var response = JsonConvert.DeserializeObject(@" { ""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)); } /// Verifies loading a admin user with all special permissions. [Test] public void TestGetAccount_DebugLevel_Logging() { var response = JsonConvert.DeserializeObject(@" { ""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)); } } }