}
[Fact]
- public async Task PostLazyAsync_MultipartTest()
- {
- using var mockHandler = new HttpMessageHandlerMock();
- using var http = new HttpClient(mockHandler);
- using var apiConnection = new TwitterApiConnection();
- apiConnection.Http = 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());
-
- 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);
-
- Assert.Equal("hogehoge", await result.LoadJsonAsync());
-
- Assert.Equal(0, mockHandler.QueueCount);
- }
-
- [Fact]
- public async Task PostLazyAsync_Multipart_NullTest()
- {
- using var mockHandler = new HttpMessageHandlerMock();
- using var http = new HttpClient(mockHandler);
- using var apiConnection = new TwitterApiConnection();
- apiConnection.Http = http;
-
- 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" +
- $"\r\n--{boundary}--\r\n";
-
- var expected = Encoding.UTF8.GetBytes(expectedText);
-
- Assert.Equal(expected, await x.Content.ReadAsByteArrayAsync());
-
- return new HttpResponseMessage(HttpStatusCode.OK)
- {
- Content = new StringContent("\"hogehoge\""),
- };
- });
-
- var endpoint = new Uri("hoge/tetete.json", UriKind.Relative);
-
- var result = await apiConnection.PostLazyAsync<string>(endpoint, param: null, media: null);
-
- Assert.Equal("hogehoge", await result.LoadJsonAsync());
-
- Assert.Equal(0, mockHandler.QueueCount);
- }
-
- [Fact]
public async Task HandleTimeout_SuccessTest()
{
static async Task<int> AsyncFunc(CancellationToken token)
return response.ReadAsLazyJson<T>();
}
- public async Task<LazyJson<T>> PostLazyAsync<T>(Uri uri, IDictionary<string, string>? param, IDictionary<string, IMediaItem>? media)
- {
- var request = new PostMultipartRequest
- {
- RequestUri = uri,
- Query = param,
- Media = media,
- };
-
- using var response = await this.SendAsync(request)
- .ConfigureAwait(false);
-
- return response.ReadAsLazyJson<T>();
- }
-
- public async Task PostAsync(Uri uri, IDictionary<string, string>? param, IDictionary<string, IMediaItem>? media)
- {
- var request = new PostMultipartRequest
- {
- RequestUri = uri,
- Query = param,
- Media = media,
- };
-
- await this.SendAsync(request)
- .IgnoreResponse()
- .ConfigureAwait(false);
- }
-
public static async Task<T> HandleTimeout<T>(Func<CancellationToken, Task<T>> func, TimeSpan timeout)
{
using var cts = new CancellationTokenSource();