public async void NewShippingInfo_InvalidModelState_RedisplaysViewWithSameModelWithAddressesAndCountriesSetup() { var viewModel = new AddressViewModel(); List<Country> countries = GetCountries(); List<MemberAddress> addresses = GetMemberAddresses(); Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); SetupVeilDataAccessWithCarts(dbStub, GetCartsListContainingCartWithNewAndUsed()); SetupVeilDataAccessWithCountriesSetupForInclude(dbStub, countries); SetupVeilDataAccessWithAddresses(dbStub, addresses); Mock<ControllerContext> contextStub = GetControllerContextWithSessionSetupToReturn(validNotSavedShippingDetails); CheckoutController controller = CreateCheckoutController(dbStub.Object, context: contextStub.Object); controller.ModelState.AddModelError(nameof(AddressViewModel.ProvinceCode), "Invalid"); var result = await controller.NewShippingInfo(viewModel, false) as ViewResult; Assert.That(result != null); Assert.That(result.Model, Is.InstanceOf<AddressViewModel>()); var model = (AddressViewModel)result.Model; Assert.That(model.Addresses.Count(), Is.EqualTo(addresses.Count)); Assert.That(model.Countries, Has.Count.EqualTo(countries.Count)); Assert.That(model, Is.EqualTo(viewModel)); Assert.That(model.City, Is.EqualTo(viewModel.City)); Assert.That(model.CountryCode, Is.EqualTo(viewModel.CountryCode)); Assert.That(model.ProvinceCode, Is.EqualTo(viewModel.ProvinceCode)); Assert.That(model.POBoxNumber, Is.EqualTo(viewModel.POBoxNumber)); Assert.That(model.PostalCode, Is.EqualTo(viewModel.PostalCode)); Assert.That(model.StreetAddress, Is.EqualTo(viewModel.StreetAddress)); }
private List<Province> GetProvinceList(AddressViewModel model) { return new List<Province> { new Province { ProvinceCode = model.ProvinceCode, CountryCode = model.CountryCode } }; }
public async void CreateAddress_InvalidModelState_RedisplaysViewWithSameViewModel() { AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbStub = SetupVeilDataAccessFakeWithCountriesAndAddresses(); Mock<IGuidUserIdGetter> idGetterStub = TestHelpers.GetSetupIUserIdGetterFake(memberId); Mock<ControllerContext> contextStub = TestHelpers.GetSetupControllerContextFakeWithUserIdentitySetup(); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object, idGetter: idGetterStub.Object); controller.ControllerContext = contextStub.Object; controller.ModelState.AddModelError(nameof(AddressViewModel.City), "Required"); var result = await controller.CreateAddress(viewModel) as ViewResult; Assert.That(result != null); Assert.That(result.Model, Is.EqualTo(viewModel)); }
public async void CreateAddress_InvalidPostalCodeModelStateWithoutCountryCodeSupplied_LeavesErrorMessage() { AddressViewModel viewModel = new AddressViewModel(); string postalCodeErrorMessage = "Required"; Mock<IVeilDataAccess> dbStub = SetupVeilDataAccessFakeWithCountriesAndAddresses(); Mock<IGuidUserIdGetter> idGetterStub = TestHelpers.GetSetupIUserIdGetterFake(memberId); Mock<ControllerContext> contextStub = TestHelpers.GetSetupControllerContextFakeWithUserIdentitySetup(); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object, idGetter: idGetterStub.Object); controller.ControllerContext = contextStub.Object; controller.ModelState.AddModelError(nameof(AddressViewModel.PostalCode), postalCodeErrorMessage); await controller.CreateAddress(viewModel); Assert.That(controller.ModelState[nameof(AddressViewModel.PostalCode)].Errors, Has.Some.Matches<ModelError>(modelError => modelError.ErrorMessage == postalCodeErrorMessage)); }
public async void EditAddress_ValidModel_CallsFindAsyncWithPassedId() { MemberAddress addressToEdit = new MemberAddress(); AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.FindAsync(It.IsAny<Guid>())). ReturnsAsync(addressToEdit). Verifiable(); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object); await controller.EditAddress(addressId, viewModel); Assert.That( () => addressDbSetStub.Verify(adb => adb.FindAsync(addressId), Times.Exactly(1)), Throws.Nothing); }
public async Task<ActionResult> EditAddress(Guid? addressId) { if (addressId == null) { throw new HttpException(NotFound, "Address"); } MemberAddress addressToEdit = await db.MemberAddresses.FindAsync(addressId); if (addressToEdit == null) { throw new HttpException(NotFound, "Address"); } AddressViewModel model = new AddressViewModel { Id = addressToEdit.Id, StreetAddress = addressToEdit.Address.StreetAddress, POBoxNumber = addressToEdit.Address.POBoxNumber, City = addressToEdit.Address.City, PostalCode = addressToEdit.Address.PostalCode, ProvinceCode = addressToEdit.ProvinceCode, CountryCode = addressToEdit.CountryCode }; await model.SetupCountries(db); return View(model); }
public async void CreateAddress_SaveChangesAsyncThrowing_RedisplaysViewWithSameViewModel() { AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.Add(It.IsAny<MemberAddress>())). Returns<MemberAddress>(ma => ma); Mock<DbSet<Country>> countryDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<Country>().AsQueryable()); countryDbSetStub.SetupForInclude(); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); dbStub. Setup(db => db.Countries). Returns(countryDbSetStub.Object); dbStub. Setup(db => db.SaveChangesAsync()). ThrowsAsync(new DbUpdateException()); Mock<IGuidUserIdGetter> idGetterStub = TestHelpers.GetSetupIUserIdGetterFake(memberId); Mock<ControllerContext> contextStub = TestHelpers.GetSetupControllerContextFakeWithUserIdentitySetup(); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object, idGetter: idGetterStub.Object); controller.ControllerContext = contextStub.Object; var result = await controller.CreateAddress(viewModel) as ViewResult; Assert.That(result != null); Assert.That(result.Model, Is.EqualTo(viewModel)); }
public async void CreateAddress_ValidModel_ReformatsPostalCodeToMatchStoredPostalCodeRegex(string postalCode, string countryCode) { MemberAddress newAddress = null; Guid currentMemberId = memberId; AddressViewModel viewModel = new AddressViewModel { City = "Waterloo", CountryCode = countryCode, ProvinceCode = "ON", PostalCode = postalCode, StreetAddress = "445 Wes Graham Way" }; Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.Add(It.IsAny<MemberAddress>())). Returns<MemberAddress>(ma => ma). Callback<MemberAddress>(ma => newAddress = ma); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); Mock<IGuidUserIdGetter> idGetterStub = TestHelpers.GetSetupIUserIdGetterFake(currentMemberId); Mock<ControllerContext> contextStub = TestHelpers.GetSetupControllerContextFakeWithUserIdentitySetup(); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object, idGetter: idGetterStub.Object); controller.ControllerContext = contextStub.Object; await controller.CreateAddress(viewModel); Assert.That(newAddress != null); Assert.That(newAddress.Address.PostalCode, Is.StringMatching(ValidationRegex.STORED_POSTAL_CODE)); }
public async Task<ActionResult> ShippingInfo() { Guid memberId = GetUserId(); RedirectToRouteResult invalidStateResult = await EnsureCartNotEmptyAsync(memberId); if (invalidStateResult != null) { return invalidStateResult; } var viewModel = new AddressViewModel(); await viewModel.SetupAddressesAndCountries(db, memberId); var orderCheckoutDetails = Session[OrderCheckoutDetailsKey] as WebOrderCheckoutDetails; if (orderCheckoutDetails?.Address != null) { viewModel.StreetAddress = orderCheckoutDetails.Address.StreetAddress; viewModel.PostalCode = orderCheckoutDetails.Address.PostalCode; viewModel.POBoxNumber = orderCheckoutDetails.Address.POBoxNumber; viewModel.City = orderCheckoutDetails.Address.City; viewModel.ProvinceCode = orderCheckoutDetails.ProvinceCode; viewModel.CountryCode = orderCheckoutDetails.CountryCode; } return View(viewModel); }
public async void EditAddress_InvalidModelState_SetsUpViewModelWithCountries() { AddressViewModel viewModel = new AddressViewModel(); List<Country> countries = GetCountries(); Mock<IVeilDataAccess> dbStub = SetupVeilDataAccessFakeWithCountries(countries); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object); controller.ModelState.AddModelError(nameof(AddressViewModel.City), "Required"); var result = await controller.EditAddress(addressId, viewModel) as ViewResult; Assert.That(result != null); Assert.That(result.Model, Is.EqualTo(viewModel)); Assert.That(result.Model, Is.InstanceOf<AddressViewModel>()); Assert.That(viewModel.Countries, Is.Not.Empty); Assert.That(viewModel.Countries, Has.Count.EqualTo(countries.Count)); }
public async void EditAddress_InvalidPostalCodeModelStateWithoutCountryCodeSupplied_LeavesErrorMessage() { AddressViewModel viewModel = new AddressViewModel(); string postalCodeErrorMessage = "Required"; Mock<IVeilDataAccess> dbStub = SetupVeilDataAccessFakeWithCountries(); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object); controller.ModelState.AddModelError(nameof(AddressViewModel.PostalCode), postalCodeErrorMessage); await controller.EditAddress(addressId, viewModel); Assert.That(controller.ModelState[nameof(AddressViewModel.PostalCode)].Errors, Has.Some.Matches<ModelError>(modelError => modelError.ErrorMessage == postalCodeErrorMessage)); }
public async void EditAddress_InvalidModelState_RedisplaysViewWithSameViewModel() { AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbStub = SetupVeilDataAccessFakeWithCountries(); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object); controller.ModelState.AddModelError(nameof(AddressViewModel.City), "Required"); var result = await controller.EditAddress(addressId, viewModel) as ViewResult; Assert.That(result != null); Assert.That(result.Model, Is.EqualTo(viewModel)); }
public async void NewShippingInfo_InvalidPostalCodeModelStateWithCountryCodeSupplied_ReplacesErrorMessage([Values("CA", "US")]string countryCode) { AddressViewModel viewModel = new AddressViewModel { CountryCode = countryCode }; string postalCodeErrorMessage = "Required"; List<Country> countries = GetCountries(); List<MemberAddress> addresses = GetMemberAddresses(); Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); SetupVeilDataAccessWithCarts(dbStub, GetCartsListContainingCartWithNewAndUsed()); SetupVeilDataAccessWithCountriesSetupForInclude(dbStub, countries); SetupVeilDataAccessWithAddresses(dbStub, addresses); Mock<ControllerContext> contextStub = GetControllerContextWithSessionSetupToReturn(validNotSavedShippingDetails); CheckoutController controller = CreateCheckoutController(dbStub.Object, context: contextStub.Object); controller.ModelState.AddModelError(nameof(AddressViewModel.PostalCode), postalCodeErrorMessage); await controller.NewShippingInfo(viewModel, false); Assert.That(controller.ModelState[nameof(AddressViewModel.PostalCode)].Errors, Has.None.Matches<ModelError>(modelError => modelError.ErrorMessage == postalCodeErrorMessage)); }
public async Task<ActionResult> EditAddress(Guid id, AddressViewModel model) { if (!ModelState.IsValid) { model.UpdatePostalCodeModelError(ModelState); this.AddAlert(AlertType.Error, "Some address information was invalid."); await model.SetupCountries(db); return View("ManageAddresses", model); } MemberAddress editedAddress = await db.MemberAddresses.FindAsync(id); if (editedAddress == null) { throw new HttpException(NotFound, "Address"); } model.FormatPostalCode(); editedAddress.Address = model.MapToNewAddress(); editedAddress.ProvinceCode = model.ProvinceCode; editedAddress.CountryCode = model.CountryCode; try { await db.SaveChangesAsync(); } catch (DbUpdateException ex) { // Get the exception which states if a foreign key constraint was violated SqlException innermostException = ex.GetBaseException() as SqlException; bool errorWasProvinceForeignKeyConstraint = false; if (innermostException != null) { string exMessage = innermostException.Message; errorWasProvinceForeignKeyConstraint = innermostException.Number == (int) SqlErrorNumbers.ConstraintViolation && exMessage.Contains(nameof(Province.ProvinceCode)) && exMessage.Contains(nameof(Province.CountryCode)); } this.AddAlert( AlertType.Error, errorWasProvinceForeignKeyConstraint ? "The Province/State you selected isn't in the Country you selected." : "An unknown error occured while adding the address."); await model.SetupCountries(db); return View(model); } this.AddAlert(AlertType.Success, "Successfully updated the address."); return RedirectToAction("ManageAddresses"); }
public void SetupBase() { memberId = new Guid("59EF92BE-D71F-49ED-992D-DF15773DAF98"); addressId = new Guid("53BE47E4-0C74-4D49-97BB-7246A7880B39"); creditCardId = new Guid("D9A69026-E3DA-4748-816B-293D9BE3E43F"); cartProduct1Id = new Guid("3882D242-A62A-4E99-BA11-D6EF340C2EE8"); cartProduct2Id = new Guid("7413D131-7337-42DC-A7E4-1155EB91E8C9"); memberAddress = new MemberAddress { Address = new Address { City = "Waterloo", PostalCode = "N2L 6R2", StreetAddress = "445 Wes Graham Way" }, CountryCode = "CA", Country = new Country { CountryCode = "CA", CountryName = "Canada", FederalTaxRate = 0.05m }, ProvinceCode = "ON", Province = new Province { CountryCode = "CA", ProvinceCode = "ON", ProvincialTaxRate = 0.08m }, MemberId = memberId, Id = addressId }; game = new Game { Name = "A game" }; platform = new Platform { PlatformCode = "XONE", PlatformName = "Xbox One" }; cartProduct1 = new PhysicalGameProduct { Id = cartProduct1Id, NewWebPrice = 60.00m, ProductAvailabilityStatus = AvailabilityStatus.Available, ReleaseDate = new DateTime(635835582902643008L, DateTimeKind.Local), UsedWebPrice = 10.00m, Game = game, Platform = platform }; cartProduct2 = new PhysicalGameProduct { Id = cartProduct2Id, NewWebPrice = 59.99m, ProductAvailabilityStatus = AvailabilityStatus.Available, ReleaseDate = new DateTime(635837213100050176L, DateTimeKind.Local), Game = game, Platform = platform }; newProduct1CartItem = new CartItem { IsNew = true, MemberId = memberId, Product = cartProduct1, ProductId = cartProduct1.Id, Quantity = 1 }; usedProduct1CartItem = new CartItem { IsNew = false, MemberId = memberId, Product = cartProduct1, ProductId = cartProduct1.Id, Quantity = 1 }; newProduct2CartItem = new CartItem { IsNew = true, MemberId = memberId, Product = cartProduct2, ProductId = cartProduct2.Id, Quantity = 1 }; validNotSavedShippingDetails = new WebOrderCheckoutDetails { Address = new Address { City = "Waterloo", PostalCode = "N2L 6R2", POBoxNumber = "123", StreetAddress = "445 Wes Graham Way" }, ProvinceCode = "ON", CountryCode = "CA" }; validAddressViewModel = new AddressViewModel { City = "Waterloo", CountryCode = "CA", ProvinceCode = "ON", POBoxNumber = "1234", PostalCode = "N2L 6R2", StreetAddress = "445 Wes Graham Way" }; memberCreditCard = new MemberCreditCard { Id = creditCardId, CardholderName = "John Doe", ExpiryMonth = 11, ExpiryYear = 2015, Last4Digits = "4242", Member = member, MemberId = memberId, StripeCardId = "cardToken" }; member = new Member { UserId = memberId, CreditCards = new List<MemberCreditCard> { memberCreditCard } }; memberUser = new User { FirstName = "John", LastName = "Doe", Id = memberId, PhoneNumber = "800-555-0199", }; validNotSavedShippingBillingDetails = new WebOrderCheckoutDetails { Address = new Address { City = "Waterloo", PostalCode = "N2L 6R2", POBoxNumber = "123", StreetAddress = "445 Wes Graham Way" }, ProvinceCode = "ON", CountryCode = "CA", StripeCardToken = "card_token" }; validSavedShippingBillingDetails = new WebOrderCheckoutDetails { MemberCreditCardId = creditCardId, MemberAddressId = addressId }; cartWithNewAndUsed = new Cart { Items = new List<CartItem> { newProduct1CartItem, usedProduct1CartItem }, Member = member, MemberId = memberId }; }
public void EditAddress_IdNotInDb_Throws404Exception() { AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.FindAsync(It.IsAny<Guid>())). ReturnsAsync(null); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object); Assert.That(async () => await controller.EditAddress(addressId, viewModel), Throws.InstanceOf<HttpException>().And.Matches<HttpException>(ex => ex.GetHttpCode() == 404)); }
public async Task<ActionResult> NewShippingInfo(AddressViewModel model, bool saveAddress, bool returnToConfirm = false) { Guid memberId = GetUserId(); RedirectToRouteResult invalidStateResult = await EnsureCartNotEmptyAsync(memberId); if (invalidStateResult != null) { return invalidStateResult; } if (!ModelState.IsValid) { model.UpdatePostalCodeModelError(ModelState); this.AddAlert(AlertType.Error, "Some address information was invalid."); await model.SetupAddressesAndCountries(db, memberId); return View("ShippingInfo", model); } bool validCountry = await db.Countries.AnyAsync(c => c.CountryCode == model.CountryCode); bool validProvince = true; if (!validCountry) { this.AddAlert(AlertType.Error, "The Country you selected isn't valid."); } else { validProvince = await db.Provinces. AnyAsync(p => p.CountryCode == model.CountryCode && p.ProvinceCode == model.ProvinceCode); if (!validProvince) { this.AddAlert(AlertType.Error, "The Province/State you selected isn't in the Country you selected."); } } if (!validCountry || !validProvince) { await model.SetupAddressesAndCountries(db, memberId); return View("ShippingInfo", model); } var orderCheckoutDetails = Session[OrderCheckoutDetailsKey] as WebOrderCheckoutDetails ?? new WebOrderCheckoutDetails(); model.FormatPostalCode(); if (saveAddress) { var newAddress = new MemberAddress { MemberId = memberId, Address = model.MapToNewAddress(), CountryCode = model.CountryCode, ProvinceCode = model.ProvinceCode }; db.MemberAddresses.Add(newAddress); await db.SaveChangesAsync(); this.AddAlert(AlertType.Success, "Successfully add the new address."); orderCheckoutDetails.MemberAddressId = newAddress.Id; } else { orderCheckoutDetails.Address = model.MapToNewAddress(); orderCheckoutDetails.CountryCode = model.CountryCode; orderCheckoutDetails.ProvinceCode = model.ProvinceCode; } Session[OrderCheckoutDetailsKey] = orderCheckoutDetails; if (returnToConfirm) { return RedirectToAction("ConfirmOrder"); } return RedirectToAction("BillingInfo"); }
public async void EditAddress_ValidModel_MapsViewModelToNewModel() { MemberAddress addressToEdit = new MemberAddress { Address = new Address() }; AddressViewModel viewModel = new AddressViewModel { City = "Waterloo", CountryCode = "CA", ProvinceCode = "ON", PostalCode = "N2L 6R2", StreetAddress = "445 Wes Graham Way", POBoxNumber = "123" }; Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.FindAsync(It.IsAny<Guid>())). ReturnsAsync(addressToEdit); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object); await controller.EditAddress(addressId, viewModel); Assert.That(addressToEdit != null); Assert.That(addressToEdit.Address.City, Is.EqualTo(viewModel.City)); Assert.That(addressToEdit.CountryCode, Is.EqualTo(viewModel.CountryCode)); Assert.That(addressToEdit.ProvinceCode, Is.EqualTo(viewModel.ProvinceCode)); Assert.That(addressToEdit.Address.PostalCode, Is.EqualTo(viewModel.PostalCode)); Assert.That(addressToEdit.Address.StreetAddress, Is.EqualTo(viewModel.StreetAddress)); Assert.That(addressToEdit.Address.POBoxNumber, Is.EqualTo(viewModel.POBoxNumber)); }
public async void CreateAddress_ValidModel_MapsViewModelToNewModel() { MemberAddress newAddress = null; Guid currentMemberId = memberId; AddressViewModel viewModel = new AddressViewModel { City = "Waterloo", CountryCode = "CA", ProvinceCode = "ON", PostalCode = "N2L 6R2", StreetAddress = "445 Wes Graham Way", POBoxNumber = "123" }; Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.Add(It.IsAny<MemberAddress>())). Returns<MemberAddress>(ma => ma). Callback<MemberAddress>(ma => newAddress = ma); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); Mock<IGuidUserIdGetter> idGetterStub = TestHelpers.GetSetupIUserIdGetterFake(currentMemberId); Mock<ControllerContext> contextStub = TestHelpers.GetSetupControllerContextFakeWithUserIdentitySetup(); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object, idGetter: idGetterStub.Object); controller.ControllerContext = contextStub.Object; await controller.CreateAddress(viewModel); Assert.That(newAddress != null); Assert.That(newAddress.MemberId, Is.EqualTo(currentMemberId)); Assert.That(newAddress.Address.City, Is.EqualTo(viewModel.City)); Assert.That(newAddress.CountryCode, Is.EqualTo(viewModel.CountryCode)); Assert.That(newAddress.ProvinceCode, Is.EqualTo(viewModel.ProvinceCode)); Assert.That(newAddress.Address.PostalCode, Is.EqualTo(viewModel.PostalCode)); Assert.That(newAddress.Address.StreetAddress, Is.EqualTo(viewModel.StreetAddress)); Assert.That(newAddress.Address.POBoxNumber, Is.EqualTo(viewModel.POBoxNumber)); }
public async void EditAddress_ValidModel_ReformatsPostalCodeToMatchStoredPostalCodeRegex(string postalCode, string countryCode) { MemberAddress addressToEdit = new MemberAddress { Address = new Address() }; AddressViewModel viewModel = new AddressViewModel { CountryCode = countryCode, PostalCode = postalCode, }; Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.FindAsync(It.IsAny<Guid>())). ReturnsAsync(addressToEdit); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object); await controller.EditAddress(addressId, viewModel); Assert.That(addressToEdit.Address.PostalCode, Is.StringMatching(ValidationRegex.STORED_POSTAL_CODE)); }
public async void CreateAddress_ValidModel_CallsSaveChangesAsync() { AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbMock = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.Add(It.IsAny<MemberAddress>())). Returns<MemberAddress>(ma => ma); dbMock. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); dbMock. Setup(db => db.SaveChangesAsync()). ReturnsAsync(1). Verifiable(); Mock<IGuidUserIdGetter> idGetterStub = TestHelpers.GetSetupIUserIdGetterFake(memberId); Mock<ControllerContext> contextStub = TestHelpers.GetSetupControllerContextFakeWithUserIdentitySetup(); ManageController controller = CreateManageController(veilDataAccess: dbMock.Object, idGetter: idGetterStub.Object); controller.ControllerContext = contextStub.Object; await controller.CreateAddress(viewModel); Assert.That( () => dbMock.Verify(db => db.SaveChangesAsync(), Times.Exactly(1)), Throws.Nothing); }
public void EditAddress_SaveChangesAsyncThrowing_HandlesException() { MemberAddress addressToEdit = new MemberAddress(); AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.FindAsync(It.IsAny<Guid>())). ReturnsAsync(addressToEdit); Mock<DbSet<Country>> countryDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<Country>().AsQueryable()); countryDbSetStub.SetupForInclude(); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); dbStub. Setup(db => db.Countries). Returns(countryDbSetStub.Object); dbStub. Setup(db => db.SaveChangesAsync()). ThrowsAsync(new DbUpdateException()); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object); Assert.That(async () => await controller.EditAddress(addressId, viewModel), Throws.Nothing); }
public void CreateAddress_SaveChangesAsyncThrowingProvinceForeignKeyViolationException_HandlesException() { AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.Add(It.IsAny<MemberAddress>())). Returns<MemberAddress>(ma => ma); Mock<DbSet<Country>> countryDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<Country>().AsQueryable()); countryDbSetStub.SetupForInclude(); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); dbStub. Setup(db => db.Countries). Returns(countryDbSetStub.Object); DbUpdateException provinceConstraintException = new DbUpdateException("See inner", SqlExceptionCreator.Create( // This message was copied verbatim from the actual exception being thrown "The INSERT statement conflicted with the FOREIGN KEY constraint " + "\"FK_dbo.MemberAddress_dbo.Province_ProvinceCode_CountryCode\". " + "The conflict occurred in database \"prog3050\", table " + "\"dbo.Province\".\r\nThe statement has been terminated.", (int)SqlErrorNumbers.ConstraintViolation)); dbStub. Setup(db => db.SaveChangesAsync()). ThrowsAsync(provinceConstraintException); Mock<IGuidUserIdGetter> idGetterStub = TestHelpers.GetSetupIUserIdGetterFake(memberId); Mock<ControllerContext> contextStub = TestHelpers.GetSetupControllerContextFakeWithUserIdentitySetup(); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object, idGetter: idGetterStub.Object); controller.ControllerContext = contextStub.Object; Assert.That(async () => await controller.CreateAddress(viewModel), Throws.Nothing); }
public async void EditAddress_SaveChangesAsyncThrowing_RedisplaysViewWithSameViewModel() { MemberAddress addressToEdit = new MemberAddress(); AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.FindAsync(It.IsAny<Guid>())). ReturnsAsync(addressToEdit); Mock<DbSet<Country>> countryDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<Country>().AsQueryable()); countryDbSetStub.SetupForInclude(); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); dbStub. Setup(db => db.Countries). Returns(countryDbSetStub.Object); dbStub. Setup(db => db.SaveChangesAsync()). ThrowsAsync(new DbUpdateException()); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object); var result = await controller.EditAddress(addressId, viewModel) as ViewResult; Assert.That(result != null); Assert.That(result.Model, Is.EqualTo(viewModel)); }
public async void CreateAddress_SuccessfulCreate_RedirectsToManageAddress() { AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.Add(It.IsAny<MemberAddress>())). Returns<MemberAddress>(ma => ma); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); dbStub. Setup(db => db.SaveChangesAsync()). ReturnsAsync(1); Mock<IGuidUserIdGetter> idGetterStub = TestHelpers.GetSetupIUserIdGetterFake(memberId); Mock<ControllerContext> contextStub = TestHelpers.GetSetupControllerContextFakeWithUserIdentitySetup(); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object, idGetter: idGetterStub.Object); controller.ControllerContext = contextStub.Object; var result = await controller.CreateAddress(viewModel) as RedirectToRouteResult; Assert.That(result != null); Assert.That(result.RouteValues["Action"], Is.EqualTo(nameof(ManageController.ManageAddresses))); }
public async void EditAddress_SuccessfulSave_RedirectsToManageAddress() { MemberAddress addressToEdit = new MemberAddress(); AddressViewModel viewModel = new AddressViewModel(); Mock<IVeilDataAccess> dbStub = TestHelpers.GetVeilDataAccessFake(); Mock<DbSet<MemberAddress>> addressDbSetStub = TestHelpers.GetFakeAsyncDbSet(new List<MemberAddress>().AsQueryable()); addressDbSetStub. Setup(adb => adb.FindAsync(It.IsAny<Guid>())). ReturnsAsync(addressToEdit); dbStub. Setup(db => db.MemberAddresses). Returns(addressDbSetStub.Object); dbStub. Setup(db => db.SaveChangesAsync()). ReturnsAsync(1); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object); var result = await controller.EditAddress(addressId, viewModel) as RedirectToRouteResult; Assert.That(result != null); Assert.That(result.RouteValues["Action"], Is.EqualTo(nameof(ManageController.ManageAddresses))); }
public async void CreateAddress_InvalidModelState_SetsUpViewModelWithCountries() { AddressViewModel viewModel = new AddressViewModel(); List<Country> countries = GetCountries(); List<MemberAddress> addresses = GetMemberAddresses(); Mock<IVeilDataAccess> dbStub = SetupVeilDataAccessFakeWithCountriesAndAddresses(countries, addresses); Mock<IGuidUserIdGetter> idGetterStub = TestHelpers.GetSetupIUserIdGetterFake(memberId); Mock<ControllerContext> contextStub = TestHelpers.GetSetupControllerContextFakeWithUserIdentitySetup(); ManageController controller = CreateManageController(veilDataAccess: dbStub.Object, idGetter: idGetterStub.Object); controller.ControllerContext = contextStub.Object; controller.ModelState.AddModelError(nameof(AddressViewModel.City), "Required"); var result = await controller.CreateAddress(viewModel) as ViewResult; Assert.That(result != null); Assert.That(result.Model, Is.EqualTo(viewModel)); Assert.That(result.Model, Is.InstanceOf<AddressViewModel>()); Assert.That(viewModel.Countries, Is.Not.Empty); Assert.That(viewModel.Countries, Has.Count.EqualTo(countries.Count)); Assert.That(viewModel.Addresses, Is.Not.Empty); Assert.That(viewModel.Addresses.Count(), Is.EqualTo(addresses.Count)); }
/// <summary> /// Displays a view for adding or removing addresses /// </summary> /// <returns> /// The view. /// </returns> public async Task<ActionResult> ManageAddresses() { AddressViewModel model = new AddressViewModel(); await model.SetupAddressesAndCountries(db, GetUserId()); return View(model); }