Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ public void DateTimeConverter_Read_ValidFormat_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime)) }
Converters = { new JsonDateTimeConverterAttribute("MM/dd/yyyy").CreateConverter(typeof(DateTime)) }
};
var json = "\"2023-10-15\"";
var json = "\"10/15/2023\"";

// Act
var result = JsonSerializer.Deserialize<DateTime>(json, options);
Expand All @@ -50,7 +50,7 @@ public void DateTimeConverter_Read_InvalidFormat_FallbackToGetDateTime()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime)) }
Converters = { new JsonDateTimeConverterAttribute("dd-MM-yyyy").CreateConverter(typeof(DateTime)) }
};
// ISO 8601 format that doesn't match our custom format
var json = "\"2023-10-15T14:30:45Z\"";
Expand Down Expand Up @@ -107,15 +107,15 @@ public void DateTimeNullableConverter_Write_ValidValue_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
Converters = { new JsonDateTimeConverterAttribute("yyyy/MM/dd").CreateConverter(typeof(DateTime?)) }
};
DateTime? date = new DateTime(2023, 10, 15, 14, 30, 45, DateTimeKind.Utc);

// Act
var json = JsonSerializer.Serialize(date, options);

// Assert
Assert.Equal("\"2023-10-15\"", json);
Assert.Equal("\"2023/10/15\"", json);
}

[Fact]
Expand All @@ -124,7 +124,7 @@ public void DateTimeNullableConverter_Write_NullValue_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
Converters = { new JsonDateTimeConverterAttribute("yyyyMMdd").CreateConverter(typeof(DateTime?)) }
};
DateTime? date = null;

Expand All @@ -141,9 +141,9 @@ public void DateTimeNullableConverter_Read_ValidFormat_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
Converters = { new JsonDateTimeConverterAttribute("dd.MM.yyyy").CreateConverter(typeof(DateTime?)) }
};
var json = "\"2023-10-15\"";
var json = "\"15.10.2023\"";

// Act
var result = JsonSerializer.Deserialize<DateTime?>(json, options);
Expand All @@ -159,7 +159,7 @@ public void DateTimeNullableConverter_Read_NullToken_ReturnsNull()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
Converters = { new JsonDateTimeConverterAttribute("yyyy.MM.dd").CreateConverter(typeof(DateTime?)) }
};
var json = "null";

Expand All @@ -176,7 +176,7 @@ public void DateTimeNullableConverter_Read_InvalidFormat_ReturnsNull()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
Converters = { new JsonDateTimeConverterAttribute("MM-dd-yyyy").CreateConverter(typeof(DateTime?)) }
};
var json = "\"invalid-date\"";

Expand Down Expand Up @@ -211,7 +211,7 @@ public void DateTimeNullableConverter_RoundTrip_WithNull_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTime?)) }
Converters = { new JsonDateTimeConverterAttribute("dd/MM/yyyy").CreateConverter(typeof(DateTime?)) }
};
DateTime? original = null;

Expand Down Expand Up @@ -267,7 +267,7 @@ public void DateTimeOffsetConverter_Read_InvalidFormat_FallbackToGetDateTimeOffs
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset)) }
Converters = { new JsonDateTimeConverterAttribute("yyyyMMdd").CreateConverter(typeof(DateTimeOffset)) }
};
// Standard ISO 8601 format
var json = "\"2023-10-15T14:30:45+00:00\"";
Expand Down Expand Up @@ -324,7 +324,7 @@ public void DateTimeOffsetNullableConverter_Write_NullValue_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) }
Converters = { new JsonDateTimeConverterAttribute("yyyy/MM/dd").CreateConverter(typeof(DateTimeOffset?)) }
};
DateTimeOffset? date = null;

Expand Down Expand Up @@ -359,7 +359,7 @@ public void DateTimeOffsetNullableConverter_Read_NullToken_ReturnsNull()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) }
Converters = { new JsonDateTimeConverterAttribute("dd-MM-yyyy").CreateConverter(typeof(DateTimeOffset?)) }
};
var json = "null";

Expand All @@ -376,7 +376,7 @@ public void DateTimeOffsetNullableConverter_Read_InvalidFormat_ReturnsNull()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) }
Converters = { new JsonDateTimeConverterAttribute("MM/dd/yyyy").CreateConverter(typeof(DateTimeOffset?)) }
};
var json = "\"invalid-date\"";

Expand Down Expand Up @@ -411,7 +411,7 @@ public void DateTimeOffsetNullableConverter_RoundTrip_WithNull_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateTimeOffset?)) }
Converters = { new JsonDateTimeConverterAttribute("dd.MM.yyyy").CreateConverter(typeof(DateTimeOffset?)) }
};
DateTimeOffset? original = null;

Expand Down Expand Up @@ -485,7 +485,7 @@ public void DateOnlyConverter_Read_InvalidToken_ThrowsJsonException()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly)) }
Converters = { new JsonDateTimeConverterAttribute("dd/MM/yyyy").CreateConverter(typeof(DateOnly)) }
};
var json = "\"invalid-date-format\"";

Expand Down Expand Up @@ -538,7 +538,7 @@ public void DateOnlyNullableConverter_Write_NullValue_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) }
Converters = { new JsonDateTimeConverterAttribute("dd-MM-yyyy").CreateConverter(typeof(DateOnly?)) }
};
DateOnly? date = null;

Expand Down Expand Up @@ -573,7 +573,7 @@ public void DateOnlyNullableConverter_Read_NullToken_ReturnsNull()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) }
Converters = { new JsonDateTimeConverterAttribute("dd.MM.yyyy").CreateConverter(typeof(DateOnly?)) }
};
var json = "null";

Expand All @@ -590,7 +590,7 @@ public void DateOnlyNullableConverter_Read_InvalidFormat_ReturnsNull()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) }
Converters = { new JsonDateTimeConverterAttribute("MM-dd-yyyy").CreateConverter(typeof(DateOnly?)) }
};
var json = "\"invalid-date\"";

Expand Down Expand Up @@ -625,7 +625,7 @@ public void DateOnlyNullableConverter_RoundTrip_WithNull_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("yyyy-MM-dd").CreateConverter(typeof(DateOnly?)) }
Converters = { new JsonDateTimeConverterAttribute("yyyy.MM.dd").CreateConverter(typeof(DateOnly?)) }
};
DateOnly? original = null;

Expand Down Expand Up @@ -681,7 +681,7 @@ public void TimeOnlyConverter_Read_InvalidFormat_FallbackToGetDateTime()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("HH:mm").CreateConverter(typeof(TimeOnly)) }
Converters = { new JsonDateTimeConverterAttribute("HH.mm").CreateConverter(typeof(TimeOnly)) }
};
// Full datetime that doesn't match our format
var json = "\"2023-10-15T14:30:45Z\"";
Expand Down Expand Up @@ -752,7 +752,7 @@ public void TimeOnlyNullableConverter_Write_NullValue_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) }
Converters = { new JsonDateTimeConverterAttribute("HH-mm-ss").CreateConverter(typeof(TimeOnly?)) }
};
TimeOnly? time = null;

Expand Down Expand Up @@ -787,7 +787,7 @@ public void TimeOnlyNullableConverter_Read_NullToken_ReturnsNull()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) }
Converters = { new JsonDateTimeConverterAttribute("HH.mm.ss").CreateConverter(typeof(TimeOnly?)) }
};
var json = "null";

Expand All @@ -804,7 +804,7 @@ public void TimeOnlyNullableConverter_Read_InvalidFormat_ReturnsNull()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) }
Converters = { new JsonDateTimeConverterAttribute("mm:ss:HH").CreateConverter(typeof(TimeOnly?)) }
};
var json = "\"invalid-time\"";

Expand Down Expand Up @@ -839,7 +839,7 @@ public void TimeOnlyNullableConverter_RoundTrip_WithNull_Success()
// Arrange
var options = new JsonSerializerOptions
{
Converters = { new JsonDateTimeConverterAttribute("HH:mm:ss").CreateConverter(typeof(TimeOnly?)) }
Converters = { new JsonDateTimeConverterAttribute("HH:mm").CreateConverter(typeof(TimeOnly?)) }
};
TimeOnly? original = null;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Scarlet.System.Text.Json.DateTimeConverter.Tests;

/// <summary>
/// Unit tests for DateTimeConverterFactoryHelper to ensure full code coverage.
/// </summary>
public class DateTimeConverterFactoryHelperTests
{
private const string TestDateFormat = "yyyy-MM-dd";
private const string TestTimeFormat = "HH:mm:ss";

[Fact]
public void CreateConverter_DateTime_ReturnsDateTimeConverter()
{
// Act
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTime), TestDateFormat);

// Assert
Assert.NotNull(converter);
Assert.IsType<Converters.DateTimeConverter>(converter);
}

[Fact]
public void CreateConverter_NullableDateTime_ReturnsDateTimeNullableConverter()
{
// Act
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTime?), TestDateFormat);

// Assert
Assert.NotNull(converter);
Assert.IsType<Converters.DateTimeNullableConverter>(converter);
}

[Fact]
public void CreateConverter_DateTimeOffset_ReturnsDateTimeOffsetConverter()
{
// Act
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTimeOffset), TestDateFormat);

// Assert
Assert.NotNull(converter);
Assert.IsType<Converters.DateTimeOffsetConverter>(converter);
}

[Fact]
public void CreateConverter_NullableDateTimeOffset_ReturnsDateTimeOffsetNullableConverter()
{
// Act
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateTimeOffset?), TestDateFormat);

// Assert
Assert.NotNull(converter);
Assert.IsType<Converters.DateTimeOffsetNullableConverter>(converter);
}

[Fact]
public void CreateConverter_DateOnly_ReturnsDateOnlyConverter()
{
// Act
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateOnly), TestDateFormat);

// Assert
Assert.NotNull(converter);
Assert.IsType<Converters.DateOnlyConverter>(converter);
}

[Fact]
public void CreateConverter_NullableDateOnly_ReturnsDateOnlyNullableConverter()
{
// Act
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(DateOnly?), TestDateFormat);

// Assert
Assert.NotNull(converter);
Assert.IsType<Converters.DateOnlyNullableConverter>(converter);
}

[Fact]
public void CreateConverter_TimeOnly_ReturnsTimeOnlyConverter()
{
// Act
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(TimeOnly), TestTimeFormat);

// Assert
Assert.NotNull(converter);
Assert.IsType<Converters.TimeOnlyConverter>(converter);
}

[Fact]
public void CreateConverter_NullableTimeOnly_ReturnsTimeOnlyNullableConverter()
{
// Act
var converter = DateTimeConverterFactoryHelper.CreateConverter(typeof(TimeOnly?), TestTimeFormat);

// Assert
Assert.NotNull(converter);
Assert.IsType<Converters.TimeOnlyNullableConverter>(converter);
}

[Fact]
public void CreateConverter_UnsupportedType_ThrowsNotSupportedException()
{
// Act & Assert
var exception = Assert.Throws<NotSupportedException>(() =>
DateTimeConverterFactoryHelper.CreateConverter(typeof(string), TestDateFormat));

Assert.Contains("System.String", exception.Message);
Assert.Contains("DateTimeConverterFactoryHelper", exception.Message);
}

[Fact]
public void CreateConverter_AnotherUnsupportedType_ThrowsNotSupportedException()
{
// Act & Assert
var exception = Assert.Throws<NotSupportedException>(() =>
DateTimeConverterFactoryHelper.CreateConverter(typeof(int), TestDateFormat));

Assert.Contains("System.Int32", exception.Message);
Assert.Contains("DateTimeConverterFactoryHelper", exception.Message);
}

[Fact]
public void CreateConverter_NullType_ThrowsArgumentNullException()
{
// Act & Assert
Assert.Throws<ArgumentNullException>(() =>
DateTimeConverterFactoryHelper.CreateConverter(null!, TestDateFormat));
}
}
Loading