public async Task TestCreate_LikeContactEmailAddress()
        {
            var userId    = 1;
            var user      = new User(userId);
            var email1    = "*****@*****.**";
            var fullName  = "Full Name";
            var position  = "Star Lord";
            var isPrimary = true;

            var newEmail1 = new NewEmailAddress(user, EmailAddressType.Business.Id, email1, isPrimary);

            var additionalPointOfContact = new AdditionalPointOfContact(user, fullName, position, new List <NewEmailAddress> {
                newEmail1
            }, new List <NewPhoneNumber>());

            Action beforeTester = () =>
            {
                Assert.AreEqual(0, context.PhoneNumbers.Count());
                Assert.AreEqual(1, context.EmailAddresses.Count());
                Assert.AreEqual(0, context.Contacts.Count());
            };
            Action <AdditionalPointOfContactValidationEntity> validationEntityTester = (entity) =>
            {
                Assert.AreEqual(fullName, entity.FullName);
                Assert.AreEqual(position, entity.Position);
            };
            Action afterTester = () =>
            {
                Assert.AreEqual(1, context.Contacts.Count());
            };

            context.SetupActions.Add(() =>
            {
                context.EmailAddresses.Add(new EmailAddress
                {
                    ContactId = 1,
                    Address   = email1
                });
            });
            validator.Setup(x => x.ValidateCreate(It.IsAny <AdditionalPointOfContactValidationEntity>())).Callback(validationEntityTester);
            context.Revert();
            beforeTester();
            service.Create(additionalPointOfContact);
            afterTester();

            context.Revert();
            beforeTester();
            await service.CreateAsync(additionalPointOfContact);

            afterTester();
        }
        public async Task TestCreate_PhoneNumberIsWhitespace()
        {
            var    userId    = 1;
            var    user      = new User(userId);
            string phone1    = " ";
            string ext1      = "";
            var    fullName  = "Full Name";
            var    position  = "Star Lord";
            var    isPrimary = true;

            var newPhone1 = new NewPhoneNumber(user, PhoneNumberType.Cell.Id, phone1, ext1, isPrimary);
            var additionalPointOfContact = new AdditionalPointOfContact(user, fullName, position, new List <NewEmailAddress>(), new List <NewPhoneNumber> {
                newPhone1
            });

            Action beforeTester = () =>
            {
                Assert.AreEqual(0, context.PhoneNumbers.Count());
                Assert.AreEqual(0, context.EmailAddresses.Count());
                Assert.AreEqual(0, context.Contacts.Count());
            };
            Action afterTester = () =>
            {
                Assert.AreEqual(1, context.Contacts.Count());
                Assert.AreEqual(0, context.PhoneNumbers.Count());
            };

            context.Revert();
            beforeTester();
            service.Create(additionalPointOfContact);
            afterTester();

            context.Revert();
            beforeTester();
            await service.CreateAsync(additionalPointOfContact);

            afterTester();
        }
        public async Task TestCreate_PositionIsWhitespace()
        {
            var    userId   = 1;
            var    user     = new User(userId);
            var    fullName = "Full Name";
            string position = " ";

            var additionalPointOfContact = new AdditionalPointOfContact(user, fullName, position, new List <NewEmailAddress>(), new List <NewPhoneNumber>());

            Action beforeTester = () =>
            {
                Assert.AreEqual(0, context.PhoneNumbers.Count());
                Assert.AreEqual(0, context.EmailAddresses.Count());
                Assert.AreEqual(0, context.Contacts.Count());
            };
            Action <AdditionalPointOfContactValidationEntity> validationEntityTester = (entity) =>
            {
                Assert.AreEqual(position, entity.Position);
            };
            Action afterTester = () =>
            {
                Assert.AreEqual(1, context.Contacts.Count());
                var pointOfContact = context.Contacts.First();
                Assert.IsNull(pointOfContact.Position);
            };

            validator.Setup(x => x.ValidateCreate(It.IsAny <AdditionalPointOfContactValidationEntity>())).Callback(validationEntityTester);
            context.Revert();
            beforeTester();
            service.Create(additionalPointOfContact);
            afterTester();

            context.Revert();
            beforeTester();
            await service.CreateAsync(additionalPointOfContact);

            afterTester();
        }
        public async Task TestCreate_EmailAddressValueIsWhitespace()
        {
            var    userId    = 1;
            var    user      = new User(userId);
            string email1    = String.Empty;
            var    fullName  = "Full Name";
            var    position  = "Star Lord";
            var    isPrimary = true;

            var newEmail1 = new NewEmailAddress(user, EmailAddressType.Business.Id, email1, isPrimary);
            var additionalPointOfContact = new AdditionalPointOfContact(user, fullName, position, new List <NewEmailAddress> {
                newEmail1
            }, new List <NewPhoneNumber>());

            Action beforeTester = () =>
            {
                Assert.AreEqual(0, context.PhoneNumbers.Count());
                Assert.AreEqual(0, context.EmailAddresses.Count());
                Assert.AreEqual(0, context.Contacts.Count());
            };
            Action afterTester = () =>
            {
                Assert.AreEqual(1, context.Contacts.Count());
                Assert.AreEqual(0, context.EmailAddresses.Count());
            };

            context.Revert();
            beforeTester();
            service.Create(additionalPointOfContact);
            afterTester();

            context.Revert();
            beforeTester();
            await service.CreateAsync(additionalPointOfContact);

            afterTester();
        }
        public async Task TestCreate_CheckProperties()
        {
            var userId          = 1;
            var user            = new User(userId);
            var phoneNumber1    = "555-555-1212";
            var phoneNumber1ext = "123";
            var phoneNumber2    = "123-456-7890";
            var phoneNumber2ext = "123";
            var email1          = "*****@*****.**";
            var email2          = "*****@*****.**";
            var fullName        = "Full Name";
            var position        = "Star Lord";
            var isPrimaryEmail  = true;
            var isPrimaryPhone  = true;

            var newEmail1 = new NewEmailAddress(user, EmailAddressType.Business.Id, email1, isPrimaryEmail);
            var newEmail2 = new NewEmailAddress(user, EmailAddressType.Home.Id, email2, false);

            var newPhone1 = new NewPhoneNumber(user, PhoneNumberType.Cell.Id, phoneNumber1, phoneNumber1ext, isPrimaryPhone);
            var newPhone2 = new NewPhoneNumber(user, PhoneNumberType.Home.Id, phoneNumber2, phoneNumber2ext, false);

            var additionalPointOfContact = new AdditionalPointOfContact(user, fullName, position, new List <NewEmailAddress> {
                newEmail1, newEmail2
            }, new List <NewPhoneNumber> {
                newPhone1, newPhone2
            });

            Action beforeTester = () =>
            {
                Assert.AreEqual(0, context.PhoneNumbers.Count());
                Assert.AreEqual(0, context.EmailAddresses.Count());
                Assert.AreEqual(0, context.Contacts.Count());
            };
            Action <AdditionalPointOfContactValidationEntity> validationEntityTester = (entity) =>
            {
                Assert.AreEqual(fullName, entity.FullName);
                Assert.AreEqual(position, entity.Position);
                Assert.AreEqual(1, entity.NumberOfPrimaryEmailAddresses);
                Assert.AreEqual(1, entity.NumberOfPrimaryPhoneNumbers);
            };
            Action afterTester = () =>
            {
                Assert.AreEqual(1, context.Contacts.Count());
                Assert.AreEqual(2, context.EmailAddresses.Count());
                Assert.AreEqual(2, context.PhoneNumbers.Count());

                var pointOfContact = context.Contacts.First();
                Assert.AreEqual(fullName, pointOfContact.FullName);
                Assert.AreEqual(position, pointOfContact.Position);
                Assert.AreEqual(userId, pointOfContact.History.CreatedBy);
                Assert.AreEqual(userId, pointOfContact.History.RevisedBy);
                DateTimeOffset.Now.Should().BeCloseTo(pointOfContact.History.CreatedOn, 20000);
                DateTimeOffset.Now.Should().BeCloseTo(pointOfContact.History.RevisedOn, 20000);
                Assert.AreEqual(2, pointOfContact.EmailAddresses.Count);
                Assert.AreEqual(2, pointOfContact.PhoneNumbers.Count);

                var firstEmail  = pointOfContact.EmailAddresses.First();
                var secondEmail = pointOfContact.EmailAddresses.Last();
                Assert.IsTrue(context.EmailAddresses.Contains(firstEmail));
                Assert.IsTrue(context.EmailAddresses.Contains(secondEmail));
                Assert.AreEqual(newEmail1.EmailAddressTypeId, firstEmail.EmailAddressTypeId);
                Assert.AreEqual(newEmail1.Address, firstEmail.Address);
                Assert.IsTrue(firstEmail.IsPrimary.Value);
                Assert.AreEqual(newEmail2.EmailAddressTypeId, secondEmail.EmailAddressTypeId);
                Assert.AreEqual(newEmail2.Address, secondEmail.Address);
                Assert.IsFalse(secondEmail.IsPrimary.Value);

                Assert.AreEqual(userId, firstEmail.History.CreatedBy);
                Assert.AreEqual(userId, firstEmail.History.RevisedBy);
                DateTimeOffset.Now.Should().BeCloseTo(firstEmail.History.CreatedOn, 20000);
                DateTimeOffset.Now.Should().BeCloseTo(firstEmail.History.RevisedOn, 20000);

                Assert.AreEqual(userId, secondEmail.History.CreatedBy);
                Assert.AreEqual(userId, secondEmail.History.RevisedBy);
                DateTimeOffset.Now.Should().BeCloseTo(secondEmail.History.CreatedOn, 20000);
                DateTimeOffset.Now.Should().BeCloseTo(secondEmail.History.RevisedOn, 20000);

                var firstPhone  = pointOfContact.PhoneNumbers.First();
                var secondPhone = pointOfContact.PhoneNumbers.Last();
                Assert.IsTrue(context.PhoneNumbers.Contains(firstPhone));
                Assert.IsTrue(context.PhoneNumbers.Contains(secondPhone));
                Assert.AreEqual(newPhone1.PhoneNumberTypeId, firstPhone.PhoneNumberTypeId);
                Assert.AreEqual(newPhone1.Number, firstPhone.Number);
                Assert.AreEqual(newPhone1.Extension, firstPhone.Extension);
                Assert.IsTrue(firstPhone.IsPrimary.Value);
                Assert.AreEqual(newPhone2.PhoneNumberTypeId, secondPhone.PhoneNumberTypeId);
                Assert.AreEqual(newPhone2.Number, secondPhone.Number);
                Assert.AreEqual(newPhone2.Extension, secondPhone.Extension);
                Assert.IsFalse(secondPhone.IsPrimary.Value);

                Assert.AreEqual(userId, firstPhone.History.CreatedBy);
                Assert.AreEqual(userId, firstPhone.History.RevisedBy);
                DateTimeOffset.Now.Should().BeCloseTo(firstPhone.History.CreatedOn, 20000);
                DateTimeOffset.Now.Should().BeCloseTo(firstPhone.History.RevisedOn, 20000);

                Assert.AreEqual(userId, secondPhone.History.CreatedBy);
                Assert.AreEqual(userId, secondPhone.History.RevisedBy);
                DateTimeOffset.Now.Should().BeCloseTo(secondPhone.History.CreatedOn, 20000);
                DateTimeOffset.Now.Should().BeCloseTo(secondPhone.History.RevisedOn, 20000);
            };

            validator.Setup(x => x.ValidateCreate(It.IsAny <AdditionalPointOfContactValidationEntity>())).Callback(validationEntityTester);
            context.Revert();
            beforeTester();
            service.Create(additionalPointOfContact);
            afterTester();

            context.Revert();
            beforeTester();
            await service.CreateAsync(additionalPointOfContact);

            afterTester();
        }