Code updated to 3.0.238

This commit is contained in:
Oliver Hauff 2021-06-26 20:57:55 +02:00
parent 3302d80678
commit 9c6a1fa92b
257 changed files with 7763 additions and 2861 deletions

View file

@ -0,0 +1,160 @@
using MonkeyCache.FileStore;
using NUnit.Framework;
using Serilog;
using System;
using TINK.Model.Connector;
using TINK.Model.Services.CopriApi.ServerUris;
using UITest.Fixtures.Connector;
namespace TestTINKLib.Fixtures.Misc
{
[TestFixture]
[Explicit("Run with care because this stress impact live system.")]
[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),
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/" + nameof(TestCachedQuery_GetStationsAll),
cookieAndMail.Split(';')[0],
cookieAndMail.Split(';')[1],
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.IsNull(result.Exception, $"Exception message: {result.Exception?.Message}");
queryIndex++;
}
}
/// <remarks>
/// From COPRI version v4.1 switched from TINK 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),
"Testsharee.bikeApp/3.0.223 AutomatedTestEnvirnoment/" + nameof(TestCachedQuery_GetBikes),
cookieAndMail.Split(';')[0],
cookieAndMail.Split(';')[1],
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.IsNull(result.Exception, $"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),
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/" + nameof(TestCachedQuery_GetBikes),
cookieAndMail.Split(';')[0],
cookieAndMail.Split(';')[1],
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.IsNull(result.Exception, $"Exception message: {result.Exception?.Message}");
queryIndex++;
}
}
}
}

View file

@ -0,0 +1,30 @@
using MonkeyCache.FileStore;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TINK.Model.Connector;
namespace TestTINKLib.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"), "TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default", "123456789", "a@b");
Assert.AreEqual(typeof(ConnectorCache), connector.GetType());
connector = ConnectorFactory.Create(true, new Uri("https://1.2.3.4"), "TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default", "123456789", "a@b");
Assert.AreEqual(typeof(TINK.Model.Connector.Connector), connector.GetType());
}
}
}

View file

@ -0,0 +1,514 @@
using MonkeyCache.FileStore;
using Newtonsoft.Json;
using NSubstitute;
using NUnit.Framework;
using System;
using System.Threading.Tasks;
using TINK.Model.Services.CopriApi;
using TINK.Repository;
using TINK.Repository.Exception;
using TINK.Repository.Response;
namespace TestTINKLib.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"" : [ ""TINK"" ],
""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"" : ""TINK 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"" : [ ""TINK"" ],
""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"" : [ ""TINK"" ],
""gps"" : { ""latitude"": ""47.66756"", ""longitude"": ""9.16477"" },
""state"" : ""available"",
""description"" : """"
},
""13"" : {
""station"" : ""13"",
""bike_soll"" : ""4"",
""bike_ist"" : ""1"",
""station_group"" : [ ""TINK"" ],
""gps"" : { ""latitude"": ""47.657756"", ""longitude"": ""9.176084"" },
""state"" : ""available"",
""description"" : """"
},
""30"" : {
""station"" : ""30"",
""bike_soll"" : ""5"",
""bike_ist"" : ""0"",
""station_group"" : [ ""TINK"", ""Konrad"" ],
""gps"" : { ""latitude"": ""47.657766"", ""longitude"": ""9.176094"" },
""state"" : ""available"",
""description"" : ""Test für Stadtradstation""
}
},
""user_group"" : [ ""Konrad"", ""TINK"" ],
""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
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default", // User agent
"456", // cookie
cacheServer: cache,
httpsServer: https);
var bikes = await provider.GetBikesAvailable();
Assert.AreEqual(1, bikes.Response.bikes.Count);
Assert.AreEqual(typeof(CopriCallsMonkeyStore).Name, bikes.Source.Name);
Assert.IsNull(bikes.Exception);
}
[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",
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default",
cacheServer: cache,
httpsServer: https);
var bikes = await provider.GetBikesAvailable(true);
Assert.AreEqual(1, bikes.Response.bikes.Count);
Assert.AreEqual(typeof(CopriCallsMonkeyStore).Name, bikes.Source.Name);
Assert.IsNull(bikes.Exception);
}
[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",
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default",
cacheServer: cache,
httpsServer: https);
var bikes = await provider.GetBikesAvailable();
Assert.AreEqual(1, bikes.Response.bikes.Count);
Assert.AreEqual(typeof(CopriCallsHttps).Name, bikes.Source.Name);
Assert.IsNull(bikes.Exception);
}
[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 Exception()); });
var provider = new CopriProviderHttps(
new Uri("http://1.2.3.4"),
"123",
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default",
cacheServer: cache,
httpsServer: https);
var bikes = await provider.GetBikesAvailable();
Assert.AreEqual(1, bikes.Response.bikes.Count);
Assert.AreEqual(typeof(CopriCallsMonkeyStore).Name, bikes.Source.Name);
Assert.AreEqual("Bang...", bikes.Exception.Message);
}
[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
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default", // User agent
"f782a208d9399291ba8d086b5dcc2509", // Auth cookie
cacheServer: cache,
httpsServer: https);
var bikes = await provider.GetBikesOccupied();
Assert.AreEqual(1, bikes.Response.bikes_occupied.Count);
Assert.AreEqual(typeof(CopriCallsMonkeyStore).Name, bikes.Source.Name);
Assert.IsNull(bikes.Exception);
}
[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
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default", // User agent
"f782a208d9399291ba8d086b5dcc2509", // Auth cookie
cacheServer: cache,
httpsServer: https);
var bikes = await provider.GetBikesOccupied(true);
Assert.AreEqual(1, bikes.Response.bikes_occupied.Count);
Assert.AreEqual(typeof(CopriCallsMonkeyStore).Name, bikes.Source.Name);
Assert.IsNull(bikes.Exception);
}
[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
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default", // User agent
"f782a208d9399291ba8d086b5dcc2509", // Auth cookie
cacheServer: cache,
httpsServer: https);
var bikes = await provider.GetBikesOccupied();
Assert.AreEqual(1, bikes.Response.bikes_occupied.Count);
Assert.AreEqual(typeof(CopriCallsHttps).Name, bikes.Source.Name);
Assert.IsNull(bikes.Exception);
}
[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 Exception()); });
var provider = new CopriProviderHttps(
new Uri("http://1.2.3.4"),
"12345678", // Merchant id
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default", // User agent
"f782a208d9399291ba8d086b5dcc2509", // Auth cookie
cacheServer: cache,
httpsServer: https);
var bikes = await provider.GetBikesOccupied();
Assert.AreEqual(1, bikes.Response.bikes_occupied.Count);
Assert.AreEqual(typeof(CopriCallsMonkeyStore).Name, bikes.Source.Name);
Assert.AreEqual("Bang...", bikes.Exception.Message);
}
[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<StationsAllResponse>(STATIONSALL)));
var provider = new CopriProviderHttps(
new Uri("http://1.2.3.4"),
"123", // Merchant id
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default", // User agent
"456", // cookie
cacheServer: cache,
httpsServer: https);
var stations = await provider.GetStations();
Assert.AreEqual(3, stations.Response.stations.Count);
Assert.AreEqual(typeof(CopriCallsMonkeyStore).Name, stations.Source.Name);
Assert.IsNull(stations.Exception);
}
[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<StationsAllResponse>(STATIONSALL)));
var provider = new CopriProviderHttps(
new Uri("http://1.2.3.4"),
"123",
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default",
cacheServer: cache,
httpsServer: https);
var stations = await provider.GetStations(true);
Assert.AreEqual(3, stations.Response.stations.Count);
Assert.AreEqual(typeof(CopriCallsMonkeyStore).Name, stations.Source.Name);
Assert.IsNull(stations.Exception);
}
[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<StationsAllResponse>(STATIONSALL)));
var provider = new CopriProviderHttps(
new Uri("http://1.2.3.4"),
"123",
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default",
cacheServer: cache,
httpsServer: https);
var stations = await provider.GetStations();
Assert.AreEqual(3, stations.Response.stations.Count);
Assert.AreEqual(typeof(CopriCallsHttps).Name, stations.Source.Name);
Assert.IsNull(stations.Exception);
}
[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<StationsAllResponse>(STATIONSALL)));
https.GetStationsAsync().Returns<StationsAllResponse>(x => { throw new WebConnectFailureException("Bang...", new Exception()); });
var provider = new CopriProviderHttps(
new Uri("http://1.2.3.4"),
"123",
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default",
cacheServer: cache,
httpsServer: https);
var stations = await provider.GetStations();
Assert.AreEqual(3, stations.Response.stations.Count);
Assert.AreEqual(typeof(CopriCallsMonkeyStore).Name, stations.Source.Name);
Assert.AreEqual("Bang...", stations.Exception.Message);
}
[Test]
public async Task Test_AddToCache_Stations()
{
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",
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default");
var stations = await provider.GetStations(true);
Assert.AreEqual(0, stations.Response.stations.Count);
try
{
// Do not add if an excption occurred
provider.AddToCache(new Result<StationsAllResponse>(typeof(CopriCallsHttps), JsonConvert.DeserializeObject<StationsAllResponse>(STATIONSALL), new System.Exception("Bang...")));
stations = await provider.GetStations(true);
Assert.AreEqual(0, stations.Response.stations.Count);
// Do not add if results from cache
provider.AddToCache(new Result<StationsAllResponse>(typeof(CopriCallsMonkeyStore), JsonConvert.DeserializeObject<StationsAllResponse>(STATIONSALL)));
stations = await provider.GetStations(true);
Assert.AreEqual(0, stations.Response.stations.Count);
// Add result
provider.AddToCache(new Result<StationsAllResponse>(typeof(CopriCallsHttps), JsonConvert.DeserializeObject<StationsAllResponse>(STATIONSALL)));
stations = await provider.GetStations(true);
Assert.AreEqual(3, stations.Response.stations.Count);
}
finally
{
Barrel.Current.EmptyAll();
}
}
[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",
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default");
var bikes = await provider.GetBikesAvailable(true);
Assert.AreEqual(0, bikes.Response.bikes.Count);
try
{
// Do not add if an excption occurred
provider.AddToCache(new Result<BikesAvailableResponse>(typeof(CopriCallsHttps), JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE), new System.Exception("Bang...")));
bikes = await provider.GetBikesAvailable(true);
Assert.AreEqual(0, bikes.Response.bikes.Count);
// Do not add if results from cache
provider.AddToCache(new Result<BikesAvailableResponse>(typeof(CopriCallsMonkeyStore), JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE)));
bikes = await provider.GetBikesAvailable(true);
Assert.AreEqual(0, bikes.Response.bikes.Count);
// Add result
provider.AddToCache(new Result<BikesAvailableResponse>(typeof(CopriCallsHttps), JsonConvert.DeserializeObject<BikesAvailableResponse>(BIKESAVAILABLE)));
bikes = await provider.GetBikesAvailable(true);
Assert.AreEqual(1, bikes.Response.bikes.Count);
}
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",
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default", // User agent
"876");
var bikes = await provider.GetBikesOccupied(true);
Assert.AreEqual(0, bikes.Response.bikes_occupied.Count);
try
{
// Do not add if an excption occurred
provider.AddToCache(new Result<BikesReservedOccupiedResponse>(typeof(CopriCallsHttps), JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED), new System.Exception("Bang...")));
bikes = await provider.GetBikesOccupied(true);
Assert.AreEqual(0, bikes.Response.bikes_occupied.Count);
// Do not add if results from cache
provider.AddToCache(new Result<BikesReservedOccupiedResponse>(typeof(CopriCallsMonkeyStore), JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED)));
bikes = await provider.GetBikesOccupied(true);
Assert.AreEqual(0, bikes.Response.bikes_occupied.Count);
// Add result
provider.AddToCache(new Result<BikesReservedOccupiedResponse>(typeof(CopriCallsHttps), JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(BIKESOCCUPIED)));
bikes = await provider.GetBikesOccupied(true);
Assert.AreEqual(1, bikes.Response.bikes_occupied.Count);
}
finally
{
Barrel.Current.EmptyAll();
}
}
}
}

View file

@ -0,0 +1,866 @@
using Newtonsoft.Json;
using NUnit.Framework;
using System;
using System.Linq;
using TINK.Model;
using TINK.Model.Bike;
using TINK.Model.Connector;
using TINK.Repository.Response;
using TINK.Model.State;
using TINK.Repository;
using static TINK.Repository.CopriCallsMemory;
using BikeInfo = TINK.Model.Bike.BluetoothLock.BikeInfo;
using TINK.Model.User.Account;
namespace TestTINKLib.Fixtures.Connector
{
[TestFixture]
public class TestUpdaterJSON
{
[Test]
public void TestGetAllStations()
{
var l_oStationsTarget = UpdaterJSON.GetStationsAllMutable(new CopriCallsMemory(SampleSets.Set2, 1).GetStationsAsync().Result);
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 TestUpdateBikesAvailable_BikeNr5GetBooked()
{
// Bike 5 is availalbe.
var l_oBikesTarget = UpdaterJSON.GetBikesAvailable(
GetBikesAvailable(TinkApp.MerchantId, p_eSampleSet: SampleSets.Set2, p_lStageIndex: 1));
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 = UpdaterJSON.GetBikesAvailable(
GetBikesAvailable(TinkApp.MerchantId, p_eSampleSet: SampleSets.Set2, p_lStageIndex: 2));
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 = UpdaterJSON.GetBikesAvailable(
GetBikesAvailable(TinkApp.MerchantId, p_eSampleSet: SampleSets.Set2, p_lStageIndex: 3));
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 = UpdaterJSON.GetBikesOccupied(
GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 1),
"a@B",
() => new DateTime(2017, 11, 28, 14, 8, 14)); // Date time now for bikes which are reserved
// Check initial count of bikes.
Assert.AreEqual(2, l_oBikesTarget.Count);
// Bike 5 is reserved
l_oBikesTarget = UpdaterJSON.GetBikesOccupied(
GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 2),
"a@B",
() => new DateTime(2017, 11, 28, 14, 08, 36).Add(new TimeSpan(0, 2, 0))); // Date time now for bikes which are reserved
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!
Assert.AreEqual("2360", l_oBikesTarget.GetById("5").State.Code);
// Bike 5 is booked
l_oBikesTarget = UpdaterJSON.GetBikesOccupied(
GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 3),
"a@B",
() => DateTime.Now);
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!
Assert.AreEqual("2360", l_oBikesTarget.GetById("5").State.Code);
}
public void TestGetBikesAvailable_BikeNr5GetBooked()
{
// Bike 5 is availalbe.
var l_oBikesTarget = UpdaterJSON.GetBikesAvailable(GetBikesAvailable(TinkApp.MerchantId, p_eSampleSet: SampleSets.Set2, p_lStageIndex: 1));
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 = UpdaterJSON.GetBikesAvailable(GetBikesAvailable(TinkApp.MerchantId, p_eSampleSet: SampleSets.Set2, p_lStageIndex: 2));
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 = UpdaterJSON.GetBikesAvailable(GetBikesAvailable(TinkApp.MerchantId, p_eSampleSet: SampleSets.Set2, p_lStageIndex: 3));
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_BikeNr5GetBooked()
{
var l_oBikesTarget = UpdaterJSON.GetBikesOccupied(
GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 1),
"a@B",
() => new DateTime(2017, 11, 28, 14, 8, 14)); // Date time now for bikes which are reserved
// Check initial count of bikes.
Assert.AreEqual(2, l_oBikesTarget.Count);
// Bike 5 is reserved
l_oBikesTarget = UpdaterJSON.GetBikesOccupied(
GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 2),
"a@B",
() => new DateTime(2017, 11, 28, 14, 08, 36).Add(new TimeSpan(0, 2, 0))); // Date time now for bikes which are reserved
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!
Assert.AreEqual("2360", l_oBikesTarget.GetById("5").State.Code);
// Bike 5 is booked
l_oBikesTarget = UpdaterJSON.GetBikesOccupied(
CopriCallsMemory.GetBikesOccupied("4da3044c8657a04ba60e2eaa753bc51a", SampleSets.Set2, 3),
"a@B",
() => DateTime.Now);
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!
Assert.AreEqual("2360", l_oBikesTarget.GetById("5").State.Code);
}
[Test]
public void TestGetBikesAvailable()
{
var l_oBikesTarget = UpdaterJSON.GetBikesAvailable(
GetBikesAvailable(TinkApp.MerchantId, p_eSampleSet: SampleSets.Set2, p_lStageIndex: 1));
// Verify count of bikes
Assert.AreEqual(12, l_oBikesTarget.Count);
// Verify properties of bike 5
Assert.NotNull(l_oBikesTarget.GetById("5"));
Assert.AreEqual("5", l_oBikesTarget.GetById("5").Id);
Assert.AreEqual("TINK", l_oBikesTarget.GetById("5").Group.ToArray()[0]);
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);
// Verify properties of bike 52
Assert.NotNull(l_oBikesTarget.GetById("52"));
Assert.AreEqual("52", l_oBikesTarget.GetById("52").Id);
Assert.AreEqual("Konrad", l_oBikesTarget.GetById("52").Group.ToArray()[0]);
}
[Test]
public void TestGetBikesOccupied()
{
var l_oBikesTarget = UpdaterJSON.GetBikesOccupied(
GetBikesOccupied(TinkApp.MerchantId, SampleSets.Set2, 1),
"a@b",
() => DateTime.Now);
// Verify count of bikes
Assert.AreEqual(0, l_oBikesTarget.Count);
}
[Test]
public void TestGetBikesAll_BikesAvaialbleResponse()
{
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 = UpdaterJSON.GetBikesAll(
availableResponse,
null,
"Heinz.Mustermann@posteo.de",
() => DateTime.Now);
Assert.AreEqual(
2,
bikes.Count);
Assert.AreEqual(
1,
bikes.Where(x => x is BikeInfo).Count(),
"There must be one ILockitBike and one BC bike (BikeInfo class).");
}
[Test]
public void TestGetBikesAll_BikesAvaialbleResponse_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 = UpdaterJSON.GetBikesAll(
availableResponse,
null,
"Heinz.Mustermann@posteo.de",
() => DateTime.Now);
Assert.AreEqual(
0,
bikes.Count,
"State of a element of BikesAvailableResponse must never be reserved.");
}
[Test]
public void TestGetBikesAll_BikesAvaialbleResponse_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 = UpdaterJSON.GetBikesAll(
availableResponse,
null,
"Heinz.Mustermann@posteo.de",
() => DateTime.Now);
Assert.AreEqual(
0,
bikes.Count,
"Station of a element of BikesAvailableResponse must always be defined.");
}
[Test]
public void TestGetBikesAll_BikesAvaialbleResponse_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 = UpdaterJSON.GetBikesAll(
availableResponse,
null,
"Heinz.Mustermann@posteo.de",
() => DateTime.Now);
Assert.AreEqual(
0,
bikes.Count,
"Ids of a elements of BikesAvailableResponse must be unique.");
}
[Test]
public void TestGetBikesAll_BikesReservedOccupiedResponse_InvalidState()
{
var reservedOccupiedResponse = JsonConvert.DeserializeObject<BikesReservedOccupiedResponse>(
@"{
""bikes_occupied"" : {
""87785"" : {
""station"" : ""2"",
""state"" : ""available"",
""bike"" : ""20"",
""description"" : ""Cargo Long"",
""start_time"" : ""2017-12-01 22:21:57.740069+01"",
""timeCode"" : ""6603""
}
}
}");
var bikes = UpdaterJSON.GetBikesAll(
null,
reservedOccupiedResponse,
"Heinz.Mustermann@posteo.de",
() => DateTime.Now);
Assert.AreEqual(
0,
bikes.Count,
"State of a element of BikesAvailableResponse must never be reserved.");
}
[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 = UpdaterJSON.GetBikesAll(
null,
reservedOccupiedResponse,
"Heinz.Mustermann@posteo.de",
() => DateTime.Now);
Assert.AreEqual(
0,
bikes.Count,
"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 = UpdaterJSON.GetBikesAll(
null,
reservedOccupiedResponse,
"Heinz.Mustermann@posteo.de",
() => DateTime.Now);
Assert.AreEqual(
2,
bikes.Count,
"Ids of a elements of BikesAvailableResponse must be unique.");
Assert.AreEqual(
1,
bikes.Where(x => x is 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.Bike.BluetoothLock.BikeInfoMutable(new BikeInfo(
"17",
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));
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", () => DateTime.Now);
// 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.Bike.BluetoothLock.BikeInfoMutable(new BikeInfo(
"17",
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*/));
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", () => DateTime.Now);
// 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.Bike.BluetoothLock.BikeInfoMutable(new BikeInfo(
"17",
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));
Assert.AreEqual(InUseStateEnum.Reserved, bike.State.Value);
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", () => DateTime.Now);
Assert.AreEqual(InUseStateEnum.Booked, bike.State.Value);
}
/// <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));
}
[Test]
public void TestCreateTariffDescription()
{
var tariffDescription = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.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().Number,
Is.EqualTo(5494));
Assert.That(
tariffDescription.Create().FreeTimePerSession,
Is.EqualTo(TimeSpan.FromMinutes(90)));
Assert.That(
tariffDescription.Create().FeeEuroPerHour,
Is.EqualTo(10.5));
Assert.That(
tariffDescription.Create().AboEuroPerMonth,
Is.EqualTo(920.99));
}
[Test]
public void TestCreateTariffDescription_Name()
{
var tariffDescription = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.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 = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.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().Number,
Is.EqualTo(5494));
}
[Test]
public void TestCreateTariffDescription_FreeTimePerSession()
{
var tariffDescription = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.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().FreeTimePerSession,
Is.EqualTo(TimeSpan.FromMinutes(90)));
}
[Test]
public void TestCreateTariffDescription_FeeEuroPerHour()
{
var tariffDescription = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.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().FeeEuroPerHour,
Is.EqualTo(10.5));
}
[Test]
public void TestCreateTariffDescription_AboEuroPerMonth()
{
var tariffDescription = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.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().AboEuroPerMonth,
Is.EqualTo(920.99));
}
[Test]
public void TestCreateTariffDescription_Name_Empty()
{
var tariffDescription = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.TariffDescription>(
@"{}");
Assert.That(
tariffDescription.Create().Name,
Is.Null);
}
[Test]
public void TestCreateTariffDescription_Number_Empty()
{
var tariffDescription = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.TariffDescription>(
@"{}");
Assert.That(
tariffDescription.Create().Number,
Is.Null);
}
[Test]
public void TestCreateTariffDescription_FreeTimePerSession_Empty()
{
var tariffDescription = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.TariffDescription>(
@"{}");
Assert.That(
tariffDescription.Create().FreeTimePerSession,
Is.EqualTo(TimeSpan.Zero));
}
[Test]
public void TestCreateTariffDescription_FeeEuroPerHour_Empty()
{
var tariffDescription = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.TariffDescription>(
@"{}");
Assert.That(
tariffDescription.Create().FeeEuroPerHour,
Is.NaN);
}
[Test]
public void TestCreateTariffDescription_AboEuroPerMonth_Empty()
{
var tariffDescription = TINK.Repository.Response.JsonConvertRethrow.DeserializeObject<TINK.Repository.Response.TariffDescription>(
@"{}");
Assert.That(
tariffDescription.Create().AboEuroPerMonth,
Is.NaN);
}
[Test]
public void TestCreateTariffDescription_Name_Null()
{
Assert.That(
BikeInfoFactory.Create((TINK.Repository.Response.TariffDescription)null).Name,
Is.Null);
}
[Test]
public void TestCreateTariffDescription_Number_Null()
{
Assert.That(
BikeInfoFactory.Create((TINK.Repository.Response.TariffDescription)null).Number,
Is.Null);
}
[Test]
public void TestCreateTariffDescription_FreeTimePerSession_Null()
{
Assert.That(
BikeInfoFactory.Create((TINK.Repository.Response.TariffDescription)null).FreeTimePerSession,
Is.EqualTo(TimeSpan.Zero));
}
[Test]
public void TestCreateTariffDescription_FeeEuroPerHour_Null()
{
Assert.That(
BikeInfoFactory.Create((TINK.Repository.Response.TariffDescription)null).FeeEuroPerHour,
Is.NaN);
}
[Test]
public void TestCreateTariffDescription_AboEuroPerMonth_Null()
{
Assert.That(
BikeInfoFactory.Create((TINK.Repository.Response.TariffDescription)null).AboEuroPerMonth,
Is.NaN);
}
}
}