public async Task GetCoordinatesFromAddress_ReturnsNull_WhenNotSuccessStatusCode()
        {
            var httpClient = new Mock <IHttpClient>();

            httpClient.Setup(x => x.GetAsync(It.IsAny <string>())).ReturnsAsync(new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest));

            var options = new Mock <IOptions <MappingSettings> >();

            options.Setup(x => x.Value).Returns(new MappingSettings {
                GoogleMapsApiKey = "123"
            });

            var sut = new GoogleGeocodeService(httpClient.Object, options.Object);

            var result = await sut.GetCoordinatesFromAddress("address");

            result.ShouldBeNull();
        }
        public async Task GetCoordinatesFromAddress_CallsHttpClientGetAsync_Once()
        {
            var httpClient = new Mock <IHttpClient>();

            httpClient.Setup(x => x.GetAsync(It.IsAny <string>())).ReturnsAsync(new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest));

            var options = new Mock <IOptions <MappingSettings> >();

            options.Setup(x => x.Value).Returns(new MappingSettings {
                GoogleMapsApiKey = "123"
            });

            var sut = new GoogleGeocodeService(httpClient.Object, options.Object);

            await sut.GetCoordinatesFromAddress("address");

            httpClient.Verify(x => x.GetAsync(It.IsAny <string>()), Times.Once);
        }
        public async Task GetCoordinatesFromAddress_ReturnsNull_WhenExceptionThrown()
        {
            var httpClient = new Mock <IHttpClient>();

            httpClient.Setup(x => x.GetAsync(It.IsAny <string>())).Throws <Exception>();

            var options = new Mock <IOptions <MappingSettings> >();

            options.Setup(x => x.Value).Returns(new MappingSettings {
                GoogleMapsApiKey = "123"
            });

            var sut = new GoogleGeocodeService(httpClient.Object, options.Object);

            var result = await sut.GetCoordinatesFromAddress("address");

            result.ShouldBeNull();
        }
        public async Task GetCoordinatesFromAddress_WithIndividualAddressParams_CallsHttpClientGetAsync_WithCorrectUrl()
        {
            var url = string.Empty;

            var httpClient = new Mock <IHttpClient>();

            httpClient.Setup(x => x.GetAsync(It.IsAny <string>())).ReturnsAsync(new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)).Callback <string>(x => url = x);

            var options = new Mock <IOptions <MappingSettings> >();

            options.Setup(x => x.Value).Returns(new MappingSettings {
                GoogleMapsApiKey = "123"
            });

            var sut = new GoogleGeocodeService(httpClient.Object, options.Object);

            await sut.GetCoordinatesFromAddress("1 some street", "town", "state", "postcode", null);

            url.ShouldBe(string.Concat("https://maps.googleapis.com/maps/api/geocode/json?address=", "1%20some%20street,town,state,postcode", "&key=", "123"));
        }
        public async Task GetCoordinatesFromAddress_ReturnsCorrectCoordinates_WhenValidGoogleResponse()
        {
            var response = new HttpResponseMessage(System.Net.HttpStatusCode.OK);

            response.Content = new StringContent(ValidGoogleResponse);

            var httpClient = new Mock <IHttpClient>();

            httpClient.Setup(x => x.GetAsync(It.IsAny <string>())).ReturnsAsync(response);

            var options = new Mock <IOptions <MappingSettings> >();

            options.Setup(x => x.Value).Returns(new MappingSettings {
                GoogleMapsApiKey = "123"
            });

            var sut = new GoogleGeocodeService(httpClient.Object, options.Object);

            var result = await sut.GetCoordinatesFromAddress("address");

            result.Latitude.ShouldBe(37.4224764);
            result.Longitude.ShouldBe(-122.0842499);
        }