Skip to content

Commit 055d630

Browse files
committed
#1030 Tweetinvi is now using DateTimeOffset instead of DateTime
1 parent 0b9bb93 commit 055d630

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+134
-58
lines changed

Tests/xUnitinvi/EndToEnd/AuthEndToEndTests.cs

+17-6
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public async Task AuthenticateWithPinCodeAsync()
9999
return;
100100

101101
// act
102-
var authenticationClient = new TwitterClient(EndToEndTestConfig.TweetinviApi.Credentials);
102+
var authenticationClient = new TwitterClient(EndToEndTestConfig.TweetinviTest.Credentials);
103103
var authenticationRequest = await authenticationClient.Auth.RequestAuthenticationUrlAsync();
104104
var authUrl = authenticationRequest.AuthorizationURL;
105105

@@ -191,7 +191,7 @@ private async Task<TwitterClient> GetAuthenticatedTwitterClientViaRedirectAsync(
191191
{
192192
var expectAuthRequestTask = AExtensions.HttpRequest(new AssertHttpRequestConfig(_logger.WriteLine))
193193
.OnPort(8042)
194-
.WithATimeoutOf(TimeSpan.FromSeconds(30))
194+
.WithATimeoutOf(TimeSpan.FromSeconds(40))
195195
.Matching(request => { return request.Url.AbsoluteUri.Contains(authRequest.AuthorizationKey); })
196196
.MustHaveHappenedAsync();
197197

@@ -265,20 +265,31 @@ private void AuthenticateOnTwitterWebsite(string authUrl, RemoteWebDriver webDri
265265

266266
Task.Delay(2000).Wait();
267267

268-
var emailTextFields = webDriver.FindElementsByClassName("js-username-field");
269-
// var emailTextFields = webDriver.FindElements(By.Name("session[username_or_email]"));
268+
// var emailTextFields = webDriver.FindElementsByClassName("js-username-field");
269+
270+
var emailTextFields = webDriver.FindElements(By.Name("session[username_or_email]"));
270271
var isTwitterPromptingForSecondAuthentication = emailTextFields.Count == 1;
271272

273+
// NOTE : If this appears to redirect to twitter.com instead of the redirect page
274+
// It means that Twitter detected strange action. Need to authenticate and share access code
275+
272276
if (isTwitterPromptingForSecondAuthentication)
273277
{
274-
var secondPasswordTextField = webDriver.FindElementByClassName("js-password-field");
275-
// var secondPasswordTextField = webDriver.FindElement(By.Name("session[password]"));
278+
// var secondPasswordTextField = webDriver.FindElementByClassName("js-password-field");
279+
var secondPasswordTextField = webDriver.FindElement(By.Name("session[password]"));
276280
emailTextFields[0].SendKeys(Environment.GetEnvironmentVariable("TWEETINVI_EMAIL"));
277281
secondPasswordTextField.SendKeys(Environment.GetEnvironmentVariable("TWEETINVI_PASS"));
278282
secondPasswordTextField.Submit();
279283
new WebDriverWait(webDriver, TimeSpan.FromSeconds(10)).Until(d => ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState").Equals("complete"));
280284
}
281285

286+
var currentUrl = webDriver.Url;
287+
if (currentUrl.Contains("twitter"))
288+
{
289+
webDriver.Url = authUrl;
290+
new WebDriverWait(webDriver, TimeSpan.FromSeconds(10)).Until(d => ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState").Equals("complete"));
291+
}
292+
282293
_logger.WriteLine($"{DateTime.Now.ToLongTimeString()} - authentication completed");
283294
}
284295

Tests/xUnitinvi/EndToEnd/StreamEndToEndTests.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public async Task FilteredStream_UrlMatching()
151151
}
152152

153153
Assert.Equal(matchedTweetEvent.MatchOn, MatchOn.URLEntities);
154-
Assert.True(matchedTweetEvent.MatchOn == MatchOn.URLEntities|| matchedTweetEvent.QuotedTweetMatchOn == MatchOn.URLEntities);
154+
Assert.True(matchedTweetEvent.MatchOn == MatchOn.URLEntities || matchedTweetEvent.QuotedTweetMatchOn == MatchOn.URLEntities);
155155

156156
await Task.Delay(TimeSpan.FromSeconds(10)); // this is for preventing Enhance Your Calm message from Twitter
157157
}
@@ -191,7 +191,7 @@ public async Task FilteredStream_UserMentionsMatching()
191191
throw new TimeoutException();
192192
}
193193

194-
Assert.True(matchedTweetEvent.MatchOn == (MatchOn.TweetText | MatchOn.UserMentionEntities) || matchedTweetEvent.QuotedTweetMatchOn == (MatchOn.TweetText | MatchOn.UserMentionEntities));
194+
Assert.Equal(matchedTweetEvent.MatchOn | matchedTweetEvent.QuotedTweetMatchOn | matchedTweetEvent.RetweetMatchOn, MatchOn.TweetText | MatchOn.UserMentionEntities);
195195

196196
await Task.Delay(TimeSpan.FromSeconds(20)); // this is for preventing Enhance Your Calm message from Twitter
197197
}
@@ -232,7 +232,7 @@ public async Task FilteredStream_HashtagsMatching()
232232
throw new TimeoutException();
233233
}
234234

235-
Assert.True(matchedTweetEvent.MatchOn == (MatchOn.TweetText | MatchOn.HashTagEntities) || matchedTweetEvent.QuotedTweetMatchOn == (MatchOn.TweetText | MatchOn.HashTagEntities));
235+
Assert.Equal(matchedTweetEvent.MatchOn | matchedTweetEvent.QuotedTweetMatchOn | matchedTweetEvent.RetweetMatchOn, MatchOn.TweetText | MatchOn.HashTagEntities);
236236

237237
await Task.Delay(TimeSpan.FromSeconds(10)); // this is for preventing Enhance Your Calm message from Twitter
238238
}
@@ -274,7 +274,7 @@ public async Task FilteredStream_CurrencyMatching()
274274
throw new TimeoutException();
275275
}
276276

277-
Assert.Equal(matchedTweetEvent.MatchOn, MatchOn.TweetText | MatchOn.SymbolEntities);
277+
Assert.Equal(matchedTweetEvent.MatchOn | matchedTweetEvent.RetweetMatchOn, MatchOn.TweetText | MatchOn.SymbolEntities);
278278

279279
await Task.Delay(TimeSpan.FromSeconds(10)); // this is for preventing Enhance Your Calm message from Twitter
280280
}

Tests/xUnitinvi/Streams/AccountActivityStreamTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public void TweetDeletedRaised()
8080
Assert.Equal(eventsReceived[0].UserId, 3198576760);
8181
Assert.Equal(eventsReceived[0].TweetId, 601430178305220608);
8282
var time = TimeSpan.FromMilliseconds(1432228155593);
83-
Assert.Equal(eventsReceived[0].EventDate, new DateTime(1970, 1, 1) + time);
83+
Assert.Equal(eventsReceived[0].EventDate, new DateTime(1970, 1, 1, 0, 0, 0 , DateTimeKind.Utc) + time);
8484
}
8585

8686
[Fact]

src/Tweetinvi.Controllers/Messages/MessageQueryGenerator.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Net.Http;
1+
using System;
2+
using System.Net.Http;
23
using System.Text;
34
using Tweetinvi.Controllers.Properties;
45
using Tweetinvi.Controllers.Shared;
@@ -85,6 +86,7 @@ private ICreateMessageDTO GetPublishMessageBody(IPublishMessageParameters parame
8586
MessageEvent = new MessageEventDTO
8687
{
8788
Type = EventType.MessageCreate,
89+
CreatedAt = new DateTimeOffset(2000, 11, 22, 0,0,0, TimeSpan.Zero),
8890
MessageCreate = new MessageCreateDTO
8991
{
9092
Target = new MessageCreateTargetDTO

src/Tweetinvi.Core/Core/DTO/Events/MessageEventDTO.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class MessageEventDTO : IMessageEventDTO
1818

1919
[JsonProperty("created_timestamp")]
2020
[JsonConverter(typeof(JsonPropertyConverterRepository))]
21-
public DateTime CreatedAt { get; set; }
21+
public DateTimeOffset CreatedAt { get; set; }
2222

2323
[JsonProperty("initiated_via")]
2424
[JsonConverter(typeof(JsonPropertyConverterRepository))]

src/Tweetinvi.Core/Core/DTO/SavedSearchDTO.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ public class SavedSearchDTO : ISavedSearchDTO
2121

2222
[JsonProperty("created_at")]
2323
[JsonConverter(typeof(JsonPropertyConverterRepository))]
24-
public DateTime CreatedAt { get; set; }
24+
public DateTimeOffset CreatedAt { get; set; }
2525
}
2626
}

src/Tweetinvi.Core/Core/DTO/TweetDTO.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ public class TweetDTO : ITweetDTO
5757
public ITweetEntities Entities { get; set; }
5858

5959
[JsonProperty("created_at")]
60-
[JsonConverter(typeof(JsonTwitterDateTimeConverter))]
61-
public DateTime CreatedAt { get; set; }
60+
[JsonConverter(typeof(JsonTwitterDateTimeOffsetConverter))]
61+
public DateTimeOffset CreatedAt { get; set; }
6262

6363
[JsonProperty("truncated")]
6464
public bool Truncated { get; set; }

src/Tweetinvi.Core/Core/DTO/TwitterListDTO.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ public class TwitterListDTO : ITwitterListDTO
3434
public IUserDTO Owner { get; set; }
3535

3636
[JsonProperty("created_at")]
37-
[JsonConverter(typeof(JsonTwitterDateTimeConverter))]
38-
public DateTime CreatedAt { get; set; }
37+
[JsonConverter(typeof(JsonTwitterDateTimeOffsetConverter))]
38+
public DateTimeOffset CreatedAt { get; set; }
3939

4040
[JsonProperty("uri")]
4141
public string Uri { get; set; }

src/Tweetinvi.Core/Core/DTO/UploadedMediaInfo.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public UploadedMediaInfo()
1313
}
1414

1515
[JsonIgnore]
16-
public DateTime CreatedDate { get; }
16+
public DateTimeOffset CreatedDate { get; }
1717

1818
[JsonProperty("media_id")]
1919
public long MediaId { get; set; }

src/Tweetinvi.Core/Core/DTO/UserDTO.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ public class UserDTO : UserIdentifierDTO, IUserDTO
2222
public string Description { get; set; }
2323

2424
[JsonProperty("created_at")]
25-
[JsonConverter(typeof(JsonTwitterDateTimeConverter))]
26-
public DateTime CreatedAt { get; set; }
25+
[JsonConverter(typeof(JsonTwitterDateTimeOffsetConverter))]
26+
public DateTimeOffset CreatedAt { get; set; }
2727

2828
[JsonProperty("location")]
2929
public string Location { get; set; }

src/Tweetinvi.Core/Core/DTO/Webhooks/WebhookDTO.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public Uri Uri
2929
public bool Valid { get; set; }
3030

3131
[JsonProperty("created_timestamp")]
32-
[JsonConverter(typeof(JsonTwitterDateTimeConverter), "yyyy-MM-dd HH:mm:ss zzzz")]
33-
public DateTime CreatedAt { get; set; }
32+
[JsonConverter(typeof(JsonTwitterDateTimeOffsetConverter), "yyyy-MM-dd HH:mm:ss zzzz")]
33+
public DateTimeOffset CreatedAt { get; set; }
3434
}
3535
}

src/Tweetinvi.Core/Core/Exceptions/ITwitterException.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public interface ITwitterException
1111
string URL { get; }
1212
int StatusCode { get; }
1313
string TwitterDescription { get; }
14-
DateTime CreationDate { get; }
14+
DateTimeOffset CreationDate { get; }
1515
ITwitterExceptionInfo[] TwitterExceptionInfos { get; }
1616
ITwitterQuery TwitterQuery { get; }
1717
}

src/Tweetinvi.Core/Core/JsonConverters/JsonPropertyConverterRepository.cs

+2
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,15 @@ private static void IntializeClassicalTypesConverters()
4646
var nullableIntegerConverter = new JsonTwitterNullableConverter<int>();
4747
var nullableDoubleConverter = new JsonTwitterNullableConverter<double>();
4848
var dateTimeConverter = new JsonTwitterDateTimeConverter();
49+
var dateTimeOffsetConverter = new JsonTwitterDateTimeOffsetConverter();
4950

5051
JsonConverters.Add(typeof(bool), nullableBoolConverter);
5152
JsonConverters.Add(typeof(long), nullableLongConverter);
5253
JsonConverters.Add(typeof(long?), nullableLongConverter);
5354
JsonConverters.Add(typeof(int), nullableIntegerConverter);
5455
JsonConverters.Add(typeof(double), nullableDoubleConverter);
5556
JsonConverters.Add(typeof(DateTime), dateTimeConverter);
57+
JsonConverters.Add(typeof(DateTimeOffset), dateTimeOffsetConverter);
5658
}
5759

5860
private static void InitializeTweetinviObjectConverters()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System;
2+
using System.Globalization;
3+
using Newtonsoft.Json;
4+
using Newtonsoft.Json.Converters;
5+
6+
namespace Tweetinvi.Core.JsonConverters
7+
{
8+
public class JsonTwitterDateTimeOffsetConverter : DateTimeConverterBase
9+
{
10+
private readonly string _format;
11+
12+
public JsonTwitterDateTimeOffsetConverter() : this("ddd MMM dd HH:mm:ss zzzz yyyy")
13+
{
14+
}
15+
16+
// ReSharper disable once MemberCanBePrivate.Global -- This is used by JsonConverters
17+
public JsonTwitterDateTimeOffsetConverter(string format)
18+
{
19+
_format = format;
20+
}
21+
22+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
23+
{
24+
serializer.Serialize(writer, value);
25+
}
26+
27+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
28+
{
29+
if (reader.Value is DateTimeOffset)
30+
{
31+
return reader.Value;
32+
}
33+
34+
if (reader.Value is DateTime)
35+
{
36+
return new DateTimeOffset((DateTime)reader.Value);
37+
}
38+
39+
var datetimeStr = reader.Value as string;
40+
DateTimeOffset datetime;
41+
42+
// Some endpoints now return a UNIX epoch (in milliseconds) as the timestamp, so check for that
43+
if (long.TryParse(datetimeStr, out long epoch))
44+
{
45+
var dtOffset = DateTimeOffset.FromUnixTimeMilliseconds(epoch);
46+
datetime = dtOffset.LocalDateTime;
47+
}
48+
else // Otherwise it's a formatted string
49+
{
50+
datetime = DateTimeOffset.ParseExact(datetimeStr, _format, CultureInfo.InvariantCulture);
51+
}
52+
53+
return datetime;
54+
}
55+
56+
public override bool CanConvert(Type objectType)
57+
{
58+
return objectType == typeof(DateTimeOffset) || objectType == typeof(DateTimeOffset?);
59+
}
60+
}
61+
}

src/Tweetinvi.Core/Core/Models/CredentialsRateLimits.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public CredentialsRateLimits(CredentialsRateLimitsDTO credentialsRateLimitsDTO)
1717
CredentialsRateLimitsDTO = credentialsRateLimitsDTO;
1818
}
1919

20-
public DateTime CreatedAt { get; }
20+
public DateTimeOffset CreatedAt { get; }
2121

2222
public string RateLimitContext
2323
{

src/Tweetinvi.Core/Core/Models/EndpointRateLimit.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public double ResetDateTimeInSeconds
6262
/// DateTime when the endpoint rate limit will be reset.
6363
/// </summary>
6464
[JsonIgnore]
65-
public DateTime ResetDateTime { get; private set; }
65+
public DateTimeOffset ResetDateTime { get; private set; }
6666

6767
public bool IsCustomHeaderRateLimit { get; set; }
6868

src/Tweetinvi.Core/Core/Models/GetTrendsAtResult.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ public class GetTrendsAtResult : IGetTrendsAtResult
99
{
1010
[JsonProperty("as_of")]
1111
[JsonConverter(typeof(JsonPropertyConverterRepository))]
12-
public DateTime AsOf { get; set; }
12+
public DateTimeOffset AsOf { get; set; }
1313

1414
[JsonProperty("created_at")]
1515
[JsonConverter(typeof(JsonPropertyConverterRepository))]
16-
public DateTime CreatedAt { get; set; }
16+
public DateTimeOffset CreatedAt { get; set; }
1717

1818
[JsonProperty("locations")]
1919
public IWoeIdLocation[] WoeIdLocations { get; set; }

src/Tweetinvi.Core/Core/Models/Message.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public IApp App
4545

4646
public long Id => MessageEventDTO.Id;
4747

48-
public DateTime CreatedAt => MessageEventDTO.CreatedAt;
48+
public DateTimeOffset CreatedAt => MessageEventDTO.CreatedAt;
4949

5050
public long SenderId => MessageEventDTO.MessageCreate.SenderId;
5151

src/Tweetinvi.Core/Core/Models/SavedSearch.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,6 @@ public string Query
3535
set => _savedSearchDTO.Query = value;
3636
}
3737

38-
public DateTime CreatedAt => _savedSearchDTO.CreatedAt;
38+
public DateTimeOffset CreatedAt => _savedSearchDTO.CreatedAt;
3939
}
4040
}

src/Tweetinvi.Core/Core/Models/Tweet.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public ICoordinates Coordinates
145145

146146
public ITweetIdentifier CurrentUserRetweetIdentifier => _tweetDTO.CurrentUserRetweetIdentifier;
147147

148-
public DateTime CreatedAt => _tweetDTO.CreatedAt;
148+
public DateTimeOffset CreatedAt => _tweetDTO.CreatedAt;
149149

150150
public string Source
151151
{

src/Tweetinvi.Core/Core/Models/TwitterList.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public ITwitterListDTO TwitterListDTO
4343
public string Name => _twitterListDTO.Name;
4444
public string FullName => _twitterListDTO.FullName;
4545
public IUser Owner => _owner;
46-
public DateTime CreatedAt => _twitterListDTO.CreatedAt;
46+
public DateTimeOffset CreatedAt => _twitterListDTO.CreatedAt;
4747
public string Uri => _twitterListDTO.Uri;
4848
public string Description => _twitterListDTO.Description;
4949
public bool Following => _twitterListDTO.Following;

src/Tweetinvi.Core/Core/Models/User.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public string ScreenName
5151

5252
public ITweetDTO Status => UserDTO.Status;
5353

54-
public DateTime CreatedAt => UserDTO.CreatedAt;
54+
public DateTimeOffset CreatedAt => UserDTO.CreatedAt;
5555

5656
public string Location => UserDTO.Location;
5757

src/Tweetinvi.Core/Core/Models/Webhook.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public Webhook(IWebhookDTO dto)
1818
public string Id => WebhookDTO.Id;
1919
public string Url => WebhookDTO.Url;
2020
public bool Valid => WebhookDTO.Valid;
21-
public DateTime CreatedAt => WebhookDTO.CreatedAt;
21+
public DateTimeOffset CreatedAt => WebhookDTO.CreatedAt;
2222
public Uri Uri => WebhookDTO.Uri;
2323
}
2424
}

src/Tweetinvi.Core/Public/Events/AccountActivity/AccountActivityEvent.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public AccountActivityEvent()
1313
}
1414

1515
public long AccountUserId { get; set; }
16-
public DateTime EventDate { get; set; }
16+
public DateTimeOffset EventDate { get; set; }
1717
public string Json { get; set; }
1818
}
1919

src/Tweetinvi.Core/Public/Events/AccountActivity/BaseAccountActivityEventArgs.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ protected BaseAccountActivityEventArgs(AccountActivityEvent activityEvent)
1919
/// <summary>
2020
/// The date when the event has occurred
2121
/// </summary>
22-
public DateTime EventDate { get; }
22+
public DateTimeOffset EventDate { get; }
2323

2424
/// <summary>
2525
/// The full json message from which this event has been extracted out.

src/Tweetinvi.Core/Public/Events/AfterExecutingQueryEventArgs.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public AfterExecutingQueryEventArgs(
3434
/// <summary>
3535
/// Exact DateTime when the request completed.
3636
/// </summary>
37-
public DateTime CompletedDateTime { get; set; }
37+
public DateTimeOffset CompletedDateTime { get; set; }
3838

3939
/// <summary>
4040
/// Whether the request has been successful.

src/Tweetinvi.Core/Public/Events/QueryAwaitingEventArgs.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public QueryAwaitingEventArgs(
2323
public string Query => _query;
2424
public IEndpointRateLimit QueryRateLimit => _queryRateLimit;
2525
public IReadOnlyTwitterCredentials Credentials => _twitterCredentials;
26-
public DateTime ResetDateTime => _queryRateLimit.ResetDateTime;
26+
public DateTimeOffset ResetDateTime => _queryRateLimit.ResetDateTime;
2727
public int ResetInMilliseconds => (int)_queryRateLimit.ResetDateTimeInMilliseconds;
2828
}
2929
}

0 commit comments

Comments
 (0)