Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 858c0c2

Browse files
author
Andreia Gaita
authored
Merge pull request #838 from github-for-unity/fixes/datetime-format-string
Fixing date parsing for VSTS repos
2 parents 59c5a8c + b75e0f7 commit 858c0c2

File tree

4 files changed

+89
-12
lines changed

4 files changed

+89
-12
lines changed

src/GitHub.Api/Helpers/Constants.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,22 @@ static class Constants
1414
public const string Iso8601Format = @"yyyy-MM-dd\THH\:mm\:ss.fffzzz";
1515
public const string Iso8601FormatZ = @"yyyy-MM-dd\THH\:mm\:ss\Z";
1616
public static readonly string[] Iso8601Formats = {
17+
Iso8601Format,
1718
Iso8601FormatZ,
1819
@"yyyy-MM-dd\THH\:mm\:ss.fffffffzzz",
19-
Iso8601Format,
20+
@"yyyy-MM-dd\THH\:mm\:ss.ffffffzzz",
21+
@"yyyy-MM-dd\THH\:mm\:ss.fffffzzz",
22+
@"yyyy-MM-dd\THH\:mm\:ss.ffffzzz",
23+
@"yyyy-MM-dd\THH\:mm\:ss.ffzzz",
24+
@"yyyy-MM-dd\THH\:mm\:ss.fzzz",
2025
@"yyyy-MM-dd\THH\:mm\:sszzz",
26+
@"yyyy-MM-dd\THH\:mm\:ss.fffffff\Z",
27+
@"yyyy-MM-dd\THH\:mm\:ss.ffffff\Z",
28+
@"yyyy-MM-dd\THH\:mm\:ss.fffff\Z",
29+
@"yyyy-MM-dd\THH\:mm\:ss.ffff\Z",
30+
@"yyyy-MM-dd\THH\:mm\:ss.fff\Z",
31+
@"yyyy-MM-dd\THH\:mm\:ss.ff\Z",
32+
@"yyyy-MM-dd\THH\:mm\:ss.f\Z",
2133
};
2234
public const DateTimeStyles DateTimeStyle = DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal;
2335
public const string SkipVersionKey = "SkipVersion";

src/GitHub.Api/Helpers/SimpleJson.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,17 +1250,7 @@ class PocoJsonSerializerStrategy : IJsonSerializerStrategy
12501250
internal static readonly Type[] EmptyTypes = new Type[0];
12511251
internal static readonly Type[] ArrayConstructorParameterTypes = new Type[] { typeof(int) };
12521252

1253-
private static readonly string[] Iso8601Format = new string[]
1254-
{
1255-
@"yyyy-MM-dd\THH\:mm\:sszzz",
1256-
@"yyyy-MM-dd\THH\:mm\:ss.fffffffzzz",
1257-
@"yyyy-MM-dd\THH\:mm\:ss.fffzzz",
1258-
@"yyyy-MM-dd\THH\:mm\:ss\Z",
1259-
@"yyyy-MM-dd\THH:mm:ss.fffffffzzz",
1260-
@"yyyy-MM-dd\THH:mm:ss.fffzzz",
1261-
@"yyyy-MM-dd\THH:mm:sszzz",
1262-
@"yyyy-MM-dd\THH:mm:ss\Z",
1263-
};
1253+
private static readonly string[] Iso8601Format = Constants.Iso8601Formats;
12641254

12651255
public PocoJsonSerializerStrategy()
12661256
{

src/tests/UnitTests/IO/LockOutputProcessorTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,25 @@ public void ShouldParseTwoLocksFormat()
6868
new GitLock("2f9cfde9c159d50e235cc1402c3e534b0bf2198afb20760697a5f9b07bf04fb3", "somezip.zip".ToNPath(), new GitUser("GitHub User", ""), now)
6969
};
7070

71+
AssertProcessOutput(output, expected);
72+
}
73+
74+
[Test]
75+
public void ShouldParseVSTSLocksFormat()
76+
{
77+
var nowString = DateTimeOffset.UtcNow.ToString(@"yyyy-MM-dd\THH\:mm\:ss.ff\Z");
78+
var now = DateTimeOffset.ParseExact(nowString, Constants.Iso8601Formats, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
79+
var output = new[]
80+
{
81+
$@"[{{""id"":""7"" ,""path"":""Assets/Main.unity"",""owner"":{{""name"":""GitHub User""}},""locked_at"":""{nowString}""}}]",
82+
string.Empty,
83+
"1 lock(s) matched query.",
84+
null
85+
};
86+
87+
var expected = new[] {
88+
new GitLock("7", "Assets/Main.unity".ToNPath(), new GitUser("GitHub User", ""), now),
89+
};
7190

7291
AssertProcessOutput(output, expected);
7392
}

src/tests/UnitTests/Primitives/SerializationTests.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,41 @@ namespace UnitTests.Primitives
1111
[TestFixture]
1212
class SerializationTests
1313
{
14+
[TestCase("2018-05-01T12:04:29.1234567-02:00", "2018-05-01T14:04:29.123+00:00")]
15+
[TestCase("2018-05-01T12:04:29.123456-02:00", "2018-05-01T14:04:29.123+00:00")]
16+
[TestCase("2018-05-01T12:04:29.12345-02:00", "2018-05-01T14:04:29.123+00:00")]
17+
[TestCase("2018-05-01T12:04:29.1234-02:00", "2018-05-01T14:04:29.123+00:00")]
18+
[TestCase("2018-05-01T12:04:29.123-02:00", "2018-05-01T14:04:29.123+00:00")]
19+
[TestCase("2018-05-01T12:04:29.12-02:00", "2018-05-01T14:04:29.120+00:00")]
20+
[TestCase("2018-05-01T12:04:29.1-02:00", "2018-05-01T14:04:29.100+00:00")]
21+
[TestCase("2018-05-01T12:04:29-02:00", "2018-05-01T14:04:29.000+00:00")]
22+
[TestCase("2018-05-01T12:04:29.1234567Z", "2018-05-01T12:04:29.123+00:00")]
23+
[TestCase("2018-05-01T12:04:29.123456Z", "2018-05-01T12:04:29.123+00:00")]
24+
[TestCase("2018-05-01T12:04:29.12345Z", "2018-05-01T12:04:29.123+00:00")]
25+
[TestCase("2018-05-01T12:04:29.1234Z", "2018-05-01T12:04:29.123+00:00")]
26+
[TestCase("2018-05-01T12:04:29.123Z", "2018-05-01T12:04:29.123+00:00")]
27+
[TestCase("2018-05-01T12:04:29.12Z", "2018-05-01T12:04:29.120+00:00")]
28+
[TestCase("2018-05-01T12:04:29.1Z", "2018-05-01T12:04:29.100+00:00")]
29+
[TestCase("2018-05-01T12:04:29Z", "2018-05-01T12:04:29.000+00:00")]
30+
public void FromLocalStringToUniversalDateTimeOffset(string input, string expected)
31+
{
32+
var dtInput = DateTimeOffset.ParseExact(input, Constants.Iso8601Formats, CultureInfo.InvariantCulture, Constants.DateTimeStyle);
33+
var output = dtInput.ToUniversalTime().ToString(Constants.Iso8601Format);
34+
Assert.AreEqual(expected, output);
35+
36+
var json = $@"{{""date"":""{input}""}}";
37+
Assert.DoesNotThrow(() => json.FromJson<ADateTimeOffset>(lowerCase: true));
38+
}
39+
40+
[Test]
41+
public void JsonSerializationUsesKnownFormat()
42+
{
43+
var now = DateTimeOffset.Now;
44+
var output = new ADateTimeOffset { Date = now };
45+
var json = output.ToJson(lowerCase: true);
46+
Assert.AreEqual($@"{{""date"":""{ now.ToUniversalTime().ToString(Constants.Iso8601Format, CultureInfo.InvariantCulture) }""}}", json);
47+
}
48+
1449
[Test]
1550
public void DateTimeSerializationRoundTrip()
1651
{
@@ -37,6 +72,27 @@ public void DateTimeSerializationRoundTrip()
3772
Assert.AreEqual(dt3, dt4);
3873
}
3974

75+
[Test]
76+
public void DateTimeSerializationRoundTripFormatPointZ()
77+
{
78+
var dt1 = DateTimeOffset.ParseExact("2018-05-01T15:04:29.00Z", Constants.Iso8601Formats, CultureInfo.InvariantCulture, Constants.DateTimeStyle);
79+
var str1 = dt1.ToJson();
80+
var ret1 = str1.FromJson<DateTimeOffset>();
81+
Assert.AreEqual(dt1, ret1);
82+
83+
var dt2 = DateTimeOffset.ParseExact("2018-05-01T15:04:29Z", Constants.Iso8601Formats, CultureInfo.InvariantCulture, Constants.DateTimeStyle);
84+
var str2 = dt2.ToJson();
85+
var ret2 = str2.FromJson<DateTimeOffset>();
86+
Assert.AreEqual(dt2, ret2);
87+
88+
Assert.AreEqual(dt1, dt2);
89+
}
90+
91+
class ADateTimeOffset
92+
{
93+
public DateTimeOffset Date;
94+
}
95+
4096
class TestData
4197
{
4298
public List<string> Things { get; set; } = new List<string>();

0 commit comments

Comments
 (0)