Example #1
0
        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();
                    }
        }
Example #2
0
        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();
                    }
        }
Example #3
0
        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));
                }
            }
        }
Example #4
0
        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();
        }
Example #5
0
        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();
            }
        }
Example #6
0
        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);
                }
            }
        }
Example #8
0
        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);
                            }
                    }
        }