コード例 #1
0
        public void ProcessResults_Populates_PublicMetrics()
        {
            var tweetProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = BaseUrl2
            };

            List <TweetQuery> results = tweetProc.ProcessResults(SingleTweet);

            Assert.IsNotNull(results);
            TweetQuery tweetQuery = results.SingleOrDefault();

            Assert.IsNotNull(tweetQuery);
            List <Tweet> tweets = tweetQuery.Tweets;

            Assert.IsNotNull(tweets);
            Assert.AreEqual(1, tweets.Count);
            Tweet tweet = tweets.FirstOrDefault();

            Assert.IsNotNull(tweet);

            TweetPublicMetrics metrics = tweet.PublicMetrics;

            Assert.IsNotNull(metrics);
            Assert.AreEqual(1, metrics.RetweetCount);
            Assert.AreEqual(1, metrics.ReplyCount);
            Assert.AreEqual(1, metrics.LikeCount);
            Assert.AreEqual(0, metrics.QuoteCount);
        }
コード例 #2
0
        public void ProcessResults_WithErrors_PopulatesErrorList()
        {
            var tweetProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = "https://api.twitter.com/1.1/search/"
            };

            List <TweetQuery> results = tweetProc.ProcessResults(ErrorTweet);

            Assert.IsNotNull(results);
            TweetQuery tweetQuery = results.SingleOrDefault();

            Assert.IsNotNull(tweetQuery);
            List <TwitterError> errors = tweetQuery.Errors;

            Assert.IsNotNull(errors);
            Assert.AreEqual(1, errors.Count);
            TwitterError error = errors.FirstOrDefault();

            Assert.IsNotNull(error);
            Assert.AreEqual("Could not find tweet with ids: [1].", error.Detail);
            Assert.AreEqual("Not Found Error", error.Title);
            Assert.AreEqual("tweet", error.ResourceType);
            Assert.AreEqual("ids", error.Parameter);
            Assert.AreEqual("1", error.Value);
            Assert.AreEqual("https://api.twitter.com/2/problems/resource-not-found", error.Type);
        }
コード例 #3
0
        public void ProcessResults_ForLookup_PopulatesInputParameters()
        {
            var tweetProc = new TweetRequestProcessor <TweetQuery>()
            {
                BaseUrl     = BaseUrl2,
                Type        = TweetType.Lookup,
                Ids         = "3,7",
                Expansions  = "123",
                MediaFields = "456",
                PlaceFields = "012",
                PollFields  = "345",
                TweetFields = "678",
                UserFields  = "234"
            };

            var results = tweetProc.ProcessResults(SingleTweet);

            Assert.IsNotNull(results);
            Assert.AreEqual(1, results.Count);
            var tweetQuery = results.Single();

            Assert.IsNotNull(tweetQuery);
            Assert.AreEqual(TweetType.Lookup, tweetQuery.Type);
            Assert.AreEqual("123", tweetQuery.Expansions);
            Assert.AreEqual("3,7", tweetQuery.Ids);
            Assert.AreEqual("456", tweetQuery.MediaFields);
            Assert.AreEqual("012", tweetQuery.PlaceFields);
            Assert.AreEqual("345", tweetQuery.PollFields);
            Assert.AreEqual("678", tweetQuery.TweetFields);
            Assert.AreEqual("234", tweetQuery.UserFields);
        }
コード例 #4
0
        public void BuildUrl_WithSpacesInFields_FixesSpaces()
        {
            const string ExpectedUrl =
                BaseUrl2 + "tweets?" +
                "ids=2%2C3&" +
                "expansions=attachments.poll_ids%2Cauthor_id&" +
                "media.fields=height%2Cwidth&" +
                "place.fields=country&" +
                "poll.fields=duration_minutes%2Cend_datetime&" +
                "tweet.fields=author_id%2Ccreated_at&" +
                "user.fields=created_at%2Cverified";
            var tweetReqProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = BaseUrl2
            };
            var parameters =
                new Dictionary <string, string>
            {
                { nameof(TweetQuery.Type), TweetType.Lookup.ToString() },
                { nameof(TweetQuery.Ids), "2, 3" },
                { nameof(TweetQuery.Expansions), "attachments.poll_ids, author_id" },
                { nameof(TweetQuery.MediaFields), "height, width" },
                { nameof(TweetQuery.PlaceFields), "country" },
                { nameof(TweetQuery.PollFields), "duration_minutes, end_datetime" },
                { nameof(TweetQuery.TweetFields), "author_id, created_at" },
                { nameof(TweetQuery.UserFields), "created_at, verified" },
            };

            Request req = tweetReqProc.BuildUrl(parameters);

            Assert.AreEqual(ExpectedUrl, req.FullUrl);
        }
コード例 #5
0
        public void ProcessResults_Populates_ContextAnnotations()
        {
            var tweetProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = BaseUrl2
            };

            List <TweetQuery> results = tweetProc.ProcessResults(SingleTweet);

            Assert.IsNotNull(results);
            TweetQuery tweetQuery = results.SingleOrDefault();

            Assert.IsNotNull(tweetQuery);
            List <Tweet> tweets = tweetQuery.Tweets;

            Assert.IsNotNull(tweets);
            Assert.AreEqual(1, tweets.Count);
            Tweet tweet = tweets.FirstOrDefault();

            Assert.IsNotNull(tweet);

            List <TweetContextAnnotation> annotations = tweet.ContextAnnotations;

            Assert.IsNotNull(annotations);
            Assert.AreEqual(7, annotations.Count);
            TweetContextAnnotation annotation = annotations.First();

            Assert.IsNotNull(annotation);
            TweetContextAnnotationDetails domain = annotation.Domain;

            Assert.IsNotNull(domain);
            Assert.AreEqual("46", domain.ID);
            Assert.AreEqual("Brand Category", domain.Name);
            Assert.AreEqual("Categories within Brand Verticals that narrow down the scope of Brands", domain.Description);
        }
コード例 #6
0
        public void ProcessResults_Populates_Tweets()
        {
            var tweetProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = BaseUrl2
            };

            List <TweetQuery> results = tweetProc.ProcessResults(SingleTweet);

            Assert.IsNotNull(results);
            TweetQuery tweetQuery = results.SingleOrDefault();

            Assert.IsNotNull(tweetQuery);
            List <Tweet> tweets = tweetQuery.Tweets;

            Assert.IsNotNull(tweets);
            Assert.AreEqual(1, tweets.Count);
            Tweet tweet = tweets.FirstOrDefault();

            Assert.IsNotNull(tweet);
            Assert.AreEqual("en", tweet.Language);
            Assert.AreEqual("Thanks @github for approving sponsorship for LINQ to Twitter: https://t.co/jWeDEN07HN", tweet.Text);
            Assert.AreEqual("1305895383260782593", tweet.ID);
            Assert.AreEqual("15411837", tweet.AuthorID);
            Assert.AreEqual(DateTime.Parse("2020-09-15T15:44:56.000Z").Date, tweet.CreatedAt?.Date);
            Assert.AreEqual("1305895383260782593", tweet.ConversationID);
            Assert.IsTrue(tweet.PossiblySensitive ?? false);
            Assert.AreEqual(tweet.ReplySettings, TweetReplySettings.MentionedUsers);
        }
コード例 #7
0
        public void BuildUrl_WithNullParameters_Throws()
        {
            var tweetReqProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = BaseUrl2
            };

            L2TAssert.Throws <NullReferenceException>(() =>
            {
                tweetReqProc.BuildUrl(null);
            });
        }
コード例 #8
0
        public void ProcessResults_Handles_Response_With_No_Results()
        {
            var tweetProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = BaseUrl2
            };

            List <TweetQuery> results = tweetProc.ProcessResults(ErrorTweet);

            Assert.IsNotNull(results);
            TweetQuery tweetQuery = results.SingleOrDefault();

            Assert.IsNotNull(tweetQuery);
            List <Tweet> tweets = tweetQuery.Tweets;

            Assert.IsNull(tweets);
        }
コード例 #9
0
        public void ProcessResults_ForUserTimeline_PopulatesInputParameters()
        {
            var tweetProc = new TweetRequestProcessor <TweetQuery>()
            {
                BaseUrl         = BaseUrl2,
                Type            = TweetType.TweetsTimeline,
                ID              = "567",
                EndTime         = new DateTime(2020, 12, 31),
                Exclude         = TweetExcludes.Retweets,
                MaxResults      = 73,
                Expansions      = "123",
                MediaFields     = "456",
                PaginationToken = "567",
                PlaceFields     = "012",
                PollFields      = "345",
                SinceID         = "890",
                StartTime       = new DateTime(2020, 1, 1),
                TweetFields     = "678",
                UntilID         = "123",
                UserFields      = "234"
            };

            var results = tweetProc.ProcessResults(SingleTweet);

            Assert.IsNotNull(results);
            Assert.AreEqual(1, results.Count);
            var tweetQuery = results.Single();

            Assert.IsNotNull(tweetQuery);
            Assert.AreEqual(TweetType.TweetsTimeline, tweetQuery.Type);
            Assert.AreEqual(new DateTime(2020, 12, 31), tweetQuery.EndTime);
            Assert.AreEqual(TweetExcludes.Retweets, tweetQuery.Exclude);
            Assert.AreEqual("123", tweetQuery.Expansions);
            Assert.AreEqual("567", tweetQuery.ID);
            Assert.AreEqual(73, tweetQuery.MaxResults);
            Assert.AreEqual("456", tweetQuery.MediaFields);
            Assert.AreEqual("567", tweetQuery.PaginationToken);
            Assert.AreEqual("012", tweetQuery.PlaceFields);
            Assert.AreEqual("345", tweetQuery.PollFields);
            Assert.AreEqual("890", tweetQuery.SinceID);
            Assert.AreEqual(new DateTime(2020, 1, 1), tweetQuery.StartTime);
            Assert.AreEqual("678", tweetQuery.TweetFields);
            Assert.AreEqual("123", tweetQuery.UntilID);
            Assert.AreEqual("234", tweetQuery.UserFields);
        }
コード例 #10
0
        public void BuildUrl_ForMentionsTimeline_RequiresID()
        {
            var tweetReqProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = BaseUrl2
            };
            var parameters =
                new Dictionary <string, string>
            {
                { nameof(TweetQuery.Type), TweetType.MentionsTimeline.ToString() },
                //{ nameof(Tweet.ID), null }
            };

            ArgumentException ex =
                L2TAssert.Throws <ArgumentException>(() =>
                                                     tweetReqProc.BuildUrl(parameters));

            Assert.AreEqual(nameof(TweetQuery.ID), ex.ParamName);
        }
コード例 #11
0
        public void BuildUrl_ForUserTimeline_IncludesParameters()
        {
            const string ExpectedUrl =
                BaseUrl2 + "users/123/tweets?" +
                "end_time=2021-01-01T12%3A59%3A59Z&" +
                "exclude=replies%2Cretweets&" +
                "max_results=50&" +
                "pagination_token=456&" +
                "since_id=789&" +
                "start_time=2020-12-31T00%3A00%3A01Z&" +
                "until_id=012&" +
                "expansions=attachments.poll_ids%2Cauthor_id&" +
                "media.fields=height%2Cwidth&" +
                "place.fields=country&" +
                "poll.fields=duration_minutes%2Cend_datetime&" +
                "tweet.fields=author_id%2Ccreated_at&" +
                "user.fields=created_at%2Cverified";
            var tweetReqProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = BaseUrl2
            };
            var parameters =
                new Dictionary <string, string>
            {
                { nameof(TweetQuery.Type), TweetType.TweetsTimeline.ToString() },
                { nameof(TweetQuery.EndTime), new DateTime(2021, 1, 1, 12, 59, 59).ToString() },
                { nameof(TweetQuery.Exclude), TweetExcludes.All },
                { nameof(TweetQuery.Expansions), "attachments.poll_ids,author_id" },
                { nameof(TweetQuery.ID), "123" },
                { nameof(TweetQuery.MaxResults), "50" },
                { nameof(TweetQuery.MediaFields), "height,width" },
                { nameof(TweetQuery.PaginationToken), "456" },
                { nameof(TweetQuery.PlaceFields), "country" },
                { nameof(TweetQuery.PollFields), "duration_minutes,end_datetime" },
                { nameof(TweetQuery.SinceID), "789" },
                { nameof(TweetQuery.StartTime), new DateTime(2020, 12, 31, 0, 0, 1).ToString() },
                { nameof(TweetQuery.TweetFields), "author_id,created_at" },
                { nameof(TweetQuery.UntilID), "012" },
                { nameof(TweetQuery.UserFields), "created_at,verified" },
            };

            Request req = tweetReqProc.BuildUrl(parameters);

            Assert.AreEqual(ExpectedUrl, req.FullUrl);
        }
コード例 #12
0
        public void GetParametersTest()
        {
            var target = new TweetRequestProcessor <TweetQuery>();

            Expression <Func <TweetQuery, bool> > expression =
                tweet =>
                tweet.Type == TweetType.Lookup &&
                tweet.Ids == "2,3" &&
                tweet.Expansions == "attachments.poll_ids,author_id" &&
                tweet.MediaFields == "height,width" &&
                tweet.PlaceFields == "country" &&
                tweet.PollFields == "duration_minutes,end_datetime" &&
                tweet.TweetFields == "author_id,created_at" &&
                tweet.UserFields == "created_at,verified";

            var lambdaExpression = expression as LambdaExpression;

            Dictionary <string, string> queryParams = target.GetParameters(lambdaExpression);

            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.Type), ((int)TweetType.Lookup).ToString(CultureInfo.InvariantCulture))));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.Ids), "2,3")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.Expansions), "attachments.poll_ids,author_id")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.MediaFields), "height,width")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.PlaceFields), "country")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.PollFields), "duration_minutes,end_datetime")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.TweetFields), "author_id,created_at")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.UserFields), "created_at,verified")));
        }
コード例 #13
0
        public void ProcessResults_Populates_Includes()
        {
            var tweetProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = BaseUrl2
            };

            List <TweetQuery> results = tweetProc.ProcessResults(SingleTweet);

            Assert.IsNotNull(results);
            TweetQuery tweetQuery = results.SingleOrDefault();

            Assert.IsNotNull(tweetQuery);
            TwitterInclude includes = tweetQuery.Includes;

            Assert.IsNotNull(includes);
            List <TwitterUser> users = includes.Users;

            Assert.IsNotNull(users);
            Assert.AreEqual(2, users.Count);
        }
コード例 #14
0
        public void ProcessResults_Populates_Entities()
        {
            var tweetProc = new TweetRequestProcessor <TweetQuery> {
                BaseUrl = BaseUrl2
            };

            List <TweetQuery> results = tweetProc.ProcessResults(SingleTweet);

            Assert.IsNotNull(results);
            TweetQuery tweetQuery = results.SingleOrDefault();

            Assert.IsNotNull(tweetQuery);

            List <Tweet> tweets = tweetQuery.Tweets;

            Assert.IsNotNull(tweets);
            Assert.AreEqual(1, tweets.Count);
            Tweet tweet = tweets.FirstOrDefault();

            Assert.IsNotNull(tweet);
            TweetEntities entities = tweet.Entities;

            Assert.IsNotNull(entities);

            TweetEntityAnnotation annotation = entities?.Annotations?.FirstOrDefault();

            Assert.IsNotNull(annotation);
            Assert.AreEqual(53, annotation.Start);
            Assert.AreEqual(59, annotation.End);
            Assert.AreEqual(0.5865f, annotation.Probability);
            Assert.AreEqual("Organization", annotation.Type);
            Assert.AreEqual("Twitter", annotation.NormalizedText);

            TweetEntityMention mention = entities?.Mentions?.FirstOrDefault();

            Assert.IsNotNull(mention);
            Assert.AreEqual(7, mention.Start);
            Assert.AreEqual(14, mention.End);
            Assert.AreEqual("github", mention.Username);

            TweetEntityUrl url = entities?.Urls?.FirstOrDefault();

            Assert.IsNotNull(url);
            Assert.AreEqual(62, url.Start);
            Assert.AreEqual(85, url.End);
            Assert.AreEqual("https://t.co/jWeDEN07HN", url.Url);
            Assert.AreEqual("http://bit.ly/1b2wrHb", url.ExpandedUrl);
            Assert.AreEqual("bit.ly/1b2wrHb", url.DisplayUrl);
            Assert.AreEqual(200, url.Status);
            Assert.AreEqual("JoeMayo/LinqToTwitter", url.Title);
            Assert.AreEqual("LINQ Provider for the Twitter API (Twitter Library) - JoeMayo/LinqToTwitter", url.Description);
            Assert.AreEqual("https://github.com/JoeMayo/LinqToTwitter", url.UnwoundUrl);
            List <TweetEntityImage> images = url.Images;

            Assert.IsNotNull(images);
            Assert.AreEqual(2, images.Count);
            TweetEntityImage image = images.First();

            Assert.AreEqual("https://pbs.twimg.com/news_img/1321470110356287488/pWdfwBk5?format=png&name=orig", image.Url);
            Assert.AreEqual(100, image.Width);
            Assert.AreEqual(100, image.Height);
        }
コード例 #15
0
        public void GetParametersTest()
        {
            var target = new TweetRequestProcessor <TweetQuery>();

            var endTime   = new DateTime(2020, 8, 30);
            var startTime = new DateTime(2020, 8, 1);
            Expression <Func <TweetQuery, bool> > expression =
                tweet =>
                tweet.Type == TweetType.Lookup &&
                tweet.EndTime == endTime &&
                tweet.Exclude == TweetExcludes.Replies &&
                tweet.Ids == "2,3" &&
                tweet.ID == "123" &&
                tweet.Expansions == "attachments.poll_ids,author_id" &&
                tweet.MaxResults == 99 &&
                tweet.MediaFields == "height,width" &&
                tweet.PaginationToken == "456" &&
                tweet.PlaceFields == "country" &&
                tweet.PollFields == "duration_minutes,end_datetime" &&
                tweet.SinceID == "789" &&
                tweet.StartTime == startTime &&
                tweet.TweetFields == "author_id,created_at" &&
                tweet.UntilID == "012" &&
                tweet.UserFields == "created_at,verified";

            var lambdaExpression = expression as LambdaExpression;

            Dictionary <string, string> queryParams = target.GetParameters(lambdaExpression);

            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.Type), ((int)TweetType.Lookup).ToString(CultureInfo.InvariantCulture))));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.EndTime), "08/30/2020 00:00:00")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.Exclude), TweetExcludes.Replies)));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.Ids), "2,3")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.ID), "123")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.Expansions), "attachments.poll_ids,author_id")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.MaxResults), "99")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.MediaFields), "height,width")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.PaginationToken), "456")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.PlaceFields), "country")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.PollFields), "duration_minutes,end_datetime")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.SinceID), "789")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.StartTime), "08/01/2020 00:00:00")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.TweetFields), "author_id,created_at")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.UntilID), "012")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>(nameof(TweetQuery.UserFields), "created_at,verified")));
        }