diff --git a/src/CarbonAware.DataSources/CarbonAware.DataSources.WattTime/src/Client/WattTimeClient.cs b/src/CarbonAware.DataSources/CarbonAware.DataSources.WattTime/src/Client/WattTimeClient.cs index 5f4abdf8a..08caab921 100644 --- a/src/CarbonAware.DataSources/CarbonAware.DataSources.WattTime/src/Client/WattTimeClient.cs +++ b/src/CarbonAware.DataSources/CarbonAware.DataSources.WattTime/src/Client/WattTimeClient.cs @@ -10,13 +10,17 @@ using System.Net.Mime; using System.Text; using System.Text.Json; +using System.Text.Json.Serialization; using System.Web; namespace CarbonAware.DataSources.WattTime.Client; internal class WattTimeClient : IWattTimeClient { - private static readonly JsonSerializerOptions _options = new JsonSerializerOptions(JsonSerializerDefaults.Web); + private static readonly JsonSerializerOptions _options = new JsonSerializerOptions(JsonSerializerDefaults.Web) + { + Converters = { new JsonStringEnumConverter() } + }; private static readonly HttpStatusCode[] _retriableStatusCodes = new HttpStatusCode[] { diff --git a/src/CarbonAware.DataSources/CarbonAware.DataSources.WattTime/test/Client/WattTimeClientTests.cs b/src/CarbonAware.DataSources/CarbonAware.DataSources.WattTime/test/Client/WattTimeClientTests.cs index 03557348d..8ffaa341c 100644 --- a/src/CarbonAware.DataSources/CarbonAware.DataSources.WattTime/test/Client/WattTimeClientTests.cs +++ b/src/CarbonAware.DataSources/CarbonAware.DataSources.WattTime/test/Client/WattTimeClientTests.cs @@ -413,6 +413,60 @@ public async Task GetHistoricalDataAsync_RefreshesTokenWhenNoneSet() } } + [Test] + public async Task JsonStringEnumConverter_CorrectlyDeserializesEnumValues() + { + // Arrange + // Create a custom response with a specific signal_type enum value + var customResponse = new + { + meta = new + { + region = WattTimeTestData.Constants.Region, + generated_at = WattTimeTestData.Constants.GeneratedAt, + generated_at_period_seconds = 30, + signal_type = "co2_aoer", // Different from default co2_moer to verify conversion + units = "lbs_co2_per_mwh", + model = new { date = WattTimeTestData.Constants.Date, type = "binned_regression" } + }, + data = new[] + { + new { + point_time = WattTimeTestData.Constants.PointTime, + value = WattTimeTestData.Constants.Value, + frequency = WattTimeTestData.Constants.Frequency, + market = WattTimeTestData.Constants.Market, + version = WattTimeTestData.Constants.Version + } + } + }; + + var responseJson = System.Text.Json.JsonSerializer.Serialize(customResponse); + + this.AddHandlers_Auth(); + this.AddHandler_RequestResponse(r => + { + return r.RequestUri!.ToString().Contains("/v3/historical") && r.Method == HttpMethod.Get; + }, System.Net.HttpStatusCode.OK, responseJson); + + // Act + var client = new WattTimeClient(this.HttpClientFactory, this.Options.Object, this.Log.Object, this.MemoryCache); + client.SetBearerAuthenticationHeader(_DEFAULT_TOKEN_VALUE); + + var emissionsResponse = await client.GetDataAsync( + WattTimeTestData.Constants.Region, + new DateTimeOffset(2022, 4, 22, 0, 0, 0, TimeSpan.Zero), + new DateTimeOffset(2022, 4, 22, 0, 0, 0, TimeSpan.Zero)); + + // Assert + Assert.IsNotNull(emissionsResponse); + Assert.AreEqual(SignalTypes.co2_aoer, emissionsResponse.Meta.SignalType); + + // Verify other properties were correctly deserialized + Assert.AreEqual(WattTimeTestData.Constants.Region, emissionsResponse.Meta.Region); + Assert.IsTrue(emissionsResponse.Data.Count() > 0); + } + /** * Helper to add client handlers for auth checking */