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); }; var eventAggregator = new MockEventAggregator(); var shoppingCartUpdatedEvent = new ShoppingCartUpdatedEvent(); eventAggregator.GetEventDelegate = type => shoppingCartUpdatedEvent; var target = new ShoppingCartPageViewModel(shoppingCartRepository, navigationService, accountService, null, null, null, null, null, eventAggregator); target.OnNavigatedTo(null, 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.AreEqual("$200.00", target.FullPrice); }
public void VMListensToShoppingCartUpdatedEvent_ThenCalculatesTotalNumberOfItemsInCart() { var shoppingCart = new ShoppingCart(new List<ShoppingCartItem>()); var shoppingCartRepository = new MockShoppingCartRepository(); shoppingCartRepository.GetShoppingCartAsyncDelegate = () => Task.FromResult(shoppingCart); var shoppingCartUpdatedEvent = new ShoppingCartUpdatedEvent(); var eventAggregator = new MockEventAggregator(); eventAggregator.GetEventDelegate = type => { if (type == typeof(ShoppingCartUpdatedEvent)) return shoppingCartUpdatedEvent; if (type == typeof(ShoppingCartItemUpdatedEvent)) return new ShoppingCartItemUpdatedEvent(); return null; }; var accountService = new MockAccountService(); accountService.GetSignedInUserAsyncDelegate = () => Task.FromResult((UserInfo)null); var target = new ShoppingCartTabUserControlViewModel(shoppingCartRepository, eventAggregator, null, new AlertMessageService(), null, accountService); shoppingCart = new ShoppingCart(new List<ShoppingCartItem>() { new ShoppingCartItem {Quantity = 1}, new ShoppingCartItem {Quantity = 2} }); Assert.AreEqual(0, target.ItemCount); shoppingCartUpdatedEvent.Publish(null); Assert.AreEqual(3, target.ItemCount); }
public async Task SignOut_CallsSignOutinAccountServiceAndRemovesSavedCredentials() { bool closeFlyoutCalled = false; bool accountServiceSignOutCalled = false; bool clearHistoryCalled = false; bool navigateCalled = false; var accountService = new MockAccountService { SignOutDelegate = () => accountServiceSignOutCalled = true, GetSignedInUserAsyncDelegate = () => 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 }; target.Open(null, null); await target.SignOutCommand.Execute(); Assert.IsTrue(accountServiceSignOutCalled); Assert.IsTrue(closeFlyoutCalled); Assert.IsTrue(clearHistoryCalled); Assert.IsTrue(navigateCalled); }
public async Task SubmitValidOrder_CallsSuccessDialog() { bool successDialogCalled = false; bool errorDialogCalled = false; var navigationService = new MockNavigationService(); var accountService = new MockAccountService() { GetSignedInUserAsyncDelegate = () => Task.FromResult<UserInfo>(new UserInfo()) }; var orderService = new MockOrderService() { // the order is valid, it can be processed ProcessOrderAsyncDelegate = (a, b) => Task.FromResult(true) }; var resourcesService = new MockResourceLoader() { GetStringDelegate = (key) => key }; var alertService = new MockAlertMessageService() { ShowAsyncWithCommandsDelegate = (dialogTitle, dialogMessage, dialogCommands) => { successDialogCalled = dialogTitle.ToLower().Contains("purchased"); errorDialogCalled = !successDialogCalled; return Task.FromResult(successDialogCalled); } }; var target = new CheckoutSummaryPageViewModel(navigationService, orderService, null, null, null, null, accountService, null, resourcesService, alertService); await target.SubmitCommand.Execute(); Assert.IsTrue(successDialogCalled); Assert.IsFalse(errorDialogCalled); }
public async Task FiringSignInCommand_Persists_Credentials_And_Turns_Invisible() { bool accountServiceSignInCalled = false; bool flyoutClosed = false; var accountService = new MockAccountService() { SignInUserAsyncDelegate = (username, password, useCredentialStore) => { Assert.AreEqual("TestUsername", username); Assert.AreEqual("TestPassword", password); Assert.IsTrue(useCredentialStore); accountServiceSignInCalled = true; return Task.FromResult(true); } }; var target = new SignInFlyoutViewModel(accountService) { CloseFlyout = () => flyoutClosed = true, UserName = "******", Password = "******", SaveCredentials = true }; await target.SignInCommand.Execute(); Assert.IsTrue(accountServiceSignInCalled); Assert.IsTrue(flyoutClosed); }
public async Task SuccessfulSignIn_CallsSuccessAction() { var successActionCalled = false; var accountService = new MockAccountService() { SignInUserAsyncDelegate = (username, password, useCredentialStore) => Task.FromResult(true) }; var target = new SignInFlyoutViewModel(accountService) {CloseFlyout = () => Task.Delay(0)}; target.Open(null, () => { successActionCalled = true; }); await target.SignInCommand.Execute(); Assert.IsTrue(successActionCalled); }
public async Task ExecuteGoNextCommand_ProcessesFormsAndNavigates_IfViewModelsAreValid() { bool shippingInfoProcessed = false; bool billingInfoProcessed = false; bool paymentInfoProcessed = false; bool navigated = false; var shippingAddressPageViewModel = new MockShippingAddressPageViewModel() { ValidateFormDelegate = () => true, ProcessFormDelegate = () => shippingInfoProcessed = true }; var billingAddressPageViewModel = new MockBillingAddressPageViewModel() { ValidateFormDelegate = () => true, ProcessFormDelegate = () => billingInfoProcessed = true }; var paymentMethodPageViewModel = new MockPaymentMethodPageViewModel() { ValidateFormDelegate = () => true, ProcessFormDelegate = () => paymentInfoProcessed = true }; var accountService = new MockAccountService() { GetSignedInUserAsyncDelegate = () => Task.FromResult(new UserInfo()) }; 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, null); await target.GoNextCommand.Execute(); Assert.IsTrue(shippingInfoProcessed); Assert.IsTrue(billingInfoProcessed); Assert.IsTrue(paymentInfoProcessed); Assert.IsTrue(navigated); }
public async Task FiringSignInCommand_WithNotRememberPassword_DoesNotSaveInCredentialStore() { var accountService = new MockAccountService() { SignInUserAsyncDelegate = (username, password, useCredentialStore) => { Assert.IsFalse(useCredentialStore); return Task.FromResult(true); } }; var target = new SignInFlyoutViewModel(accountService) { CloseFlyout = () => Assert.IsTrue(true), SaveCredentials = false }; await target.SignInCommand.Execute(); }
public async Task SubmitInvalidOrder_CallsErrorDialog() { bool successDialogCalled = false; bool errorDialogCalled = false; var navigationService = new MockNavigationService(); var accountService = new MockAccountService() { GetSignedInUserAsyncDelegate = () => Task.FromResult<UserInfo>(new UserInfo()) }; var orderService = new MockOrderService() { // the order is invalid, it cannot be processed ProcessOrderAsyncDelegate = (a, b) => { 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, null, resourcesService, alertService); await target.SubmitCommand.Execute(); Assert.IsFalse(successDialogCalled); Assert.IsTrue(errorDialogCalled); }
public void FailedCallToShoppingCartRepository_ShowsAlert() { var alertCalled = false; var shoppingCartRepository = new MockShoppingCartRepository(); shoppingCartRepository.GetShoppingCartAsyncDelegate = () => { throw new HttpRequestException(); }; var alertMessageService = new MockAlertMessageService(); alertMessageService.ShowAsyncDelegate = (s, s1) => { alertCalled = true; Assert.AreEqual("Error", s1); return Task.FromResult(string.Empty); }; var accountService = new MockAccountService(); accountService.GetSignedInUserAsyncDelegate = () => Task.FromResult((UserInfo)null); var target = new ShoppingCartTabUserControlViewModel(shoppingCartRepository, null, null, alertMessageService, new MockResourceLoader(), accountService); Assert.IsTrue(alertCalled); }
public void ShoppingCartUpdated_WithNullCart_SetsItemCountZero() { var shoppingCartRepository = new MockShoppingCartRepository(); shoppingCartRepository.GetShoppingCartAsyncDelegate = () => Task.FromResult<ShoppingCart>(null); var eventAggregator = new MockEventAggregator(); var shoppingCartUpdatedEvent = new ShoppingCartUpdatedEvent(); eventAggregator.GetEventDelegate = type => { if (type == typeof(ShoppingCartUpdatedEvent)) return shoppingCartUpdatedEvent; if (type == typeof(ShoppingCartItemUpdatedEvent)) return new ShoppingCartItemUpdatedEvent(); return null; }; var accountService = new MockAccountService(); accountService.GetSignedInUserAsyncDelegate = () => Task.FromResult((UserInfo)null); var target = new ShoppingCartTabUserControlViewModel(shoppingCartRepository, eventAggregator, null, new AlertMessageService(), null, accountService); target.ItemCount = 99; shoppingCartUpdatedEvent.Publish(null); Assert.AreEqual(0, target.ItemCount); }
public async Task Submit_WhenAnonymous_ShowsSignInFlyout() { bool showFlyoutCalled = false; var accountService = new MockAccountService() { GetSignedInUserAsyncDelegate = () => Task.FromResult<UserInfo>(null) }; var flyoutService = new MockFlyoutService() { ShowFlyoutDelegate = (s, o, arg3) => { showFlyoutCalled = true; Assert.AreEqual("SignIn", s); } }; var target = new CheckoutSummaryPageViewModel(new MockNavigationService(), null, null, null, null, null, accountService, flyoutService, null, null); await target.SubmitCommand.Execute(); Assert.IsTrue(showFlyoutCalled); }
public async Task ExecuteGoNextCommand_DisplaysSignInFlyout_IfViewModelsAreValidAndUserNotLoggedIn() { bool signInFlyoutDisplayed = false; var shippingAddressPageViewModel = new MockShippingAddressPageViewModel() { ValidateFormDelegate = () => true }; var billingAddressPageViewModel = new MockBillingAddressPageViewModel() { ValidateFormDelegate = () => true }; var paymentMethodPageViewModel = new MockPaymentMethodPageViewModel() { ValidateFormDelegate = () => true }; var accountService = new MockAccountService() { GetSignedInUserAsyncDelegate = () => Task.FromResult<UserInfo>(null) }; var flyoutService = new MockFlyoutService() { ShowFlyoutDelegate = (a, b, c) => signInFlyoutDisplayed = true }; var target = new CheckoutHubPageViewModel(new MockNavigationService(), accountService, null, null, shippingAddressPageViewModel, billingAddressPageViewModel, paymentMethodPageViewModel, flyoutService, null, null); await target.GoNextCommand.Execute(); Assert.IsTrue(signInFlyoutDisplayed); }
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, ProcessFormDelegate = () => Task.Delay(0), Address = mockAddress }; var billingAddressPageViewModel = new MockBillingAddressPageViewModel() { ValidateFormDelegate = () => true }; billingAddressPageViewModel.ProcessFormDelegate = () => { // The Address have to be updated before the form is processed Assert.IsTrue(compareAddressesFunc(shippingAddressPageViewModel.Address, billingAddressPageViewModel.Address)); }; var paymentMethodPageViewModel = new MockPaymentMethodPageViewModel() { ValidateFormDelegate = () => true, ProcessFormDelegate = () => Task.Delay(0), }; var accountService = new MockAccountService() { GetSignedInUserAsyncDelegate = () => Task.FromResult(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 shippingMethodService = new MockShippingMethodService() { GetBasicShippingMethodAsyncDelegate = () => Task.FromResult(new ShippingMethod()) }; 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, null); target.UseSameAddressAsShipping = true; await target.GoNextCommand.Execute(); }
public void UserName_ReturnsLastSignedInUser_IfAvailable() { var accountService = new MockAccountService() { SignedInUser = new UserInfo { UserName = "******" } }; var target = new SignInFlyoutViewModel(accountService); Assert.AreEqual("TestUserName", target.UserName); Assert.IsFalse(target.IsNewSignIn); }
public async Task ExecuteGoNextCommand_DoNothing_IfViewModelsAreInvalid() { bool formProcessStarted = false; var accountService = new MockAccountService() { GetSignedInUserAsyncDelegate = () => { // The process starts with a call to retrieve the logged user formProcessStarted = true; return Task.FromResult(new UserInfo()); } }; var shippingAddressPageViewModel = new MockShippingAddressPageViewModel(); var billingAddressPageViewModel = new MockBillingAddressPageViewModel(); var paymentMethodPageViewModel = new MockPaymentMethodPageViewModel(); var target = new CheckoutHubPageViewModel(new MockNavigationService(), accountService, null, null, shippingAddressPageViewModel, billingAddressPageViewModel, paymentMethodPageViewModel, null, null, null); // ShippingAddress invalid only shippingAddressPageViewModel.ValidateFormDelegate = () => false; billingAddressPageViewModel.ValidateFormDelegate = () => true; paymentMethodPageViewModel.ValidateFormDelegate = () => true; await target.GoNextCommand.Execute(); Assert.IsFalse(formProcessStarted); // BillingAddress invalid only shippingAddressPageViewModel.ValidateFormDelegate = () => true; billingAddressPageViewModel.ValidateFormDelegate = () => false; paymentMethodPageViewModel.ValidateFormDelegate = () => true; Assert.IsFalse(formProcessStarted); // PaymentMethod invalid only shippingAddressPageViewModel.ValidateFormDelegate = () => true; billingAddressPageViewModel.ValidateFormDelegate = () => true; paymentMethodPageViewModel.ValidateFormDelegate = () => false; Assert.IsFalse(formProcessStarted); }
public void ShoppingCartMerged_WhenAnonymousUserLogsIn() { bool mergeShoppingCartsCalled = false; var anonymousCartItems = new List<ShoppingCartItem> { new ShoppingCartItem {Quantity = 1, Product = new Product {ProductNumber = "123"}} }; var testUserCartItems = new List<ShoppingCartItem> { new ShoppingCartItem {Quantity = 2, Product = new Product {ProductNumber = "123"}} }; var shoppingCartService = new MockShoppingCartService() { GetShoppingCartAsyncDelegate = s => { switch (s) { case "AnonymousId": return Task.FromResult(new ShoppingCart(anonymousCartItems)); default: return Task.FromResult(new ShoppingCart(testUserCartItems)); } }, MergeShoppingCartsAsyncDelegate = (s, s1) => { mergeShoppingCartsCalled = true; Assert.AreEqual("AnonymousId", s); Assert.AreEqual("TestUserName", s1); return Task.FromResult(string.Empty); } }; var accountService = new MockAccountService(); var shoppingCartUpdatedEvent = new MockShoppingCartUpdatedEvent { PublishDelegate = () => { } }; var eventAggregator = new MockEventAggregator() { GetEventDelegate = (a) => shoppingCartUpdatedEvent }; var suspensionManagerState = new MockSuspensionManagerState(); suspensionManagerState.SessionState[ShoppingCartRepository.ShoppingCartIdKey] = "AnonymousId"; var target = new ShoppingCartRepository(shoppingCartService, accountService, eventAggregator, null, suspensionManagerState); accountService.RaiseUserChanged(new UserInfo { UserName = "******" }, null); Assert.IsTrue(mergeShoppingCartsCalled); }
public void CartUpdatedEventRaised_WhenUserChanged() { var shoppingCartUpdatedRaised = false; var accountService = new MockAccountService(); var shoppingCartUpdatedEvent = new MockShoppingCartUpdatedEvent() { PublishDelegate = () => shoppingCartUpdatedRaised = true }; var eventAggregator = new MockEventAggregator() { GetEventDelegate = (a) => shoppingCartUpdatedEvent }; var shoppingCartService = new MockShoppingCartService() { MergeShoppingCartsAsyncDelegate = (s, s1) => Task.FromResult(string.Empty) }; var target = new ShoppingCartRepository(shoppingCartService, accountService, eventAggregator, new MockProductCatalogRepository(), new MockSuspensionManagerState()); accountService.RaiseUserChanged(new UserInfo { UserName = "******" }, null); Assert.IsTrue(shoppingCartUpdatedRaised); }
public void ExecutingShoppingCartCommand_NavigatesToShoppingCart() { var navigateCalled = false; var navigationService = new MockNavigationService(); navigationService.NavigateDelegate = (s, o) => { Assert.AreEqual("ShoppingCart", s); navigateCalled = true; return true; }; var eventAggregator = new MockEventAggregator(); eventAggregator.GetEventDelegate = type => { if (type == typeof(ShoppingCartUpdatedEvent)) return new ShoppingCartUpdatedEvent(); if (type == typeof(ShoppingCartItemUpdatedEvent)) return new ShoppingCartItemUpdatedEvent(); return null; }; var shoppingCartRepository = new MockShoppingCartRepository(); shoppingCartRepository.GetShoppingCartAsyncDelegate = () => Task.FromResult(new ShoppingCart(null)); var accountService = new MockAccountService(); accountService.GetSignedInUserAsyncDelegate = () => Task.FromResult((UserInfo)null); var target = new ShoppingCartTabUserControlViewModel(shoppingCartRepository, eventAggregator, navigationService, new AlertMessageService(), null, accountService); target.ShoppingCartTabCommand.Execute(); Assert.IsTrue(navigateCalled); }
public async Task Checkout_WhenAnonymous_ShowsSignInFlyout() { var showFlyoutCalled = false; var accountService = new MockAccountService { GetSignedInUserAsyncDelegate = () => Task.FromResult<UserInfo>(null) }; var flyoutService = new MockFlyoutService { ShowFlyoutDelegate = (s, o, arg3) => { showFlyoutCalled = true; Assert.AreEqual("SignIn", s); } }; var checkoutDataRepository = new MockCheckoutDataRepository() { GetDefaultShippingAddressDelegate = () => null, GetDefaultBillingAddresDelegate = () => null, GetDefaultPaymentMethodDelegate = () => Task.FromResult<PaymentMethod>(null) }; var eventAggregator = new MockEventAggregator { GetEventDelegate = type => new MockShoppingCartUpdatedEvent() }; var target = new ShoppingCartPageViewModel(null, new MockNavigationService(), accountService, flyoutService, null, null, checkoutDataRepository, null, eventAggregator); await target.CheckoutCommand.Execute(); Assert.IsTrue(showFlyoutCalled); }