OSDN Git Service

IMediaItemを引数に取るIApiConnectionLegacy.PostLazyAsyncを使用している箇所をPostMultipartRequestに移行
authorKimura Youichi <kim.upsilon@bucyou.net>
Mon, 11 Dec 2023 18:56:05 +0000 (03:56 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Tue, 12 Dec 2023 17:51:21 +0000 (02:51 +0900)
OpenTween.Tests/Api/TwitterApiTest.cs
OpenTween/Api/TwitterApi.cs

index c660337..c6b24ab 100644 (file)
@@ -1143,21 +1143,35 @@ namespace OpenTween.Api
         [Fact]
         public async Task AccountUpdateProfileImage_Test()
         {
+            using var responseMessage = new HttpResponseMessage(HttpStatusCode.OK);
             using var image = TestUtils.CreateDummyImage();
             using var media = new MemoryImageMediaItem(image);
+
+            Func<PostMultipartRequest, bool> verifyRequest = r =>
+            {
+                Assert.Equal(new("account/update_profile_image.json", UriKind.Relative), r.RequestUri);
+                var expectedQuery = new Dictionary<string, string>
+                {
+                    ["include_entities"] = "true",
+                    ["include_ext_alt_text"] = "true",
+                    ["tweet_mode"] = "extended",
+                };
+                Assert.Equal(expectedQuery, r.Query);
+                var expectedMedia = new Dictionary<string, IMediaItem>
+                {
+                    ["image"] = media,
+                };
+                Assert.Equal(expectedMedia, r.Media);
+                return true;
+            };
+
             var mock = new Mock<IApiConnectionLegacy>();
             mock.Setup(x =>
-                x.PostLazyAsync<TwitterUser>(
-                    new Uri("account/update_profile_image.json", UriKind.Relative),
-                    new Dictionary<string, string>
-                    {
-                            { "include_entities", "true" },
-                            { "include_ext_alt_text", "true" },
-                            { "tweet_mode", "extended" },
-                    },
-                    new Dictionary<string, IMediaItem> { { "image", media } })
+                x.SendAsync(
+                    It.Is<PostMultipartRequest>(r => verifyRequest(r))
+                )
             )
-            .ReturnsAsync(LazyJson.Create(new TwitterUser()));
+            .ReturnsAsync(new ApiResponse(responseMessage));
 
             using var twitterApi = new TwitterApi();
             twitterApi.ApiConnection = mock.Object;
@@ -1237,21 +1251,35 @@ namespace OpenTween.Api
         [Fact]
         public async Task MediaUploadAppend_Test()
         {
+            using var responseMessage = new HttpResponseMessage(HttpStatusCode.OK);
             using var image = TestUtils.CreateDummyImage();
             using var media = new MemoryImageMediaItem(image);
+
+            Func<PostMultipartRequest, bool> verifyRequest = r =>
+            {
+                Assert.Equal(new("https://upload.twitter.com/1.1/media/upload.json"), r.RequestUri);
+                var expectedQuery = new Dictionary<string, string>
+                {
+                    ["command"] = "APPEND",
+                    ["media_id"] = "11111",
+                    ["segment_index"] = "1",
+                };
+                Assert.Equal(expectedQuery, r.Query);
+                var expectedMedia = new Dictionary<string, IMediaItem>
+                {
+                    ["media"] = media,
+                };
+                Assert.Equal(expectedMedia, r.Media);
+                return true;
+            };
+
             var mock = new Mock<IApiConnectionLegacy>();
             mock.Setup(x =>
-                x.PostAsync(
-                    new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute),
-                    new Dictionary<string, string>
-                    {
-                            { "command", "APPEND" },
-                            { "media_id", "11111" },
-                            { "segment_index", "1" },
-                    },
-                    new Dictionary<string, IMediaItem> { { "media", media } })
+                x.SendAsync(
+                    It.Is<PostMultipartRequest>(r => verifyRequest(r))
+                )
             )
-            .Returns(Task.CompletedTask);
+            .ReturnsAsync(new ApiResponse(responseMessage));
 
             using var twitterApi = new TwitterApi();
             twitterApi.ApiConnection = mock.Object;
index 3421222..5e3c558 100644 (file)
@@ -713,21 +713,27 @@ namespace OpenTween.Api
             return this.Connection.PostLazyAsync<TwitterUser>(endpoint, param);
         }
 
-        public Task<LazyJson<TwitterUser>> AccountUpdateProfileImage(IMediaItem image)
+        public async Task<LazyJson<TwitterUser>> AccountUpdateProfileImage(IMediaItem image)
         {
-            var endpoint = new Uri("account/update_profile_image.json", UriKind.Relative);
-            var param = new Dictionary<string, string>
+            var request = new PostMultipartRequest
             {
-                ["include_entities"] = "true",
-                ["include_ext_alt_text"] = "true",
-                ["tweet_mode"] = "extended",
-            };
-            var paramMedia = new Dictionary<string, IMediaItem>
-            {
-                ["image"] = image,
+                RequestUri = new("account/update_profile_image.json", UriKind.Relative),
+                Query = new Dictionary<string, string>
+                {
+                    ["include_entities"] = "true",
+                    ["include_ext_alt_text"] = "true",
+                    ["tweet_mode"] = "extended",
+                },
+                Media = new Dictionary<string, IMediaItem>
+                {
+                    ["image"] = image,
+                },
             };
 
-            return this.Connection.PostLazyAsync<TwitterUser>(endpoint, param, paramMedia);
+            using var response = await this.Connection.SendAsync(request)
+                .ConfigureAwait(false);
+
+            return response.ReadAsLazyJson<TwitterUser>();
         }
 
         public Task<TwitterRateLimits> ApplicationRateLimitStatus()
@@ -760,21 +766,26 @@ namespace OpenTween.Api
             return this.Connection.PostLazyAsync<TwitterUploadMediaInit>(endpoint, param);
         }
 
-        public Task MediaUploadAppend(long mediaId, int segmentIndex, IMediaItem media)
+        public async Task MediaUploadAppend(long mediaId, int segmentIndex, IMediaItem media)
         {
-            var endpoint = new Uri("https://upload.twitter.com/1.1/media/upload.json");
-            var param = new Dictionary<string, string>
+            var request = new PostMultipartRequest
             {
-                ["command"] = "APPEND",
-                ["media_id"] = mediaId.ToString(),
-                ["segment_index"] = segmentIndex.ToString(),
-            };
-            var paramMedia = new Dictionary<string, IMediaItem>
-            {
-                ["media"] = media,
+                RequestUri = new("https://upload.twitter.com/1.1/media/upload.json"),
+                Query = new Dictionary<string, string>
+                {
+                    ["command"] = "APPEND",
+                    ["media_id"] = mediaId.ToString(),
+                    ["segment_index"] = segmentIndex.ToString(),
+                },
+                Media = new Dictionary<string, IMediaItem>
+                {
+                    ["media"] = media,
+                },
             };
 
-            return this.Connection.PostAsync(endpoint, param, paramMedia);
+            await this.Connection.SendAsync(request)
+                .IgnoreResponse()
+                .ConfigureAwait(false);
         }
 
         public Task<LazyJson<TwitterUploadMediaResult>> MediaUploadFinalize(long mediaId)