using System; using System.Collections.Generic; using System.Threading.Tasks; using NSubstitute; using NUnit.Framework; using Plugin.BLE.Abstractions.Contracts; using TestFramework.Model.Device; using TestFramework.Model.Services.Geolocation; using TestFramework.Model.User.Account; using TestFramework.Repository; using TestFramework.Services.BluetoothLock; using TINK.Model; using TINK.Model.Connector; using TINK.Model.Services.CopriApi; using TINK.Model.Settings; using TINK.Repository; using TINK.Repository.Exception; using TINK.Services; using TINK.Services.Geolocation; using TINK.Services.Permissions; using TINK.View; using TINK.ViewModel.Account; using TINK.ViewModel.Map; using TINK.ViewModel.Settings; using static TINK.Repository.CopriCallsMemory; namespace TestTINKLib.Fixtures.ObjectTests.Account { public class TestAccountPageViewModel { [Test] public void TestConstruct_NotLoggedIn() { const string MERCH_ID = "MyMerchId"; var tinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.Off } }), new GroupFilterSettings(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.On } }), new StartupSettings(), new Uri("https://shareeapp-primary.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(), isConnectedFunc: () => true, connectorFactory: (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo(MERCH_ID, "MyApp", new Version(1, 2)), null /*UI language */, sessionCookie, mail, server: new CopriCallsMemory(MERCH_ID, SampleSets.Set2, 1, sessionCookie)), merchantId: MERCH_ID, bluetoothService: Substitute.For(), locationPermissionsService: Substitute.For(), locationServicesContainer: Substitute.For>(), locksService: new LocksServiceMock(), // Cipher device: new DeviceMock(), specialFolder: new SpecialFolderMock(), cipher: null, theme: null, 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 viewService = Substitute.For(); var settingsPageViewModel = new AccountPageViewModel( tinkApp, (uri) => { }, viewService); Assert.AreEqual("No user logged in.", settingsPageViewModel.LoggedInInfo); Assert.IsFalse(settingsPageViewModel.IsBookingStateInfoVisible, "No user logged in."); Assert.AreEqual(string.Empty, settingsPageViewModel.BookingStateInfo); } [Test] public async Task TestConstruct() { const string MERCH_ID = "MyMerchId"; var tinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.Off } }), new GroupFilterSettings(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.On } }), new StartupSettings(), new Uri("https://shareeapp-primary.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 TINK.Model.User.Account.Account("a@b", "123456789", false, "UnknownCookie", new List { "TINK" })), isConnectedFunc: () => true, connectorFactory: (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo(MERCH_ID, "MyApp", new Version(1, 2)), null /*UI language */, sessionCookie, mail, server: new CopriCallsMemory(MERCH_ID, SampleSets.Set2, 1, sessionCookie)), merchantId: MERCH_ID, bluetoothService: Substitute.For(), locationPermissionsService: Substitute.For(), locationServicesContainer: Substitute.For>(), locksService: new LocksServiceMock(), // Cipher device: new DeviceMock(), specialFolder: new SpecialFolderMock(), cipher: null, theme: null, 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 viewService = Substitute.For(); var settingsPageViewModel = new AccountPageViewModel( tinkApp, (uri) => { }, viewService); await settingsPageViewModel.OnAppearing(); Assert.AreEqual("Logged in as a@b.", settingsPageViewModel.LoggedInInfo); Assert.IsFalse(settingsPageViewModel.IsBookingStateInfoVisible, "A user is logged but no bikes requested/ booked."); Assert.AreEqual(string.Empty, settingsPageViewModel.BookingStateInfo); } [Test] public async Task TestConstruct_TwoBikes() { var tinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.Off } }), new GroupFilterSettings(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.On } }), new StartupSettings(), new Uri("https://shareeapp-primary.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 TINK.Model.User.Account.Account("a@b", "123456789", false, "6103_112e96b36ba33de245943c5ffaf369cd_", new List { "TINK" })), isConnectedFunc: () => true, connectorFactory: (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)), null /*UI language */, sessionCookie, mail, server: new CopriCallsMemory001(sessionCookie)), merchantId: "MyMerchId", bluetoothService: Substitute.For(), locationPermissionsService: Substitute.For(), locationServicesContainer: Substitute.For>(), locksService: new LocksServiceMock(), // Cipher device: new DeviceMock(), specialFolder: new SpecialFolderMock(), cipher: null, theme: null, 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 viewService = Substitute.For(); var settingsPageViewModel = new AccountPageViewModel( tinkApp, (uri) => { }, viewService); await settingsPageViewModel.OnAppearing(); Assert.AreEqual("Logged in as a@b.", settingsPageViewModel.LoggedInInfo); Assert.IsTrue(settingsPageViewModel.IsBookingStateInfoVisible, "A user is logged but no bikes requested/ booked."); Assert.AreEqual("Currently 2 bikes reserved/ booked.", settingsPageViewModel.BookingStateInfo); } [Test] public async Task TestConstruct_TwoBikes_Offline() { var tinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.Off } }), new GroupFilterSettings(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.On } }), new StartupSettings(), new Uri("https://shareeapp-primary.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 TINK.Model.User.Account.Account("a@b", "123456789", false, "6103_112e96b36ba33de245943c5ffaf369cd_", new List { "TINK" })), isConnectedFunc: () => false, connectorFactory: (isConnected, uri, sessionCookie, mail, expiresAfter) => new ConnectorCache(new AppContextInfo("MyMerchId", "MyApp", new Version(1, 2)), null /*UI language */, sessionCookie, mail, server: new CopriCallsMemory001(sessionCookie)), merchantId: "MyMerchId", bluetoothService: Substitute.For(), locationPermissionsService: Substitute.For(), locationServicesContainer: Substitute.For>(), locksService: new LocksServiceMock(), // Cipher device: new DeviceMock(), specialFolder: new SpecialFolderMock(), cipher: null, // Offline theme: null, 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 viewService = Substitute.For(); var settingsPageViewModel = new AccountPageViewModel( tinkApp, (uri) => { }, viewService); await settingsPageViewModel.OnAppearing(); Assert.AreEqual("Logged in as a@b.", settingsPageViewModel.LoggedInInfo); Assert.IsTrue(settingsPageViewModel.IsBookingStateInfoVisible, "A user is logged but no bikes requested/ booked."); Assert.AreEqual("Currently 2 bikes reserved/ booked. Connectivity: Offline.", settingsPageViewModel.BookingStateInfo); } [Test] public async Task TestConstruct_TwoBikes_WebConnectCommunicationError() { var tinkApp = new TinkApp( new TINK.Model.Settings.Settings( new GroupFilterMapPage(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.Off } }), new GroupFilterSettings(new Dictionary { { "TINK", FilterState.On }, { "Konrad", FilterState.On } }), new StartupSettings(), new Uri("https://shareeapp-primary.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 TINK.Model.User.Account.Account("a@b", "123456789", false, "6103_112e96b36ba33de245943c5ffaf369cd_", new List { "TINK" })), isConnectedFunc: () => false, connectorFactory: (isConnected, uri, sessionCookie, mail, expiresAfter) => new TINK.Model.Connector.Connector( uri, new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), null /*UI language */, sessionCookie, mail, server: new CopriProviderHttps( uri, TinkApp.MerchantId, new AppContextInfo("oiF2kahH", "sharee.bike.test", new Version(3, 0, 267)), null /*UI language */, sessionCookie: sessionCookie, cacheServer: new CopriCallsCacheMemory001(sessionCookie: sessionCookie), httpsServer: new ExceptionServer((msg) => new WebConnectFailureException(msg, new Exception("Source exception."))))), merchantId: "MyMerchId", bluetoothService: Substitute.For(), locationPermissionsService: Substitute.For(), locationServicesContainer: Substitute.For>(), locksService: new LocksServiceMock(), // Cipher device: new DeviceMock(), specialFolder: new SpecialFolderMock(), cipher: null, // Offline theme: null, 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 viewService = Substitute.For(); var settingsPageViewModel = new AccountPageViewModel( tinkApp, (uri) => { }, viewService); await settingsPageViewModel.OnAppearing(); Assert.AreEqual("Logged in as a@b.", settingsPageViewModel.LoggedInInfo); // CopriCallsCacheMemory(SampleSets.Set2, Assert.IsTrue(settingsPageViewModel.IsBookingStateInfoVisible, "A user is logged but no bikes requested/ booked."); Assert.AreEqual("Currently 2 bikes reserved/ booked. Connectivity: Offline.", settingsPageViewModel.BookingStateInfo); } } }