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 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 GetContactsForTenancyUseCase(IContactsGateway contactsGateway)
 {
     _contactsGateway = contactsGateway;
 }
        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);
        }