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()
45 private void MyCommonSetup()
47 var mockAssembly = new Mock<_Assembly>();
48 mockAssembly.Setup(m => m.GetName()).Returns(new AssemblyName("OpenTween"));
50 MyCommon.EntryAssembly = mockAssembly.Object;
54 public void Initialize_Test()
56 using (var twitterApi = new TwitterApi())
58 Assert.Null(twitterApi.apiConnection);
60 twitterApi.Initialize("*** AccessToken ***", "*** AccessSecret ***", userId: 100L, screenName: "hogehoge");
62 Assert.IsType<TwitterApiConnection>(twitterApi.apiConnection);
64 var apiConnection = (TwitterApiConnection)twitterApi.apiConnection;
65 Assert.Equal("*** AccessToken ***", apiConnection.AccessToken);
66 Assert.Equal("*** AccessSecret ***", apiConnection.AccessSecret);
68 Assert.Equal(100L, twitterApi.CurrentUserId);
69 Assert.Equal("hogehoge", twitterApi.CurrentScreenName);
71 // 複数回 Initialize を実行した場合は新たに TwitterApiConnection が生成される
72 twitterApi.Initialize("*** AccessToken2 ***", "*** AccessSecret2 ***", userId: 200L, screenName: "foobar");
74 var oldApiConnection = apiConnection;
75 Assert.True(oldApiConnection.IsDisposed);
77 Assert.IsType<TwitterApiConnection>(twitterApi.apiConnection);
79 apiConnection = (TwitterApiConnection)twitterApi.apiConnection;
80 Assert.Equal("*** AccessToken2 ***", apiConnection.AccessToken);
81 Assert.Equal("*** AccessSecret2 ***", apiConnection.AccessSecret);
83 Assert.Equal(200L, twitterApi.CurrentUserId);
84 Assert.Equal("foobar", twitterApi.CurrentScreenName);
89 public async Task StatusesHomeTimeline_Test()
91 using (var twitterApi = new TwitterApi())
93 var mock = new Mock<IApiConnection>();
95 x.GetAsync<TwitterStatus[]>(
96 new Uri("statuses/home_timeline.json", UriKind.Relative),
97 new Dictionary<string, string> {
98 { "include_entities", "true" },
99 { "include_ext_alt_text", "true" },
100 { "tweet_mode", "extended" },
103 { "since_id", "100" },
105 "/statuses/home_timeline")
107 .ReturnsAsync(new TwitterStatus[0]);
109 twitterApi.apiConnection = mock.Object;
111 await twitterApi.StatusesHomeTimeline(200, maxId: 900L, sinceId: 100L)
112 .ConfigureAwait(false);
119 public async Task StatusesMentionsTimeline_Test()
121 using (var twitterApi = new TwitterApi())
123 var mock = new Mock<IApiConnection>();
125 x.GetAsync<TwitterStatus[]>(
126 new Uri("statuses/mentions_timeline.json", UriKind.Relative),
127 new Dictionary<string, string> {
128 { "include_entities", "true" },
129 { "include_ext_alt_text", "true" },
130 { "tweet_mode", "extended" },
133 { "since_id", "100" },
135 "/statuses/mentions_timeline")
137 .ReturnsAsync(new TwitterStatus[0]);
139 twitterApi.apiConnection = mock.Object;
141 await twitterApi.StatusesMentionsTimeline(200, maxId: 900L, sinceId: 100L)
142 .ConfigureAwait(false);
149 public async Task StatusesUserTimeline_Test()
151 using (var twitterApi = new TwitterApi())
153 var mock = new Mock<IApiConnection>();
155 x.GetAsync<TwitterStatus[]>(
156 new Uri("statuses/user_timeline.json", UriKind.Relative),
157 new Dictionary<string, string> {
158 { "screen_name", "twitterapi" },
159 { "include_rts", "true" },
160 { "include_entities", "true" },
161 { "include_ext_alt_text", "true" },
162 { "tweet_mode", "extended" },
165 { "since_id", "100" },
167 "/statuses/user_timeline")
169 .ReturnsAsync(new TwitterStatus[0]);
171 twitterApi.apiConnection = mock.Object;
173 await twitterApi.StatusesUserTimeline("twitterapi", count: 200, maxId: 900L, sinceId: 100L)
174 .ConfigureAwait(false);
181 public async Task StatusesShow_Test()
183 using (var twitterApi = new TwitterApi())
185 var mock = new Mock<IApiConnection>();
187 x.GetAsync<TwitterStatus>(
188 new Uri("statuses/show.json", UriKind.Relative),
189 new Dictionary<string, string> {
191 { "include_entities", "true" },
192 { "include_ext_alt_text", "true" },
193 { "tweet_mode", "extended" },
195 "/statuses/show/:id")
197 .ReturnsAsync(new TwitterStatus { Id = 100L });
199 twitterApi.apiConnection = mock.Object;
201 await twitterApi.StatusesShow(statusId: 100L)
202 .ConfigureAwait(false);
209 public async Task StatusesUpdate_Test()
211 using (var twitterApi = new TwitterApi())
213 var mock = new Mock<IApiConnection>();
215 x.PostLazyAsync<TwitterStatus>(
216 new Uri("statuses/update.json", UriKind.Relative),
217 new Dictionary<string, string> {
218 { "status", "hogehoge" },
219 { "include_entities", "true" },
220 { "include_ext_alt_text", "true" },
221 { "tweet_mode", "extended" },
222 { "in_reply_to_status_id", "100" },
223 { "media_ids", "10,20" },
224 { "auto_populate_reply_metadata", "true" },
225 { "exclude_reply_user_ids", "100,200" },
226 { "attachment_url", "https://twitter.com/twitterapi/status/22634515958" },
229 .ReturnsAsync(LazyJson.Create(new TwitterStatus()));
231 twitterApi.apiConnection = mock.Object;
233 await twitterApi.StatusesUpdate("hogehoge", replyToId: 100L, mediaIds: new[] { 10L, 20L },
234 autoPopulateReplyMetadata: true, excludeReplyUserIds: new[] { 100L, 200L },
235 attachmentUrl: "https://twitter.com/twitterapi/status/22634515958")
237 .ConfigureAwait(false);
244 public async Task StatusesUpdate_ExcludeReplyUserIdsEmptyTest()
246 using (var twitterApi = new TwitterApi())
248 var mock = new Mock<IApiConnection>();
250 x.PostLazyAsync<TwitterStatus>(
251 new Uri("statuses/update.json", UriKind.Relative),
252 new Dictionary<string, string> {
253 { "status", "hogehoge" },
254 { "include_entities", "true" },
255 { "include_ext_alt_text", "true" },
256 { "tweet_mode", "extended" },
257 // exclude_reply_user_ids は空の場合には送信されない
260 .ReturnsAsync(LazyJson.Create(new TwitterStatus()));
262 twitterApi.apiConnection = mock.Object;
264 await twitterApi.StatusesUpdate("hogehoge", replyToId: null, mediaIds: null, excludeReplyUserIds: new long[0])
266 .ConfigureAwait(false);
273 public async Task StatusesDestroy_Test()
275 using (var twitterApi = new TwitterApi())
277 var mock = new Mock<IApiConnection>();
279 x.PostLazyAsync<TwitterStatus>(
280 new Uri("statuses/destroy.json", UriKind.Relative),
281 new Dictionary<string, string> { { "id", "100" } })
283 .ReturnsAsync(LazyJson.Create(new TwitterStatus { Id = 100L }));
285 twitterApi.apiConnection = mock.Object;
287 await twitterApi.StatusesDestroy(statusId: 100L)
289 .ConfigureAwait(false);
296 public async Task StatusesRetweet_Test()
298 using (var twitterApi = new TwitterApi())
300 var mock = new Mock<IApiConnection>();
302 x.PostLazyAsync<TwitterStatus>(
303 new Uri("statuses/retweet.json", UriKind.Relative),
304 new Dictionary<string, string> {
306 { "include_entities", "true" },
307 { "include_ext_alt_text", "true" },
308 { "tweet_mode", "extended" },
311 .ReturnsAsync(LazyJson.Create(new TwitterStatus()));
313 twitterApi.apiConnection = mock.Object;
315 await twitterApi.StatusesRetweet(100L)
317 .ConfigureAwait(false);
324 public async Task SearchTweets_Test()
326 using (var twitterApi = new TwitterApi())
328 var mock = new Mock<IApiConnection>();
330 x.GetAsync<TwitterSearchResult>(
331 new Uri("search/tweets.json", UriKind.Relative),
332 new Dictionary<string, string> {
333 { "q", "from:twitterapi" },
334 { "result_type", "recent" },
335 { "include_entities", "true" },
336 { "include_ext_alt_text", "true" },
337 { "tweet_mode", "extended" },
341 { "since_id", "100" },
345 .ReturnsAsync(new TwitterSearchResult());
347 twitterApi.apiConnection = mock.Object;
349 await twitterApi.SearchTweets("from:twitterapi", "en", count: 200, maxId: 900L, sinceId: 100L)
350 .ConfigureAwait(false);
357 public async Task ListsOwnerships_Test()
359 using (var twitterApi = new TwitterApi())
361 var mock = new Mock<IApiConnection>();
363 x.GetAsync<TwitterLists>(
364 new Uri("lists/ownerships.json", UriKind.Relative),
365 new Dictionary<string, string> {
366 { "screen_name", "twitterapi" },
372 .ReturnsAsync(new TwitterLists());
374 twitterApi.apiConnection = mock.Object;
376 await twitterApi.ListsOwnerships("twitterapi", cursor: -1L, count: 100)
377 .ConfigureAwait(false);
384 public async Task ListsSubscriptions_Test()
386 using (var twitterApi = new TwitterApi())
388 var mock = new Mock<IApiConnection>();
390 x.GetAsync<TwitterLists>(
391 new Uri("lists/subscriptions.json", UriKind.Relative),
392 new Dictionary<string, string> {
393 { "screen_name", "twitterapi" },
397 "/lists/subscriptions")
399 .ReturnsAsync(new TwitterLists());
401 twitterApi.apiConnection = mock.Object;
403 await twitterApi.ListsSubscriptions("twitterapi", cursor: -1L, count: 100)
404 .ConfigureAwait(false);
411 public async Task ListsMemberships_Test()
413 using (var twitterApi = new TwitterApi())
415 var mock = new Mock<IApiConnection>();
417 x.GetAsync<TwitterLists>(
418 new Uri("lists/memberships.json", UriKind.Relative),
419 new Dictionary<string, string> {
420 { "screen_name", "twitterapi" },
423 { "filter_to_owned_lists", "true" },
425 "/lists/memberships")
427 .ReturnsAsync(new TwitterLists());
429 twitterApi.apiConnection = mock.Object;
431 await twitterApi.ListsMemberships("twitterapi", cursor: -1L, count: 100, filterToOwnedLists: true)
432 .ConfigureAwait(false);
439 public async Task ListsCreate_Test()
441 using (var twitterApi = new TwitterApi())
443 var mock = new Mock<IApiConnection>();
445 x.PostLazyAsync<TwitterList>(
446 new Uri("lists/create.json", UriKind.Relative),
447 new Dictionary<string, string> {
448 { "name", "hogehoge" },
449 { "description", "aaaa" },
450 { "mode", "private" },
453 .ReturnsAsync(LazyJson.Create(new TwitterList()));
455 twitterApi.apiConnection = mock.Object;
457 await twitterApi.ListsCreate("hogehoge", description: "aaaa", @private: true)
459 .ConfigureAwait(false);
466 public async Task ListsUpdate_Test()
468 using (var twitterApi = new TwitterApi())
470 var mock = new Mock<IApiConnection>();
472 x.PostLazyAsync<TwitterList>(
473 new Uri("lists/update.json", UriKind.Relative),
474 new Dictionary<string, string> {
475 { "list_id", "12345" },
476 { "name", "hogehoge" },
477 { "description", "aaaa" },
478 { "mode", "private" },
481 .ReturnsAsync(LazyJson.Create(new TwitterList()));
483 twitterApi.apiConnection = mock.Object;
485 await twitterApi.ListsUpdate(12345L, name: "hogehoge", description: "aaaa", @private: true)
487 .ConfigureAwait(false);
494 public async Task ListsDestroy_Test()
496 using (var twitterApi = new TwitterApi())
498 var mock = new Mock<IApiConnection>();
500 x.PostLazyAsync<TwitterList>(
501 new Uri("lists/destroy.json", UriKind.Relative),
502 new Dictionary<string, string> {
503 { "list_id", "12345" },
506 .ReturnsAsync(LazyJson.Create(new TwitterList()));
508 twitterApi.apiConnection = mock.Object;
510 await twitterApi.ListsDestroy(12345L)
512 .ConfigureAwait(false);
519 public async Task ListsStatuses_Test()
521 using (var twitterApi = new TwitterApi())
523 var mock = new Mock<IApiConnection>();
525 x.GetAsync<TwitterStatus[]>(
526 new Uri("lists/statuses.json", UriKind.Relative),
527 new Dictionary<string, string> {
528 { "list_id", "12345" },
529 { "include_entities", "true" },
530 { "include_ext_alt_text", "true" },
531 { "tweet_mode", "extended" },
534 { "since_id", "100" },
535 { "include_rts", "true" },
539 .ReturnsAsync(new TwitterStatus[0]);
541 twitterApi.apiConnection = mock.Object;
543 await twitterApi.ListsStatuses(12345L, count: 200, maxId: 900L, sinceId: 100L, includeRTs: true)
544 .ConfigureAwait(false);
551 public async Task ListsMembers_Test()
553 using (var twitterApi = new TwitterApi())
555 var mock = new Mock<IApiConnection>();
557 x.GetAsync<TwitterUsers>(
558 new Uri("lists/members.json", UriKind.Relative),
559 new Dictionary<string, string> {
560 { "list_id", "12345" },
561 { "include_entities", "true" },
562 { "include_ext_alt_text", "true" },
563 { "tweet_mode", "extended" },
568 .ReturnsAsync(new TwitterUsers());
570 twitterApi.apiConnection = mock.Object;
572 await twitterApi.ListsMembers(12345L, cursor: -1)
573 .ConfigureAwait(false);
580 public async Task ListsMembersShow_Test()
582 using (var twitterApi = new TwitterApi())
584 var mock = new Mock<IApiConnection>();
586 x.GetAsync<TwitterUser>(
587 new Uri("lists/members/show.json", UriKind.Relative),
588 new Dictionary<string, string> {
589 { "list_id", "12345" },
590 { "screen_name", "twitterapi" },
591 { "include_entities", "true" },
592 { "include_ext_alt_text", "true" },
593 { "tweet_mode", "extended" },
595 "/lists/members/show")
597 .ReturnsAsync(new TwitterUser());
599 twitterApi.apiConnection = mock.Object;
601 await twitterApi.ListsMembersShow(12345L, "twitterapi")
602 .ConfigureAwait(false);
609 public async Task ListsMembersCreate_Test()
611 using (var twitterApi = new TwitterApi())
613 var mock = new Mock<IApiConnection>();
615 x.PostLazyAsync<TwitterUser>(
616 new Uri("lists/members/create.json", UriKind.Relative),
617 new Dictionary<string, string> {
618 { "list_id", "12345" },
619 { "screen_name", "twitterapi" },
620 { "include_entities", "true" },
621 { "include_ext_alt_text", "true" },
622 { "tweet_mode", "extended" },
625 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
627 twitterApi.apiConnection = mock.Object;
629 await twitterApi.ListsMembersCreate(12345L, "twitterapi")
631 .ConfigureAwait(false);
638 public async Task ListsMembersDestroy_Test()
640 using (var twitterApi = new TwitterApi())
642 var mock = new Mock<IApiConnection>();
644 x.PostLazyAsync<TwitterUser>(
645 new Uri("lists/members/destroy.json", UriKind.Relative),
646 new Dictionary<string, string> {
647 { "list_id", "12345" },
648 { "screen_name", "twitterapi" },
649 { "include_entities", "true" },
650 { "include_ext_alt_text", "true" },
651 { "tweet_mode", "extended" },
654 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
656 twitterApi.apiConnection = mock.Object;
658 await twitterApi.ListsMembersDestroy(12345L, "twitterapi")
660 .ConfigureAwait(false);
667 public async Task DirectMessagesRecv_Test()
669 using (var twitterApi = new TwitterApi())
671 var mock = new Mock<IApiConnection>();
673 x.GetAsync<TwitterDirectMessage[]>(
674 new Uri("direct_messages.json", UriKind.Relative),
675 new Dictionary<string, string> {
676 { "full_text", "true" },
677 { "include_entities", "true" },
678 { "include_ext_alt_text", "true" },
681 { "since_id", "100" },
685 .ReturnsAsync(new TwitterDirectMessage[0]);
687 twitterApi.apiConnection = mock.Object;
689 await twitterApi.DirectMessagesRecv(count: 200, maxId: 900L, sinceId: 100L)
690 .ConfigureAwait(false);
697 public async Task DirectMessagesSent_Test()
699 using (var twitterApi = new TwitterApi())
701 var mock = new Mock<IApiConnection>();
703 x.GetAsync<TwitterDirectMessage[]>(
704 new Uri("direct_messages/sent.json", UriKind.Relative),
705 new Dictionary<string, string> {
706 { "full_text", "true" },
707 { "include_entities", "true" },
708 { "include_ext_alt_text", "true" },
711 { "since_id", "100" },
713 "/direct_messages/sent")
715 .ReturnsAsync(new TwitterDirectMessage[0]);
717 twitterApi.apiConnection = mock.Object;
719 await twitterApi.DirectMessagesSent(count: 200, maxId: 900L, sinceId: 100L)
720 .ConfigureAwait(false);
727 public async Task DirectMessagesDestroy_Test()
729 using (var twitterApi = new TwitterApi())
731 var mock = new Mock<IApiConnection>();
733 x.PostLazyAsync<TwitterDirectMessage>(
734 new Uri("direct_messages/destroy.json", UriKind.Relative),
735 new Dictionary<string, string> { { "id", "100" } })
737 .ReturnsAsync(LazyJson.Create(new TwitterDirectMessage { Id = 100L }));
739 twitterApi.apiConnection = mock.Object;
741 await twitterApi.DirectMessagesDestroy(statusId: 100L)
743 .ConfigureAwait(false);
750 public async Task DirectMessagesEventsNew_Test()
752 using (var twitterApi = new TwitterApi())
754 var mock = new Mock<IApiConnection>();
757 new Uri("direct_messages/events/new.json", UriKind.Relative),
760 ""type"": ""message_create"",
761 ""message_create"": {
763 ""recipient_id"": ""12345""
766 ""text"": ""hogehoge""
772 .Returns(Task.FromResult(0));
774 twitterApi.apiConnection = mock.Object;
776 await twitterApi.DirectMessagesEventsNew(recipientId: 12345L, text: "hogehoge")
777 .ConfigureAwait(false);
784 public async Task UsersShow_Test()
786 using (var twitterApi = new TwitterApi())
788 var mock = new Mock<IApiConnection>();
790 x.GetAsync<TwitterUser>(
791 new Uri("users/show.json", UriKind.Relative),
792 new Dictionary<string, string> {
793 { "screen_name", "twitterapi" },
794 { "include_entities", "true" },
795 { "include_ext_alt_text", "true" },
796 { "tweet_mode", "extended" },
800 .ReturnsAsync(new TwitterUser { ScreenName = "twitterapi" });
802 twitterApi.apiConnection = mock.Object;
804 await twitterApi.UsersShow(screenName: "twitterapi")
805 .ConfigureAwait(false);
812 public async Task UsersReportSpam_Test()
814 using (var twitterApi = new TwitterApi())
816 var mock = new Mock<IApiConnection>();
818 x.PostLazyAsync<TwitterUser>(
819 new Uri("users/report_spam.json", UriKind.Relative),
820 new Dictionary<string, string> {
821 { "screen_name", "twitterapi" },
822 { "tweet_mode", "extended" },
825 .ReturnsAsync(LazyJson.Create(new TwitterUser { ScreenName = "twitterapi" }));
827 twitterApi.apiConnection = mock.Object;
829 await twitterApi.UsersReportSpam(screenName: "twitterapi")
831 .ConfigureAwait(false);
838 public async Task FavoritesList_Test()
840 using (var twitterApi = new TwitterApi())
842 var mock = new Mock<IApiConnection>();
844 x.GetAsync<TwitterStatus[]>(
845 new Uri("favorites/list.json", UriKind.Relative),
846 new Dictionary<string, string> {
847 { "include_entities", "true" },
848 { "include_ext_alt_text", "true" },
849 { "tweet_mode", "extended" },
852 { "since_id", "100" },
856 .ReturnsAsync(new TwitterStatus[0]);
858 twitterApi.apiConnection = mock.Object;
860 await twitterApi.FavoritesList(200, maxId: 900L, sinceId: 100L)
861 .ConfigureAwait(false);
868 public async Task FavoritesCreate_Test()
870 using (var twitterApi = new TwitterApi())
872 var mock = new Mock<IApiConnection>();
874 x.PostLazyAsync<TwitterStatus>(
875 new Uri("favorites/create.json", UriKind.Relative),
876 new Dictionary<string, string> {
878 { "tweet_mode", "extended" },
881 .ReturnsAsync(LazyJson.Create(new TwitterStatus { Id = 100L }));
883 twitterApi.apiConnection = mock.Object;
885 await twitterApi.FavoritesCreate(statusId: 100L)
887 .ConfigureAwait(false);
894 public async Task FavoritesDestroy_Test()
896 using (var twitterApi = new TwitterApi())
898 var mock = new Mock<IApiConnection>();
900 x.PostLazyAsync<TwitterStatus>(
901 new Uri("favorites/destroy.json", UriKind.Relative),
902 new Dictionary<string, string> {
904 { "tweet_mode", "extended" },
907 .ReturnsAsync(LazyJson.Create(new TwitterStatus { Id = 100L }));
909 twitterApi.apiConnection = mock.Object;
911 await twitterApi.FavoritesDestroy(statusId: 100L)
913 .ConfigureAwait(false);
920 public async Task FriendshipsShow_Test()
922 using (var twitterApi = new TwitterApi())
924 var mock = new Mock<IApiConnection>();
926 x.GetAsync<TwitterFriendship>(
927 new Uri("friendships/show.json", UriKind.Relative),
928 new Dictionary<string, string> { { "source_screen_name", "twitter" }, { "target_screen_name", "twitterapi" } },
931 .ReturnsAsync(new TwitterFriendship());
933 twitterApi.apiConnection = mock.Object;
935 await twitterApi.FriendshipsShow(sourceScreenName: "twitter", targetScreenName: "twitterapi")
936 .ConfigureAwait(false);
943 public async Task FriendshipsCreate_Test()
945 using (var twitterApi = new TwitterApi())
947 var mock = new Mock<IApiConnection>();
949 x.PostLazyAsync<TwitterFriendship>(
950 new Uri("friendships/create.json", UriKind.Relative),
951 new Dictionary<string, string> { { "screen_name", "twitterapi" } })
953 .ReturnsAsync(LazyJson.Create(new TwitterFriendship()));
955 twitterApi.apiConnection = mock.Object;
957 await twitterApi.FriendshipsCreate(screenName: "twitterapi")
959 .ConfigureAwait(false);
966 public async Task FriendshipsDestroy_Test()
968 using (var twitterApi = new TwitterApi())
970 var mock = new Mock<IApiConnection>();
972 x.PostLazyAsync<TwitterFriendship>(
973 new Uri("friendships/destroy.json", UriKind.Relative),
974 new Dictionary<string, string> { { "screen_name", "twitterapi" } })
976 .ReturnsAsync(LazyJson.Create(new TwitterFriendship()));
978 twitterApi.apiConnection = mock.Object;
980 await twitterApi.FriendshipsDestroy(screenName: "twitterapi")
982 .ConfigureAwait(false);
989 public async Task NoRetweetIds_Test()
991 using (var twitterApi = new TwitterApi())
993 var mock = new Mock<IApiConnection>();
996 new Uri("friendships/no_retweets/ids.json", UriKind.Relative),
998 "/friendships/no_retweets/ids")
1000 .ReturnsAsync(new long[0]);
1002 twitterApi.apiConnection = mock.Object;
1004 await twitterApi.NoRetweetIds()
1005 .ConfigureAwait(false);
1012 public async Task FollowersIds_Test()
1014 using (var twitterApi = new TwitterApi())
1016 var mock = new Mock<IApiConnection>();
1018 x.GetAsync<TwitterIds>(
1019 new Uri("followers/ids.json", UriKind.Relative),
1020 new Dictionary<string, string> { { "cursor", "-1" } },
1023 .ReturnsAsync(new TwitterIds());
1025 twitterApi.apiConnection = mock.Object;
1027 await twitterApi.FollowersIds(cursor: -1L)
1028 .ConfigureAwait(false);
1035 public async Task MutesUsersIds_Test()
1037 using (var twitterApi = new TwitterApi())
1039 var mock = new Mock<IApiConnection>();
1041 x.GetAsync<TwitterIds>(
1042 new Uri("mutes/users/ids.json", UriKind.Relative),
1043 new Dictionary<string, string> { { "cursor", "-1" } },
1046 .ReturnsAsync(new TwitterIds());
1048 twitterApi.apiConnection = mock.Object;
1050 await twitterApi.MutesUsersIds(cursor: -1L)
1051 .ConfigureAwait(false);
1058 public async Task BlocksIds_Test()
1060 using (var twitterApi = new TwitterApi())
1062 var mock = new Mock<IApiConnection>();
1064 x.GetAsync<TwitterIds>(
1065 new Uri("blocks/ids.json", UriKind.Relative),
1066 new Dictionary<string, string> { { "cursor", "-1" } },
1069 .ReturnsAsync(new TwitterIds());
1071 twitterApi.apiConnection = mock.Object;
1073 await twitterApi.BlocksIds(cursor: -1L)
1074 .ConfigureAwait(false);
1081 public async Task BlocksCreate_Test()
1083 using (var twitterApi = new TwitterApi())
1085 var mock = new Mock<IApiConnection>();
1087 x.PostLazyAsync<TwitterUser>(
1088 new Uri("blocks/create.json", UriKind.Relative),
1089 new Dictionary<string, string> {
1090 { "screen_name", "twitterapi" },
1091 { "tweet_mode", "extended" },
1094 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
1096 twitterApi.apiConnection = mock.Object;
1098 await twitterApi.BlocksCreate(screenName: "twitterapi")
1100 .ConfigureAwait(false);
1107 public async Task BlocksDestroy_Test()
1109 using (var twitterApi = new TwitterApi())
1111 var mock = new Mock<IApiConnection>();
1113 x.PostLazyAsync<TwitterUser>(
1114 new Uri("blocks/destroy.json", UriKind.Relative),
1115 new Dictionary<string, string> {
1116 { "screen_name", "twitterapi" },
1117 { "tweet_mode", "extended" },
1120 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
1122 twitterApi.apiConnection = mock.Object;
1124 await twitterApi.BlocksDestroy(screenName: "twitterapi")
1126 .ConfigureAwait(false);
1133 public async Task AccountVerifyCredentials_Test()
1135 using (var twitterApi = new TwitterApi())
1137 var mock = new Mock<IApiConnection>();
1139 x.GetAsync<TwitterUser>(
1140 new Uri("account/verify_credentials.json", UriKind.Relative),
1141 new Dictionary<string, string> {
1142 { "include_entities", "true" },
1143 { "include_ext_alt_text", "true" },
1144 { "tweet_mode", "extended" },
1146 "/account/verify_credentials")
1148 .ReturnsAsync(new TwitterUser {
1150 ScreenName = "opentween",
1153 twitterApi.apiConnection = mock.Object;
1155 await twitterApi.AccountVerifyCredentials()
1156 .ConfigureAwait(false);
1158 Assert.Equal(100L, twitterApi.CurrentUserId);
1159 Assert.Equal("opentween", twitterApi.CurrentScreenName);
1166 public async Task AccountUpdateProfile_Test()
1168 using (var twitterApi = new TwitterApi())
1170 var mock = new Mock<IApiConnection>();
1172 x.PostLazyAsync<TwitterUser>(
1173 new Uri("account/update_profile.json", UriKind.Relative),
1174 new Dictionary<string, string> {
1175 { "include_entities", "true" },
1176 { "include_ext_alt_text", "true" },
1177 { "tweet_mode", "extended" },
1179 { "url", "http://example.com/" },
1180 { "location", "Location" },
1181 { "description", "<script>alert(1)</script>" },
1184 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
1186 twitterApi.apiConnection = mock.Object;
1188 await twitterApi.AccountUpdateProfile(name: "Name", url: "http://example.com/", location: "Location", description: "<script>alert(1)</script>")
1190 .ConfigureAwait(false);
1197 public async Task AccountUpdateProfileImage_Test()
1199 using (var twitterApi = new TwitterApi())
1200 using (var image = TestUtils.CreateDummyImage())
1201 using (var media = new MemoryImageMediaItem(image))
1203 var mock = new Mock<IApiConnection>();
1205 x.PostLazyAsync<TwitterUser>(
1206 new Uri("account/update_profile_image.json", UriKind.Relative),
1207 new Dictionary<string, string> {
1208 { "include_entities", "true" },
1209 { "include_ext_alt_text", "true" },
1210 { "tweet_mode", "extended" },
1212 new Dictionary<string, IMediaItem> { { "image", media } })
1214 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
1216 twitterApi.apiConnection = mock.Object;
1218 await twitterApi.AccountUpdateProfileImage(media)
1220 .ConfigureAwait(false);
1227 public async Task ApplicationRateLimitStatus_Test()
1229 using (var twitterApi = new TwitterApi())
1231 var mock = new Mock<IApiConnection>();
1233 x.GetAsync<TwitterRateLimits>(
1234 new Uri("application/rate_limit_status.json", UriKind.Relative),
1236 "/application/rate_limit_status")
1238 .ReturnsAsync(new TwitterRateLimits());
1240 twitterApi.apiConnection = mock.Object;
1242 await twitterApi.ApplicationRateLimitStatus()
1243 .ConfigureAwait(false);
1250 public async Task Configuration_Test()
1252 using (var twitterApi = new TwitterApi())
1254 var mock = new Mock<IApiConnection>();
1256 x.GetAsync<TwitterConfiguration>(
1257 new Uri("help/configuration.json", UriKind.Relative),
1259 "/help/configuration")
1261 .ReturnsAsync(new TwitterConfiguration());
1263 twitterApi.apiConnection = mock.Object;
1265 await twitterApi.Configuration()
1266 .ConfigureAwait(false);
1273 public async Task MediaUploadInit_Test()
1275 using (var twitterApi = new TwitterApi())
1277 var mock = new Mock<IApiConnection>();
1279 x.PostLazyAsync<TwitterUploadMediaInit>(
1280 new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute),
1281 new Dictionary<string, string> {
1282 { "command", "INIT" },
1283 { "total_bytes", "123456" },
1284 { "media_type", "image/png" },
1287 .ReturnsAsync(LazyJson.Create(new TwitterUploadMediaInit()));
1289 twitterApi.apiConnection = mock.Object;
1291 await twitterApi.MediaUploadInit(totalBytes: 123456L, mediaType: "image/png")
1293 .ConfigureAwait(false);
1300 public async Task MediaUploadAppend_Test()
1302 using (var twitterApi = new TwitterApi())
1303 using (var image = TestUtils.CreateDummyImage())
1304 using (var media = new MemoryImageMediaItem(image))
1306 var mock = new Mock<IApiConnection>();
1309 new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute),
1310 new Dictionary<string, string> {
1311 { "command", "APPEND" },
1312 { "media_id", "11111" },
1313 { "segment_index", "1" },
1315 new Dictionary<string, IMediaItem> { { "media", media } })
1317 .Returns(Task.FromResult(0));
1319 twitterApi.apiConnection = mock.Object;
1321 await twitterApi.MediaUploadAppend(mediaId: 11111L, segmentIndex: 1, media: media)
1322 .ConfigureAwait(false);
1329 public async Task MediaUploadFinalize_Test()
1331 using (var twitterApi = new TwitterApi())
1333 var mock = new Mock<IApiConnection>();
1335 x.PostLazyAsync<TwitterUploadMediaResult>(
1336 new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute),
1337 new Dictionary<string, string> {
1338 { "command", "FINALIZE" },
1339 { "media_id", "11111" },
1342 .ReturnsAsync(LazyJson.Create(new TwitterUploadMediaResult()));
1344 twitterApi.apiConnection = mock.Object;
1346 await twitterApi.MediaUploadFinalize(mediaId: 11111L)
1348 .ConfigureAwait(false);
1355 public async Task MediaUploadStatus_Test()
1357 using (var twitterApi = new TwitterApi())
1359 var mock = new Mock<IApiConnection>();
1361 x.GetAsync<TwitterUploadMediaResult>(
1362 new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute),
1363 new Dictionary<string, string> {
1364 { "command", "STATUS" },
1365 { "media_id", "11111" },
1369 .ReturnsAsync(new TwitterUploadMediaResult());
1371 twitterApi.apiConnection = mock.Object;
1373 await twitterApi.MediaUploadStatus(mediaId: 11111L)
1374 .ConfigureAwait(false);
1381 public async Task MediaMetadataCreate_Test()
1383 using (var twitterApi = new TwitterApi())
1385 var mock = new Mock<IApiConnection>();
1388 new Uri("https://upload.twitter.com/1.1/media/metadata/create.json", UriKind.Absolute),
1389 "{\"media_id\": \"12345\", \"alt_text\": {\"text\": \"hogehoge\"}}")
1391 .Returns(Task.FromResult(0));
1393 twitterApi.apiConnection = mock.Object;
1395 await twitterApi.MediaMetadataCreate(mediaId: 12345L, altText: "hogehoge")
1396 .ConfigureAwait(false);
1403 public async Task UserStreams_Test()
1405 using (var twitterApi = new TwitterApi())
1407 var mock = new Mock<IApiConnection>();
1409 x.GetStreamingStreamAsync(
1410 new Uri("https://userstream.twitter.com/1.1/user.json", UriKind.Absolute),
1411 new Dictionary<string, string> {
1412 { "replies", "all" },
1413 { "track", "OpenTween" },
1416 .ReturnsAsync(new MemoryStream());
1418 twitterApi.apiConnection = mock.Object;
1420 var stream = await twitterApi.UserStreams(replies: "all", track: "OpenTween")
1421 .ConfigureAwait(false);
1430 [InlineData("", "")]
1431 [InlineData("123ABCabc", "123ABCabc")]
1432 [InlineData(@"\", @"\\")]
1433 [InlineData("\"", "\\\"")]
1434 [InlineData("\n", @"\u000A")]
1435 [InlineData("\U0001D11E", @"\uD834\uDD1E")]
1436 public void EscapeJsonString_Test(string targetText, string expectedText)
1438 Assert.Equal(expectedText, TwitterApi.EscapeJsonString(targetText));