OSDN Git Service

UserTweetsAndRepliesの取得に新しいIApiConnectionを使用する
authorKimura Youichi <kim.upsilon@bucyou.net>
Fri, 8 Dec 2023 18:48:02 +0000 (03:48 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Fri, 8 Dec 2023 18:48:45 +0000 (03:48 +0900)
OpenTween.Tests/Api/GraphQL/UserTweetsAndRepliesRequestTest.cs
OpenTween/Api/GraphQL/UserTweetsAndRepliesRequest.cs

index 690cd44..50264c6 100644 (file)
 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
 // Boston, MA 02110-1301, USA.
 
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
 using System.Threading.Tasks;
 using Moq;
 using OpenTween.Connection;
@@ -36,21 +31,23 @@ namespace OpenTween.Api.GraphQL
         [Fact]
         public async Task Send_Test()
         {
-            using var responseStream = File.OpenRead("Resources/Responses/UserTweetsAndReplies_SimpleTweet.json");
+            using var apiResponse = await TestUtils.CreateApiResponse("Resources/Responses/UserTweetsAndReplies_SimpleTweet.json");
 
-            var mock = new Mock<IApiConnectionLegacy>();
+            var mock = new Mock<IApiConnection>();
             mock.Setup(x =>
-                    x.GetStreamAsync(It.IsAny<Uri>(), It.IsAny<IDictionary<string, string>>(), It.IsAny<string>())
+                    x.SendAsync(It.IsAny<IHttpRequest>())
                 )
-                .Callback<Uri, IDictionary<string, string>, string>((url, param, endpointName) =>
+                .Callback<IHttpRequest>(x =>
                 {
-                    Assert.Equal(new("https://twitter.com/i/api/graphql/YlkSUg0mRBx7-EkxCvc-bw/UserTweetsAndReplies"), url);
-                    Assert.Equal(2, param.Count);
-                    Assert.Equal("""{"userId":"40480664","count":20,"includePromotedContent":true,"withCommunity":true,"withVoice":true,"withV2Timeline":true}""", param["variables"]);
-                    Assert.True(param.ContainsKey("features"));
-                    Assert.Equal("UserTweetsAndReplies", endpointName);
+                    var request = Assert.IsType<GetRequest>(x);
+                    Assert.Equal(new("https://twitter.com/i/api/graphql/YlkSUg0mRBx7-EkxCvc-bw/UserTweetsAndReplies"), request.RequestUri);
+                    var query = request.Query!;
+                    Assert.Equal(2, query.Count);
+                    Assert.Equal("""{"userId":"40480664","count":20,"includePromotedContent":true,"withCommunity":true,"withVoice":true,"withV2Timeline":true}""", query["variables"]);
+                    Assert.True(query.ContainsKey("features"));
+                    Assert.Equal("UserTweetsAndReplies", request.EndpointName);
                 })
-                .ReturnsAsync(responseStream);
+                .ReturnsAsync(apiResponse);
 
             var request = new UserTweetsAndRepliesRequest(userId: "40480664")
             {
@@ -68,21 +65,23 @@ namespace OpenTween.Api.GraphQL
         [Fact]
         public async Task Send_RequestCursor_Test()
         {
-            using var responseStream = File.OpenRead("Resources/Responses/UserTweetsAndReplies_SimpleTweet.json");
+            using var apiResponse = await TestUtils.CreateApiResponse("Resources/Responses/UserTweetsAndReplies_SimpleTweet.json");
 
-            var mock = new Mock<IApiConnectionLegacy>();
+            var mock = new Mock<IApiConnection>();
             mock.Setup(x =>
-                    x.GetStreamAsync(It.IsAny<Uri>(), It.IsAny<IDictionary<string, string>>(), It.IsAny<string>())
+                    x.SendAsync(It.IsAny<IHttpRequest>())
                 )
-                .Callback<Uri, IDictionary<string, string>, string>((url, param, endpointName) =>
+                .Callback<IHttpRequest>(x =>
                 {
-                    Assert.Equal(new("https://twitter.com/i/api/graphql/YlkSUg0mRBx7-EkxCvc-bw/UserTweetsAndReplies"), url);
-                    Assert.Equal(2, param.Count);
-                    Assert.Equal("""{"userId":"40480664","count":20,"includePromotedContent":true,"withCommunity":true,"withVoice":true,"withV2Timeline":true,"cursor":"aaa"}""", param["variables"]);
-                    Assert.True(param.ContainsKey("features"));
-                    Assert.Equal("UserTweetsAndReplies", endpointName);
+                    var request = Assert.IsType<GetRequest>(x);
+                    Assert.Equal(new("https://twitter.com/i/api/graphql/YlkSUg0mRBx7-EkxCvc-bw/UserTweetsAndReplies"), request.RequestUri);
+                    var query = request.Query!;
+                    Assert.Equal(2, query.Count);
+                    Assert.Equal("""{"userId":"40480664","count":20,"includePromotedContent":true,"withCommunity":true,"withVoice":true,"withV2Timeline":true,"cursor":"aaa"}""", query["variables"]);
+                    Assert.True(query.ContainsKey("features"));
+                    Assert.Equal("UserTweetsAndReplies", request.EndpointName);
                 })
-                .ReturnsAsync(responseStream);
+                .ReturnsAsync(apiResponse);
 
             var request = new UserTweetsAndRepliesRequest(userId: "40480664")
             {
index 3fad578..fff6513 100644 (file)
 
 using System;
 using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Runtime.Serialization.Json;
-using System.Text;
 using System.Threading.Tasks;
-using System.Xml;
-using System.Xml.Linq;
 using System.Xml.XPath;
 using OpenTween.Connection;
 
@@ -69,26 +63,20 @@ namespace OpenTween.Api.GraphQL
             };
         }
 
-        public async Task<TimelineResponse> Send(IApiConnectionLegacy apiConnection)
+        public async Task<TimelineResponse> Send(IApiConnection apiConnection)
         {
-            var param = this.CreateParameters();
-
-            XElement rootElm;
-            try
-            {
-                using var stream = await apiConnection.GetStreamAsync(EndpointUri, param, EndpointName);
-                using var jsonReader = JsonReaderWriterFactory.CreateJsonReader(stream, XmlDictionaryReaderQuotas.Max);
-                rootElm = XElement.Load(jsonReader);
-            }
-            catch (IOException ex)
-            {
-                throw new WebApiException("IO Error", ex);
-            }
-            catch (NotSupportedException ex)
+            var request = new GetRequest
             {
-                // NotSupportedException: Stream does not support reading. のエラーが時々報告される
-                throw new WebApiException("Stream Error", ex);
-            }
+                RequestUri = EndpointUri,
+                Query = this.CreateParameters(),
+                EndpointName = EndpointName,
+            };
+
+            using var response = await apiConnection.SendAsync(request)
+                .ConfigureAwait(false);
+
+            var rootElm = await response.ReadAsJsonXml()
+                .ConfigureAwait(false);
 
             ErrorResponse.ThrowIfError(rootElm);