public async Task MediaUpload_Test() { using (var twitterApi = new TwitterApi()) using (var image = TestUtils.CreateDummyImage()) using (var media = new MemoryImageMediaItem(image)) { var mock = new Mock <IApiConnection>(); mock.Setup(x => x.PostLazyAsync <TwitterUploadMediaResult>( new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute), null, new Dictionary <string, IMediaItem> { { "media", media } }) ) .ReturnsAsync(LazyJson.Create(new TwitterUploadMediaResult())); twitterApi.apiConnection = mock.Object; await twitterApi.MediaUpload(media) .IgnoreResponse() .ConfigureAwait(false); mock.VerifyAll(); } }
public async Task AccountUpdateProfileImage_Test() { using (var twitterApi = new TwitterApi()) using (var image = TestUtils.CreateDummyImage()) using (var media = new MemoryImageMediaItem(image)) { var mock = new Mock <IApiConnection>(); 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 } }) ) .ReturnsAsync(LazyJson.Create(new TwitterUser())); twitterApi.apiConnection = mock.Object; await twitterApi.AccountUpdateProfileImage(media) .IgnoreResponse() .ConfigureAwait(false); mock.VerifyAll(); } }
private async Task <long> UploadMediaItem(IMediaItem mediaItem, string mediaCategory) { async Task <long> UploadInternal(IMediaItem media, string category) { var mediaId = await this.tw.UploadMedia(media, category) .ConfigureAwait(false); if (!string.IsNullOrEmpty(media.AltText)) { await this.tw.Api.MediaMetadataCreate(mediaId, media.AltText) .ConfigureAwait(false); } return(mediaId); } using (var origImage = mediaItem.CreateImage()) { if (SettingManager.Common.AlphaPNGWorkaround && this.AddAlphaChannelIfNeeded(origImage.Image, out var newImage)) { using (var newMediaItem = new MemoryImageMediaItem(newImage)) { newMediaItem.AltText = mediaItem.AltText; return(await UploadInternal(newMediaItem, mediaCategory)); } } else { return(await UploadInternal(mediaItem, mediaCategory)); } } }
public async Task MediaUploadAppend_Test() { using var image = TestUtils.CreateDummyImage(); using var media = new MemoryImageMediaItem(image); var mock = new Mock <IApiConnection>(); 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 } }) ) .Returns(Task.CompletedTask); using var twitterApi = new TwitterApi(); twitterApi.apiConnection = mock.Object; await twitterApi.MediaUploadAppend(mediaId : 11111L, segmentIndex : 1, media : media) .ConfigureAwait(false); mock.VerifyAll(); }
public async Task MediaUpload_Test() { using (var twitterApi = new TwitterApi()) using (var image = TestUtils.CreateDummyImage()) using (var media = new MemoryImageMediaItem(image)) { var mock = new Mock<IApiConnection>(); mock.Setup(x => x.PostLazyAsync<TwitterUploadMediaResult>( new Uri("https://upload.twitter.com/1.1/media/upload.json", UriKind.Absolute), null, new Dictionary<string, IMediaItem> { { "media", media } }) ) .ReturnsAsync(LazyJson.Create(new TwitterUploadMediaResult())); twitterApi.apiConnection = mock.Object; await twitterApi.MediaUpload(media) .IgnoreResponse() .ConfigureAwait(false); mock.VerifyAll(); } }
public async Task AccountUpdateProfileImage_Test() { using (var twitterApi = new TwitterApi()) using (var image = TestUtils.CreateDummyImage()) using (var media = new MemoryImageMediaItem(image)) { var mock = new Mock<IApiConnection>(); 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 } }) ) .ReturnsAsync(LazyJson.Create(new TwitterUser())); twitterApi.apiConnection = mock.Object; await twitterApi.AccountUpdateProfileImage(media) .IgnoreResponse() .ConfigureAwait(false); mock.VerifyAll(); } }
public async Task PostLazyAsync_MultipartTest() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.httpUpload = http; using (var image = TestUtils.CreateDummyImage()) using (var media = new MemoryImageMediaItem(image)) { mockHandler.Enqueue(async x => { Assert.Equal(HttpMethod.Post, x.Method); Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json", x.RequestUri.AbsoluteUri); Assert.IsType<MultipartFormDataContent>(x.Content); var boundary = x.Content.Headers.ContentType.Parameters.Cast<NameValueHeaderValue>() .First(y => y.Name == "boundary").Value; // 前後のダブルクオーテーションを除去 boundary = boundary.Substring(1, boundary.Length - 2); var expectedText = $"--{boundary}\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "Content-Disposition: form-data; name=aaaa\r\n" + "\r\n" + "1111\r\n"+ $"--{boundary}\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "Content-Disposition: form-data; name=bbbb\r\n" + "\r\n" + "2222\r\n" + $"--{boundary}\r\n" + $"Content-Disposition: form-data; name=media1; filename={media.Name}; filename*=utf-8''{media.Name}\r\n" + "\r\n"; var expected = Encoding.UTF8.GetBytes(expectedText) .Concat(image.Stream.ToArray()) .Concat(Encoding.UTF8.GetBytes($"\r\n--{boundary}--\r\n")); Assert.Equal(expected, await x.Content.ReadAsByteArrayAsync().ConfigureAwait(false)); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("\"hogehoge\""), }; }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); var param = new Dictionary<string, string> { ["aaaa"] = "1111", ["bbbb"] = "2222", }; var mediaParam = new Dictionary<string, IMediaItem> { ["media1"] = media, }; var result = await apiConnection.PostLazyAsync<string>(endpoint, param, mediaParam) .ConfigureAwait(false); Assert.Equal("hogehoge", await result.LoadJsonAsync() .ConfigureAwait(false)); Assert.Equal(0, mockHandler.QueueCount); } } }
public async Task PostLazyAsync_MultipartTest() { using (var mockHandler = new HttpMessageHandlerMock()) using (var http = new HttpClient(mockHandler)) using (var apiConnection = new TwitterApiConnection("", "")) { apiConnection.httpUpload = http; using (var image = TestUtils.CreateDummyImage()) using (var media = new MemoryImageMediaItem(image)) { mockHandler.Enqueue(async x => { Assert.Equal(HttpMethod.Post, x.Method); Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json", x.RequestUri.AbsoluteUri); Assert.IsType <MultipartFormDataContent>(x.Content); var boundary = x.Content.Headers.ContentType.Parameters.Cast <NameValueHeaderValue>() .First(y => y.Name == "boundary").Value; // 前後のダブルクオーテーションを除去 boundary = boundary.Substring(1, boundary.Length - 2); var expectedText = $"--{boundary}\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "Content-Disposition: form-data; name=aaaa\r\n" + "\r\n" + "1111\r\n" + $"--{boundary}\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "Content-Disposition: form-data; name=bbbb\r\n" + "\r\n" + "2222\r\n" + $"--{boundary}\r\n" + $"Content-Disposition: form-data; name=media1; filename={media.Name}; filename*=utf-8''{media.Name}\r\n" + "\r\n"; var expected = Encoding.UTF8.GetBytes(expectedText) .Concat(image.Stream.ToArray()) .Concat(Encoding.UTF8.GetBytes($"\r\n--{boundary}--\r\n")); Assert.Equal(expected, await x.Content.ReadAsByteArrayAsync().ConfigureAwait(false)); return(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("\"hogehoge\""), }); }); var endpoint = new Uri("hoge/tetete.json", UriKind.Relative); var param = new Dictionary <string, string> { ["aaaa"] = "1111", ["bbbb"] = "2222", }; var mediaParam = new Dictionary <string, IMediaItem> { ["media1"] = media, }; var result = await apiConnection.PostLazyAsync <string>(endpoint, param, mediaParam) .ConfigureAwait(false); Assert.Equal("hogehoge", await result.LoadJsonAsync() .ConfigureAwait(false)); Assert.Equal(0, mockHandler.QueueCount); } } }