public async Task SignOut_CallsSignOutinAccountServiceAndRemovesSavedCredentials() { bool closeFlyoutCalled = false; bool accountServiceSignOutCalled = false; bool clearHistoryCalled = false; bool navigateCalled = false; var accountService = new MockAccountService { SignOutDelegate = () => accountServiceSignOutCalled = true, VerifyUserAuthenticationAsyncDelegate = () => Task.FromResult(new UserInfo()) }; var navigationService = new MockNavigationService { ClearHistoryDelegate = () => clearHistoryCalled = true, NavigateDelegate = (s, o) => { navigateCalled = true; Assert.AreEqual("Hub", s); return true; } }; var target = new SignOutFlyoutViewModel(accountService, navigationService) { CloseFlyout = () => closeFlyoutCalled = true }; await target.SignOutCommand.Execute(); Assert.IsTrue(accountServiceSignOutCalled); Assert.IsTrue(closeFlyoutCalled); Assert.IsTrue(clearHistoryCalled); Assert.IsTrue(navigateCalled); }
public void OnNavigatedTo_Fill_Properties_With_Shopping_Cart_Items() { var navigationService = new MockNavigationService(); var shoppingCartRepository = new MockShoppingCartRepository(); shoppingCartRepository.GetShoppingCartAsyncDelegate = () => { ShoppingCart shoppingCart = null; var shoppingCartItems = new ObservableCollection<ShoppingCartItem> { new ShoppingCartItem() {Product = new Product { ListPrice = 100, DiscountPercentage = 50, ProductNumber = "p1", ImageUri = new Uri("http://image")}, Currency = "USD", Quantity = 1}, new ShoppingCartItem() {Product = new Product { ListPrice = 100, DiscountPercentage = 50, ProductNumber = "p2", ImageUri = new Uri("http://image")}, Currency = "USD", Quantity = 1} }; shoppingCart = new ShoppingCart(shoppingCartItems) { Currency = "USD"}; return Task.FromResult(shoppingCart); }; bool signInUserControlOnNavigatedToCalled = false; var signInUserControlViewModel = new MockSignInUserControlViewModel() { OnNavigatedToDelegate = (a, b, c) => signInUserControlOnNavigatedToCalled = true }; var eventAggregator = new MockEventAggregator(); eventAggregator.GetEventDelegate = type => new MockShoppingCartUpdatedEvent(); var target = new ShoppingCartPageViewModel(shoppingCartRepository, navigationService, new MockAccountService(), signInUserControlViewModel, null, null, null, null, eventAggregator); target.OnNavigatedTo(new NavigatedToEventArgs { Parameter = null, NavigationMode = NavigationMode.New }, null); Assert.IsTrue(signInUserControlOnNavigatedToCalled); Assert.AreEqual("$200.00", target.FullPrice); Assert.AreEqual("$100.00", target.TotalDiscount); Assert.AreEqual(2, target.ShoppingCartItemViewModels.Count); }
public void OnNavigatedTo_ClearsNavigationHistory() { bool clearHistoryCalled = false; var navigationService = new MockNavigationService(); navigationService.ClearHistoryDelegate = () => { clearHistoryCalled = true; }; var resourcesService = new MockResourceLoader() { GetStringDelegate = (key) => key }; var target = new OrderConfirmationPageViewModel(resourcesService, navigationService); target.OnNavigatedTo(new NavigatedToEventArgs { Parameter = null, NavigationMode = NavigationMode.Forward }, null); Assert.IsTrue(clearHistoryCalled); }
public void FailedCallToProductCatalogRepository_ShowsAlert() { var alertCalled = false; var productCatalogRepository = new MockProductCatalogRepository(); var navService = new MockNavigationService(); productCatalogRepository.GetRootCategoriesAsyncDelegate = (maxAmmountOfProducts) => { throw new Exception(); }; var alertMessageService = new MockAlertMessageService(); alertMessageService.ShowAsyncDelegate = (s, s1) => { alertCalled = true; Assert.AreEqual("ErrorServiceUnreachable", s1); return Task.FromResult(string.Empty); }; var target = new HubPageViewModel(productCatalogRepository, navService, alertMessageService, new MockResourceLoader()); target.OnNavigatedTo(new NavigatedToEventArgs { Parameter = null, NavigationMode = NavigationMode.New }, null); Assert.IsTrue(alertCalled); }
public void OnNavigatedTo_Fill_RootCategories() { var repository = new MockProductCatalogRepository(); var navigationService = new MockNavigationService(); repository.GetRootCategoriesAsyncDelegate = (maxAmmountOfProducts) => { var categories = new Collection<Category>(new List<Category>{ new Category(), new Category(), new Category() }); return Task.FromResult((ICollection<Category>)categories); }; var viewModel = new HubPageViewModel(repository, navigationService, null, null); viewModel.OnNavigatedTo(new NavigatedToEventArgs { Parameter = null, NavigationMode = NavigationMode.New }, null); Assert.IsNotNull(viewModel.RootCategories); Assert.AreEqual(((ICollection<CategoryViewModel>)viewModel.RootCategories).Count, 3); }
public async Task SubmitInvalidOrder_CallsErrorDialog() { bool successDialogCalled = false; bool errorDialogCalled = false; var navigationService = new MockNavigationService(); var accountService = new MockAccountService() { VerifySavedCredentialsAsyncDelegate = () => Task.FromResult<UserInfo>(new UserInfo()) }; var orderService = new MockOrderService() { // the order is invalid, it cannot be processed ProcessOrderAsyncDelegate = (o) => { var modelValidationResult = new ModelValidationResult(); modelValidationResult.ModelState.Add("someKey", new List<string>() { "the value of someKey is invalid" }); throw new ModelValidationException(modelValidationResult); } }; var resourcesService = new MockResourceLoader() { GetStringDelegate = (key) => key }; var alertService = new MockAlertMessageService() { ShowAsyncDelegate = (dialogTitle, dialogMessage) => { successDialogCalled = dialogTitle.ToLower().Contains("purchased"); errorDialogCalled = !successDialogCalled; return Task.FromResult(successDialogCalled); } }; var target = new CheckoutSummaryPageViewModel(navigationService, orderService, null, null, null, null, accountService, resourcesService, alertService, null); await target.SubmitCommand.Execute(); Assert.IsFalse(successDialogCalled); Assert.IsTrue(errorDialogCalled); }
public async Task SubmitValidOrder_NavigatesToOrderConfirmation() { bool navigateCalled = false; bool clearCartCalled = false; var navigationService = new MockNavigationService(); navigationService.NavigateDelegate = (s, o) => { Assert.AreEqual("OrderConfirmation", s); navigateCalled = true; return true; }; var accountService = new MockAccountService() { VerifySavedCredentialsAsyncDelegate = () => Task.FromResult<UserInfo>(new UserInfo()) }; var orderService = new MockOrderService() { // the order is valid, it can be processed ProcessOrderAsyncDelegate = (o) => Task.FromResult(true) }; var resourcesService = new MockResourceLoader() { GetStringDelegate = (key) => key }; var shoppingCartRepository = new MockShoppingCartRepository(); shoppingCartRepository.ClearCartAsyncDelegate = () => { clearCartCalled = true; return Task.Delay(0); }; var target = new CheckoutSummaryPageViewModel(navigationService, orderService, null, null, null, shoppingCartRepository, accountService, resourcesService, null, null); await target.SubmitCommand.Execute(); Assert.IsTrue(navigateCalled); Assert.IsTrue(clearCartCalled); }
public void ShoppingCartUpdated_WhenShoppingCartChanged() { var navigationService = new MockNavigationService(); var accountService = new MockAccountService(); var shoppingCartRepository = new MockShoppingCartRepository(); shoppingCartRepository.GetShoppingCartAsyncDelegate = () => { ShoppingCart shoppingCart = new ShoppingCart(new ObservableCollection<ShoppingCartItem>()) { Currency = "USD"}; return Task.FromResult(shoppingCart); }; bool signInUserControlOnNavigatedToCalled = false; var signInUserControlViewModel = new MockSignInUserControlViewModel() { OnNavigatedToDelegate = (a, b, c) => signInUserControlOnNavigatedToCalled = true }; var eventAggregator = new MockEventAggregator(); var shoppingCartUpdatedEvent = new ShoppingCartUpdatedEvent(); eventAggregator.GetEventDelegate = type => shoppingCartUpdatedEvent; var target = new ShoppingCartPageViewModel(shoppingCartRepository, navigationService, accountService, signInUserControlViewModel, null, null, null, null, eventAggregator); target.OnNavigatedTo(new NavigatedToEventArgs { Parameter = null, NavigationMode = NavigationMode.New }, null); Assert.AreEqual("$0.00", target.FullPrice); shoppingCartRepository.GetShoppingCartAsyncDelegate = () => { var shoppingCartItems = new ObservableCollection<ShoppingCartItem> { new ShoppingCartItem() { Product = new Product { ListPrice = 100, ProductNumber = "p1", ImageUri = new Uri("http://image")}, Currency = "USD", Quantity = 2}, }; ShoppingCart shoppingCart = new ShoppingCart(new ObservableCollection<ShoppingCartItem>(shoppingCartItems)) { Currency = "USD" }; return Task.FromResult(shoppingCart); }; shoppingCartUpdatedEvent.Publish(null); Assert.IsTrue(signInUserControlOnNavigatedToCalled); Assert.AreEqual("$200.00", target.FullPrice); }
public void DecrementCountCommand_NotExecutable() { var navigationService = new MockNavigationService(); var shoppingCartRepository = new MockShoppingCartRepository(); var eventAggregator = new MockEventAggregator(); eventAggregator.GetEventDelegate = type => new MockShoppingCartUpdatedEvent(); var target = new ShoppingCartPageViewModel(shoppingCartRepository, navigationService, null, null, null, null, null, null, eventAggregator); target.SelectedItem = new ShoppingCartItemViewModel(new ShoppingCartItem(){ Quantity = 2, Currency = "USD", Product = new Product() }, null); Assert.IsTrue(target.DecrementCountCommand.CanExecute()); target.SelectedItem = new ShoppingCartItemViewModel(new ShoppingCartItem() { Quantity = 1, Currency = "USD", Product = new Product() }, null); Assert.IsFalse(target.DecrementCountCommand.CanExecute()); }
public void CheckoutCommand_NotExecutable_IfNoItemsInCart() { var navigationService = new MockNavigationService(); var shoppingCartRepository = new MockShoppingCartRepository(); shoppingCartRepository.GetShoppingCartAsyncDelegate = () => Task.FromResult<ShoppingCart>(null); var eventAggregator = new MockEventAggregator(); eventAggregator.GetEventDelegate = type => new MockShoppingCartUpdatedEvent(); var target = new ShoppingCartPageViewModel(shoppingCartRepository, navigationService, null, null, null, null, null, null, eventAggregator); target.UpdateShoppingCartAsync(null); Assert.IsFalse(target.CheckoutCommand.CanExecute()); shoppingCartRepository.GetShoppingCartAsyncDelegate = () => Task.FromResult(new ShoppingCart(new Collection<ShoppingCartItem>()){Currency = "USD", FullPrice = 0, TaxRate = 0, TotalDiscount = 0, TotalPrice = 0}); target.UpdateShoppingCartAsync(null); Assert.IsFalse(target.CheckoutCommand.CanExecute()); shoppingCartRepository.GetShoppingCartAsyncDelegate = () => Task.FromResult(new ShoppingCart(new Collection<ShoppingCartItem> { new ShoppingCartItem{Product = new Product(), Currency = "USD", Quantity = 0} }) { Currency = "USD", FullPrice = 0, TaxRate = 0, TotalDiscount = 0, TotalPrice = 0 }); target.UpdateShoppingCartAsync(null); Assert.IsTrue(target.CheckoutCommand.CanExecute()); }
public async Task ExecuteGoNextCommand_ProcessesFormsAndNavigates_IfViewModelsAreValid() { bool shippingInfoProcessed = false; bool billingInfoProcessed = false; bool paymentInfoProcessed = false; bool navigated = false; var shippingAddressPageViewModel = new MockShippingAddressPageViewModel() { ValidateFormDelegate = () => true, ProcessFormAsyncDelegate = () => { shippingInfoProcessed = true; return Task.Delay(0); } }; var billingAddressPageViewModel = new MockBillingAddressPageViewModel() { ValidateFormDelegate = () => true, ProcessFormAsyncDelegate = () => { billingInfoProcessed = true; return Task.Delay(0); } }; var paymentMethodPageViewModel = new MockPaymentMethodPageViewModel() { ValidateFormDelegate = () => true, ProcessFormAsyncDelegate = async () => { paymentInfoProcessed = true; await Task.Delay(0); } }; var accountService = new MockAccountService() { VerifyUserAuthenticationAsyncDelegate = () => Task.FromResult(new UserInfo()), SignedInUser = new UserInfo() { UserName = "******" } }; var orderRepository = new MockOrderRepository() { CreateBasicOrderAsyncDelegate = (a, b, c, d, e) => Task.FromResult(new Order() { Id = 1 }) }; var shoppingCartRepository = new MockShoppingCartRepository() { GetShoppingCartAsyncDelegate = () => Task.FromResult(new ShoppingCart(null)) }; var navigationService = new MockNavigationService() { NavigateDelegate = (a, b) => navigated = true }; var target = new CheckoutHubPageViewModel(navigationService, accountService, orderRepository, shoppingCartRepository, shippingAddressPageViewModel, billingAddressPageViewModel, paymentMethodPageViewModel, null, null); await target.GoNextCommand.Execute(); Assert.IsTrue(shippingInfoProcessed); Assert.IsTrue(billingInfoProcessed); Assert.IsTrue(paymentInfoProcessed); Assert.IsTrue(navigated); }
public async Task SettingUseShippingAddressToTrue_CopiesValuesFromShippingAddressToBilling() { var mockAddress = new Address() { FirstName = "TestFirstName", MiddleInitial = "TestMiddleInitial", LastName = "TestLastName", StreetAddress = "TestStreetAddress", OptionalAddress = "TestOptionalAddress", City = "TestCity", State = "TestState", ZipCode = "123456", Phone = "123456" }; var compareAddressesFunc = new Func<Address, Address, bool>((Address a1, Address a2) => { return a1.FirstName == a2.FirstName && a1.MiddleInitial == a2.MiddleInitial && a1.LastName == a2.LastName && a1.StreetAddress == a2.StreetAddress && a1.OptionalAddress == a2.OptionalAddress && a1.City == a2.City && a1.State == a2.State && a1.ZipCode == a2.ZipCode && a1.Phone == a2.Phone; }); var shippingAddressPageViewModel = new MockShippingAddressPageViewModel() { ValidateFormDelegate = () => true, ProcessFormAsyncDelegate = () => Task.Delay(0), Address = mockAddress }; var billingAddressPageViewModel = new MockBillingAddressPageViewModel() { ValidateFormDelegate = () => true }; billingAddressPageViewModel.ProcessFormAsyncDelegate = () => { // The Address have to be updated before the form is processed Assert.IsTrue(compareAddressesFunc(shippingAddressPageViewModel.Address, billingAddressPageViewModel.Address)); return Task.Delay(0); }; var paymentMethodPageViewModel = new MockPaymentMethodPageViewModel() { ValidateFormDelegate = () => true, ProcessFormAsyncDelegate = async () => await Task.Delay(0), }; var accountService = new MockAccountService() { VerifyUserAuthenticationAsyncDelegate = () => Task.FromResult(new UserInfo()), SignedInUser = new UserInfo() }; var orderRepository = new MockOrderRepository() { CreateBasicOrderAsyncDelegate = (userId, shoppingCart, shippingAddress, billingAddress, paymentMethod) => { // The Address information stored in the order must be the same Assert.IsTrue(compareAddressesFunc(shippingAddress, billingAddress)); return Task.FromResult<Order>(new Order()); } }; var shoppingCartRepository = new MockShoppingCartRepository() { GetShoppingCartAsyncDelegate = () => Task.FromResult(new ShoppingCart(null)) }; var navigationService = new MockNavigationService() { NavigateDelegate = (a, b) => true }; var target = new CheckoutHubPageViewModel(navigationService, accountService, orderRepository, shoppingCartRepository, shippingAddressPageViewModel, billingAddressPageViewModel, paymentMethodPageViewModel, null, null); target.UseSameAddressAsShipping = true; await target.GoNextCommand.Execute(); }
public void AddCheckoutData_NavigatesToProperPage() { string requestedPageName = string.Empty; var navigationService= new MockNavigationService() { NavigateDelegate = (pageName, navParam) => { Assert.IsTrue(pageName == requestedPageName); return true; } }; var target = new CheckoutSummaryPageViewModel(navigationService, null, null, null, null, null, null, null, null, null); requestedPageName = "ShippingAddress"; target.SelectedCheckoutData = new CheckoutDataViewModel() { DataType = Constants.ShippingAddress }; target.AddCheckoutDataCommand.Execute().Wait(); requestedPageName = "BillingAddress"; target.SelectedCheckoutData = new CheckoutDataViewModel() { DataType = Constants.BillingAddress }; target.AddCheckoutDataCommand.Execute().Wait(); requestedPageName = "PaymentMethod"; target.SelectedCheckoutData = new CheckoutDataViewModel() { DataType = Constants.PaymentMethod }; target.AddCheckoutDataCommand.Execute().Wait(); }