public static async Task UpdateAsync_InvokesAddOrUpdateAddress(
            [Frozen] Mock <IContactDetailsService> contactDetailsService,
            [Frozen] Mock <ISupplierSectionService> supplierSectionService,
            [Frozen] CallOffId callOffId,
            Order order,
            SupplierModel model,
            SupplierSectionController controller)
        {
            var originalAddress = order.Supplier.Address;

            Expression <Func <IContactDetailsService, Address> > addOrUpdateAddress = s => s.AddOrUpdateAddress(
                It.Is <Address>(a => a == originalAddress),
                It.Is <AddressModel>(a => a == model.Address));

            supplierSectionService.Setup(o => o.GetOrder(callOffId)).ReturnsAsync(order);
            supplierSectionService.Setup(o => o.SetSupplierSection(order, It.IsAny <Supplier>(), It.IsAny <Contact>())).Callback(() =>
            {
                order.Supplier.Address = originalAddress;
            });
            contactDetailsService.Setup(addOrUpdateAddress).Returns(originalAddress);

            await controller.UpdateAsync(callOffId, model);

            contactDetailsService.Verify(addOrUpdateAddress);

            order.Supplier.Address.Should().BeEquivalentTo(originalAddress);
        }
        public static async Task UpdateAsync_UpdatesSupplierDetails(
            [Frozen] Mock <IContactDetailsService> contactDetailsService,
            [Frozen] Mock <ISupplierSectionService> supplierSectionService,
            [Frozen] CallOffId callOffId,
            Order order,
            SupplierModel model,
            SupplierSectionController controller)
        {
            order.Supplier.Should().NotBeEquivalentTo(model);
            supplierSectionService.Setup(o => o.GetOrder(callOffId)).ReturnsAsync(order);
            supplierSectionService.Setup(o => o.SetSupplierSection(order, It.IsAny <Supplier>(), It.IsAny <Contact>())).Callback(() =>
            {
                order.Supplier = new Supplier {
                    Name = model.Name
                };
            });

            contactDetailsService
            .Setup(s => s.AddOrUpdateAddress(It.IsNotNull <Address>(), It.IsNotNull <AddressModel>()))
            .Returns(order.Supplier.Address);

            await controller.UpdateAsync(callOffId, model);

            order.Supplier.Should().BeEquivalentTo(model, o => o.Including(s => s.Name));
        }
        public static async Task UpdateAsync_OrderDoesNotExist_ReturnsNotFound(
            [Frozen] Mock <ISupplierSectionService> service,
            CallOffId callOffId,
            SupplierModel model,
            SupplierSectionController controller)
        {
            service.Setup(o => o.GetOrder(callOffId)).ReturnsAsync((Order)null);
            var response = await controller.UpdateAsync(callOffId, model);

            response.Should().BeOfType <NotFoundResult>();
        }
        public static async Task UpdateAsync_SuccessfulUpdate_ReturnsNoContentResult(
            [Frozen] Mock <IContactDetailsService> contactDetailsService,
            [Frozen] Mock <ISupplierSectionService> supplierSectionService,
            [Frozen] CallOffId callOffId,
            Order order,
            SupplierModel model,
            SupplierSectionController controller)
        {
            supplierSectionService.Setup(o => o.GetOrder(callOffId)).ReturnsAsync(order);
            contactDetailsService
            .Setup(s => s.AddOrUpdateAddress(It.IsNotNull <Address>(), It.IsNotNull <AddressModel>()))
            .Returns(order.Supplier.Address);

            var result = await controller.UpdateAsync(callOffId, model);

            result.Should().BeOfType <NoContentResult>();
        }
        public static async Task UpdateAsync_InvokesAddOrUpdatePrimaryContact(
            [Frozen] Mock <IContactDetailsService> contactDetailsService,
            [Frozen] Mock <ISupplierSectionService> supplierSectionService,
            [Frozen] CallOffId callOffId,
            Order order,
            SupplierModel model,
            SupplierSectionController controller)
        {
            var originalContact = order.SupplierContact;

            supplierSectionService.Setup(o => o.GetOrder(callOffId)).ReturnsAsync(order);
            contactDetailsService
            .Setup(s => s.AddOrUpdatePrimaryContact(It.IsNotNull <Contact>(), It.IsNotNull <PrimaryContactModel>()))
            .Returns(order.SupplierContact);

            await controller.UpdateAsync(callOffId, model);

            contactDetailsService.Verify(s => s.AddOrUpdatePrimaryContact(
                                             It.Is <Contact>(c => c == originalContact),
                                             It.Is <PrimaryContactModel>(c => c == model.PrimaryContact)));
        }
        public static async Task UpdateAsync_UpdatesSupplierContact(
            [Frozen] Mock <IContactDetailsService> contactDetailsService,
            [Frozen] Mock <ISupplierSectionService> supplierSectionService,
            [Frozen] CallOffId callOffId,
            Order order,
            SupplierModel model,
            SupplierSectionController controller)
        {
            var expectedContact = order.SupplierContact;

            order.Supplier.Should().NotBeEquivalentTo(model);
            supplierSectionService.Setup(o => o.GetOrder(callOffId)).ReturnsAsync(order);

            contactDetailsService
            .Setup(s => s.AddOrUpdatePrimaryContact(It.IsNotNull <Contact>(), It.IsNotNull <PrimaryContactModel>()))
            .Returns(order.SupplierContact);

            await controller.UpdateAsync(callOffId, model);

            expectedContact.Should().BeEquivalentTo(order.SupplierContact);
        }
 public static void UpdateAsync_ModelIsNull_ThrowsArgumentNullException(
     CallOffId callOffId,
     SupplierSectionController controller)
 {
     Assert.ThrowsAsync <ArgumentNullException>(async() => await controller.UpdateAsync(callOffId, null));
 }