public void Constructed_url_with_updated_since_data_with_lat_long_is_correct()
        {
            var updatedSinceRequest = new UpdatedSinceRequest
            {
                Latitude  = 55.9553455,
                Longitude = 9.9264833,
                Since     = DateTime.Now.AddDays(-5),
                Start     = DateTime.Now.AddDays(-2),
                End       = DateTime.Now.AddDays(-1),
                Limit     = 100,
                Threshold = "P1D",
            };

            var expectedUrl = $"https://api.electricitymap.org/v3/updated-since/" +
                              $"?lat={updatedSinceRequest.Latitude}" +
                              $"&lon={updatedSinceRequest.Longitude}" +
                              $"&since={updatedSinceRequest.Since:o}" +
                              $"&start={updatedSinceRequest.Start:o}" +
                              $"&end={updatedSinceRequest.End:o}" +
                              $"&limit={updatedSinceRequest.Limit}" +
                              $"&threshold={updatedSinceRequest.Threshold}";

            var requestUrl = RequestUrlHelpers.ConstructRequest(updatedSinceRequest);

            expectedUrl
            .ToUri()
            .Should().Be(requestUrl);
        }
        public Task <UpdatedSince> GetUpdateInfoAsync(UpdatedSinceRequest updatedSinceRequest)
        {
            var requestUrl = RequestUrlHelpers
                             .ConstructRequest(updatedSinceRequest);

            return(httpFacade
                   .GetAsync <UpdatedSince>(requestUrl));
        }
        public void Constructed_url_with_updated_since_data_returns_exception_without_zone_or_coor()
        {
            var updatedSinceRequest = new UpdatedSinceRequest
            {
                Since     = DateTime.Now.AddDays(-5),
                Start     = DateTime.Now.AddDays(-2),
                End       = DateTime.Now.AddDays(-1),
                Limit     = 100,
                Threshold = "P1D",
            };

            Assert.Throws <ArgumentNullException>(()
                                                  => RequestUrlHelpers.ConstructRequest(updatedSinceRequest));
        }
        public async Task Get_update_info_returns_data_Async(
            UpdatedSinceRequest updatedSinceRequest,
            UpdatedSince updatedSince)
        {
            httpFacade
            .GetAsync <UpdatedSince>(Arg.Any <Uri>())
            .Returns(updatedSince);

            var result = await sut
                         .GetUpdateInfoAsync(updatedSinceRequest)
                         .ConfigureAwait(false);

            result.Should().NotBeNull();
            result.Should().BeEquivalentTo(updatedSince);
        }
        /// <summary>
        /// Construct the request to retrieve
        /// information on data updates.
        /// </summary>
        /// <param name="updatedSinceRequest"></param>
        /// <returns></returns>
        public static Uri ConstructRequest(UpdatedSinceRequest updatedSinceRequest)
        {
            if (updatedSinceRequest is null)
            {
                throw new ArgumentNullException(nameof(updatedSinceRequest));
            }

            var initialUrl = string.Concat(
                ApiConstants.BaseUrl,
                ApiConstants.Version3,
                ApiAreas.UpdatedSince);

            string queryUrl;

            if (!string.IsNullOrEmpty(updatedSinceRequest.Zone))
            {
                queryUrl = string.Concat(
                    initialUrl,
                    ApiConstants.ZoneParameter,
                    updatedSinceRequest.Zone);

                queryUrl = BuildQueryString(updatedSinceRequest, queryUrl);

                return(queryUrl.ToUri());
            }

            if (updatedSinceRequest.Latitude != null &&
                updatedSinceRequest.Longitude != null)
            {
                queryUrl = string.Concat(
                    initialUrl,
                    ApiConstants.LatitudeParameter,
                    updatedSinceRequest.Latitude,
                    ApiConstants.LongitudeParameter,
                    updatedSinceRequest.Longitude);

                queryUrl = BuildQueryString(updatedSinceRequest, queryUrl);

                return(queryUrl.ToUri());
            }

            throw new ArgumentNullException(updatedSinceRequest.Zone, "Zone or Latitude/Longitude must be passed as parameters.");
        }
        /// <summary>
        /// Build the query string parameters
        /// for the updated since request.
        /// </summary>
        /// <param name="updatedSinceRequest"></param>
        /// <param name="queryUrl"></param>
        /// <returns></returns>
        private static string BuildQueryString(UpdatedSinceRequest updatedSinceRequest, string queryUrl)
        {
            if (updatedSinceRequest.Start != null)
            {
                queryUrl = queryUrl
                           + "&since="
                           + updatedSinceRequest.Since
                           .ToString(DateFormatConstants.StandardDateFormat);
            }

            if (updatedSinceRequest.Start != null)
            {
                queryUrl = queryUrl
                           + "&start="
                           + updatedSinceRequest.Start.Value
                           .ToString(DateFormatConstants.StandardDateFormat, CultureInfo.InvariantCulture);
            }

            if (updatedSinceRequest.End != null)
            {
                queryUrl = queryUrl
                           + "&end="
                           + updatedSinceRequest.End.Value
                           .ToString(DateFormatConstants.StandardDateFormat, CultureInfo.InvariantCulture);
            }

            if (updatedSinceRequest.Limit != null)
            {
                queryUrl = queryUrl
                           + "&limit="
                           + updatedSinceRequest.Limit;
            }

            if (updatedSinceRequest.Threshold != null)
            {
                queryUrl = queryUrl
                           + "&threshold="
                           + updatedSinceRequest.Threshold;
            }

            return(queryUrl);
        }
        public void Constructed_url_with_updated_since_data_is_correct(
            UpdatedSinceRequest updatedSinceRequest)
        {
            if (updatedSinceRequest is null)
            {
                throw new ArgumentNullException(nameof(updatedSinceRequest));
            }

            var expectedUrl = $"https://api.electricitymap.org/v3/updated-since/" +
                              $"?zone={updatedSinceRequest.Zone}" +
                              $"&since={updatedSinceRequest.Since:o}" +
                              $"&start={updatedSinceRequest.Start:o}" +
                              $"&end={updatedSinceRequest.End:o}" +
                              $"&limit={updatedSinceRequest.Limit}" +
                              $"&threshold={updatedSinceRequest.Threshold}";

            var requestUrl = RequestUrlHelpers
                             .ConstructRequest(updatedSinceRequest);

            expectedUrl
            .ToUri()
            .Should().Be(requestUrl);
        }