using NUnit.Framework; using TINK.Model; using TINK.Model.User.Account; using TINK.Model.Connector; using System; using TINK.Model.Station; using static TINK.Repository.CopriCallsMemory; using TINK.Model.State; using System.Collections.Generic; using TINK.Repository; using TINK.ViewModel.Map; using TINK.ViewModel.Settings; using TINK.Services; using TINK.Services.Geolocation; using TestFramework.Model.User.Account; using TestFramework.Model.Device; using TestFramework.Services.BluetoothLock; using TestFramework.Repository; using TestFramework.Model.Services.Geolocation; using TestFramework.Services.Permissions; using NSubstitute; using TestFramework; namespace TestShareeLib.UseCases.Startup { [TestFixture] public class TestTinkApp { [Test] public void NotLoggedIn() { var l_oConnector = new ConnectorCache( string.Empty, string.Empty, new CopriCallsMemory(SampleSets.Set2, 1)); var l_oTinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { FilterHelper.FILTERTINKGENERAL, FilterState.On } }), new GroupFilterSettings(new Dictionary { { 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: typeof(LocksServiceMock).FullName, activeGeolocationService: typeof(GeolocationMock).FullName), new StoreMock(), (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)), sessionCookie, mail, new CopriCallsMemory001()), Substitute.For>(), new LocksServiceMock(), new DeviceMock(), new SpecialFolderMock(), null, // Cipher Substitute.For(), isConnectedFunc: () => true, 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 var l_oStations = l_oTinkApp.GetConnector(true).Query.GetBikesAndStationsAsync().Result.Response; // Check stations. Assert.AreEqual(21, l_oStations.StationsAll.Count); Assert.NotNull(l_oStations.StationsAll.GetById("KN4")); // Id of station was "4" in former version of COPRI. Assert.AreEqual("KN4", l_oStations.StationsAll.GetById("KN4").Id); Assert.AreEqual(new Position(47.658592, 9.168569), l_oStations.StationsAll.GetById("KN4").Position); // Former position was 47.6586936667, 9.16863116667 // Verify selected station. Assert.AreEqual( null, l_oTinkApp.SelectedStation.Id, "When starting app selected station must always be invlid"); // Verify bikes at station. Assert.AreEqual( 0, TestHelper.GetBikesAtStation(l_oTinkApp.ActiveUser, l_oConnector, l_oTinkApp.SelectedStation.Id).Result.Count, "If no station is selected BikesAtStation- list count must be zero"); // Check my bikes. Assert.IsFalse(l_oTinkApp.ActiveUser.IsLoggedIn); } [Test] public void LoggedIn_BikesReservedBooked() { var l_oConnector = new ConnectorCache( "4da3044c8657a04ba60e2eaa753bc51a", "javaminister@gmail.com", new CopriCallsMemory(SampleSets.Set2, 1, "4da3044c8657a04ba60e2eaa753bc51a")); // User logged in is initial state to verify. var l_oTinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { FilterHelper.FILTERTINKGENERAL, FilterState.On } }), new GroupFilterSettings(new Dictionary { { 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: typeof(LocksServiceMock).FullName, activeGeolocationService: typeof(GeolocationMock).FullName), new StoreMock(new Account("javaminister@gmail.com", "javaminister" /* password */, "4da3044c8657a04ba60e2eaa753bc51a" /* session cookie */, new List { FilterHelper.FILTERTINKGENERAL, FilterHelper.FILTERKONRAD })), (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)), sessionCookie, mail, new CopriCallsMemory001("6103_112e96b36ba33de245943c5ffaf369cd_")), Substitute.For>(), new LocksServiceMock(), new DeviceMock(), new SpecialFolderMock(), null, // Cipher Substitute.For(), isConnectedFunc: () => true, currentVersion: new Version(3, 2, 0, 115), lastVersion: new Version(3, 0, 173)); // Current app version. Must be larger or equal 3.0.173 to var l_oStations = l_oTinkApp.GetConnector(true).Query.GetBikesAndStationsAsync().Result.Response; // Check stations. Assert.AreEqual(21, l_oStations.StationsAll.Count); Assert.NotNull(l_oStations.StationsAll.GetById("KN4")); Assert.AreEqual("KN4", l_oStations.StationsAll.GetById("KN4").Id); Assert.AreEqual(new Position(47.658592, 9.168569), l_oStations.StationsAll.GetById("KN4").Position); // Former position was 47.6586936667, 9.16863116667 // Verify selected station. Assert.AreEqual( null, l_oTinkApp.SelectedStation.Id, "When starting app selected station must always be invlid"); // Verify bikes at station. Assert.AreEqual( 0, TestHelper.GetBikesAtStation(l_oTinkApp.ActiveUser, l_oConnector, l_oTinkApp.SelectedStation.Id).Result.Count, "If no station is selected BikesAtStation- list count must be zero"); // Check my bikes var l_oBikes = l_oTinkApp.GetConnector(true).Query.GetBikesOccupiedAsync().Result.Response; Assert.AreEqual(2, l_oBikes.Count); Assert.AreEqual("FR1544", l_oBikes.GetById("FR1544").Id); // Bike used here was from set CopriCallsMemory(SampleSets.Set2, 1) and had ID 8 Assert.AreEqual(InUseStateEnum.Booked, l_oBikes.GetById("FR1544").State.Value); Assert.AreEqual("FR103", l_oBikes.GetById("FR1544").CurrentStation); // // Bike used here was at station 5 Assert.That(l_oBikes.GetById("FR1544").TypeOfBike, Is.Null); // Bike used here was TypeOfBike.Cargo Assert.That(l_oBikes.GetById("FR1544").WheelType, Is.Null); // Bike was of Type WheelType.Two Assert.AreEqual("FR1004", l_oBikes.GetById("FR1004").Id); } [Test] public void LoggedIn_AllBikesDisposable_FilterTINK() { var l_oConnector = new ConnectorCache( "1234", "mgrimm@gmail.com", new CopriCallsMemory(SampleSets.Set2, 1)); // No user logged in is initial state to verify. var l_oTinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { FilterHelper.FILTERTINKGENERAL, FilterState.On } }), new GroupFilterSettings(new Dictionary { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }), new Uri("https://app.tink-konstanz.de/APIjsonserver"), new TINK.Settings.PollingParameters(new TimeSpan(10000), true), Serilog.Events.LogEventLevel.Error, activeLockService: typeof(LocksServiceMock).FullName, activeGeolocationService: typeof(GeolocationMock).FullName), new StoreMock(new Account("mgrimm@gmail.com", "123456789" /* password */, "1234" /* session cookie */, new List { FilterHelper.FILTERTINKGENERAL, FilterHelper.FILTERKONRAD })), (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)), sessionCookie, mail, new CopriCallsMemory001()), Substitute.For>(), new LocksServiceMock(), new DeviceMock(), new SpecialFolderMock(), null, // Cipher Substitute.For(), isConnectedFunc: () => true, currentVersion: new Version(3, 2, 0, 115), lastVersion: new Version(3, 0, 173)); // Current app version. Must be larger or equal 3.0.173 to var l_oStations = l_oTinkApp.GetConnector(true).Query.GetBikesAndStationsAsync().Result.Response; // Check stations. Assert.AreEqual(21, l_oStations.StationsAll.Count); Assert.NotNull(l_oStations.StationsAll.GetById("KN4")); Assert.AreEqual("KN4", l_oStations.StationsAll.GetById("KN4").Id); Assert.AreEqual(new Position(47.658592, 9.168569), l_oStations.StationsAll.GetById("KN4").Position); // Former position was 47.6586936667, 9.16863116667 // Verify selected station. Assert.AreEqual( null, l_oTinkApp.SelectedStation.Id, "When starting app selected station must always be invlid"); // Verify bikes at station. Assert.AreEqual( 0, TestHelper.GetBikesAtStation(l_oTinkApp.ActiveUser, l_oConnector, l_oTinkApp.SelectedStation.Id).Result.Count, "If no station is selected BikesAtStation- list count must be zero"); // Check my bikes Assert.IsTrue(l_oTinkApp.ActiveUser.IsLoggedIn); } [Test] public void LoggedIn_AllBikesDisposable_FilterKonrad() { var l_oCopriServer = new CopriCallsMemory(SampleSets.Set2, 1); var l_oConnector = new ConnectorCache( "1234", "mgrimm@gmail.com", new CopriCallsMemory(SampleSets.Set2, 1)); // No user logged in is initial state to verify. var l_oTinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { FilterHelper.FILTERKONRAD, FilterState.On } }), new GroupFilterSettings(new Dictionary { { FilterHelper.FILTERTINKGENERAL, FilterState.On }, { FilterHelper.FILTERKONRAD, FilterState.On } }), new Uri("https://app.tink-konstanz.de/APIjsonserver"), new TINK.Settings.PollingParameters(new TimeSpan(10000), true), Serilog.Events.LogEventLevel.Error, activeLockService: typeof(LocksServiceMock).FullName, activeGeolocationService: typeof(GeolocationMock).FullName), new StoreMock(new Account("mgrimm@gmail.com", "123456789" /* password */, "1234" /* session cookie */, new List { FilterHelper.FILTERTINKGENERAL, FilterHelper.FILTERKONRAD })), (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)), sessionCookie, mail, new CopriCallsMemory001()), Substitute.For>(), new LocksServiceMock(), new DeviceMock(), new SpecialFolderMock(), null, // Cipher Substitute.For(), isConnectedFunc: () => true, currentVersion: new Version(3, 2, 0, 115), lastVersion: new Version(3, 0, 173)); // Current app version. Must be larger or equal 3.0.173 to var l_oStations = l_oTinkApp.GetConnector(true).Query.GetBikesAndStationsAsync().Result.Response; // Check stations. Assert.AreEqual(27, l_oStations.StationsAll.Count); Assert.NotNull(l_oStations.StationsAll.GetById("KN1")); // Former station id was 14 when bike was read from CopriCallsMemory(SampleSets.Set2, 1) Assert.AreEqual("KN1", l_oStations.StationsAll.GetById("KN1").Id); Assert.AreEqual(new Position(47.66267, 9.17262), l_oStations.StationsAll.GetById("KN1").Position); // Former station was 47.66698054007847, 9.169303178787231 // Verify selected station. Assert.AreEqual( null, l_oTinkApp.SelectedStation.Id, "When starting app selected station must always be invlid"); // Verify bikes at station. Assert.AreEqual( 0, TestHelper.GetBikesAtStation(l_oTinkApp.ActiveUser, l_oConnector, l_oTinkApp.SelectedStation.Id).Result.Count, "If no station is selected BikesAtStation- list count must be zero"); // Check my bikes Assert.IsTrue(l_oTinkApp.ActiveUser.IsLoggedIn); } [Test, Ignore("Todo: Check if reserved bikes are released even if system is offline.")] public void LoggedIn_BikesReserved_OfflineAfterStart() { } /// /// Test if Whats New logic works as expected. Form version 3.0.0.115 or smaller no Whats New dialog existed. /// [Test] public void FirstInstall_WhatsNew() { var l_oAppVersion = new Version(3, 2, 0, 120); var l_oTinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { "TINK", FilterState.On } }), new GroupFilterSettings(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.On } }), new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"), new TINK.Settings.PollingParameters(new TimeSpan(10000), true), Serilog.Events.LogEventLevel.Error), new StoreMock(), (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)), sessionCookie, mail, new CopriCallsMemory(SampleSets.Set2, 1)), Substitute.For>(), null, // use default locks service new DeviceMock(), new SpecialFolderMock(), null, // Cipher Substitute.For(), #if ARENDI Substitute.For(), #endif isConnectedFunc: () => true, currentVersion: l_oAppVersion, // Current app version lastVersion: null, // Last version. whatsNewShownInVersion: null); // First install. // Whats new page Assert.IsFalse( l_oTinkApp.WhatsNew.IsShowRequired, $"Whats new should not be displayed because first install has been detected."); // Call member which view model calls when using app. l_oTinkApp.SetWhatsNewWasShown(); // Whats new page Assert.IsFalse( l_oTinkApp.WhatsNew.IsShowRequired, $"Whats new should mot be displayed first install detected."); } [Test] public void Upgrade120_WhatsNew() { var l_oAppVersion = new Version(3, 0, 0, 120); Version lastVersion = new Version(3, 0, 0, 116); var l_oTinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { "TINK", FilterState.On } }), new GroupFilterSettings(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.On } }), new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"), new TINK.Settings.PollingParameters(new TimeSpan(10000), true), Serilog.Events.LogEventLevel.Error), new StoreMock(), (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)), sessionCookie, mail, new CopriCallsMemory(SampleSets.Set2, 1)), Substitute.For>(), null, // use default locks service new DeviceMock(), new SpecialFolderMock(), null, // Cipher Substitute.For(), #if ARENDI // Requires LockItArendi library. Substitute.For(), #endif isConnectedFunc: () => true, currentVersion: l_oAppVersion, // Current app version lastVersion: lastVersion, whatsNewShownInVersion: null); // Whats new page was never shown. // Whats new page Assert.IsTrue( l_oTinkApp.WhatsNew.IsShowRequired, $"Whats new should be displayed because app version is {l_oAppVersion} and version when \"Whats New\" was shown last is {lastVersion} (null means never)."); // Call member which view model calls when using app. l_oTinkApp.SetWhatsNewWasShown(); // Whats new page Assert.IsFalse( l_oTinkApp.WhatsNew.IsShowRequired, $"Whats new should mot be displayed because app version is {l_oAppVersion} and version when \"Whats New\" was shown last is {lastVersion} equals."); } [Test] public void SubsequentStart_WhatsNew() { var l_oAppVersion = new Version(3, 2, 0, 115); var l_oWhatsNewVersion = new Version(3, 2, 0, 115); var l_oTinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { "TINK", FilterState.On } }), new GroupFilterSettings(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.On } }), new Uri("https://shareeapp-primary.copri-bike.de/APIjsonserver"), new TINK.Settings.PollingParameters(new TimeSpan(10000), true), Serilog.Events.LogEventLevel.Error, activeLockService: typeof(TINK.Services.BluetoothLock.BLE.LockItByGuidService).FullName, activeGeolocationService: typeof(TINK.Services.Geolocation.LastKnownGeolocationService).FullName), new StoreMock(), (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)), sessionCookie, mail, new CopriCallsMemory(SampleSets.Set2, 1)), Substitute.For>(), null, // use default locks service new DeviceMock(), new SpecialFolderMock(), null, // Cipher Substitute.For(), #if ARENDI // Requires LockItArendi library. Substitute.For(), #endif isConnectedFunc: () => true, currentVersion: l_oAppVersion, // Current app version< lastVersion: l_oWhatsNewVersion); // Whats new page was never shown. // Whats new page Assert.IsFalse( l_oTinkApp.WhatsNew.IsShowRequired, $"Whats new should not be displayed because app version is {l_oAppVersion} and version when \"Whats New\" was shown last is {l_oWhatsNewVersion} equals."); // Call member which view model would call if Whats New would have been shonw. l_oTinkApp.SetWhatsNewWasShown(); // Whats new page Assert.IsFalse( l_oTinkApp.WhatsNew.IsShowRequired, $"Whats new should mot be displayed because app version is {l_oAppVersion} and version when \"Whats New\" was shown last is {l_oWhatsNewVersion} equals."); } } }