public void Validate_WhenCalled_ReturnsValidator()
        {
            IGetPostalCodeQuery sut = CreateSut();

            IValidator result = sut.Validate(_validatorMockContext.ValidatorMock.Object, _contactRepositoryMock.Object);

            Assert.That(result, Is.EqualTo(_validatorMockContext.ValidatorMock.Object));
        }
        public void Validate_WhenContactRepositoryIsNull_ThrowsArgumentNullException()
        {
            IGetPostalCodeQuery sut = CreateSut();

            ArgumentNullException result = Assert.Throws <ArgumentNullException>(() => sut.Validate(_validatorMockContext.ValidatorMock.Object, null));

            Assert.That(result.ParamName, Is.EqualTo("contactRepository"));
        }
        public async Task QueryAsync_WhenCalledAndPostalCodeWasNotReturnedFromContactRepository_ReturnsNull()
        {
            QueryHandler sut = CreateSut(false);

            IGetPostalCodeQuery query  = CreateQueryMock().Object;
            IPostalCode         result = await sut.QueryAsync(query);

            Assert.That(result, Is.Null);
        }
        public async Task QueryAsync_WhenCalledAndPostalCodeWasNotReturnedFromContactRepository_AssertApplyLogicForPrincipalWasNotCalledOnCountryHelper()
        {
            QueryHandler sut = CreateSut(false);

            IGetPostalCodeQuery query = CreateQueryMock().Object;
            await sut.QueryAsync(query);

            _countryHelperMock.Verify(m => m.ApplyLogicForPrincipal(It.IsAny <ICountry>()), Times.Never);
        }
        public async Task QueryAsync_WhenCalledAndPostalCodeWasReturnedFromContactRepository_ReturnsPostalCodeCollectionFromContactRepository()
        {
            IPostalCode  postalCode = _fixture.BuildPostalCodeMock().Object;
            QueryHandler sut        = CreateSut(postalCode: postalCode);

            IGetPostalCodeQuery query  = CreateQueryMock().Object;
            IPostalCode         result = await sut.QueryAsync(query);

            Assert.That(result, Is.EqualTo(postalCode));
        }
        public async Task QueryAsync_WhenCalledAndPostalCodeWasNotReturnedFromContactRepository_AssertCountrySetterWasNotCalledOnPostalCode()
        {
            Mock <IPostalCode> postalCodeMock = _fixture.BuildPostalCodeMock();
            QueryHandler       sut            = CreateSut(false, postalCodeMock.Object);

            IGetPostalCodeQuery query = CreateQueryMock().Object;
            await sut.QueryAsync(query);

            postalCodeMock.VerifySet(m => m.Country = It.IsAny <ICountry>(), Times.Never);
        }
        public async Task QueryAsync_WhenCalledAndPostalCodeWasReturnedFromContactRepository_AssertCountrySetterWasCalledOnPostalCode()
        {
            Mock <IPostalCode> postalCodeMock = _fixture.BuildPostalCodeMock();
            ICountry           country        = _fixture.Create <ICountry>();
            QueryHandler       sut            = CreateSut(postalCode: postalCodeMock.Object, country: country);

            IGetPostalCodeQuery query = CreateQueryMock().Object;
            await sut.QueryAsync(query);

            postalCodeMock.VerifySet(m => m.Country = It.Is <ICountry>(value => value == country), Times.Once);
        }
        public async Task QueryAsync_WhenCalledAndPostalCodeWasReturnedFromContactRepository_AssertApplyLogicForPrincipalWasCalledOnCountryHelper()
        {
            ICountry     country    = _fixture.Create <ICountry>();
            IPostalCode  postalCode = _fixture.BuildPostalCodeMock(country).Object;
            QueryHandler sut        = CreateSut(postalCode: postalCode);

            IGetPostalCodeQuery query = CreateQueryMock().Object;
            await sut.QueryAsync(query);

            _countryHelperMock.Verify(m => m.ApplyLogicForPrincipal(It.Is <ICountry>(value => value == country)), Times.Once);
        }
        public async Task QueryAsync_WhenCalled_AssertGetPostalCodeAsyncWasCalledOnContactRepository()
        {
            QueryHandler sut = CreateSut();

            string countryCode        = _fixture.Create <string>();
            string postalCode         = _fixture.Create <string>();
            IGetPostalCodeQuery query = CreateQueryMock(countryCode, postalCode).Object;
            await sut.QueryAsync(query);

            _contactRepositoryMock.Verify(m => m.GetPostalCodeAsync(
                                              It.Is <string>(value => string.CompareOrdinal(value, countryCode) == 0),
                                              It.Is <string>(value => string.CompareOrdinal(value, postalCode) == 0)),
                                          Times.Once);
        }
        public void Validate_WhenCalled_AssertShouldBeKnownValueWasCalledOnObjectValidator()
        {
            string countryCode      = _fixture.Create <string>();
            IGetPostalCodeQuery sut = CreateSut(countryCode);

            sut.Validate(_validatorMockContext.ValidatorMock.Object, _contactRepositoryMock.Object);

            _validatorMockContext.ObjectValidatorMock.Verify(m => m.ShouldBeKnownValue(
                                                                 It.Is <string>(value => string.CompareOrdinal(value, countryCode.ToUpper()) == 0),
                                                                 It.IsNotNull <Func <string, Task <bool> > >(),
                                                                 It.Is <Type>(value => sut.GetType() == value),
                                                                 It.Is <string>(value => string.CompareOrdinal(value, "CountryCode") == 0),
                                                                 It.Is <bool>(value => value == false)),
                                                             Times.Once());
        }