public async Task GivenValidGetContactsForTenancyRequest_WhenCallingGet_ThenShouldReturnAPIResponseListOfContactsForTenancy()
        {
            //arrange
            var contact = new Contact
            {
                AddressLine2 = "test"
            };

            _mock.Setup(s => s.ExecuteAsync(It.IsAny <GetContactsForTenancyRequest>(), CancellationToken.None))
            .ReturnsAsync(new GetContactsForTenancyResponse
            {
                Contacts = new List <ContactsForTenancy>
                {
                    new ContactsForTenancy(contact)
                }
            });

            var request = new GetContactsForTenancyRequest
            {
                TenancyAgreementReference = "test"
            };
            //act
            var response = await _classUnderTest.Get(request).ConfigureAwait(false);

            //assert
            response.Should().NotBeNull();
            response.Should().BeOfType <ObjectResult>();
            var objectResult = response as ObjectResult;
            var getContacts  = objectResult?.Value as APIResponse <GetContactsForTenancyResponse>;

            getContacts.Should().NotBeNull();
        }
        public async Task <GetContactsForTenancyResponse> ExecuteAsync(GetContactsForTenancyRequest request, CancellationToken cancellationToken)
        {
            //validate
            if (request == null)
            {
                throw new BadRequestException();
            }

            var validationResponse = request.Validate(request);

            if (!validationResponse.IsValid)
            {
                throw new BadRequestException(validationResponse);
            }

            var response = await _contactsGateway.GetContactsByTenancyReferenceAsync(request, cancellationToken).ConfigureAwait(false);

            //tenancy could have no attached contacts
            if (response == null)
            {
                return(new GetContactsForTenancyResponse());
            }

            //Create real response
            var useCaseResponse = new GetContactsForTenancyResponse
            {
                Contacts = response.Select(s => new ContactsForTenancy(s)).ToList()
            };

            return(useCaseResponse);
        }
        public async Task GivenValidInput_WhenCallingGetContactsByTenancyReferenceAsync_AndDynamics365ReturnsNoJson_ThenShouldReturnnull()
        {
            //arrange
            var mockClientFactory = new Mock <IDynamics365ClientFactory>();
            var mockHttpClient    = new Mock <IHttpClient>();

            mockClientFactory.Setup(s => s.CreateClientAsync(true)).ReturnsAsync(mockHttpClient.Object);

            var json = string.Empty;

            mockHttpClient.Setup(s => s.GetAsync(It.IsAny <string>(), CancellationToken.None))
            .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(json, Encoding.UTF8, "application/json")
            });

            _classUnderTest = new Dynamics365RestApiContactsGateway(mockClientFactory.Object);

            var request = new GetContactsForTenancyRequest
            {
                TenancyAgreementReference = "Test"
            };
            //act
            var response = await _classUnderTest.GetContactsByTenancyReferenceAsync(request, CancellationToken.None).ConfigureAwait(false);

            //assert
            response.Should().BeNullOrEmpty();
        }
        public async Task GivenValidGetContactsForTenancyRequest_WhenCallingGet_THenShouldReturn200()
        {
            //arrange
            _mock.Setup(s => s.ExecuteAsync(It.IsAny <GetContactsForTenancyRequest>(), CancellationToken.None))
            .ReturnsAsync(new GetContactsForTenancyResponse
            {
                Contacts = new List <ContactsForTenancy>
                {
                }
            });

            var request = new GetContactsForTenancyRequest
            {
                TenancyAgreementReference = "test"
            };
            //act
            var response = await _classUnderTest.Get(request).ConfigureAwait(false);

            //assert
            response.Should().NotBeNull();
            response.Should().BeOfType <ObjectResult>();
            var objectResult = response as ObjectResult;

            objectResult.StatusCode.Should().Be(200);
        }
        public async Task GivenValidGetContactsForTenancyRequest_WhenCallingGet_ThenShouldReturnListOfContactsForTenancy_AndThePropertiesShouldBeMappedCorrectly(
            string contactId, string emailAddress, string uprn, string add1, string add2, string add3, string firstName, string lastName, string fullName,
            string larn, string tel1, string tel2, string tel3, bool cautionAlert, bool propCautionAlert, string houseRef, string title, string fullAddDisp,
            string fullAddSearch, string postCode, string dateOfBirth, string hackneyHomesId, int age)
        {
            //arrange
            var contact = new Contact
            {
                ContactId    = new Guid(contactId),
                EmailAddress = emailAddress,
                UniquePropertyReferenceNumber = uprn,
                AddressLine1            = add1,
                AddressLine2            = add2,
                AddressLine3            = add3,
                Firstname               = firstName,
                LastName                = lastName,
                FullName                = fullName,
                Larn                    = larn,
                Telephone1              = tel1,
                Telephone2              = tel2,
                Telephone3              = tel3,
                CautionaryAlert         = cautionAlert,
                PropertyCautionaryAlert = propCautionAlert,
                HouseRef                = houseRef,
                Title                   = title,
                FullAddressDisplay      = fullAddDisp,
                FullAddressSearch       = fullAddSearch,
                PostCode                = postCode,
                DateOfBirth             = DateTime.Parse(dateOfBirth),
                HackneyHomesId          = hackneyHomesId,
                Age = age,
            };

            _mock.Setup(s => s.ExecuteAsync(It.IsAny <GetContactsForTenancyRequest>(), CancellationToken.None))
            .ReturnsAsync(new GetContactsForTenancyResponse
            {
                Contacts = new List <ContactsForTenancy>
                {
                    new ContactsForTenancy(contact)
                }
            });

            var request = new GetContactsForTenancyRequest
            {
                TenancyAgreementReference = "test"
            };
            //act
            var response = await _classUnderTest.Get(request).ConfigureAwait(false);

            //assert
            response.Should().NotBeNull();
            response.Should().BeOfType <ObjectResult>();
            var objectResult = response as ObjectResult;
            var getContacts  = objectResult?.Value as APIResponse <GetContactsForTenancyResponse>;

            getContacts.Should().NotBeNull();
            getContacts.Data.Contacts.Should().NotBeNullOrEmpty();
            getContacts.Data.Contacts[0].Should().BeEquivalentTo(contact);
        }
 public async Task Given_InvalidInput_ThenShouldThrowBadRequestException()
 {
     //arrange
     var request = new GetContactsForTenancyRequest();
     //act
     //assert
     await Assert.ThrowsAsync <BadRequestException>(async() => await _classUnderTest.ExecuteAsync(request, CancellationToken.None));
 }
        public async Task GivenValidedInput_WhenGatewayRespondsWithNull_ThenContactsListShouldBeNull()
        {
            //arrange
            var tenancyAgreementRef = "Test";

            _fakeGateway.Setup(s => s.GetContactsByTenancyReferenceAsync(It.Is <GetContactsForTenancyRequest>(i => i.TenancyAgreementReference.Equals("Test")), CancellationToken.None))
            .ReturnsAsync((List <Contact>)null);

            var request = new GetContactsForTenancyRequest
            {
                TenancyAgreementReference = tenancyAgreementRef
            };
            //act
            var response = await _classUnderTest.ExecuteAsync(request, CancellationToken.None);

            //assert
            response.Should().NotBeNull();
            response.Contacts.Should().BeNull();
        }
        public async Task GivenValidedInput__WhenExecuteAsync_GatewayReceivesCorrectInput()
        {
            //arrange
            var tenancyAgreementRef = "Test";

            _fakeGateway.Setup(s => s.GetContactsByTenancyReferenceAsync(It.Is <GetContactsForTenancyRequest>(i => i.TenancyAgreementReference.Equals("Test")), CancellationToken.None))
            .ReturnsAsync(new List <LBH.Data.Domain.Contact>
            {
            });

            var request = new GetContactsForTenancyRequest
            {
                TenancyAgreementReference = tenancyAgreementRef
            };
            //act
            var response = await _classUnderTest.ExecuteAsync(request, CancellationToken.None);

            //assert
            _fakeGateway.Verify(v => v.GetContactsByTenancyReferenceAsync(It.Is <GetContactsForTenancyRequest>(i => i.TenancyAgreementReference.Equals("Test")), CancellationToken.None));
        }
        public async Task GivenValidInput_WhenCallingGetContactsByTenancyReferenceAsync_AndDynamics365ReturnsError_ThenShouldThrowException()
        {
            //arrange
            var mockClientFactory = new Mock <IDynamics365ClientFactory>();
            var mockHttpClient    = new Mock <IHttpClient>();

            mockClientFactory.Setup(s => s.CreateClientAsync(true)).ReturnsAsync(mockHttpClient.Object);

            mockHttpClient.Setup(s => s.GetAsync(It.IsAny <string>(), CancellationToken.None))
            .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.BadRequest));

            _classUnderTest = new Dynamics365RestApiContactsGateway(mockClientFactory.Object);

            var request = new GetContactsForTenancyRequest
            {
                TenancyAgreementReference = "Test"
            };
            //act
            //assert
            await Assert.ThrowsAsync <Dynamics365RestApiException>(async() => await _classUnderTest.GetContactsByTenancyReferenceAsync(request, CancellationToken.None).ConfigureAwait(false));
        }
        public async Task GivenValidedInput__WhenExecuteAsync_ThenShouldReturnListOfContacts()
        {
            //arrange
            var contact1 = new Contact
            {
                ContactId    = Guid.NewGuid(),
                EmailAddress = "*****@*****.**",
                UniquePropertyReferenceNumber = "",
                AddressLine1 = "Add1",
                AddressLine2 = "Add2",
                AddressLine3 = "Add3",
            };
            var contact2 = new Contact
            {
            };
            var tenancyAgreementRef = "Test";

            _fakeGateway.Setup(s => s.GetContactsByTenancyReferenceAsync(It.Is <GetContactsForTenancyRequest>(i => i.TenancyAgreementReference.Equals("Test")), CancellationToken.None))
            .ReturnsAsync(new List <LBH.Data.Domain.Contact>
            {
                contact1,
                contact2
            });

            var request = new GetContactsForTenancyRequest
            {
                TenancyAgreementReference = tenancyAgreementRef
            };
            //act
            var response = await _classUnderTest.ExecuteAsync(request, CancellationToken.None);

            //assert
            response.Should().NotBeNull();
            response.Contacts.Should().NotBeNullOrEmpty();
            response.Contacts[0].Should().BeEquivalentTo(contact1);
            response.Contacts[1].Should().BeEquivalentTo(contact2);
        }
        public async Task <IList <Contact> > GetContactsByTenancyReferenceAsync(GetContactsForTenancyRequest request, CancellationToken cancellationToken)
        {
            var query      = GetContactQuery(request?.TenancyAgreementReference);
            var httpClient = await _dynamics365ClientFactory.CreateClientAsync().ConfigureAwait(false);

            var response = await httpClient.GetAsync(query, cancellationToken).ConfigureAwait(false);

            if (!response.IsSuccessStatusCode)
            {
                throw new Dynamics365RestApiException(response);
            }

            //call dynamics 365
            var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            //maybe no records found so return null
            if (string.IsNullOrEmpty(json))
            {
                return(null);
            }
            var contacts = JsonConvert.DeserializeObject <GetContactsResults>(json.Replace(UNWANTED_ENCODED_PREFIX, ""));

            return(contacts?.Contacts);
        }
        public async Task GivenValidInput_WhenCallingGetContactsByTenancyReferenceAsync_ThenShouldReturnContacts(
            string contactId, string emailAddress, string uprn, string add1, string add2, string add3, string firstName, string lastName, string fullName,
            string larn, string tel1, string tel2, string tel3, bool cautionAlert, bool propCautionAlert, string houseRef, string title, string fullAddDisp,
            string fullAddSearch, string postCode, string dateOfBirth, string hackneyHomesId, int age, bool responsible)
        {
            //arrange
            var mockClientFactory = new Mock <IDynamics365ClientFactory>();
            var mockHttpClient    = new Mock <IHttpClient>();

            mockClientFactory.Setup(s => s.CreateClientAsync(true)).ReturnsAsync(mockHttpClient.Object);

            var json =
                $@"{{
                        'value':
                        [
                            {{
                                '@odata.etag': 'W\/\'{010101}\'',
                                'accountid': '{Guid.NewGuid().ToString()}',
                                'contact1_x002e_telephone3': '{tel3}',
                                'contact1_x002e_telephone2': '{tel2}',
                                '*****@*****.**': 'No',
                                'contact1_x002e_hackney_cautionaryalert': {cautionAlert.ToString().ToLower()},
                                'contact1_x002e_hackney_larn': '{larn}',
                                'contact1_x002e_hackney_title': '{title}',
                                'contact1_x002e_hackney_age': '{age}',
                                'contact1_x002e_contactid': '{contactId}',
                                'contact1_x002e_firstname': '{firstName}',
                                '*****@*****.**': 'No',
                                'contact1_x002e_hackney_propertycautionaryalert': {propCautionAlert.ToString().ToLower()},
                                'contact1_x002e_address1_postalcode': '{postCode}',
                                'contact1_x002e_address1_composite': '{fullAddDisp}',
                                'contact1_x002e_hackney_hackneyhomesid': '{hackneyHomesId}',
                                'contact1_x002e_housing_house_ref': '{houseRef}',
                                'contact1_x002e_hackney_uprn': '{uprn}',
                                '*****@*****.**': '15\/05\/1971',
                                'contact1_x002e_birthdate': '{dateOfBirth}',
                                'contact1_x002e_address1_name': '{fullAddSearch}',
                                'contact1_x002e_lastname': '{lastName}',
                                'contact1_x002e_fullname': '{fullName}',
                                'contact1_x002e_address1_line3': '{add3}',
                                'contact1_x002e_address1_line2': '{add2}',
                                'contact1_x002e_address1_line1': '{add1}',
                                'contact1_x002e_telephone1': '{tel1}',
                                'contact1_x002e_emailAddress1': '{emailAddress}',
                                'contact1_x002e_hackney_responsible': '{responsible}'
                            }}
                        ]
                    }}";

            mockHttpClient.Setup(s => s.GetAsync(It.IsAny <string>(), CancellationToken.None))
            .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(json, Encoding.UTF8, "application/json")
            });

            _classUnderTest = new Dynamics365RestApiContactsGateway(mockClientFactory.Object);

            var request = new GetContactsForTenancyRequest
            {
                TenancyAgreementReference = "Test"
            };
            //act
            var response = await _classUnderTest.GetContactsByTenancyReferenceAsync(request, CancellationToken.None).ConfigureAwait(false);

            //assert
            response.Should().NotBeNullOrEmpty();

            var contact = new Contact
            {
                ContactId    = new Guid(contactId),
                EmailAddress = emailAddress,
                UniquePropertyReferenceNumber = uprn,
                AddressLine1            = add1,
                AddressLine2            = add2,
                AddressLine3            = add3,
                Firstname               = firstName,
                LastName                = lastName,
                FullName                = fullName,
                Larn                    = larn,
                Telephone1              = tel1,
                Telephone2              = tel2,
                Telephone3              = tel3,
                CautionaryAlert         = cautionAlert,
                PropertyCautionaryAlert = propCautionAlert,
                HouseRef                = houseRef,
                Title                   = title,
                FullAddressDisplay      = fullAddDisp,
                FullAddressSearch       = fullAddSearch,
                PostCode                = postCode,
                DateOfBirth             = DateTime.Parse(dateOfBirth),
                HackneyHomesId          = hackneyHomesId,
                Age         = age,
                Responsible = responsible
            };

            response[0].Should().BeEquivalentTo(contact);
        }
Esempio n. 13
0
        public async Task <IActionResult> Get([FromRoute][Required] GetContactsForTenancyRequest request)
        {
            var result = await _getContactsForTenancyUseCase.ExecuteAsync(request, HttpContext.GetCancellationToken()).ConfigureAwait(false);

            return(HandleResponse(result));
        }