public async Task LoadContact_WhenCountryAndContactWasReturnedFromQueryBus_ReturnsPartialViewResultWhereViewNameIsEqualToContactPartial()
        {
            Controller sut = CreateSut();

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            Assert.That(result.ViewName, Is.EqualTo("_ContactPartial"));
        }
        public async Task LoadContact_WhenCountryAndContactWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModel()
        {
            Controller sut = CreateSut();

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            Assert.That(result.Model, Is.TypeOf <ContactViewModel>());
        }
        public async Task LoadContact_WhenNoContactWasReturnedFromQueryBus_ReturnsBadRequestResult()
        {
            Controller sut = CreateSut(hasContact: false);

            IActionResult result = await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            Assert.That(result, Is.TypeOf <BadRequestResult>());
        }
        public async Task LoadContact_WhenCountryAndContactWasReturnedFromQueryBus_ReturnsPartialViewResult()
        {
            Controller sut = CreateSut();

            IActionResult result = await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            Assert.That(result, Is.TypeOf <PartialViewResult>());
        }
        public async Task LoadContact_WhenTokenWasReturnedFromTokenHelperFactory_AssertQueryAsyncWasCalledOnQueryBusWithEmptyQueryForCountryCollection()
        {
            Controller sut = CreateSut();

            await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            _queryBusMock.Verify(m => m.QueryAsync <EmptyQuery, IEnumerable <ICountry> >(It.IsAny <EmptyQuery>()), Times.Once);
        }
        public async Task LoadContact_WhenNoTokenWasReturnedFromTokenHelperFactory_ReturnsUnauthorizedResult()
        {
            Controller sut = CreateSut(false);

            IActionResult result = await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            Assert.That(result, Is.TypeOf <UnauthorizedResult>());
        }
        public async Task LoadContact_WhenNoTokenWasReturnedFromTokenHelperFactory_AssertQueryAsyncWasNotCalledOnQueryBusWithGetContactQuery()
        {
            Controller sut = CreateSut(false);

            await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            _queryBusMock.Verify(m => m.QueryAsync <IGetContactQuery, IContact>(It.IsAny <IGetContactQuery>()), Times.Never);
        }
        public async Task LoadContact_WhenNoTokenWasReturnedFromTokenHelperFactory_AssertQueryAsyncWasNotCalledOnQueryBusWithEmptyQueryForPaymentTermCollection()
        {
            Controller sut = CreateSut(false);

            await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            _queryBusMock.Verify(m => m.QueryAsync <EmptyQuery, IEnumerable <IPaymentTerm> >(It.IsAny <EmptyQuery>()), Times.Never);
        }
        public async Task LoadContact_WhenTokenWasReturnedFromTokenHelperFactory_AssertQueryAsyncWasCalledOnQueryBusWithGetCountryQuery()
        {
            Controller sut = CreateSut();

            string countryCode = _fixture.Create <string>();
            await sut.LoadContact(_fixture.Create <string>(), countryCode);

            _queryBusMock.Verify(m => m.QueryAsync <IGetCountryQuery, ICountry>(It.Is <IGetCountryQuery>(value => value != null && string.CompareOrdinal(value.CountryCode, countryCode.ToUpper()) == 0)), Times.Once);
        }
        public async Task LoadContact_WhenCountryAndContactWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModelWhereEditModeIsEqualToNone()
        {
            Controller sut = CreateSut();

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            ContactViewModel contactViewModel = (ContactViewModel)result.Model;

            Assert.That(contactViewModel.EditMode, Is.EqualTo(EditMode.None));
        }
        public async Task LoadContact_WhenCountryAndContactWithAddressWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModelWhereAddressIsAddressViewModel()
        {
            IContact   contact = _fixture.BuildContactMock().Object;
            Controller sut     = CreateSut(contact: contact);

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            ContactViewModel contactViewModel = (ContactViewModel)result.Model;

            Assert.That(contactViewModel.Address, Is.TypeOf <AddressViewModel>());
        }
        public async Task LoadContact_WhenCalledWithExternalIdentifierAndCountryCode_AssertGetTokenAsyncWasCalledOnTokenHelperFactory()
        {
            Controller sut = CreateSut();

            await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            _tokenHelperFactoryMock.Verify(m => m.GetTokenAsync <IRefreshableToken>(
                                               It.Is <TokenType>(value => value == TokenType.MicrosoftGraphToken),
                                               It.IsAny <HttpContext>()),
                                           Times.Once);
        }
        public async Task LoadContact_WhenCountryAndContactWithCompanyWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModelWhereCompanyIsNotNull()
        {
            IContact   contact = _fixture.BuildContactMock().Object;
            Controller sut     = CreateSut(contact: contact);

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            ContactViewModel contactViewModel = (ContactViewModel)result.Model;

            Assert.That(contactViewModel.Company, Is.Not.Null);
        }
        public async Task LoadContact_WhenCountryAndContactWithoutPaymentTermWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModelWherePaymentTermIsPaymentTermViewModel()
        {
            IContact   contact = _fixture.BuildContactMock(hasPaymentTerm: false).Object;
            Controller sut     = CreateSut(contact: contact);

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            ContactViewModel contactViewModel = (ContactViewModel)result.Model;

            Assert.That(contactViewModel.PaymentTerm, Is.TypeOf <PaymentTermViewModel>());
        }
        public async Task LoadContact_WhenCountryAndContactWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModelWhereCountryIsEqualToCountryReturnedFromQueryBus()
        {
            string     countryCode = _fixture.Create <string>();
            ICountry   country     = _fixture.BuildCountryMock(countryCode).Object;
            Controller sut         = CreateSut(country: country);

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            ContactViewModel contactViewModel = (ContactViewModel)result.Model;

            Assert.That(contactViewModel.Country.Code, Is.EqualTo(countryCode));
        }
        public async Task LoadContact_WhenCountryAndContactWithPaymentTermWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModelWherePaymentTermIsMapped()
        {
            IPaymentTerm paymentTerm = _fixture.BuildPaymentTermMock().Object;
            IContact     contact     = _fixture.BuildContactMock(paymentTerm: paymentTerm).Object;
            Controller   sut         = CreateSut(contact: contact);

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            ContactViewModel contactViewModel = (ContactViewModel)result.Model;

            Assert.That(contactViewModel.PaymentTerm.Number, Is.EqualTo(paymentTerm.Number));
        }
        public async Task LoadContact_WhenCountryAndContactWithContactGroupWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModelWhereContactGroupIsMapped()
        {
            IContactGroup contactGroup = _fixture.BuildContactGroupMock().Object;
            IContact      contact      = _fixture.BuildContactMock(contactGroup: contactGroup).Object;
            Controller    sut          = CreateSut(contact: contact);

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            ContactViewModel contactViewModel = (ContactViewModel)result.Model;

            Assert.That(contactViewModel.ContactGroup.Number, Is.EqualTo(contactGroup.Number));
        }
        public async Task LoadContact_WhenCountryAndContactWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModelWherePaymentTermsIsEqualToPaymentTermCollectionReturnedFromQueryBus()
        {
            IEnumerable <IPaymentTerm> paymentTermCollection = _fixture.CreateMany <IPaymentTerm>(_random.Next(5, 10)).ToList();
            Controller sut = CreateSut(paymentTermCollection: paymentTermCollection);

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            ContactViewModel contactViewModel = (ContactViewModel)result.Model;

            Assert.That(contactViewModel.PaymentTerms, Is.Not.Null);
            Assert.That(contactViewModel.PaymentTerms.Count, Is.EqualTo(paymentTermCollection.Count()));
            Assert.That(contactViewModel.PaymentTerms.All(paymentTermViewModel => paymentTermCollection.Any(paymentTerm => paymentTerm.Number == paymentTermViewModel.Number)), Is.True);
        }
        public async Task LoadContact_WhenCountryAndContactWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModelWhereCountriesIsEqualToCountryCollectionReturnedFromQueryBus()
        {
            IEnumerable <ICountry> countryCollection = _fixture.CreateMany <ICountry>(_random.Next(5, 10)).ToList();
            Controller             sut = CreateSut(countryCollection: countryCollection);

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            ContactViewModel contactViewModel = (ContactViewModel)result.Model;

            Assert.That(contactViewModel.Countries, Is.Not.Null);
            Assert.That(contactViewModel.Countries.Count, Is.EqualTo(countryCollection.Count()));
            Assert.That(contactViewModel.Countries.All(countryViewModel => countryCollection.Any(country => string.CompareOrdinal(country.Code, countryViewModel.Code) == 0)), Is.True);
        }
        public async Task LoadContact_WhenTokenWasReturnedFromTokenHelperFactory_AssertQueryAsyncNotCalledOnQueryBusWithGetContactQuery()
        {
            string            tokenType        = _fixture.Create <string>();
            string            accessToken      = _fixture.Create <string>();
            string            refreshToken     = _fixture.Create <string>();
            DateTime          expires          = DateTime.Now.AddMinutes(_random.Next(5, 60));
            IRefreshableToken refreshableToken = _fixture.BuildRefreshableTokenMock(tokenType, accessToken, refreshToken, expires).Object;
            Controller        sut = CreateSut(refreshableToken: refreshableToken);

            string externalIdentifier = _fixture.Create <string>();
            await sut.LoadContact(externalIdentifier, _fixture.Create <string>());

            _queryBusMock.Verify(m => m.QueryAsync <IGetContactQuery, IContact>(It.Is <IGetContactQuery>(value => value != null && string.CompareOrdinal(value.TokenType, tokenType) == 0 && string.CompareOrdinal(value.AccessToken, accessToken) == 0 && string.CompareOrdinal(value.RefreshToken, refreshToken) == 0 && value.Expires == expires && string.CompareOrdinal(value.ExternalIdentifier, externalIdentifier) == 0)), Times.Once);
        }
        public async Task LoadContact_WhenCountryAndContactWithCompanyWasReturnedFromQueryBus_ReturnsPartialViewResultWhereModelIsContactViewModelWhereCompanyIsMapped()
        {
            string       fullName    = _fixture.Create <string>();
            ICompanyName companyName = _fixture.BuildCompanyNameMock(fullName).Object;
            ICompany     company     = _fixture.BuildCompanyMock(companyName).Object;
            IContact     contact     = _fixture.BuildContactMock(company: company).Object;
            Controller   sut         = CreateSut(contact: contact);

            PartialViewResult result = (PartialViewResult)await sut.LoadContact(_fixture.Create <string>(), _fixture.Create <string>());

            ContactViewModel contactViewModel = (ContactViewModel)result.Model;

            Assert.That(contactViewModel.Company.CompanyName, Is.EqualTo(fullName));
        }
        public void LoadContact_WhenCountryCodeIsNull_ThrowsArgumentNullException()
        {
            Controller sut = CreateSut();

            ArgumentNullException result = Assert.ThrowsAsync <ArgumentNullException>(async() => await sut.LoadContact(_fixture.Create <string>(), null));

            Assert.That(result.ParamName, Is.EqualTo("countryCode"));
        }
        public void LoadContact_WhenExternalIdentifierIsWhiteSpace_ThrowsArgumentNullException()
        {
            Controller sut = CreateSut();

            ArgumentNullException result = Assert.ThrowsAsync <ArgumentNullException>(async() => await sut.LoadContact(" ", _fixture.Create <string>()));

            Assert.That(result.ParamName, Is.EqualTo("externalIdentifier"));
        }