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 public 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" },
102 { "since_id", "100" },
104 "/statuses/home_timeline")
106 .ReturnsAsync(new TwitterStatus[0]);
108 twitterApi.apiConnection = mock.Object;
110 await twitterApi.StatusesHomeTimeline(200, maxId: 900L, sinceId: 100L)
111 .ConfigureAwait(false);
118 public async Task StatusesMentionsTimeline_Test()
120 using (var twitterApi = new TwitterApi())
122 var mock = new Mock<IApiConnection>();
124 x.GetAsync<TwitterStatus[]>(
125 new Uri("statuses/mentions_timeline.json", UriKind.Relative),
126 new Dictionary<string, string> {
127 { "include_entities", "true" },
128 { "include_ext_alt_text", "true" },
131 { "since_id", "100" },
133 "/statuses/mentions_timeline")
135 .ReturnsAsync(new TwitterStatus[0]);
137 twitterApi.apiConnection = mock.Object;
139 await twitterApi.StatusesMentionsTimeline(200, maxId: 900L, sinceId: 100L)
140 .ConfigureAwait(false);
147 public async Task StatusesUserTimeline_Test()
149 using (var twitterApi = new TwitterApi())
151 var mock = new Mock<IApiConnection>();
153 x.GetAsync<TwitterStatus[]>(
154 new Uri("statuses/user_timeline.json", UriKind.Relative),
155 new Dictionary<string, string> {
156 { "screen_name", "twitterapi" },
157 { "include_rts", "true" },
158 { "include_entities", "true" },
159 { "include_ext_alt_text", "true" },
162 { "since_id", "100" },
164 "/statuses/user_timeline")
166 .ReturnsAsync(new TwitterStatus[0]);
168 twitterApi.apiConnection = mock.Object;
170 await twitterApi.StatusesUserTimeline("twitterapi", count: 200, maxId: 900L, sinceId: 100L)
171 .ConfigureAwait(false);
178 public async Task StatusesShow_Test()
180 using (var twitterApi = new TwitterApi())
182 var mock = new Mock<IApiConnection>();
184 x.GetAsync<TwitterStatus>(
185 new Uri("statuses/show.json", UriKind.Relative),
186 new Dictionary<string, string> {
188 { "include_entities", "true" },
189 { "include_ext_alt_text", "true" },
191 "/statuses/show/:id")
193 .ReturnsAsync(new TwitterStatus { Id = 100L });
195 twitterApi.apiConnection = mock.Object;
197 await twitterApi.StatusesShow(statusId: 100L)
198 .ConfigureAwait(false);
205 public async Task StatusesUpdate_Test()
207 using (var twitterApi = new TwitterApi())
209 var mock = new Mock<IApiConnection>();
211 x.PostLazyAsync<TwitterStatus>(
212 new Uri("statuses/update.json", UriKind.Relative),
213 new Dictionary<string, string> {
214 { "status", "hogehoge" },
215 { "include_entities", "true" },
216 { "include_ext_alt_text", "true" },
217 { "in_reply_to_status_id", "100" },
218 { "media_ids", "10,20" },
221 .ReturnsAsync(LazyJson.Create(new TwitterStatus()));
223 twitterApi.apiConnection = mock.Object;
225 await twitterApi.StatusesUpdate("hogehoge", replyToId: 100L, mediaIds: new[] { 10L, 20L })
227 .ConfigureAwait(false);
234 public async Task StatusesDestroy_Test()
236 using (var twitterApi = new TwitterApi())
238 var mock = new Mock<IApiConnection>();
240 x.PostLazyAsync<TwitterStatus>(
241 new Uri("statuses/destroy.json", UriKind.Relative),
242 new Dictionary<string, string> { { "id", "100" } })
244 .ReturnsAsync(LazyJson.Create(new TwitterStatus { Id = 100L }));
246 twitterApi.apiConnection = mock.Object;
248 await twitterApi.StatusesDestroy(statusId: 100L)
250 .ConfigureAwait(false);
257 public async Task StatusesRetweet_Test()
259 using (var twitterApi = new TwitterApi())
261 var mock = new Mock<IApiConnection>();
263 x.PostLazyAsync<TwitterStatus>(
264 new Uri("statuses/retweet.json", UriKind.Relative),
265 new Dictionary<string, string> {
267 { "include_entities", "true" },
268 { "include_ext_alt_text", "true" },
271 .ReturnsAsync(LazyJson.Create(new TwitterStatus()));
273 twitterApi.apiConnection = mock.Object;
275 await twitterApi.StatusesRetweet(100L)
277 .ConfigureAwait(false);
284 public async Task ListsOwnerships_Test()
286 using (var twitterApi = new TwitterApi())
288 var mock = new Mock<IApiConnection>();
290 x.GetAsync<TwitterLists>(
291 new Uri("lists/ownerships.json", UriKind.Relative),
292 new Dictionary<string, string> {
293 { "screen_name", "twitterapi" },
298 .ReturnsAsync(new TwitterLists());
300 twitterApi.apiConnection = mock.Object;
302 await twitterApi.ListsOwnerships("twitterapi", cursor: -1L)
303 .ConfigureAwait(false);
310 public async Task ListsSubscriptions_Test()
312 using (var twitterApi = new TwitterApi())
314 var mock = new Mock<IApiConnection>();
316 x.GetAsync<TwitterLists>(
317 new Uri("lists/subscriptions.json", UriKind.Relative),
318 new Dictionary<string, string> {
319 { "screen_name", "twitterapi" },
322 "/lists/subscriptions")
324 .ReturnsAsync(new TwitterLists());
326 twitterApi.apiConnection = mock.Object;
328 await twitterApi.ListsSubscriptions("twitterapi", cursor: -1L)
329 .ConfigureAwait(false);
336 public async Task ListsCreate_Test()
338 using (var twitterApi = new TwitterApi())
340 var mock = new Mock<IApiConnection>();
342 x.PostLazyAsync<TwitterList>(
343 new Uri("lists/create.json", UriKind.Relative),
344 new Dictionary<string, string> {
345 { "name", "hogehoge" },
346 { "description", "aaaa" },
347 { "mode", "private" },
350 .ReturnsAsync(LazyJson.Create(new TwitterList()));
352 twitterApi.apiConnection = mock.Object;
354 await twitterApi.ListsCreate("hogehoge", description: "aaaa", @private: true)
356 .ConfigureAwait(false);
363 public async Task ListsUpdate_Test()
365 using (var twitterApi = new TwitterApi())
367 var mock = new Mock<IApiConnection>();
369 x.PostLazyAsync<TwitterList>(
370 new Uri("lists/update.json", UriKind.Relative),
371 new Dictionary<string, string> {
372 { "list_id", "12345" },
373 { "name", "hogehoge" },
374 { "description", "aaaa" },
375 { "mode", "private" },
378 .ReturnsAsync(LazyJson.Create(new TwitterList()));
380 twitterApi.apiConnection = mock.Object;
382 await twitterApi.ListsUpdate(12345L, name: "hogehoge", description: "aaaa", @private: true)
384 .ConfigureAwait(false);
391 public async Task ListsDestroy_Test()
393 using (var twitterApi = new TwitterApi())
395 var mock = new Mock<IApiConnection>();
397 x.PostLazyAsync<TwitterList>(
398 new Uri("lists/destroy.json", UriKind.Relative),
399 new Dictionary<string, string> {
400 { "list_id", "12345" },
403 .ReturnsAsync(LazyJson.Create(new TwitterList()));
405 twitterApi.apiConnection = mock.Object;
407 await twitterApi.ListsDestroy(12345L)
409 .ConfigureAwait(false);
416 public async Task ListsStatuses_Test()
418 using (var twitterApi = new TwitterApi())
420 var mock = new Mock<IApiConnection>();
422 x.GetAsync<TwitterStatus[]>(
423 new Uri("lists/statuses.json", UriKind.Relative),
424 new Dictionary<string, string> {
425 { "list_id", "12345" },
426 { "include_entities", "true" },
427 { "include_ext_alt_text", "true" },
430 { "since_id", "100" },
431 { "include_rts", "true" },
435 .ReturnsAsync(new TwitterStatus[0]);
437 twitterApi.apiConnection = mock.Object;
439 await twitterApi.ListsStatuses(12345L, count: 200, maxId: 900L, sinceId: 100L, includeRTs: true)
440 .ConfigureAwait(false);
447 public async Task ListsMembers_Test()
449 using (var twitterApi = new TwitterApi())
451 var mock = new Mock<IApiConnection>();
453 x.GetAsync<TwitterUsers>(
454 new Uri("lists/members.json", UriKind.Relative),
455 new Dictionary<string, string> {
456 { "list_id", "12345" },
457 { "include_entities", "true" },
458 { "include_ext_alt_text", "true" },
463 .ReturnsAsync(new TwitterUsers());
465 twitterApi.apiConnection = mock.Object;
467 await twitterApi.ListsMembers(12345L, cursor: -1)
468 .ConfigureAwait(false);
475 public async Task ListsMembersShow_Test()
477 using (var twitterApi = new TwitterApi())
479 var mock = new Mock<IApiConnection>();
481 x.GetAsync<TwitterUser>(
482 new Uri("lists/members/show.json", UriKind.Relative),
483 new Dictionary<string, string> {
484 { "list_id", "12345" },
485 { "screen_name", "twitterapi" },
486 { "include_entities", "true" },
487 { "include_ext_alt_text", "true" },
489 "/lists/members/show")
491 .ReturnsAsync(new TwitterUser());
493 twitterApi.apiConnection = mock.Object;
495 await twitterApi.ListsMembersShow(12345L, "twitterapi")
496 .ConfigureAwait(false);
503 public async Task ListsMembersCreate_Test()
505 using (var twitterApi = new TwitterApi())
507 var mock = new Mock<IApiConnection>();
509 x.PostLazyAsync<TwitterUser>(
510 new Uri("lists/members/create.json", UriKind.Relative),
511 new Dictionary<string, string> {
512 { "list_id", "12345" },
513 { "screen_name", "twitterapi" },
514 { "include_entities", "true" },
515 { "include_ext_alt_text", "true" },
518 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
520 twitterApi.apiConnection = mock.Object;
522 await twitterApi.ListsMembersCreate(12345L, "twitterapi")
524 .ConfigureAwait(false);
531 public async Task DirectMessagesRecv_Test()
533 using (var twitterApi = new TwitterApi())
535 var mock = new Mock<IApiConnection>();
537 x.GetAsync<TwitterDirectMessage[]>(
538 new Uri("direct_messages.json", UriKind.Relative),
539 new Dictionary<string, string> {
540 { "full_text", "true" },
541 { "include_entities", "true" },
542 { "include_ext_alt_text", "true" },
545 { "since_id", "100" },
549 .ReturnsAsync(new TwitterDirectMessage[0]);
551 twitterApi.apiConnection = mock.Object;
553 await twitterApi.DirectMessagesRecv(count: 200, maxId: 900L, sinceId: 100L)
554 .ConfigureAwait(false);
561 public async Task DirectMessagesSent_Test()
563 using (var twitterApi = new TwitterApi())
565 var mock = new Mock<IApiConnection>();
567 x.GetAsync<TwitterDirectMessage[]>(
568 new Uri("direct_messages/sent.json", UriKind.Relative),
569 new Dictionary<string, string> {
570 { "full_text", "true" },
571 { "include_entities", "true" },
572 { "include_ext_alt_text", "true" },
575 { "since_id", "100" },
577 "/direct_messages/sent")
579 .ReturnsAsync(new TwitterDirectMessage[0]);
581 twitterApi.apiConnection = mock.Object;
583 await twitterApi.DirectMessagesSent(count: 200, maxId: 900L, sinceId: 100L)
584 .ConfigureAwait(false);
591 public async Task DirectMessagesNew_Test()
593 using (var twitterApi = new TwitterApi())
595 var mock = new Mock<IApiConnection>();
597 x.PostLazyAsync<TwitterDirectMessage>(
598 new Uri("direct_messages/new.json", UriKind.Relative),
599 new Dictionary<string, string> {
600 { "text", "hogehoge" },
601 { "screen_name", "opentween" },
604 .ReturnsAsync(LazyJson.Create(new TwitterDirectMessage()));
606 twitterApi.apiConnection = mock.Object;
608 await twitterApi.DirectMessagesNew("hogehoge", "opentween")
610 .ConfigureAwait(false);
617 public async Task DirectMessagesDestroy_Test()
619 using (var twitterApi = new TwitterApi())
621 var mock = new Mock<IApiConnection>();
623 x.PostLazyAsync<TwitterDirectMessage>(
624 new Uri("direct_messages/destroy.json", UriKind.Relative),
625 new Dictionary<string, string> { { "id", "100" } })
627 .ReturnsAsync(LazyJson.Create(new TwitterDirectMessage { Id = 100L }));
629 twitterApi.apiConnection = mock.Object;
631 await twitterApi.DirectMessagesDestroy(statusId: 100L)
633 .ConfigureAwait(false);
640 public async Task UsersShow_Test()
642 using (var twitterApi = new TwitterApi())
644 var mock = new Mock<IApiConnection>();
646 x.GetAsync<TwitterUser>(
647 new Uri("users/show.json", UriKind.Relative),
648 new Dictionary<string, string> {
649 { "screen_name", "twitterapi" },
650 { "include_entities", "true" },
651 { "include_ext_alt_text", "true" },
655 .ReturnsAsync(new TwitterUser { ScreenName = "twitterapi" });
657 twitterApi.apiConnection = mock.Object;
659 await twitterApi.UsersShow(screenName: "twitterapi")
660 .ConfigureAwait(false);
667 public async Task UsersReportSpam_Test()
669 using (var twitterApi = new TwitterApi())
671 var mock = new Mock<IApiConnection>();
673 x.PostLazyAsync<TwitterUser>(
674 new Uri("users/report_spam.json", UriKind.Relative),
675 new Dictionary<string, string> { { "screen_name", "twitterapi" } })
677 .ReturnsAsync(LazyJson.Create(new TwitterUser { ScreenName = "twitterapi" }));
679 twitterApi.apiConnection = mock.Object;
681 await twitterApi.UsersReportSpam(screenName: "twitterapi")
683 .ConfigureAwait(false);
690 public async Task FavoritesCreate_Test()
692 using (var twitterApi = new TwitterApi())
694 var mock = new Mock<IApiConnection>();
696 x.PostLazyAsync<TwitterStatus>(
697 new Uri("favorites/create.json", UriKind.Relative),
698 new Dictionary<string, string> { { "id", "100" } })
700 .ReturnsAsync(LazyJson.Create(new TwitterStatus { Id = 100L }));
702 twitterApi.apiConnection = mock.Object;
704 await twitterApi.FavoritesCreate(statusId: 100L)
706 .ConfigureAwait(false);
713 public async Task FavoritesDestroy_Test()
715 using (var twitterApi = new TwitterApi())
717 var mock = new Mock<IApiConnection>();
719 x.PostLazyAsync<TwitterStatus>(
720 new Uri("favorites/destroy.json", UriKind.Relative),
721 new Dictionary<string, string> { { "id", "100" } })
723 .ReturnsAsync(LazyJson.Create(new TwitterStatus { Id = 100L }));
725 twitterApi.apiConnection = mock.Object;
727 await twitterApi.FavoritesDestroy(statusId: 100L)
729 .ConfigureAwait(false);
736 public async Task FriendshipsShow_Test()
738 using (var twitterApi = new TwitterApi())
740 var mock = new Mock<IApiConnection>();
742 x.GetAsync<TwitterFriendship>(
743 new Uri("friendships/show.json", UriKind.Relative),
744 new Dictionary<string, string> { { "source_screen_name", "twitter" }, { "target_screen_name", "twitterapi" } },
747 .ReturnsAsync(new TwitterFriendship());
749 twitterApi.apiConnection = mock.Object;
751 await twitterApi.FriendshipsShow(sourceScreenName: "twitter", targetScreenName: "twitterapi")
752 .ConfigureAwait(false);
759 public async Task FriendshipsCreate_Test()
761 using (var twitterApi = new TwitterApi())
763 var mock = new Mock<IApiConnection>();
765 x.PostLazyAsync<TwitterFriendship>(
766 new Uri("friendships/create.json", UriKind.Relative),
767 new Dictionary<string, string> { { "screen_name", "twitterapi" } })
769 .ReturnsAsync(LazyJson.Create(new TwitterFriendship()));
771 twitterApi.apiConnection = mock.Object;
773 await twitterApi.FriendshipsCreate(screenName: "twitterapi")
775 .ConfigureAwait(false);
782 public async Task FriendshipsDestroy_Test()
784 using (var twitterApi = new TwitterApi())
786 var mock = new Mock<IApiConnection>();
788 x.PostLazyAsync<TwitterFriendship>(
789 new Uri("friendships/destroy.json", UriKind.Relative),
790 new Dictionary<string, string> { { "screen_name", "twitterapi" } })
792 .ReturnsAsync(LazyJson.Create(new TwitterFriendship()));
794 twitterApi.apiConnection = mock.Object;
796 await twitterApi.FriendshipsDestroy(screenName: "twitterapi")
798 .ConfigureAwait(false);
805 public async Task NoRetweetIds_Test()
807 using (var twitterApi = new TwitterApi())
809 var mock = new Mock<IApiConnection>();
812 new Uri("friendships/no_retweets/ids.json", UriKind.Relative),
814 "/friendships/no_retweets/ids")
816 .ReturnsAsync(new long[0]);
818 twitterApi.apiConnection = mock.Object;
820 await twitterApi.NoRetweetIds()
821 .ConfigureAwait(false);
828 public async Task FollowersIds_Test()
830 using (var twitterApi = new TwitterApi())
832 var mock = new Mock<IApiConnection>();
834 x.GetAsync<TwitterIds>(
835 new Uri("followers/ids.json", UriKind.Relative),
836 new Dictionary<string, string> { { "cursor", "-1" } },
839 .ReturnsAsync(new TwitterIds());
841 twitterApi.apiConnection = mock.Object;
843 await twitterApi.FollowersIds(cursor: -1L)
844 .ConfigureAwait(false);
851 public async Task MutesUsersIds_Test()
853 using (var twitterApi = new TwitterApi())
855 var mock = new Mock<IApiConnection>();
857 x.GetAsync<TwitterIds>(
858 new Uri("mutes/users/ids.json", UriKind.Relative),
859 new Dictionary<string, string> { { "cursor", "-1" } },
862 .ReturnsAsync(new TwitterIds());
864 twitterApi.apiConnection = mock.Object;
866 await twitterApi.MutesUsersIds(cursor: -1L)
867 .ConfigureAwait(false);
874 public async Task BlocksIds_Test()
876 using (var twitterApi = new TwitterApi())
878 var mock = new Mock<IApiConnection>();
880 x.GetAsync<TwitterIds>(
881 new Uri("blocks/ids.json", UriKind.Relative),
882 new Dictionary<string, string> { { "cursor", "-1" } },
885 .ReturnsAsync(new TwitterIds());
887 twitterApi.apiConnection = mock.Object;
889 await twitterApi.BlocksIds(cursor: -1L)
890 .ConfigureAwait(false);
897 public async Task BlocksCreate_Test()
899 using (var twitterApi = new TwitterApi())
901 var mock = new Mock<IApiConnection>();
903 x.PostLazyAsync<TwitterUser>(
904 new Uri("blocks/create.json", UriKind.Relative),
905 new Dictionary<string, string> { { "screen_name", "twitterapi" } })
907 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
909 twitterApi.apiConnection = mock.Object;
911 await twitterApi.BlocksCreate(screenName: "twitterapi")
913 .ConfigureAwait(false);
920 public async Task BlocksDestroy_Test()
922 using (var twitterApi = new TwitterApi())
924 var mock = new Mock<IApiConnection>();
926 x.PostLazyAsync<TwitterUser>(
927 new Uri("blocks/destroy.json", UriKind.Relative),
928 new Dictionary<string, string> { { "screen_name", "twitterapi" } })
930 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
932 twitterApi.apiConnection = mock.Object;
934 await twitterApi.BlocksDestroy(screenName: "twitterapi")
936 .ConfigureAwait(false);
943 public async Task AccountUpdateProfile_Test()
945 using (var twitterApi = new TwitterApi())
947 var mock = new Mock<IApiConnection>();
949 x.PostLazyAsync<TwitterUser>(
950 new Uri("account/update_profile.json", UriKind.Relative),
951 new Dictionary<string, string> {
952 { "include_entities", "true" },
953 { "include_ext_alt_text", "true" },
955 { "url", "http://example.com/" },
956 { "location", "Location" },
957 { "description", "<script>alert(1)</script>" },
960 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
962 twitterApi.apiConnection = mock.Object;
964 await twitterApi.AccountUpdateProfile(name: "Name", url: "http://example.com/", location: "Location", description: "<script>alert(1)</script>")
966 .ConfigureAwait(false);
973 public async Task AccountUpdateProfileImage_Test()
975 using (var twitterApi = new TwitterApi())
976 using (var image = TestUtils.CreateDummyImage())
977 using (var media = new MemoryImageMediaItem(image))
979 var mock = new Mock<IApiConnection>();
981 x.PostLazyAsync<TwitterUser>(
982 new Uri("account/update_profile_image.json", UriKind.Relative),
983 new Dictionary<string, string> {
984 { "include_entities", "true" },
985 { "include_ext_alt_text", "true" },
987 new Dictionary<string, IMediaItem> { { "image", media } })
989 .ReturnsAsync(LazyJson.Create(new TwitterUser()));
991 twitterApi.apiConnection = mock.Object;
993 await twitterApi.AccountUpdateProfileImage(media)
995 .ConfigureAwait(false);
1002 public async Task ApplicationRateLimitStatus_Test()
1004 using (var twitterApi = new TwitterApi())
1006 var mock = new Mock<IApiConnection>();
1008 x.GetAsync<TwitterRateLimits>(
1009 new Uri("application/rate_limit_status.json", UriKind.Relative),
1011 "/application/rate_limit_status")
1013 .ReturnsAsync(new TwitterRateLimits());
1015 twitterApi.apiConnection = mock.Object;
1017 await twitterApi.ApplicationRateLimitStatus()
1018 .ConfigureAwait(false);
1025 public async Task Configuration_Test()
1027 using (var twitterApi = new TwitterApi())
1029 var mock = new Mock<IApiConnection>();
1031 x.GetAsync<TwitterConfiguration>(
1032 new Uri("help/configuration.json", UriKind.Relative),
1034 "/help/configuration")
1036 .ReturnsAsync(new TwitterConfiguration());
1038 twitterApi.apiConnection = mock.Object;
1040 await twitterApi.Configuration()
1041 .ConfigureAwait(false);
1048 public async Task MediaUpload_Test()
1050 using (var twitterApi = new TwitterApi())
1051 using (var image = TestUtils.CreateDummyImage())
1052 using (var media = new MemoryImageMediaItem(image))
1054 var mock = new Mock<IApiConnection>();
1056 x.PostLazyAsync<TwitterUploadMediaResult>(
1057 new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute),
1059 new Dictionary<string, IMediaItem> { { "media", media } })
1061 .ReturnsAsync(LazyJson.Create(new TwitterUploadMediaResult()));
1063 twitterApi.apiConnection = mock.Object;
1065 await twitterApi.MediaUpload(media)
1067 .ConfigureAwait(false);
1074 public async Task UserStreams_Test()
1076 using (var twitterApi = new TwitterApi())
1078 var mock = new Mock<IApiConnection>();
1081 new Uri("https://userstream.twitter.com/1.1/user.json", UriKind.Absolute),
1082 new Dictionary<string, string> {
1083 { "replies", "all" },
1084 { "track", "OpenTween" },
1087 .ReturnsAsync(new MemoryStream());
1089 twitterApi.apiConnection = mock.Object;
1091 var stream = await twitterApi.UserStreams(replies: "all", track: "OpenTween")
1092 .ConfigureAwait(false);