public async Task CreatePostalCode_WhenCalledWithUnknownCountryCode_ReturnsRedirectToActionResult()
        {
            Controller sut = CreateSut(knownCountryCode: false);

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

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

            ViewResult result = (ViewResult)await sut.CreatePostalCode(_fixture.Create <string>());

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

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

            Assert.That(result, Is.TypeOf <ViewResult>());
        }
        public async Task CreatePostalCode_WhenCalledWithUnknownCountryCode_ReturnsRedirectToActionResultWhereActionNameIsEqualToPostalCodes()
        {
            Controller sut = CreateSut(knownCountryCode: false);

            RedirectToActionResult result = (RedirectToActionResult)await sut.CreatePostalCode(_fixture.Create <string>());

            Assert.That(result.ActionName, Is.EqualTo("PostalCodes"));
        }
        public async Task CreatePostalCode_WhenCalledWithCountryCodeNotEqualToNullEmptyOrWhiteSpace_AssertQueryAsyncWasCalledOnQueryBusWithGetCountryQuery()
        {
            Controller sut = CreateSut();

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

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

            PostalCodeViewModel    model  = CreateModel();
            RedirectToActionResult result = (RedirectToActionResult)await sut.CreatePostalCode(model);

            Assert.That(result.ActionName, Is.EqualTo("PostalCodes"));
        }
        public async Task CreatePostalCode_WhenCalledWithValidModel_ReturnsRedirectToActionResult()
        {
            Controller sut = CreateSut();

            PostalCodeViewModel model  = CreateModel();
            IActionResult       result = await sut.CreatePostalCode(model);

            Assert.That(result, Is.TypeOf <RedirectToActionResult>());
        }
        public async Task CreatePostalCode_WhenCalledWithInvalidModel_ReturnsViewResultWhereViewNameIsEqualToCreatePostalCode()
        {
            Controller sut = CreateSut(modelIsValid: false);

            PostalCodeViewModel model  = CreateModel();
            ViewResult          result = (ViewResult)await sut.CreatePostalCode(model);

            Assert.That(result.ViewName, Is.EqualTo("CreatePostalCode"));
        }
        public async Task CreatePostalCode_WhenCalledWithInvalidModel_AssertPublishAsyncWasNotCalledOnCommandBus()
        {
            Controller sut = CreateSut(modelIsValid: false);

            PostalCodeViewModel model = CreateModel();
            await sut.CreatePostalCode(model);

            _commandBusMock.Verify(m => m.PublishAsync(It.IsAny <ICreatePostalCodeCommand>()), Times.Never);
        }
        public async Task CreatePostalCode_WhenCalledWithInvalidModel_ReturnsViewResultWhereModelIsEqualToInvalidModel()
        {
            Controller sut = CreateSut(modelIsValid: false);

            PostalCodeViewModel model  = CreateModel();
            ViewResult          result = (ViewResult)await sut.CreatePostalCode(model);

            Assert.That(result.Model, Is.TypeOf <PostalCodeViewModel>());

            PostalCodeViewModel postalCodeViewModel = (PostalCodeViewModel)result.Model;

            Assert.That(postalCodeViewModel, Is.EqualTo(model));
        }
        public async Task CreatePostalCode_WhenCalledWithValidModel_AssertPublishAsyncWasCalledOnCommandBus()
        {
            Controller sut = CreateSut();

            PostalCodeViewModel model = CreateModel();
            await sut.CreatePostalCode(model);

            _commandBusMock.Verify(m => m.PublishAsync(It.Is <ICreatePostalCodeCommand>(command =>
                                                                                        string.CompareOrdinal(command.CountryCode, model.Country.Code.ToUpper()) == 0 &&
                                                                                        string.CompareOrdinal(command.PostalCode, model.Code) == 0 &&
                                                                                        string.CompareOrdinal(command.City, model.City) == 0 &&
                                                                                        string.CompareOrdinal(command.State, model.State) == 0)),
                                   Times.Once);
        }
        public async Task CreatePostalCode_WhenCalledWithKnownCountryCode_ReturnsViewResultWhereModelIsPostalCodeViewModel()
        {
            string     countryCode = _fixture.Create <string>();
            ICountry   country     = _fixture.BuildCountryMock(countryCode).Object;
            Controller sut         = CreateSut(country: country);

            ViewResult result = (ViewResult)await sut.CreatePostalCode(countryCode);

            Assert.That(result.Model, Is.TypeOf <PostalCodeViewModel>());

            PostalCodeViewModel postalCodeViewModel = (PostalCodeViewModel)result.Model;

            Assert.That(postalCodeViewModel, Is.Not.Null);
            Assert.That(postalCodeViewModel.Country, Is.Not.Null);
            Assert.That(postalCodeViewModel.Country.Code, Is.EqualTo(countryCode));
            Assert.That(postalCodeViewModel.Code, Is.Null);
            Assert.That(postalCodeViewModel.City, Is.Null);
            Assert.That(postalCodeViewModel.State, Is.Null);
            Assert.That(postalCodeViewModel.EditMode, Is.EqualTo(EditMode.Create));
        }
        public void CreatePostalCode_WhenCalledWithCountryCodeEqualToWhiteSpace_ThrowsArgumentNullException()
        {
            Controller sut = CreateSut();

            ArgumentNullException result = Assert.ThrowsAsync <ArgumentNullException>(async() => await sut.CreatePostalCode(" "));

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

            ArgumentNullException result = Assert.ThrowsAsync <ArgumentNullException>(async() => await sut.CreatePostalCode((PostalCodeViewModel)null));

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