Skip to content

Commit b9ce458

Browse files
committed
Added switch to disable the DateTime format check. (#8289)
1 parent 879b660 commit b9ce458

File tree

2 files changed

+42
-17
lines changed

2 files changed

+42
-17
lines changed

src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,33 @@ public class DateTimeType : ScalarType<DateTimeOffset, StringValueNode>
2424
@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{1,7})?(Z|[+-][0-9]{2}:[0-9]{2})$",
2525
RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled);
2626

27+
private readonly bool _enforceSpecFormat;
28+
2729
/// <summary>
2830
/// Initializes a new instance of the <see cref="DateTimeType"/> class.
2931
/// </summary>
3032
public DateTimeType(
3133
string name,
3234
string? description = null,
33-
BindingBehavior bind = BindingBehavior.Explicit)
35+
BindingBehavior bind = BindingBehavior.Explicit,
36+
bool disableFormatCheck = false)
3437
: base(name, bind)
3538
{
3639
Description = description;
3740
SpecifiedBy = new Uri(_specifiedBy);
41+
_enforceSpecFormat = !disableFormatCheck;
42+
}
43+
44+
/// <summary>
45+
/// Initializes a new instance of the <see cref="DateTimeType"/> class.
46+
/// </summary>
47+
public DateTimeType(bool disableFormatCheck)
48+
: this(
49+
ScalarNames.DateTime,
50+
TypeResources.DateTimeType_Description,
51+
BindingBehavior.Implicit,
52+
disableFormatCheck: disableFormatCheck)
53+
{
3854
}
3955

4056
/// <summary>
@@ -45,7 +61,8 @@ public DateTimeType()
4561
: this(
4662
ScalarNames.DateTime,
4763
TypeResources.DateTimeType_Description,
48-
BindingBehavior.Implicit)
64+
BindingBehavior.Implicit,
65+
disableFormatCheck: false)
4966
{
5067
}
5168

@@ -163,7 +180,7 @@ private static string Serialize(DateTimeOffset value)
163180
CultureInfo.InvariantCulture);
164181
}
165182

166-
private static bool TryDeserializeFromString(
183+
private bool TryDeserializeFromString(
167184
string? serialized,
168185
[NotNullWhen(true)] out DateTimeOffset? value)
169186
{
@@ -174,7 +191,7 @@ private static bool TryDeserializeFromString(
174191
}
175192

176193
// Check format.
177-
if (!DateTimeScalarRegex.IsMatch(serialized))
194+
if (_enforceSpecFormat && !DateTimeScalarRegex.IsMatch(serialized))
178195
{
179196
value = null;
180197
return false;

src/HotChocolate/Core/test/Types.Tests/Types/Scalars/DateTimeTypeTests.cs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,7 @@ public void ParseLiteral_StringValueNode()
8585
new TimeSpan(4, 0, 0));
8686

8787
// act
88-
var dateTime = (DateTimeOffset)dateTimeType
89-
.ParseLiteral(literal);
88+
var dateTime = (DateTimeOffset)dateTimeType.ParseLiteral(literal)!;
9089

9190
// assert
9291
Assert.Equal(expectedDateTime, dateTime);
@@ -147,8 +146,7 @@ public void ParseLiteral_StringValueNode_DifferentCulture(string cultureName)
147146
new TimeSpan(4, 0, 0));
148147

149148
// act
150-
var dateTime = (DateTimeOffset)dateTimeType
151-
.ParseLiteral(literal);
149+
var dateTime = (DateTimeOffset)dateTimeType.ParseLiteral(literal)!;
152150

153151
// assert
154152
Assert.Equal(expectedDateTime, dateTime);
@@ -164,8 +162,7 @@ public void Deserialize_IsoString_DateTimeOffset()
164162
new TimeSpan(4, 0, 0));
165163

166164
// act
167-
var deserializedValue = (DateTimeOffset)dateTimeType
168-
.Deserialize("2018-06-11T08:46:14+04:00");
165+
var deserializedValue = (DateTimeOffset)dateTimeType.Deserialize("2018-06-11T08:46:14+04:00")!;
169166

170167
// assert
171168
Assert.Equal(dateTime, deserializedValue);
@@ -181,8 +178,7 @@ public void Deserialize_ZuluString_DateTimeOffset()
181178
new TimeSpan(0, 0, 0));
182179

183180
// act
184-
var deserializedValue = (DateTimeOffset)dateTimeType
185-
.Deserialize("2018-06-11T08:46:14.000Z");
181+
var deserializedValue = (DateTimeOffset)dateTimeType.Deserialize("2018-06-11T08:46:14.000Z")!;
186182

187183
// assert
188184
Assert.Equal(dateTime, deserializedValue);
@@ -203,8 +199,7 @@ public void Deserialize_IsoString_DateTime()
203199
DateTimeKind.Unspecified);
204200

205201
// act
206-
var deserializedValue = ((DateTimeOffset)dateTimeType
207-
.Deserialize("2018-06-11T08:46:14+04:00")).DateTime;
202+
var deserializedValue = ((DateTimeOffset)dateTimeType.Deserialize("2018-06-11T08:46:14+04:00")!).DateTime;
208203

209204
// assert
210205
Assert.Equal(dateTime, deserializedValue);
@@ -226,8 +221,7 @@ public void Deserialize_ZuluString_DateTime()
226221
DateTimeKind.Utc);
227222

228223
// act
229-
var deserializedValue = ((DateTimeOffset)dateTimeType
230-
.Deserialize("2018-06-11T08:46:14.000Z"));
224+
var deserializedValue = (DateTimeOffset)dateTimeType.Deserialize("2018-06-11T08:46:14.000Z")!;
231225

232226
// assert
233227
Assert.Equal(dateTime, deserializedValue.UtcDateTime);
@@ -240,7 +234,7 @@ public void Deserialize_InvalidString_To_DateTimeOffset()
240234
var type = new DateTimeType();
241235

242236
// act
243-
var success = type.TryDeserialize("abc", out var deserialized);
237+
var success = type.TryDeserialize("abc", out _);
244238

245239
// assert
246240
Assert.False(success);
@@ -415,6 +409,20 @@ public async Task Integration_DefaultDateTime()
415409
res.ToJson().MatchSnapshot();
416410
}
417411

412+
[Fact]
413+
public void DateTime_Relaxed_Format_Check()
414+
{
415+
// arrange
416+
const string s = "2011-08-30";
417+
418+
// act
419+
var dateTimeType = new DateTimeType(disableFormatCheck: true);
420+
var result = dateTimeType.Deserialize(s);
421+
422+
// assert
423+
Assert.IsType<DateTimeOffset>(result);
424+
}
425+
418426
public class DefaultDateTime
419427
{
420428
public DateTime Test => default;

0 commit comments

Comments
 (0)