var rootElm = this.LoadResponseDocument("TimelineTweet_TweetTombstone.json");
var timelineTweet = new TimelineTweet(rootElm);
- Assert.True(timelineTweet.IsTombstone);
+ Assert.False(timelineTweet.IsAvailable);
var ex = Assert.Throws<WebApiException>(
() => timelineTweet.ToTwitterStatus()
);
Assert.Equal("This Post is from a suspended account. Learn more", ex.Message);
}
+
+ [Fact]
+ public void ToStatus_EmptyTweet_Test()
+ {
+ var rootElm = this.LoadResponseDocument("TimelineTweet_EmptyTweet.json");
+ var timelineTweet = new TimelineTweet(rootElm);
+
+ Assert.False(timelineTweet.IsAvailable);
+ var ex = Assert.Throws<WebApiException>(
+ () => timelineTweet.ToTwitterStatus()
+ );
+ Assert.Equal("Tweet is not available", ex.Message);
+ }
}
}
using System;
using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public XElement Element { get; }
- public bool IsTombstone
- => this.tombstoneElm != null;
+ public bool IsAvailable
+ => this.resultElm != null && !this.IsTombstoneResult(this.resultElm);
- private readonly XElement? tombstoneElm;
+ private readonly XElement? resultElm;
public TimelineTweet(XElement element)
{
throw new ArgumentException($"Invalid itemType: {typeName}", nameof(element));
this.Element = element;
- this.tombstoneElm = this.TryGetTombstoneElm();
+ this.resultElm = this.TryGetResultElm();
}
- private XElement? TryGetTombstoneElm()
- => this.Element.XPathSelectElement("tweet_results/result[__typename[text()='TweetTombstone']]");
+ private XElement? TryGetResultElm()
+ => this.Element.XPathSelectElement("tweet_results/result");
+
+ private bool IsTombstoneResult([NotNullWhen(true)]XElement? resultElm)
+ => resultElm?.Element("__typename")?.Value == "TweetTombstone";
public TwitterStatus ToTwitterStatus()
{
- this.ThrowIfTweetIsTombstone();
+ this.ThrowIfTweetIsNotAvailable();
try
{
- var resultElm = this.Element.Element("tweet_results")?.Element("result") ?? throw CreateParseError();
+ var resultElm = this.resultElm ?? throw CreateParseError();
var status = TimelineTweet.ParseTweetUnion(resultElm);
if (this.Element.Element("promotedMetadata") != null)
}
}
- public void ThrowIfTweetIsTombstone()
+ public void ThrowIfTweetIsNotAvailable()
{
- if (this.tombstoneElm == null)
+ if (this.IsAvailable)
return;
- var tombstoneText = this.tombstoneElm.XPathSelectElement("tombstone/text/text")?.Value;
+ string? tombstoneText = null;
+ if (this.IsTombstoneResult(this.resultElm))
+ tombstoneText = this.resultElm.XPathSelectElement("tombstone/text/text")?.Value;
+
var message = tombstoneText ?? "Tweet is not available";
var json = JsonUtils.JsonXmlToString(this.Element);