mirror of
https://dev.azure.com/TeilRad/sharee.bike%20App/_git/Code
synced 2024-11-15 22:56:37 +01:00
1152 lines
63 KiB
C#
1152 lines
63 KiB
C#
using NUnit.Framework;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using TINK.Model;
|
|
using TINK.Model.Connector;
|
|
using TINK.Repository.Exception;
|
|
using TINK.View;
|
|
using TINK.Model.Services.CopriApi;
|
|
using TINK.Repository;
|
|
|
|
using static TINK.Repository.CopriCallsMemory;
|
|
using TINK.ViewModel.Map;
|
|
using TINK.ViewModel.Settings;
|
|
using Plugin.BLE.Abstractions.Contracts;
|
|
using TINK.Services.BluetoothLock;
|
|
using NSubstitute;
|
|
using TINK.ViewModel.BikesAtStation;
|
|
using Xamarin.Forms;
|
|
using TINK.Services.BluetoothLock.Tdo;
|
|
using TINK.Services.Permissions;
|
|
using TINK.Model.Services.Geolocation;
|
|
using NSubstitute.ExceptionExtensions;
|
|
using TINK.Services;
|
|
using TINK.Model.Device;
|
|
using TestFramework.Model.Device;
|
|
using TestFramework.Repository;
|
|
using TestFramework.Model.User.Account;
|
|
using TestFramework.Model.Services.Geolocation;
|
|
using TestFramework.Services.Permissions;
|
|
using TestFramework.Services.CopriApi.Connector;
|
|
|
|
namespace TestTINKLib.Fixtures.ObjectTests.ViewModel
|
|
{
|
|
[TestFixture]
|
|
public class TestBikesAtStationPageViewModel
|
|
{
|
|
[Test]
|
|
public async Task TestConstruct_Droid_NotLoggedIn()
|
|
{
|
|
var geolocation = Substitute.For<IServicesContainer<IGeolocation>>();
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(new TINK.Model.User.Account.Account("", null, null, new List<string>())),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory001(sessionCookie)),
|
|
geolocation,
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
null, // Permissions
|
|
isConnectedFunc: () => true,
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.Android,
|
|
new TINK.Model.Station.Station("FR103", new List<string>(), null), // Was station id 103 before switching from data provider CopriCallsMemory(SampleSets.ShareeFr01_Set1, 1, ...)
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
geolocation.Active, // geolocation
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
Assert.IsEmpty(bikesAtStation.StatusInfoText);
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(2, bikesAtStation.Count);
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
var bikeFR9999 = bikesAtStation.FirstOrDefault(x => x.Id == "FR9999") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel; // Was id 1315
|
|
var bikeFR9998 = bikesAtStation.FirstOrDefault(x => x.Id == "FR9998") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel; // Was id 1543
|
|
|
|
Assert.AreEqual("Available.", bikeFR9999.StateText);
|
|
Assert.AreEqual("Available.", bikeFR9998.StateText);
|
|
Assert.AreEqual("NotLoggedIn", bikeFR9999.LockitButtonText);
|
|
Assert.AreEqual("NotLoggedIn", bikeFR9998.LockitButtonText);
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsTrue(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestConstruct_Droid_NoBikes()
|
|
{
|
|
var geolocation = Substitute.For<IServicesContainer<IGeolocation>>();
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(new TINK.Model.User.Account.Account("a@b", "123456789", "5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH", new List<string> { "300001", "300029" })),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory(SampleSets.ShareeFr01_Set1, 1, sessionCookie)),
|
|
geolocation,
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
null, // Permissions,
|
|
isConnectedFunc: () => true,
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.Android,
|
|
new TINK.Model.Station.Station("102", new List<string>(), null), // Station 102
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
geolocation.Active, // geolocation
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
Assert.IsEmpty(bikesAtStation.StatusInfoText);
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(0, bikesAtStation.Count);
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsFalse(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsFalse(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsTrue(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual("Momentan sind keine Fahrräder an dieser Station verfügbar.", bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestConstruct_Droid()
|
|
{
|
|
var geolocation = Substitute.For<IServicesContainer<IGeolocation>>();
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
// Fake location permissions to be set
|
|
permissions.CheckStatusAsync().Returns(Task.FromResult(Status.Granted));
|
|
geolocation.Active.IsGeolcationEnabled.Returns(true); // Fake gps to be on
|
|
bluetooth.State.Returns(BluetoothState.On); // Fake bluetooth to be on
|
|
|
|
// Fake bluetooth answer for locks with id 2200545 and 2200537.
|
|
locksService.GetLocksStateAsync(Arg.Any<IEnumerable<LockInfoAuthTdo>>(), Arg.Any<TimeSpan>()).Returns(
|
|
new List<LockInfoTdo> {
|
|
{ new LockInfoTdo.Builder { Id = 2200545, State = LockitLockingState.Open }.Build() },
|
|
{ new LockInfoTdo.Builder { Id = 2200537, State = LockitLockingState.Closed }.Build() }
|
|
}
|
|
);
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(new TINK.Model.User.Account.Account("a@b", "123456789", "5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH", new List<string> { "300001", "300029" })),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory(SampleSets.ShareeFr01_Set1, 1, sessionCookie)),
|
|
geolocation, // Instance geolocation mocks both parts
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
null, // Permissions,
|
|
isConnectedFunc: () => true,
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.Android,
|
|
new TINK.Model.Station.Station("103", new List<string>(), null), // Station 103
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
geolocation.Active, // geolocation
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
// Verify behaviour
|
|
Received.InOrder(() =>
|
|
{
|
|
permissions.CheckStatusAsync();
|
|
var glDummy = geolocation.Active.Received().IsGeolcationEnabled;
|
|
var btDummy = bluetooth.Received().State;
|
|
locksService.GetLocksStateAsync(Arg.Any<IEnumerable<LockInfoAuthTdo>>(), Arg.Any<TimeSpan>());
|
|
});
|
|
|
|
Assert.IsEmpty(bikesAtStation.StatusInfoText);
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(4, bikesAtStation.Count);
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
var bike1545 = bikesAtStation.FirstOrDefault(x => x.Id == "1545") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1537 = bikesAtStation.FirstOrDefault(x => x.Id == "1537") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1315 = bikesAtStation.FirstOrDefault(x => x.Id == "1315") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1543 = bikesAtStation.FirstOrDefault(x => x.Id == "1543") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
|
|
Assert.AreEqual("Rented since 06. November 17:53.", bike1545.StateText);
|
|
Assert.AreEqual("Rented since 12. October 08:38.", bike1537.StateText);
|
|
Assert.AreEqual("Available.", bike1315.StateText);
|
|
Assert.AreEqual("Available.", bike1543.StateText);
|
|
Assert.AreEqual("Close lock", bike1545.LockitButtonText);
|
|
Assert.AreEqual("Open lock & continue renting", bike1537.LockitButtonText);
|
|
Assert.AreEqual("DisposableDisconnected", bike1315.LockitButtonText);
|
|
Assert.AreEqual("DisposableDisconnected", bike1543.LockitButtonText);
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsFalse(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestConstruct_Droid_NoPermissions_OpenSettings()
|
|
{
|
|
var geolocation = Substitute.For<IServicesContainer<IGeolocation>>();
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
// Fake location permissions not to be set
|
|
permissions.CheckStatusAsync().Returns(Task.FromResult(Status.Denied));
|
|
|
|
// Fake anwser on question whether to open permissions dialog
|
|
viewService.DisplayAlert(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()).Returns(true);
|
|
|
|
// Fake bluetooth answer for locks with id 2200545 and 2200537.
|
|
locksService.GetLocksStateAsync(Arg.Any<IEnumerable<LockInfoAuthTdo>>(), Arg.Any<TimeSpan>()).Returns(
|
|
new List<LockInfoTdo> {
|
|
{ new LockInfoTdo.Builder { Id = 2200545, State = LockitLockingState.Open }.Build() },
|
|
{ new LockInfoTdo.Builder { Id = 2200537, State = LockitLockingState.Closed }.Build() }
|
|
}
|
|
);
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(new TINK.Model.User.Account.Account("a@b", "123456789", "5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH", new List<string> { "300001", "300029" })),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory(SampleSets.ShareeFr01_Set1, 1, sessionCookie)),
|
|
geolocation,
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
null, // Permissions,
|
|
isConnectedFunc: () => true,
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.Android,
|
|
new TINK.Model.Station.Station("103", new List<string>(), null), // Station 103
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
geolocation.Active, // geolocation
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
// Verify behaviour
|
|
Received.InOrder(() =>
|
|
{
|
|
permissions.CheckStatusAsync();
|
|
var glDummy = geolocation.Active.Received().IsGeolcationEnabled;
|
|
permissions.RequestAsync(); // Ask user from permissions.
|
|
viewService.DisplayAlert(
|
|
"Hint",
|
|
"Please allow location sharing so that bike lock/locks can be managed.\r\nOpen sharing dialog?",
|
|
"Yes",
|
|
"No");
|
|
permissions.OpenAppSettings();
|
|
});
|
|
|
|
Assert.IsEmpty(bikesAtStation.StatusInfoText);
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(4, bikesAtStation.Count);
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
var bike1545 = bikesAtStation.FirstOrDefault(x => x.Id == "1545") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1537 = bikesAtStation.FirstOrDefault(x => x.Id == "1537") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1315 = bikesAtStation.FirstOrDefault(x => x.Id == "1315") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1543 = bikesAtStation.FirstOrDefault(x => x.Id == "1543") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
|
|
Assert.AreEqual("Rented since 06. November 17:53.", bike1545.StateText);
|
|
Assert.AreEqual("Rented since 12. October 08:38.", bike1537.StateText);
|
|
Assert.AreEqual("Available.", bike1315.StateText);
|
|
Assert.AreEqual("Available.", bike1543.StateText);
|
|
Assert.AreEqual("Search lock", bike1545.LockitButtonText);
|
|
Assert.AreEqual("Search lock", bike1537.LockitButtonText);
|
|
Assert.AreEqual("DisposableDisconnected", bike1315.LockitButtonText);
|
|
Assert.AreEqual("DisposableDisconnected", bike1543.LockitButtonText);
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsFalse(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestConstruct_Droid_NoPermissions()
|
|
{
|
|
var geolocation = Substitute.For<IServicesContainer<IGeolocation>>();
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
// Fake location permissions not to be set
|
|
permissions.CheckStatusAsync().Returns(Task.FromResult(Status.Denied));
|
|
permissions.OpenAppSettings().Throws<Exception>(); // Ensures that method is not called and fixture succeeds.
|
|
|
|
// Fake anwser on question whether to open permissions dialog
|
|
viewService.DisplayAlert(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()).Returns(false);
|
|
|
|
// Fake bluetooth answer for locks with id 2200545 and 2200537.
|
|
locksService.GetLocksStateAsync(Arg.Any<IEnumerable<LockInfoAuthTdo>>(), Arg.Any<TimeSpan>()).Returns(
|
|
new List<LockInfoTdo> {
|
|
{ new LockInfoTdo.Builder { Id = 2200545, State = LockitLockingState.Open }.Build() },
|
|
{ new LockInfoTdo.Builder { Id = 2200537, State = LockitLockingState.Closed }.Build() }
|
|
}
|
|
);
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(new TINK.Model.User.Account.Account("a@b", "123456789", "5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH", new List<string> { "300001", "300029" })),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory(SampleSets.ShareeFr01_Set1, 1, sessionCookie)),
|
|
geolocation,
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
null, // Permissions,
|
|
isConnectedFunc: () => true,
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.Android,
|
|
new TINK.Model.Station.Station("103", new List<string>(), null), // Station 103
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
geolocation.Active, // geolocation
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
// Verify behaviour
|
|
Received.InOrder(() =>
|
|
{
|
|
permissions.CheckStatusAsync();
|
|
var glDummy = geolocation.Active.Received().IsGeolcationEnabled;
|
|
permissions.RequestAsync(); // Ask user from permissions.
|
|
viewService.DisplayAlert(
|
|
"Hint",
|
|
"Please allow location sharing so that bike lock/locks can be managed.\r\nOpen sharing dialog?",
|
|
"Yes",
|
|
"No");
|
|
});
|
|
|
|
Assert.IsEmpty(bikesAtStation.StatusInfoText);
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(4, bikesAtStation.Count);
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
var bike1545 = bikesAtStation.FirstOrDefault(x => x.Id == "1545") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1537 = bikesAtStation.FirstOrDefault(x => x.Id == "1537") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1315 = bikesAtStation.FirstOrDefault(x => x.Id == "1315") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1543 = bikesAtStation.FirstOrDefault(x => x.Id == "1543") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
|
|
Assert.AreEqual("Rented since 06. November 17:53.", bike1545.StateText);
|
|
Assert.AreEqual("Rented since 12. October 08:38.", bike1537.StateText);
|
|
Assert.AreEqual("Available.", bike1315.StateText);
|
|
Assert.AreEqual("Available.", bike1543.StateText);
|
|
Assert.AreEqual("Search lock", bike1545.LockitButtonText);
|
|
Assert.AreEqual("Search lock", bike1537.LockitButtonText);
|
|
Assert.AreEqual("DisposableDisconnected", bike1315.LockitButtonText);
|
|
Assert.AreEqual("DisposableDisconnected", bike1543.LockitButtonText);
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsFalse(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestConstruct_Droid_GeolocationOff()
|
|
{
|
|
var geolocation = Substitute.For<IServicesContainer<IGeolocation>>();
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
// Fake location permissions to be set
|
|
permissions.CheckStatusAsync().Returns(Task.FromResult(Status.Granted));
|
|
geolocation.Active.IsGeolcationEnabled.Returns(false); // Fake gps to be off
|
|
bluetooth.State.Returns(BluetoothState.On); // Fake bluetooth to be on
|
|
|
|
// Fake bluetooth answer for locks with id 2200545 and 2200537.
|
|
locksService.GetLocksStateAsync(Arg.Any<IEnumerable<LockInfoAuthTdo>>(), Arg.Any<TimeSpan>()).Returns(
|
|
new List<LockInfoTdo> {
|
|
{ new LockInfoTdo.Builder { Id = 2200545, State = LockitLockingState.Open }.Build() },
|
|
{ new LockInfoTdo.Builder { Id = 2200537, State = LockitLockingState.Closed }.Build() }
|
|
}
|
|
);
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(new TINK.Model.User.Account.Account("a@b", "123456789", "5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH", new List<string> { "300001", "300029" })),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory(SampleSets.ShareeFr01_Set1, 1, sessionCookie)),
|
|
geolocation,
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
null, // Permissions,
|
|
isConnectedFunc: () => true,
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.Android,
|
|
new TINK.Model.Station.Station("103", new List<string>(), null), // Station 103
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
geolocation.Active, // geolocation
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
// Verify behaviour
|
|
Received.InOrder(() =>
|
|
{
|
|
permissions.CheckStatusAsync();
|
|
var glDummy = geolocation.Active.Received().IsGeolcationEnabled;
|
|
viewService.DisplayAlert(
|
|
"Hint",
|
|
"Please activate location so that bike lock can be found!",
|
|
"OK");
|
|
});
|
|
|
|
Assert.IsEmpty(bikesAtStation.StatusInfoText);
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(4, bikesAtStation.Count);
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
var bike1545 = bikesAtStation.FirstOrDefault(x => x.Id == "1545") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1537 = bikesAtStation.FirstOrDefault(x => x.Id == "1537") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1315 = bikesAtStation.FirstOrDefault(x => x.Id == "1315") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1543 = bikesAtStation.FirstOrDefault(x => x.Id == "1543") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
|
|
Assert.AreEqual("Rented since 06. November 17:53.", bike1545.StateText);
|
|
Assert.AreEqual("Rented since 12. October 08:38.", bike1537.StateText);
|
|
Assert.AreEqual("Available.", bike1315.StateText);
|
|
Assert.AreEqual("Available.", bike1543.StateText);
|
|
Assert.AreEqual("Search lock", bike1545.LockitButtonText);
|
|
Assert.AreEqual("Search lock", bike1537.LockitButtonText);
|
|
Assert.AreEqual("DisposableDisconnected", bike1315.LockitButtonText);
|
|
Assert.AreEqual("DisposableDisconnected", bike1543.LockitButtonText);
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsFalse(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestConstruct_Droid_BluetoothOff()
|
|
{
|
|
var geolocation = Substitute.For<IServicesContainer<IGeolocation>>();
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
// Fake location permissions to be set
|
|
permissions.CheckStatusAsync().Returns(Task.FromResult(Status.Granted));
|
|
geolocation.Active.IsGeolcationEnabled.Returns(true); // Fake gps to be on
|
|
bluetooth.State.Returns(BluetoothState.Off); // // Fake bluetooth to be off
|
|
|
|
// Fake bluetooth answer for locks with id 2200545 and 2200537.
|
|
locksService.GetLocksStateAsync(Arg.Any<IEnumerable<LockInfoAuthTdo>>(), Arg.Any<TimeSpan>()).Returns(
|
|
new List<LockInfoTdo> {
|
|
{ new LockInfoTdo.Builder { Id = 2200545, State = LockitLockingState.Open }.Build() },
|
|
{ new LockInfoTdo.Builder { Id = 2200537, State = LockitLockingState.Closed }.Build() }
|
|
}
|
|
);
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(new TINK.Model.User.Account.Account("a@b", "123456789", "5781_d47fc786e740ef77d85a24bcb6f0ff97_oiF2kahH", new List<string> { "300001", "300029" })),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory(SampleSets.ShareeFr01_Set1, 1, sessionCookie)),
|
|
geolocation,
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
null, // Permissions,
|
|
isConnectedFunc: () => true,
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.Android,
|
|
new TINK.Model.Station.Station("103", new List<string>(), null), // Station 103
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
geolocation.Active, // geolocation
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
// Verify behaviour
|
|
Received.InOrder(() =>
|
|
{
|
|
permissions.CheckStatusAsync();
|
|
var glDummy = geolocation.Active.Received().IsGeolcationEnabled;
|
|
var btDummy = bluetooth.Received().State;
|
|
viewService.DisplayAlert(
|
|
"Hint",
|
|
"Please enable Bluetooth to manage bike lock/locks.",
|
|
"OK");
|
|
});
|
|
|
|
Assert.IsEmpty(bikesAtStation.StatusInfoText);
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(4, bikesAtStation.Count);
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
var bike1545 = bikesAtStation.FirstOrDefault(x => x.Id == "1545") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1537 = bikesAtStation.FirstOrDefault(x => x.Id == "1537") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1315 = bikesAtStation.FirstOrDefault(x => x.Id == "1315") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
var bike1543 = bikesAtStation.FirstOrDefault(x => x.Id == "1543") as TINK.ViewModel.Bikes.Bike.BluetoothLock.BikeViewModel;
|
|
|
|
Assert.AreEqual("Rented since 06. November 17:53.", bike1545.StateText);
|
|
Assert.AreEqual("Rented since 12. October 08:38.", bike1537.StateText);
|
|
Assert.AreEqual("Available.", bike1315.StateText);
|
|
Assert.AreEqual("Available.", bike1543.StateText);
|
|
Assert.AreEqual("Search lock", bike1545.LockitButtonText);
|
|
Assert.AreEqual("Search lock", bike1537.LockitButtonText);
|
|
Assert.AreEqual("DisposableDisconnected", bike1315.LockitButtonText);
|
|
Assert.AreEqual("DisposableDisconnected", bike1543.LockitButtonText);
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsFalse(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestConstructKonrad()
|
|
{
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
bluetooth.State.Returns(BluetoothState.On);
|
|
|
|
locksService.TimeOut.Returns(timeOut);
|
|
timeOut.MultiConnect.Returns(new TimeSpan(0));
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.Off }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory001(sessionCookie)),
|
|
Substitute.For<IServicesContainer<IGeolocation>>(),
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
new PermissionsMock(),
|
|
isConnectedFunc: () => true,
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.iOS,
|
|
new TINK.Model.Station.Station("FR101", new List<string>(), null), // Was 31 before switching CopriCallsMemory(SampleSets.Set2, 1, ...)
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
new GeolocationMock(),
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
Assert.IsTrue(new List<string> { "Updating...", string.Empty }.Contains(bikesAtStation.StatusInfoText));
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(3, bikesAtStation.Count); // Was 1 before switch.
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR1003").StateText); // Was 52 before switch.
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR1002").StateText);
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR1001").StateText);
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsTrue(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
|
|
[Test]
|
|
public async Task TestConstructKonrad_NoBikes()
|
|
{
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
bluetooth.State.Returns(BluetoothState.On);
|
|
|
|
locksService.TimeOut.Returns(timeOut);
|
|
timeOut.MultiConnect.Returns(new TimeSpan(0));
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.Off }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://tinkwwp.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory(SampleSets.Set2, 1, sessionCookie)),
|
|
Substitute.For<IServicesContainer<IGeolocation>>(),
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
new PermissionsMock(),
|
|
isConnectedFunc: () => true,
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.iOS,
|
|
new TINK.Model.Station.Station("4", new List<string>(), null),
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
new GeolocationMock(),
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
Assert.IsTrue(new List<string> { "Updating...", string.Empty }.Contains(bikesAtStation.StatusInfoText));
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(0, bikesAtStation.Count);
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsFalse(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsFalse(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsTrue(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual("Momentan sind keine Fahrräder an dieser Station verfügbar.", bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestConstruct_LoggedIn()
|
|
{
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
bluetooth.State.Returns(BluetoothState.On);
|
|
|
|
locksService.TimeOut.Returns(timeOut);
|
|
timeOut.MultiConnect.Returns(new TimeSpan(0));
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: locksService.GetType().FullName),
|
|
new StoreMock(new TINK.Model.User.Account.Account(
|
|
LoginSessionCopriInfo.JavaministerHardwareNr1.Mail,
|
|
LoginSessionCopriInfo.JavaministerHardwareNr1.Pwd,
|
|
"6103_112e96b36ba33de245943c5ffaf369cd_", // Was 4da3044c8657a04ba60e2eaa753bc51a before switching from data provider CopriCallsMemory(SampleSets.Set2, 1, ...)
|
|
new List<string> { FilterHelper.FILTERTINKGENERAL })),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory001(sessionCookie)),
|
|
Substitute.For<IServicesContainer<IGeolocation>>(),
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
new PermissionsMock(),
|
|
isConnectedFunc: () => true,
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.iOS,
|
|
new TINK.Model.Station.Station("FR103", new List<string>(), null), // Was station id 4 before switching from data provider CopriCallsMemory(SampleSets.Set2, 1, ...)
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
new GeolocationMock(),
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
Assert.IsTrue(new List<string> { "Updating...", string.Empty }.Contains(bikesAtStation.StatusInfoText));
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(4, bikesAtStation.Count); // Count of bikes was 4 before switching from data provider CopriCallsMemory(SampleSets.Set2, 1, ...)
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR9999").StateText);
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR9999").StateText);
|
|
Assert.AreEqual("Max. reservation time of 15 minutes expired.", bikesAtStation.FirstOrDefault(x => x.Id == "FR1004").StateText);
|
|
Assert.AreEqual("Rented since 06. November 18:57.", bikesAtStation.FirstOrDefault(x => x.Id == "FR1544").StateText); // Was 7
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsFalse(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestConstruct_Offline()
|
|
{
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
bluetooth.State.Returns(BluetoothState.On);
|
|
|
|
locksService.TimeOut.Returns(timeOut);
|
|
timeOut.MultiConnect.Returns(new TimeSpan(0));
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(sessionCookie, mail, new CopriCallsMemory001(sessionCookie)),
|
|
Substitute.For<IServicesContainer<IGeolocation>>(),
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
new PermissionsMock(),
|
|
isConnectedFunc: () => false, // Not connected.
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.iOS,
|
|
new TINK.Model.Station.Station("FR103", new List<string>(), null), // Was station id 4 before switching from data provider CopriCallsMemory(SampleSets.Set2, 1
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
new GeolocationMock(),
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService);
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
Assert.AreEqual("Offline.", bikesAtStation.StatusInfoText);
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(2, bikesAtStation.Count); // Count of bikes was 3. There is no more bike with id 26.
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR9999").StateText); // Was id 5
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR9998").StateText); // Was is 14
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsTrue(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestConstruct_WebConnectCommunicationError()
|
|
{
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
bluetooth.State.Returns(BluetoothState.On);
|
|
|
|
locksService.TimeOut.Returns(timeOut);
|
|
timeOut.MultiConnect.Returns(new TimeSpan(0));
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000), true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new TINK.Model.Connector.Connector(
|
|
uri,
|
|
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default",
|
|
sessionCookie,
|
|
mail,
|
|
server: new CopriProviderHttps(
|
|
uri,
|
|
TinkApp.MerchantId,
|
|
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default",
|
|
sessionCookie: sessionCookie,
|
|
cacheServer: new CopriCallsCacheMemory001(sessionCookie: sessionCookie),
|
|
httpsServer: new ExceptionServer((msg) => new WebConnectFailureException(msg, new Exception("Source expection."))))),
|
|
Substitute.For<IServicesContainer<IGeolocation>>(),
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
new PermissionsMock(),
|
|
isConnectedFunc: () => false, // Not connected.
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.iOS,
|
|
new TINK.Model.Station.Station("FR103", new List<string>(), null), // Was station id 4 before switching from data provider CopriCallsCacheMemory()
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
new GeolocationMock(),
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService)
|
|
{
|
|
IsReportLevelVerbose = true
|
|
};
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
Assert.AreEqual("Connection interrupted, server unreachable.", bikesAtStation.StatusInfoText);
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(2, bikesAtStation.Count); // Count of bikes was 3. There is no more bike with id 26.
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR9999").StateText); // Was id 5
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR9998").StateText); // Was is 14
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsTrue(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
|
|
[Test]
|
|
public async Task TestTinkApp_GeneralPurposeError()
|
|
{
|
|
var locksService = Substitute.For<ILocksService>();
|
|
var timeOut = Substitute.For<ITimeOutProvider>();
|
|
var viewService = Substitute.For<IViewService>();
|
|
var permissions = Substitute.For<ILocationPermission>();
|
|
var bluetooth = Substitute.For<IBluetoothLE>();
|
|
|
|
bluetooth.State.Returns(BluetoothState.On);
|
|
|
|
locksService.TimeOut.Returns(timeOut);
|
|
timeOut.MultiConnect.Returns(new TimeSpan(0));
|
|
|
|
var tinkApp = new TinkApp(
|
|
new TINK.Model.Settings.Settings(
|
|
new GroupFilterMapPage(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.Off } }),
|
|
new GroupFilterSettings(new Dictionary<string, FilterState> { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }),
|
|
new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"),
|
|
new TINK.Settings.PollingParameters(new TimeSpan(10000),
|
|
true),
|
|
Serilog.Events.LogEventLevel.Error,
|
|
activeLockService: locksService.GetType().FullName,
|
|
activeGeolocationService: typeof(GeolocationMock).FullName),
|
|
new StoreMock(),
|
|
(isConnected, uri, sessionCookie, mail, expiresAfter) => new TINK.Model.Connector.Connector(
|
|
uri,
|
|
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default",
|
|
sessionCookie,
|
|
mail,
|
|
server: new CopriProviderHttps(
|
|
uri,
|
|
TinkApp.MerchantId,
|
|
"TestTINKApp/3.0.127 AutomatedTestEnvirnoment/Default",
|
|
sessionCookie: sessionCookie,
|
|
cacheServer: new CopriCallsCacheMemory001(sessionCookie: sessionCookie),
|
|
httpsServer: new ExceptionServer((msg) => new Exception(msg)))),
|
|
Substitute.For<IServicesContainer<IGeolocation>>(),
|
|
locksService,
|
|
new DeviceMock(),
|
|
new SpecialFolderMock(),
|
|
null, // Cipher
|
|
new PermissionsMock(),
|
|
isConnectedFunc: () => false, // Not connected.
|
|
postAction: (d, obj) => d(obj),
|
|
currentVersion: new Version(3, 2, 0, 115), // Current app version
|
|
lastVersion: new Version(3, 0, 173), // Current app version. Must be larger or equal 3.0.173 to
|
|
whatsNewShownInVersion: null); // Whats new page was never shown.
|
|
|
|
var bikesAtStation = new BikesAtStationPageViewModel(
|
|
tinkApp.ActiveUser,
|
|
permissions,
|
|
bluetooth,
|
|
Device.iOS,
|
|
new TINK.Model.Station.Station("FR103", new List<string>(), null), // Was station id 4 before switching from data provider CopriCallsCacheMemory()
|
|
() => tinkApp.GetIsConnected(),
|
|
(isConnected) => tinkApp.GetConnector(isConnected),
|
|
new GeolocationMock(),
|
|
locksService,
|
|
tinkApp.Polling,
|
|
(url) => { },
|
|
(d, obj) => d(obj),
|
|
Substitute.For<ISmartDevice>(),
|
|
viewService)
|
|
{
|
|
IsReportLevelVerbose = true
|
|
};
|
|
|
|
await bikesAtStation.OnAppearing();
|
|
|
|
Assert.AreEqual("Connection interrupted.", bikesAtStation.StatusInfoText);
|
|
|
|
// Verify list of bikes
|
|
Assert.AreEqual(2, bikesAtStation.Count); // Count of bikes was 3. There is no more bike with id 26.
|
|
Assert.IsTrue(bikesAtStation.IsIdle);
|
|
Assert.IsTrue(bikesAtStation.IsBikesListVisible, "If there are any bikes, list must be visible.");
|
|
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR9999").StateText); // Was id 5
|
|
Assert.AreEqual("Available.", bikesAtStation.FirstOrDefault(x => x.Id == "FR9998").StateText); // Was id 14.
|
|
|
|
// Login hint/ no bikes frame
|
|
Assert.IsTrue(bikesAtStation.IsLoginRequiredHintVisible);
|
|
Assert.IsFalse(bikesAtStation.IsNoBikesAtStationVisible);
|
|
Assert.AreEqual(string.Empty, bikesAtStation.NoBikesAtStationText);
|
|
}
|
|
}
|
|
}
|