OSDN Git Service

ApiResponse.ReadAsStringメソッドを追加
[opentween/open-tween.git] / OpenTween.Tests / TweenMainTest.cs
1 // OpenTween - Client of Twitter
2 // Copyright (c) 2014 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3 // All rights reserved.
4 //
5 // This file is part of OpenTween.
6 //
7 // This program is free software; you can redistribute it and/or modify it
8 // under the terms of the GNU General Public License as published by the Free
9 // Software Foundation; either version 3 of the License, or (at your option)
10 // any later version.
11 //
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 // for more details.
16 //
17 // You should have received a copy of the GNU General Public License along
18 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
19 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 // Boston, MA 02110-1301, USA.
21
22 using System;
23 using System.Collections.Generic;
24 using System.IO;
25 using System.Linq;
26 using System.Text;
27 using System.Windows.Forms;
28 using OpenTween.Api;
29 using OpenTween.Api.DataModel;
30 using OpenTween.Connection;
31 using OpenTween.Models;
32 using OpenTween.Setting;
33 using OpenTween.Thumbnail;
34 using Xunit;
35 using Xunit.Extensions;
36
37 namespace OpenTween
38 {
39     public class TweenMainTest
40     {
41         [WinFormsFact]
42         public void Initialize_Test()
43         {
44             var settings = new SettingManager("");
45             var tabinfo = new TabInformations();
46             using var twitterApi = new TwitterApi();
47             using var twitter = new Twitter(twitterApi);
48             using var imageCache = new ImageCache();
49             using var iconAssets = new IconAssetsManager();
50             var thumbnailGenerator = new ThumbnailGenerator(new(autoupdate: false));
51             var twitterAppToken = new TwitterAppToken
52             {
53                 AuthType = APIAuthType.OAuth1,
54                 OAuth1CustomConsumerKey = ApiKey.Create("aaa"),
55                 OAuth1CustomConsumerSecret = ApiKey.Create("bbb"),
56             };
57             twitter.Initialize(twitterAppToken, "", "", "", 0L);
58
59             using var tweenMain = new TweenMain(settings, tabinfo, twitter, imageCache, iconAssets, thumbnailGenerator);
60         }
61
62         [Fact]
63         public void GetUrlFromDataObject_XMozUrlTest()
64         {
65             var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\nTwitter\0");
66             using var memstream = new MemoryStream(dataBytes);
67             var data = new DataObject("text/x-moz-url", memstream);
68
69             var expected = ("https://twitter.com/", "Twitter");
70             Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
71         }
72
73         [Fact]
74         public void GetUrlFromDataObject_IESiteModeToUrlTest()
75         {
76             var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\0Twitter\0");
77             using var memstream = new MemoryStream(dataBytes);
78             var data = new DataObject("IESiteModeToUrl", memstream);
79
80             var expected = ("https://twitter.com/", "Twitter");
81             Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
82         }
83
84         [Fact]
85         public void GetUrlFromDataObject_UniformResourceLocatorWTest()
86         {
87             var dataBytes = Encoding.Unicode.GetBytes("https://twitter.com/\0");
88             using var memstream = new MemoryStream(dataBytes);
89             var data = new DataObject("UniformResourceLocatorW", memstream);
90
91             var expected = ("https://twitter.com/", (string?)null);
92             Assert.Equal(expected, TweenMain.GetUrlFromDataObject(data));
93         }
94
95         [Fact]
96         public void GetUrlFromDataObject_UnknownFormatTest()
97         {
98             using var memstream = new MemoryStream(Array.Empty<byte>());
99             var data = new DataObject("application/x-hogehoge", memstream);
100
101             Assert.Throws<NotSupportedException>(() => TweenMain.GetUrlFromDataObject(data));
102         }
103
104         [Fact]
105         public void CreateRetweetUnofficial_UrlTest()
106         {
107             var statusText = """<a href="http://t.co/KYi7vMZzRt" title="http://twitter.com/">twitter.com</a>""";
108
109             Assert.Equal("http://twitter.com/", TweenMain.CreateRetweetUnofficial(statusText, false));
110         }
111
112         [Fact]
113         public void CreateRetweetUnofficial_MentionTest()
114         {
115             var statusText = """<a class="mention" href="https://twitter.com/twitterapi">@TwitterAPI</a>""";
116
117             Assert.Equal("@TwitterAPI", TweenMain.CreateRetweetUnofficial(statusText, false));
118         }
119
120         [Fact]
121         public void CreateRetweetUnofficial_HashtagTest()
122         {
123             var statusText = """<a class="hashtag" href="https://twitter.com/search?q=%23OpenTween">#OpenTween</a>""";
124
125             Assert.Equal("#OpenTween", TweenMain.CreateRetweetUnofficial(statusText, false));
126         }
127
128         [Fact]
129         public void CreateRetweetUnofficial_SingleLineTest()
130         {
131             var statusText = "123<br>456<br>789";
132
133             Assert.Equal("123 456 789", TweenMain.CreateRetweetUnofficial(statusText, false));
134         }
135
136         [Fact]
137         public void CreateRetweetUnofficial_MultiLineTest()
138         {
139             var statusText = "123<br>456<br>789";
140
141             Assert.Equal("123" + Environment.NewLine + "456" + Environment.NewLine + "789", TweenMain.CreateRetweetUnofficial(statusText, true));
142         }
143
144         [Fact]
145         public void CreateRetweetUnofficial_DecodeTest()
146         {
147             var statusText = "&lt;&gt;&quot;&#39;&nbsp;";
148
149             Assert.Equal("<>\"' ", TweenMain.CreateRetweetUnofficial(statusText, false));
150         }
151
152         [Fact]
153         public void CreateRetweetUnofficial_WithFormatterTest()
154         {
155             // TweetFormatterでHTMLに整形 → CreateRetweetUnofficialで復元 までの動作が正しく行えているか
156
157             var text = "#てすと @TwitterAPI \n http://t.co/KYi7vMZzRt";
158             var entities = new TwitterEntity[]
159             {
160                 new TwitterEntityHashtag
161                 {
162                     Indices = new[] { 0, 4 },
163                     Text = "てすと",
164                 },
165                 new TwitterEntityMention
166                 {
167                     Indices = new[] { 5, 16 },
168                     Id = 6253282L,
169                     Name = "Twitter API",
170                     ScreenName = "twitterapi",
171                 },
172                 new TwitterEntityUrl
173                 {
174                     Indices = new[] { 19, 41 },
175                     DisplayUrl = "twitter.com",
176                     ExpandedUrl = "http://twitter.com/",
177                     Url = "http://t.co/KYi7vMZzRt",
178                 },
179             };
180
181             var html = TweetFormatter.AutoLinkHtml(text, entities);
182
183             var expected = "#てすと @TwitterAPI " + Environment.NewLine + " http://twitter.com/";
184             Assert.Equal(expected, TweenMain.CreateRetweetUnofficial(html, true));
185         }
186
187         [Theory]
188         [InlineData("", true)]
189         [InlineData("hoge", false)]
190         [InlineData("@twitterapi ", true)]
191         [InlineData("@twitterapi @opentween ", true)]
192         [InlineData("@twitterapi @opentween hoge", false)]
193         public void TextContainsOnlyMentions_Test(string input, bool expected)
194             => Assert.Equal(expected, TweenMain.TextContainsOnlyMentions(input));
195     }
196 }