1 // OpenTween - Client of Twitter
2 // Copyright (c) 2016 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3 // All rights reserved.
5 // This file is part of OpenTween.
7 // This program is free software; you can redistribute it and/or modify it
8 // under the terms of the GNU General Public License as published by the Free
9 // Software Foundation; either version 3 of the License, or (at your option)
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 // You should have received a copy of the GNU General Public License along
18 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
19 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 // Boston, MA 02110-1301, USA.
23 using System.Collections.Generic;
26 using System.Net.Http;
27 using System.Reflection;
28 using System.Runtime.InteropServices;
30 using System.Threading.Tasks;
32 using OpenTween.Api.DataModel;
33 using OpenTween.Connection;
36 namespace OpenTween.Api
38 public class TwitterApiTest
40 public TwitterApiTest()
41 => this.MyCommonSetup();
43 private void MyCommonSetup()
45 var mockAssembly = new Mock<_Assembly>();
46 mockAssembly.Setup(m => m.GetName()).Returns(new AssemblyName("OpenTween"));
48 MyCommon.EntryAssembly = mockAssembly.Object;
52 public void Initialize_Test()
54 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
55 Assert.Null(twitterApi.ApiConnection);
57 twitterApi.Initialize("*** AccessToken ***", "*** AccessSecret ***", userId: 100L, screenName: "hogehoge");
59 Assert.IsType<TwitterApiConnection>(twitterApi.ApiConnection);
61 var apiConnection = (TwitterApiConnection)twitterApi.ApiConnection!;
62 var credential = Assert.IsType<TwitterCredentialOAuth1>(apiConnection.Credential);
63 Assert.Equal("*** AccessToken ***", credential.Token);
64 Assert.Equal("*** AccessSecret ***", credential.TokenSecret);
66 Assert.Equal(100L, twitterApi.CurrentUserId);
67 Assert.Equal("hogehoge", twitterApi.CurrentScreenName);
69 // 複数回 Initialize を実行した場合は新たに TwitterApiConnection が生成される
70 twitterApi.Initialize("*** AccessToken2 ***", "*** AccessSecret2 ***", userId: 200L, screenName: "foobar");
72 var oldApiConnection = apiConnection;
73 Assert.True(oldApiConnection.IsDisposed);
75 Assert.IsType<TwitterApiConnection>(twitterApi.ApiConnection);
77 apiConnection = (TwitterApiConnection)twitterApi.ApiConnection!;
78 credential = Assert.IsType<TwitterCredentialOAuth1>(apiConnection.Credential);
79 Assert.Equal("*** AccessToken2 ***", credential.Token);
80 Assert.Equal("*** AccessSecret2 ***", credential.TokenSecret);
82 Assert.Equal(200L, twitterApi.CurrentUserId);
83 Assert.Equal("foobar", twitterApi.CurrentScreenName);
87 public async Task StatusesHomeTimeline_Test()
89 var mock = new Mock<IApiConnectionLegacy>();
91 x.GetAsync<TwitterStatus[]>(
92 new Uri("statuses/home_timeline.json", UriKind.Relative),
93 new Dictionary<string, string>
95 { "include_entities", "true" },
96 { "include_ext_alt_text", "true" },
97 { "tweet_mode", "extended" },
100 { "since_id", "100" },
102 "/statuses/home_timeline")
104 .ReturnsAsync(Array.Empty<TwitterStatus>());
106 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
107 twitterApi.ApiConnection = mock.Object;
109 await twitterApi.StatusesHomeTimeline(200, maxId: new("900"), sinceId: new("100"));
115 public async Task StatusesMentionsTimeline_Test()
117 var mock = new Mock<IApiConnectionLegacy>();
119 x.GetAsync<TwitterStatus[]>(
120 new Uri("statuses/mentions_timeline.json", UriKind.Relative),
121 new Dictionary<string, string>
123 { "include_entities", "true" },
124 { "include_ext_alt_text", "true" },
125 { "tweet_mode", "extended" },
128 { "since_id", "100" },
130 "/statuses/mentions_timeline")
132 .ReturnsAsync(Array.Empty<TwitterStatus>());
134 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
135 twitterApi.ApiConnection = mock.Object;
137 await twitterApi.StatusesMentionsTimeline(200, maxId: new("900"), sinceId: new("100"));
143 public async Task StatusesUserTimeline_Test()
145 var mock = new Mock<IApiConnectionLegacy>();
147 x.GetAsync<TwitterStatus[]>(
148 new Uri("statuses/user_timeline.json", UriKind.Relative),
149 new Dictionary<string, string>
151 { "screen_name", "twitterapi" },
152 { "include_rts", "true" },
153 { "include_entities", "true" },
154 { "include_ext_alt_text", "true" },
155 { "tweet_mode", "extended" },
158 { "since_id", "100" },
160 "/statuses/user_timeline")
162 .ReturnsAsync(Array.Empty<TwitterStatus>());
164 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
165 twitterApi.ApiConnection = mock.Object;
167 await twitterApi.StatusesUserTimeline("twitterapi", count: 200, maxId: new("900"), sinceId: new("100"));
173 public async Task StatusesShow_Test()
175 var mock = new Mock<IApiConnectionLegacy>();
177 x.GetAsync<TwitterStatus>(
178 new Uri("statuses/show.json", UriKind.Relative),
179 new Dictionary<string, string>
182 { "include_entities", "true" },
183 { "include_ext_alt_text", "true" },
184 { "tweet_mode", "extended" },
186 "/statuses/show/:id")
188 .ReturnsAsync(new TwitterStatus { Id = 100L });
190 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
191 twitterApi.ApiConnection = mock.Object;
193 await twitterApi.StatusesShow(statusId: new("100"));
199 public async Task StatusesLookup_Test()
201 var mock = new Mock<IApiConnectionLegacy>();
203 x.GetAsync<TwitterStatus[]>(
204 new Uri("statuses/lookup.json", UriKind.Relative),
205 new Dictionary<string, string>
208 { "include_entities", "true" },
209 { "include_ext_alt_text", "true" },
210 { "tweet_mode", "extended" },
215 .ReturnsAsync(Array.Empty<TwitterStatus>());
217 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
218 twitterApi.ApiConnection = mock.Object;
220 await twitterApi.StatusesLookup(statusIds: new[] { "100", "200" });
226 public async Task StatusesUpdate_Test()
228 var mock = new Mock<IApiConnectionLegacy>();
230 x.PostLazyAsync<TwitterStatus>(
231 new Uri("statuses/update.json", UriKind.Relative),
232 new Dictionary<string, string>
234 { "status", "hogehoge" },
235 { "include_entities", "true" },
236 { "include_ext_alt_text", "true" },
237 { "tweet_mode", "extended" },
238 { "in_reply_to_status_id", "100" },
239 { "media_ids", "10,20" },
240 { "auto_populate_reply_metadata", "true" },
241 { "exclude_reply_user_ids", "100,200" },
242 { "attachment_url", "https://twitter.com/twitterapi/status/22634515958" },
245 .ReturnsAsync(LazyJson.Create(new TwitterStatus()));
247 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
248 twitterApi.ApiConnection = mock.Object;
250 await twitterApi.StatusesUpdate(
252 replyToId: new("100"),
253 mediaIds: new[] { 10L, 20L },
254 autoPopulateReplyMetadata: true,
255 excludeReplyUserIds: new[] { 100L, 200L },
256 attachmentUrl: "https://twitter.com/twitterapi/status/22634515958"
264 public async Task StatusesUpdate_ExcludeReplyUserIdsEmptyTest()
266 var mock = new Mock<IApiConnectionLegacy>();
268 x.PostLazyAsync<TwitterStatus>(
269 new Uri("statuses/update.json", UriKind.Relative),
270 new Dictionary<string, string>
272 { "status", "hogehoge" },
273 { "include_entities", "true" },
274 { "include_ext_alt_text", "true" },
275 { "tweet_mode", "extended" },
276 // exclude_reply_user_ids は空の場合には送信されない
279 .ReturnsAsync(LazyJson.Create(new TwitterStatus()));
281 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
282 twitterApi.ApiConnection = mock.Object;
284 await twitterApi.StatusesUpdate("hogehoge", replyToId: null, mediaIds: null, excludeReplyUserIds: Array.Empty<long>())
291 public async Task StatusesDestroy_Test()
293 var mock = new Mock<IApiConnectionLegacy>();
295 x.PostLazyAsync<TwitterStatus>(
296 new Uri("statuses/destroy.json", UriKind.Relative),
297 new Dictionary<string, string> { { "id", "100" } })
299 .ReturnsAsync(LazyJson.Create(new TwitterStatus { Id = 100L }));
301 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
302 twitterApi.ApiConnection = mock.Object;
304 await twitterApi.StatusesDestroy(statusId: new("100"))
311 public async Task StatusesRetweet_Test()
313 var mock = new Mock<IApiConnectionLegacy>();
315 x.PostLazyAsync<TwitterStatus>(
316 new Uri("statuses/retweet.json", UriKind.Relative),
317 new Dictionary<string, string>
320 { "include_entities", "true" },
321 { "include_ext_alt_text", "true" },
322 { "tweet_mode", "extended" },
325 .ReturnsAsync(LazyJson.Create(new TwitterStatus()));
327 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
328 twitterApi.ApiConnection = mock.Object;
330 await twitterApi.StatusesRetweet(new("100"))
337 public async Task SearchTweets_Test()
339 var mock = new Mock<IApiConnectionLegacy>();
341 x.GetAsync<TwitterSearchResult>(
342 new Uri("search/tweets.json", UriKind.Relative),
343 new Dictionary<string, string>
345 { "q", "from:twitterapi" },
346 { "result_type", "recent" },
347 { "include_entities", "true" },
348 { "include_ext_alt_text", "true" },
349 { "tweet_mode", "extended" },
353 { "since_id", "100" },
357 .ReturnsAsync(new TwitterSearchResult());
359 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
360 twitterApi.ApiConnection = mock.Object;
362 await twitterApi.SearchTweets("from:twitterapi", "en", count: 200, maxId: new("900"), sinceId: new("100"));
368 public async Task ListsOwnerships_Test()
370 var mock = new Mock<IApiConnectionLegacy>();
372 x.GetAsync<TwitterLists>(
373 new Uri("lists/ownerships.json", UriKind.Relative),
374 new Dictionary<string, string>
376 { "screen_name", "twitterapi" },
382 .ReturnsAsync(new TwitterLists());
384 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
385 twitterApi.ApiConnection = mock.Object;
387 await twitterApi.ListsOwnerships("twitterapi", cursor: -1L, count: 100);
393 public async Task ListsSubscriptions_Test()
395 var mock = new Mock<IApiConnectionLegacy>();
397 x.GetAsync<TwitterLists>(
398 new Uri("lists/subscriptions.json", UriKind.Relative),
399 new Dictionary<string, string>
401 { "screen_name", "twitterapi" },
405 "/lists/subscriptions")
407 .ReturnsAsync(new TwitterLists());
409 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
410 twitterApi.ApiConnection = mock.Object;
412 await twitterApi.ListsSubscriptions("twitterapi", cursor: -1L, count: 100);
418 public async Task ListsMemberships_Test()
420 var mock = new Mock<IApiConnectionLegacy>();
422 x.GetAsync<TwitterLists>(
423 new Uri("lists/memberships.json", UriKind.Relative),
424 new Dictionary<string, string>
426 { "screen_name", "twitterapi" },
429 { "filter_to_owned_lists", "true" },
431 "/lists/memberships")
433 .ReturnsAsync(new TwitterLists());
435 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
436 twitterApi.ApiConnection = mock.Object;
438 await twitterApi.ListsMemberships("twitterapi", cursor: -1L, count: 100, filterToOwnedLists: true);
444 public async Task ListsCreate_Test()
446 var mock = new Mock<IApiConnectionLegacy>();
448 x.PostLazyAsync<TwitterList>(
449 new Uri("lists/create.json", UriKind.Relative),
450 new Dictionary<string, string>
452 { "name", "hogehoge" },
453 { "description", "aaaa" },
454 { "mode", "private" },
457 .ReturnsAsync(LazyJson.Create(new TwitterList()));
459 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
460 twitterApi.ApiConnection = mock.Object;
462 await twitterApi.ListsCreate("hogehoge", description: "aaaa", @private: true)
469 public async Task ListsUpdate_Test()
471 var mock = new Mock<IApiConnectionLegacy>();
473 x.PostLazyAsync<TwitterList>(
474 new Uri("lists/update.json", UriKind.Relative),
475 new Dictionary<string, string>
477 { "list_id", "12345" },
478 { "name", "hogehoge" },
479 { "description", "aaaa" },
480 { "mode", "private" },
483 .ReturnsAsync(LazyJson.Create(new TwitterList()));
485 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
486 twitterApi.ApiConnection = mock.Object;
488 await twitterApi.ListsUpdate(12345L, name: "hogehoge", description: "aaaa", @private: true)
495 public async Task ListsDestroy_Test()
497 var mock = new Mock<IApiConnectionLegacy>();
499 x.PostLazyAsync<TwitterList>(
500 new Uri("lists/destroy.json", UriKind.Relative),
501 new Dictionary<string, string>
503 { "list_id", "12345" },
506 .ReturnsAsync(LazyJson.Create(new TwitterList()));
508 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
509 twitterApi.ApiConnection = mock.Object;
511 await twitterApi.ListsDestroy(12345L)
518 public async Task ListsStatuses_Test()
520 var mock = new Mock<IApiConnectionLegacy>();
522 x.GetAsync<TwitterStatus[]>(
523 new Uri("lists/statuses.json", UriKind.Relative),
524 new Dictionary<string, string>
526 { "list_id", "12345" },
527 { "include_entities", "true" },
528 { "include_ext_alt_text", "true" },
529 { "tweet_mode", "extended" },
532 { "since_id", "100" },
533 { "include_rts", "true" },
537 .ReturnsAsync(Array.Empty<TwitterStatus>());
539 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
540 twitterApi.ApiConnection = mock.Object;
542 await twitterApi.ListsStatuses(12345L, count: 200, maxId: new("900"), sinceId: new("100"), includeRTs: true);
548 public async Task ListsMembers_Test()
550 var mock = new Mock<IApiConnectionLegacy>();
552 x.GetAsync<TwitterUsers>(
553 new Uri("lists/members.json", UriKind.Relative),
554 new Dictionary<string, string>
556 { "list_id", "12345" },
557 { "include_entities", "true" },
558 { "include_ext_alt_text", "true" },
559 { "tweet_mode", "extended" },
564 .ReturnsAsync(new TwitterUsers());
566 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
567 twitterApi.ApiConnection = mock.Object;
569 await twitterApi.ListsMembers(12345L, cursor: -1);
575 public async Task ListsMembersShow_Test()
577 var mock = new Mock<IApiConnectionLegacy>();
579 x.GetAsync<TwitterUser>(
580 new Uri("lists/members/show.json", UriKind.Relative),
581 new Dictionary<string, string>
583 { "list_id", "12345" },
584 { "screen_name", "twitterapi" },
585 { "include_entities", "true" },
586 { "include_ext_alt_text", "true" },
587 { "tweet_mode", "extended" },
589 "/lists/members/show")
591 .ReturnsAsync(new TwitterUser());
593 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
594 twitterApi.ApiConnection = mock.Object;
596 await twitterApi.ListsMembersShow(12345L, "twitterapi");
602 public async Task ListsMembersCreate_Test()
604 var mock = new Mock<IApiConnectionLegacy>();
606 x.PostLazyAsync<TwitterUser>(
607 new Uri("lists/members/create.json", UriKind.Relative),
608 new Dictionary<string, string>
610 { "list_id", "12345" },
611 { "screen_name", "twitterapi" },
612 { "include_entities", "true" },
613 { "include_ext_alt_text", "true" },
614 { "tweet_mode", "extended" },
617 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
619 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
620 twitterApi.ApiConnection = mock.Object;
622 await twitterApi.ListsMembersCreate(12345L, "twitterapi")
629 public async Task ListsMembersDestroy_Test()
631 var mock = new Mock<IApiConnectionLegacy>();
633 x.PostLazyAsync<TwitterUser>(
634 new Uri("lists/members/destroy.json", UriKind.Relative),
635 new Dictionary<string, string>
637 { "list_id", "12345" },
638 { "screen_name", "twitterapi" },
639 { "include_entities", "true" },
640 { "include_ext_alt_text", "true" },
641 { "tweet_mode", "extended" },
644 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
646 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
647 twitterApi.ApiConnection = mock.Object;
649 await twitterApi.ListsMembersDestroy(12345L, "twitterapi")
656 public async Task DirectMessagesEventsList_Test()
658 var mock = new Mock<IApiConnectionLegacy>();
660 x.GetAsync<TwitterMessageEventList>(
661 new Uri("direct_messages/events/list.json", UriKind.Relative),
662 new Dictionary<string, string>
665 { "cursor", "12345abcdefg" },
667 "/direct_messages/events/list")
669 .ReturnsAsync(new TwitterMessageEventList());
671 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
672 twitterApi.ApiConnection = mock.Object;
674 await twitterApi.DirectMessagesEventsList(count: 50, cursor: "12345abcdefg");
680 public async Task DirectMessagesEventsNew_Test()
682 var mock = new Mock<IApiConnectionLegacy>();
683 var responseText = """
686 "type": "message_create",
689 "recipient_id": "12345"
705 x.PostJsonAsync<TwitterMessageEventSingle>(
706 new Uri("direct_messages/events/new.json", UriKind.Relative),
709 .ReturnsAsync(LazyJson.Create(new TwitterMessageEventSingle()));
711 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
712 twitterApi.ApiConnection = mock.Object;
714 await twitterApi.DirectMessagesEventsNew(recipientId: 12345L, text: "hogehoge", mediaId: 67890L);
720 public async Task DirectMessagesEventsDestroy_Test()
722 var mock = new Mock<IApiConnectionLegacy>();
725 new Uri("direct_messages/events/destroy.json?id=100", UriKind.Relative))
727 .Returns(Task.CompletedTask);
729 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
730 twitterApi.ApiConnection = mock.Object;
732 await twitterApi.DirectMessagesEventsDestroy(eventId: new("100"));
738 public async Task UsersShow_Test()
740 var mock = new Mock<IApiConnectionLegacy>();
742 x.GetAsync<TwitterUser>(
743 new Uri("users/show.json", UriKind.Relative),
744 new Dictionary<string, string>
746 { "screen_name", "twitterapi" },
747 { "include_entities", "true" },
748 { "include_ext_alt_text", "true" },
749 { "tweet_mode", "extended" },
753 .ReturnsAsync(new TwitterUser { ScreenName = "twitterapi" });
755 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
756 twitterApi.ApiConnection = mock.Object;
758 await twitterApi.UsersShow(screenName: "twitterapi");
764 public async Task UsersLookup_Test()
766 var mock = new Mock<IApiConnectionLegacy>();
768 x.GetAsync<TwitterUser[]>(
769 new Uri("users/lookup.json", UriKind.Relative),
770 new Dictionary<string, string>
772 { "user_id", "11111,22222" },
773 { "include_entities", "true" },
774 { "include_ext_alt_text", "true" },
775 { "tweet_mode", "extended" },
779 .ReturnsAsync(Array.Empty<TwitterUser>());
781 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
782 twitterApi.ApiConnection = mock.Object;
784 await twitterApi.UsersLookup(userIds: new[] { "11111", "22222" });
790 public async Task UsersReportSpam_Test()
792 var mock = new Mock<IApiConnectionLegacy>();
794 x.PostLazyAsync<TwitterUser>(
795 new Uri("users/report_spam.json", UriKind.Relative),
796 new Dictionary<string, string>
798 { "screen_name", "twitterapi" },
799 { "tweet_mode", "extended" },
802 .ReturnsAsync(LazyJson.Create(new TwitterUser { ScreenName = "twitterapi" }));
804 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
805 twitterApi.ApiConnection = mock.Object;
807 await twitterApi.UsersReportSpam(screenName: "twitterapi")
814 public async Task FavoritesList_Test()
816 var mock = new Mock<IApiConnectionLegacy>();
818 x.GetAsync<TwitterStatus[]>(
819 new Uri("favorites/list.json", UriKind.Relative),
820 new Dictionary<string, string>
822 { "include_entities", "true" },
823 { "include_ext_alt_text", "true" },
824 { "tweet_mode", "extended" },
827 { "since_id", "100" },
831 .ReturnsAsync(Array.Empty<TwitterStatus>());
833 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
834 twitterApi.ApiConnection = mock.Object;
836 await twitterApi.FavoritesList(200, maxId: 900L, sinceId: 100L);
842 public async Task FavoritesCreate_Test()
844 var mock = new Mock<IApiConnectionLegacy>();
846 x.PostLazyAsync<TwitterStatus>(
847 new Uri("favorites/create.json", UriKind.Relative),
848 new Dictionary<string, string>
851 { "tweet_mode", "extended" },
854 .ReturnsAsync(LazyJson.Create(new TwitterStatus { Id = 100L }));
856 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
857 twitterApi.ApiConnection = mock.Object;
859 await twitterApi.FavoritesCreate(statusId: new("100"))
866 public async Task FavoritesDestroy_Test()
868 var mock = new Mock<IApiConnectionLegacy>();
870 x.PostLazyAsync<TwitterStatus>(
871 new Uri("favorites/destroy.json", UriKind.Relative),
872 new Dictionary<string, string>
875 { "tweet_mode", "extended" },
878 .ReturnsAsync(LazyJson.Create(new TwitterStatus { Id = 100L }));
880 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
881 twitterApi.ApiConnection = mock.Object;
883 await twitterApi.FavoritesDestroy(statusId: new("100"))
890 public async Task FriendshipsShow_Test()
892 var mock = new Mock<IApiConnectionLegacy>();
894 x.GetAsync<TwitterFriendship>(
895 new Uri("friendships/show.json", UriKind.Relative),
896 new Dictionary<string, string> { { "source_screen_name", "twitter" }, { "target_screen_name", "twitterapi" } },
899 .ReturnsAsync(new TwitterFriendship());
901 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
902 twitterApi.ApiConnection = mock.Object;
904 await twitterApi.FriendshipsShow(sourceScreenName: "twitter", targetScreenName: "twitterapi");
910 public async Task FriendshipsCreate_Test()
912 var mock = new Mock<IApiConnectionLegacy>();
914 x.PostLazyAsync<TwitterFriendship>(
915 new Uri("friendships/create.json", UriKind.Relative),
916 new Dictionary<string, string> { { "screen_name", "twitterapi" } })
918 .ReturnsAsync(LazyJson.Create(new TwitterFriendship()));
920 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
921 twitterApi.ApiConnection = mock.Object;
923 await twitterApi.FriendshipsCreate(screenName: "twitterapi")
930 public async Task FriendshipsDestroy_Test()
932 var mock = new Mock<IApiConnectionLegacy>();
934 x.PostLazyAsync<TwitterFriendship>(
935 new Uri("friendships/destroy.json", UriKind.Relative),
936 new Dictionary<string, string> { { "screen_name", "twitterapi" } })
938 .ReturnsAsync(LazyJson.Create(new TwitterFriendship()));
940 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
941 twitterApi.ApiConnection = mock.Object;
943 await twitterApi.FriendshipsDestroy(screenName: "twitterapi")
950 public async Task NoRetweetIds_Test()
952 var mock = new Mock<IApiConnectionLegacy>();
955 new Uri("friendships/no_retweets/ids.json", UriKind.Relative),
957 "/friendships/no_retweets/ids")
959 .ReturnsAsync(Array.Empty<long>());
961 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
962 twitterApi.ApiConnection = mock.Object;
964 await twitterApi.NoRetweetIds();
970 public async Task FollowersIds_Test()
972 var mock = new Mock<IApiConnectionLegacy>();
974 x.GetAsync<TwitterIds>(
975 new Uri("followers/ids.json", UriKind.Relative),
976 new Dictionary<string, string> { { "cursor", "-1" } },
979 .ReturnsAsync(new TwitterIds());
981 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
982 twitterApi.ApiConnection = mock.Object;
984 await twitterApi.FollowersIds(cursor: -1L);
990 public async Task MutesUsersIds_Test()
992 var mock = new Mock<IApiConnectionLegacy>();
994 x.GetAsync<TwitterIds>(
995 new Uri("mutes/users/ids.json", UriKind.Relative),
996 new Dictionary<string, string> { { "cursor", "-1" } },
999 .ReturnsAsync(new TwitterIds());
1001 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1002 twitterApi.ApiConnection = mock.Object;
1004 await twitterApi.MutesUsersIds(cursor: -1L);
1010 public async Task BlocksIds_Test()
1012 var mock = new Mock<IApiConnectionLegacy>();
1014 x.GetAsync<TwitterIds>(
1015 new Uri("blocks/ids.json", UriKind.Relative),
1016 new Dictionary<string, string> { { "cursor", "-1" } },
1019 .ReturnsAsync(new TwitterIds());
1021 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1022 twitterApi.ApiConnection = mock.Object;
1024 await twitterApi.BlocksIds(cursor: -1L);
1030 public async Task BlocksCreate_Test()
1032 var mock = new Mock<IApiConnectionLegacy>();
1034 x.PostLazyAsync<TwitterUser>(
1035 new Uri("blocks/create.json", UriKind.Relative),
1036 new Dictionary<string, string>
1038 { "screen_name", "twitterapi" },
1039 { "tweet_mode", "extended" },
1042 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
1044 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1045 twitterApi.ApiConnection = mock.Object;
1047 await twitterApi.BlocksCreate(screenName: "twitterapi")
1054 public async Task BlocksDestroy_Test()
1056 var mock = new Mock<IApiConnectionLegacy>();
1058 x.PostLazyAsync<TwitterUser>(
1059 new Uri("blocks/destroy.json", UriKind.Relative),
1060 new Dictionary<string, string>
1062 { "screen_name", "twitterapi" },
1063 { "tweet_mode", "extended" },
1066 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
1068 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1069 twitterApi.ApiConnection = mock.Object;
1071 await twitterApi.BlocksDestroy(screenName: "twitterapi")
1078 public async Task AccountVerifyCredentials_Test()
1080 var mock = new Mock<IApiConnectionLegacy>();
1082 x.GetAsync<TwitterUser>(
1083 new Uri("account/verify_credentials.json", UriKind.Relative),
1084 new Dictionary<string, string>
1086 { "include_entities", "true" },
1087 { "include_ext_alt_text", "true" },
1088 { "tweet_mode", "extended" },
1090 "/account/verify_credentials")
1092 .ReturnsAsync(new TwitterUser
1095 ScreenName = "opentween",
1098 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1099 twitterApi.ApiConnection = mock.Object;
1101 await twitterApi.AccountVerifyCredentials();
1103 Assert.Equal(100L, twitterApi.CurrentUserId);
1104 Assert.Equal("opentween", twitterApi.CurrentScreenName);
1110 public async Task AccountUpdateProfile_Test()
1112 var mock = new Mock<IApiConnectionLegacy>();
1114 x.PostLazyAsync<TwitterUser>(
1115 new Uri("account/update_profile.json", UriKind.Relative),
1116 new Dictionary<string, string>
1118 { "include_entities", "true" },
1119 { "include_ext_alt_text", "true" },
1120 { "tweet_mode", "extended" },
1122 { "url", "http://example.com/" },
1123 { "location", "Location" },
1124 { "description", "<script>alert(1)</script>" },
1127 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
1129 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1130 twitterApi.ApiConnection = mock.Object;
1132 await twitterApi.AccountUpdateProfile(name: "Name", url: "http://example.com/", location: "Location", description: "<script>alert(1)</script>")
1139 public async Task AccountUpdateProfileImage_Test()
1141 using var image = TestUtils.CreateDummyImage();
1142 using var media = new MemoryImageMediaItem(image);
1143 var mock = new Mock<IApiConnectionLegacy>();
1145 x.PostLazyAsync<TwitterUser>(
1146 new Uri("account/update_profile_image.json", UriKind.Relative),
1147 new Dictionary<string, string>
1149 { "include_entities", "true" },
1150 { "include_ext_alt_text", "true" },
1151 { "tweet_mode", "extended" },
1153 new Dictionary<string, IMediaItem> { { "image", media } })
1155 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
1157 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1158 twitterApi.ApiConnection = mock.Object;
1160 await twitterApi.AccountUpdateProfileImage(media)
1167 public async Task ApplicationRateLimitStatus_Test()
1169 var mock = new Mock<IApiConnectionLegacy>();
1171 x.GetAsync<TwitterRateLimits>(
1172 new Uri("application/rate_limit_status.json", UriKind.Relative),
1174 "/application/rate_limit_status")
1176 .ReturnsAsync(new TwitterRateLimits());
1178 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1179 twitterApi.ApiConnection = mock.Object;
1181 await twitterApi.ApplicationRateLimitStatus();
1187 public async Task Configuration_Test()
1189 var mock = new Mock<IApiConnectionLegacy>();
1191 x.GetAsync<TwitterConfiguration>(
1192 new Uri("help/configuration.json", UriKind.Relative),
1194 "/help/configuration")
1196 .ReturnsAsync(new TwitterConfiguration());
1198 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1199 twitterApi.ApiConnection = mock.Object;
1201 await twitterApi.Configuration();
1207 public async Task MediaUploadInit_Test()
1209 var mock = new Mock<IApiConnectionLegacy>();
1211 x.PostLazyAsync<TwitterUploadMediaInit>(
1212 new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute),
1213 new Dictionary<string, string>
1215 { "command", "INIT" },
1216 { "total_bytes", "123456" },
1217 { "media_type", "image/png" },
1218 { "media_category", "dm_image" },
1221 .ReturnsAsync(LazyJson.Create(new TwitterUploadMediaInit()));
1223 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1224 twitterApi.ApiConnection = mock.Object;
1226 await twitterApi.MediaUploadInit(totalBytes: 123456L, mediaType: "image/png", mediaCategory: "dm_image")
1233 public async Task MediaUploadAppend_Test()
1235 using var image = TestUtils.CreateDummyImage();
1236 using var media = new MemoryImageMediaItem(image);
1237 var mock = new Mock<IApiConnectionLegacy>();
1240 new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute),
1241 new Dictionary<string, string>
1243 { "command", "APPEND" },
1244 { "media_id", "11111" },
1245 { "segment_index", "1" },
1247 new Dictionary<string, IMediaItem> { { "media", media } })
1249 .Returns(Task.CompletedTask);
1251 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1252 twitterApi.ApiConnection = mock.Object;
1254 await twitterApi.MediaUploadAppend(mediaId: 11111L, segmentIndex: 1, media: media);
1260 public async Task MediaUploadFinalize_Test()
1262 var mock = new Mock<IApiConnectionLegacy>();
1264 x.PostLazyAsync<TwitterUploadMediaResult>(
1265 new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute),
1266 new Dictionary<string, string>
1268 { "command", "FINALIZE" },
1269 { "media_id", "11111" },
1272 .ReturnsAsync(LazyJson.Create(new TwitterUploadMediaResult()));
1274 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1275 twitterApi.ApiConnection = mock.Object;
1277 await twitterApi.MediaUploadFinalize(mediaId: 11111L)
1284 public async Task MediaUploadStatus_Test()
1286 var mock = new Mock<IApiConnectionLegacy>();
1288 x.GetAsync<TwitterUploadMediaResult>(
1289 new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute),
1290 new Dictionary<string, string>
1292 { "command", "STATUS" },
1293 { "media_id", "11111" },
1297 .ReturnsAsync(new TwitterUploadMediaResult());
1299 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1300 twitterApi.ApiConnection = mock.Object;
1302 await twitterApi.MediaUploadStatus(mediaId: 11111L);
1308 public async Task MediaMetadataCreate_Test()
1310 var mock = new Mock<IApiConnectionLegacy>();
1313 new Uri("https://upload.twitter.com/1.1/media/metadata/create.json", UriKind.Absolute),
1314 """{"media_id": "12345", "alt_text": {"text": "hogehoge"}}""")
1318 using var twitterApi = new TwitterApi(ApiKey.Create("fake_consumer_key"), ApiKey.Create("fake_consumer_secret"));
1319 twitterApi.ApiConnection = mock.Object;
1321 await twitterApi.MediaMetadataCreate(mediaId: 12345L, altText: "hogehoge");