From 781fc24623e1b386cb84a93ce69fcd924830fbaf Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Sun, 7 Jan 2024 01:29:33 +0900 Subject: [PATCH] =?utf8?q?UserByScreenName=E3=81=A7=E7=A9=BA=E3=81=AE?= =?utf8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E6=83=85=E5=A0=B1=E3=81=8C?= =?utf8?q?=E8=BF=94=E3=81=A3=E3=81=A6=E3=81=8D=E3=81=9F=E5=A0=B4=E5=90=88?= =?utf8?q?=E3=81=AB=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=A8=E3=81=97=E3=81=A6?= =?utf8?q?=E6=89=B1=E3=81=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- CHANGELOG.txt | 1 + .../Api/GraphQL/UserByScreenNameRequestTest.cs | 25 ++++++++++++++++++++++ .../Responses/UserByScreenName_Empty.json | 3 +++ OpenTween/Api/GraphQL/UserByScreenNameRequest.cs | 25 ++++++++++++++++------ 4 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 OpenTween.Tests/Resources/Responses/UserByScreenName_Empty.json diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 6306a2da..31c14d37 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -3,6 +3,7 @@ ==== Unreleased * NEW: Cookie使用時の関連発言表示に対応 * FIX: APIリクエストのタイムアウト時に接続が切断されない場合がある不具合を修正 + * FIX: 存在しないユーザーのプロフィールを取得しようとした場合のエラーが適切に処理されない不具合を修正 ==== Ver 3.10.1(2023/12/23) * FIX: OAuth 1.0a によるAPIアクセスに失敗する不具合を修正 diff --git a/OpenTween.Tests/Api/GraphQL/UserByScreenNameRequestTest.cs b/OpenTween.Tests/Api/GraphQL/UserByScreenNameRequestTest.cs index 9c4e287d..292fbada 100644 --- a/OpenTween.Tests/Api/GraphQL/UserByScreenNameRequestTest.cs +++ b/OpenTween.Tests/Api/GraphQL/UserByScreenNameRequestTest.cs @@ -81,5 +81,30 @@ namespace OpenTween.Api.GraphQL mock.VerifyAll(); } + + [Fact] + public async Task Send_EmptyTest() + { + // ユーザーが存在しない場合にエラー情報を含まない空のオブジェクトが返されることがある + using var apiResponse = await TestUtils.CreateApiResponse("Resources/Responses/UserByScreenName_Empty.json"); + + var mock = new Mock(); + mock.Setup(x => + x.SendAsync(It.IsAny()) + ) + .ReturnsAsync(apiResponse); + + var request = new UserByScreenNameRequest + { + ScreenName = "==INVALID==", + }; + + var ex = await Assert.ThrowsAsync( + () => request.Send(mock.Object) + ); + Assert.Equal("User is not available.", ex.Message); + + mock.VerifyAll(); + } } } diff --git a/OpenTween.Tests/Resources/Responses/UserByScreenName_Empty.json b/OpenTween.Tests/Resources/Responses/UserByScreenName_Empty.json new file mode 100644 index 00000000..73cd5c32 --- /dev/null +++ b/OpenTween.Tests/Resources/Responses/UserByScreenName_Empty.json @@ -0,0 +1,3 @@ +{ + "data": {} +} diff --git a/OpenTween/Api/GraphQL/UserByScreenNameRequest.cs b/OpenTween/Api/GraphQL/UserByScreenNameRequest.cs index 4b3c8cca..f3d627df 100644 --- a/OpenTween/Api/GraphQL/UserByScreenNameRequest.cs +++ b/OpenTween/Api/GraphQL/UserByScreenNameRequest.cs @@ -71,20 +71,33 @@ namespace OpenTween.Api.GraphQL ErrorResponse.ThrowIfError(rootElm); - var userElm = rootElm.XPathSelectElement("/data/user/result"); - this.ThrowIfUserUnavailable(userElm); + try + { + var userElm = rootElm.XPathSelectElement("/data/user/result"); + this.ThrowIfUserUnavailable(userElm); - return new(userElm); + return new(userElm); + } + catch (WebApiException ex) + { + ex.ResponseText = JsonUtils.JsonXmlToString(rootElm); + throw; + } } - private void ThrowIfUserUnavailable(XElement userElm) + private void ThrowIfUserUnavailable(XElement? userElm) { + if (userElm == null) + { + var errorText = "User is not available."; + throw new WebApiException(errorText); + } + var typeName = userElm.Element("__typename")?.Value; if (typeName == "UserUnavailable") { var errorText = userElm.Element("message")?.Value ?? "User is not available."; - var json = JsonUtils.JsonXmlToString(userElm); - throw new WebApiException(errorText, json); + throw new WebApiException(errorText); } } } -- 2.11.0