diff --git a/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/src/Model/HistoryCarbonIntensityData.cs b/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/src/Model/HistoryCarbonIntensityData.cs index abd42ae4e..d96ebc9b8 100644 --- a/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/src/Model/HistoryCarbonIntensityData.cs +++ b/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/src/Model/HistoryCarbonIntensityData.cs @@ -32,7 +32,7 @@ internal record CarbonIntensity /// Carbon Intensity value. /// [JsonPropertyName("carbonIntensity")] - public int Value { get; init; } + public int? Value { get; init; } /// /// Indicates the datetime of the carbon intensity @@ -74,7 +74,7 @@ public static explicit operator EmissionsData(CarbonIntensity historyCarbonInten { return new EmissionsData { - Rating = historyCarbonIntensity.Value, + Rating = historyCarbonIntensity.Value ?? -1, Time = historyCarbonIntensity.UpdatedAt, }; } diff --git a/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/test/Client/ElectricityMapsClientTests.cs b/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/test/Client/ElectricityMapsClientTests.cs index 2535020ee..d8255e3aa 100644 --- a/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/test/Client/ElectricityMapsClientTests.cs +++ b/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/test/Client/ElectricityMapsClientTests.cs @@ -8,6 +8,7 @@ using Moq.Protected; using Moq.Contrib.HttpClient; using System.Text.Json; +using CarbonAware.Model; namespace CarbonAware.DataSources.ElectricityMaps.Tests; @@ -299,4 +300,36 @@ private void AddHandler_RequestResponse(Predicate requestPre .ReturnsResponse(statusCode); } } + + [Test] + public async Task GetRecentCarbonIntensityHistoryAsync_DeserializesExpectedResponseWithNull() + { + AddHandler_RequestResponse(r => + { + return r.Method == HttpMethod.Get; + }, System.Net.HttpStatusCode.OK, TestData.GetHistoryCarbonIntensityDataJsonStringWithNull()); + + var client = new ElectricityMapsClient(this.HttpClientFactory, this.Options.Object, this.Log.Object); + + // Act + var data = await client.GetRecentCarbonIntensityHistoryAsync(TestLatitude, TestLongitude); + var dataPoint = data?.HistoryData.First(); + + // Assert + Assert.That(data, Is.Not.Null); + Assert.That(data?.Zone, Is.EqualTo(TestZone)); + Assert.That(data?.HistoryData.Count(), Is.GreaterThan(0)); + Assert.Multiple(() => + { + Assert.That(dataPoint?.DateTime, Is.EqualTo(new DateTimeOffset(2099, 1, 1, 0, 0, 0, TimeSpan.Zero))); + Assert.That(dataPoint?.UpdatedAt, Is.EqualTo(new DateTimeOffset(2099, 1, 1, 0, 0, 0, TimeSpan.Zero))); + Assert.That(dataPoint?.CreatedAt, Is.EqualTo(new DateTimeOffset(2099, 1, 1, 0, 0, 0, TimeSpan.Zero))); + Assert.That(dataPoint?.Value, Is.Null); + Assert.That(((EmissionsData)dataPoint).Rating, Is.EqualTo(-1)); + Assert.That(dataPoint?.EmissionFactorType, Is.EqualTo("lifecycle")); + Assert.That(dataPoint?.IsEstimated, Is.False); + Assert.That(dataPoint?.EstimationMethod, Is.Null); + }); + } + } diff --git a/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/test/Client/TestData.cs b/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/test/Client/TestData.cs index 761604a47..3a1a8da20 100644 --- a/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/test/Client/TestData.cs +++ b/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/test/Client/TestData.cs @@ -92,4 +92,28 @@ public static string GetCurrentForecastJsonString() return json.ToString(); } + + public static string GetHistoryCarbonIntensityDataJsonStringWithNull() + { + var json = new JsonObject + { + ["zone"] = TestZoneId1, + ["history"] = new JsonArray + { + new JsonObject + { + ["datetime"] = new DateTimeOffset(2099, 1, 1, 0, 0, 0, TimeSpan.Zero), + ["updatedAt"] = new DateTimeOffset(2099, 1, 1, 0, 0, 0, TimeSpan.Zero), + ["createdAt"] = new DateTimeOffset(2099, 1, 1, 0, 0, 0, TimeSpan.Zero), + ["carbonIntensity"] = null, + ["emissionFactorType"] = "lifecycle", + ["isEstimated"] = false, + ["estimatedMethod"] = null, + } + } + }; + + return json.ToString(); + } + } \ No newline at end of file