diff options
Diffstat (limited to 'test/core')
-rw-r--r-- | test/core/lib/retriever/entity/test_twitter_entity.rb | 144 | ||||
-rw-r--r-- | test/core/test_entity.rb | 217 | ||||
-rw-r--r-- | test/core/test_message.rb | 45 | ||||
-rw-r--r-- | test/core/test_retriever.rb | 10 |
4 files changed, 172 insertions, 244 deletions
diff --git a/test/core/lib/retriever/entity/test_twitter_entity.rb b/test/core/lib/retriever/entity/test_twitter_entity.rb new file mode 100644 index 00000000..c1822d6f --- /dev/null +++ b/test/core/lib/retriever/entity/test_twitter_entity.rb @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- + +require_relative '../../../../helper' + +miquire :lib, 'retriever' + +class TC_TwitterEntity < Test::Unit::TestCase + class EntityTestModel < Retriever::Model + field.string :message, required: true + field.time :created + field.time :modified + + entity_class Retriever::Entity::TwitterEntity + + def to_show + self[:message] + end + end + + def setup + end + + # 2つ目以降のEntityの位置がずれる問題 + def test_nested_legacy_retweet + model = EntityTestModel.new( + message: '変な意味じゃなくてね。RT @kouichi_0308: アレでソレですか…(´・ω・`)シュン… RT @nene_loveplus: 昔から一緒にいるフォロワーさんは色々アレでソレでちょっと困っちゃうわね…。', + entities: { + user_mentions: [ { id_str: "127914421", + screen_name: "kouichi_0308", + name: "コウイチ(2011年度版)", + id: 127914421, + indices: [14, 27]}, + { id_str: "95126742", + screen_name: "nene_loveplus", + name: "姉ヶ崎寧々", + id: 95126742, + indices: [53, 67]}], + urls: [], + hashtags: [] }) + assert_equal model[:message], model.entity.to_s + end + + # TwitterがEntityを返さないという勘弁してほしいケース + def test_lost_entity + model = EntityTestModel.new( + message: 'RT @toshi_a: おいmikutterが変態ツイッタークライアントだという風説が', + entities: {}) + assert_equal model[:message], model.entity.to_s + end + + def test_mention_no_space_splitted + model = EntityTestModel.new( + message: 'もともとは@penguin2716さんに勧められて始めたついった。そして彼より遅く始めた自分がTwitterにハマり、彼の総ポスト数をすぐに追い抜いたと思ったのですが、今や彼はれっきとしたmikutter廃人となり、ワタシの手の届かぬ領域に到達されました。', + entities: {}) + assert_equal model[:message], model.entity.to_s + end + + # >のあとに@...があるケース。エンティティエンコードのせいで位置がずれてないか + def test_segment_after_escaped_character + model = EntityTestModel.new( + message: '一体何をやってんだろう(笑)。 > @toshi_a the hacker', + entities: { + hashtags: [], + urls: [], + user_mentions: [ + { name: "蝶舞スカーフ型としぁ", + screen_name: "toshi_a", + indices: [21, 29], + id: 15926668, + id_str: "15926668"}]}) + assert_equal model[:message], model.entity.to_s + end + + # URLのあとにハッシュタグがある + def test_mixed_entities + model = EntityTestModel.new( + message: 'まだまだ絶賛配信中!今日は「日常のラヂオ」第35回がランティスネットラジオ goo.gl/2tsIG にて22時から配信スタートです!「日常」が好きな人ならきっと楽しんでいただけますのでよろしくお願いします。 #nichijou', + entities: { + user_mentions: [], + urls: [ + { url: "goo.gl/2tsIG", + indices: [38, 50], + expanded_url: nil } ], + hashtags: [ + { indices: [105, 114], + text: "nichijou" } ]}) + assert_equal model[:message], model.entity.to_s + end + + # まじでいらん機能によってエンティティの計算がずれていないか + def test_cashtags + model = EntityTestModel.new( + message: "@uebayasi I tried and it works as below:\n$ uname -srm\nNetBSD 6.0.1 amd64\n$ s ( ) { local b; b=1; echo $b; b=\"$@\"; echo $b; }\n$ s d e\n1\nd e", + entities: { + hashtags: [], + symbols: [{ indices: [103, 105], + text: "b"}, + { indices: [120, 122], + text: "b"}], + urls: [], + user_mentions: [{ id: 5864792, + id_str: "5864792", + indices: [0, 9], + name: "Masao Uebayashi", + screen_name: "uebayasi" }]}) + assert_equal model[:message], model.entity.to_s + end + + # TwitterがEntityを返さないという勘弁してほしいケース + def test_has_media + model = EntityTestModel.new( + message: "【特価品】Celeron C1037U&HM77、デュアルLAN(82574L)を搭載したNAS向miniITXマザー Giada N70E-DR V2 14980円 http://t.co/zYaNWyebgm https://t.co/DCbLaYFXeu", + entities: { + hashtags: [], + symbols: [], + urls: + [{ url: "http://t.co/zYaNWyebgm", + expanded_url: "http://goo.gl/HDK5i", + display_url: "goo.gl/HDK5i", + indices: [88, 110]}], + user_mentions: [], + media: + [{ id: 352644565880168448, + id_str: "352644565880168448", + indices: [111, 134], + media_url: "http://pbs.twimg.com/media/BOTYXUFCYAAGmf_.jpg", + media_url_https: "https://pbs.twimg.com/media/BOTYXUFCYAAGmf_.jpg", + url: "https://t.co/DCbLaYFXeu", + display_url: "pic.twitter.com/DCbLaYFXeu", + expanded_url: + "http://twitter.com/ph_toei/status/352644565875974144/photo/1", + type: "photo", + sizes: + { medium: {w: 480, h: 437, resize: "fit"}, + thumb: {w: 150, h: 150, resize: "crop"}, + small: {w: 340, h: 310, resize: "fit"}, + large: {w: 480, h: 437, resize: "fit"}}, + source_status_id: 352644565875974144, + source_status_id_str: "352644565875974144"}]}) + assert_equal "【特価品】Celeron C1037U&HM77、デュアルLAN(82574L)を搭載したNAS向miniITXマザー Giada N70E-DR V2 14980円 goo.gl/HDK5i pic.twitter.com/DCbLaYFXeu", model.entity.to_s + end + + +end diff --git a/test/core/test_entity.rb b/test/core/test_entity.rb deleted file mode 100644 index b1d274e6..00000000 --- a/test/core/test_entity.rb +++ /dev/null @@ -1,217 +0,0 @@ -# -*- coding: utf-8 -*- - -require File.expand_path(File.dirname(__FILE__) + '/../helper') -#require File.expand_path(File.dirname(__FILE__) + '/../utils') -miquire :core, 'entity' -miquire :core, 'userconfig' - -class Plugin -end - -class String - def inspect - to_s - end -end - -module Pango - ESCAPE_RULE = {'&' => '&' ,'>' => '>', '<' => '<'}.freeze - class << self - - # テキストをPango.parse_markupで安全にパースできるようにエスケープする。 - def escape(text) - text.gsub(/[<>&]/){|m| Pango::ESCAPE_RULE[m] } end end end - - -class TC_Message < Test::Unit::TestCase - - THE_TWEET = '変な意味じゃなくてね。RT @kouichi_0308: アレでソレですか…(´・ω・`)シュン… RT @nene_loveplus: 昔から一緒にいるフォロワーさんは色々アレでソレでちょっと困っちゃうわね…。' - THE_ENTITY = { - :user_mentions => [ { :id_str => "127914421", - :screen_name => "kouichi_0308", - :name => "コウイチ(2011年度版)", - :id => 127914421, - :indices => [14, 27]}, - { :id_str => "95126742", - :screen_name => "nene_loveplus", - :name=>"姉ヶ崎寧々", - :id=>95126742, - :indices=>[53, 67]}], - :urls => [], - :hashtags => [] } - - THE_TWEET2 = '♥ Unfaithful by Rihanna #lastfm: http://bit.ly/3YP9Hq amazon: http://bit.ly/1tmPYb' - THE_ENTITY2 = { - :user_mentions=>[], - :hashtags=> [ { :text=>"lastfm", - :indices=>[30, 37] } ], - :urls=> [ { :expanded_url=>nil, - :indices=>[39, 59], - :url=>"http://bit.ly/3YP9Hq" }, - { :expanded_url=>nil, - :indices=>[68, 88], - :url=>"http://bit.ly/1tmPYb" } ] } - - THE_TWEET3 = 'RT @toshi_a: おいmikutterが変態ツイッタークライアントだという風説が' - THE_ENTITY3 = {} - - def setup - Plugin.stubs(:call).returns(true) - Message::Entity.addlinkrule(:urls, URI.regexp(['http','https'])){ |segment| } - Message::Entity.addlinkrule(:media){ |segment| } - Message::Entity.addlinkrule(:hashtags, /(#|#)([a-zA-Z0-9_]+)/){ |segment|} - Message::Entity.addlinkrule(:user_mentions, /(@|@|〄)[a-zA-Z0-9_]+/){ |segment| } - end - - def teardown - Message::Entity.refresh - end - - def test_index_to_escaped_index - assert_equal(5, Message::Entity.index_to_escaped_index("foobar", 5)) - assert_equal(2, Message::Entity.index_to_escaped_index("<foobar>", 5)) - assert_equal(5, Message::Entity.index_to_escaped_index("<foo><bar>", 11)) - assert_equal(5, Message::Entity.index_to_escaped_index("<&>abc", 15)) - end - - def test_1 - mes = stub - mes.stubs(:to_show).returns(THE_TWEET) - mes.stubs(:[]).with(:entities).returns(THE_ENTITY) - mes.stubs(:is_a?).with(Message).returns(true) - - entity = Message::Entity.new(mes) - - assert_equal("変な意味じゃなくてね。RT @kouichi_0308: アレでソレですか…(´・ω・`)シュン… RT @nene_loveplus: 昔から一緒にいるフォロワーさんは色々アレでソレでちょっと困っちゃうわね…。", entity.to_s) - - splited = mes.to_show.split(//u).map{ |s| Pango::ESCAPE_RULE[s] || s } - entity.reverse_each{ |l| - splited[l[:range]] = '<span underline="single" underline_color="#000000">'+"#{Pango.escape(l[:face])}</span>" - } - splited - end - - def test_3 - mes = stub - mes.stubs(:to_show).returns(THE_TWEET3) - mes.stubs(:[]).with(:entities).returns(THE_ENTITY3) - mes.stubs(:is_a?).with(Message).returns(true) - entity = Message::Entity.new(mes) - assert_kind_of(String, entity.to_s) - assert_equal("RT @toshi_a: \343\201\212\343\201\204mikutter\343\201\214\345\244\211\346\205\213\343\203\204\343\202\244\343\203\203\343\202\277\343\203\274\343\202\257\343\203\251\343\202\244\343\202\242\343\203\263\343\203\210\343\201\240\343\201\250\343\201\204\343\201\206\351\242\250\350\252\254\343\201\214", entity.to_s.inspect) - end - - def test_4 - tweet = 'もともとは@penguin2716さんに勧められて始めたついった。そして彼より遅く始めた自分がTwitterにハマり、彼の総ポスト数をすぐに追い抜いたと思ったのですが、今や彼はれっきとしたmikutter廃人となり、ワタシの手の届かぬ領域に到達されました。' - mes = stub - mes.stubs(:to_show).returns(tweet) - mes.stubs(:[]).with(:entities).returns({}) - mes.stubs(:is_a?).with(Message).returns(true) - entity = Message::Entity.new(mes) - - assert_kind_of(String, entity.to_s) - assert_equal(tweet, entity.to_s.inspect) - end - - def test_5 - tweet = '一体何をやってんだろう(笑)。 > @toshi_a the hacker' - mes = stub - mes.stubs(:to_show).returns(tweet) - mes.stubs(:[]).with(:entities).returns({:hashtags=>[], :urls=>[], :user_mentions=>[{:name=>"蝶舞スカーフ型としぁ", :screen_name=>"toshi_a", :indices=>[21, 29], :id=>15926668, :id_str=>"15926668"}]}) - mes.stubs(:is_a?).with(Message).returns(true) - entity = Message::Entity.new(mes) - - assert_kind_of(String, entity.to_s) - assert_equal(tweet, entity.to_s.inspect) - end - - def test_6 - Plugin.stubs(:filtering).with(:is_expanded, 'goo.gl/2tsIG').returns([true]) - tweet = 'まだまだ絶賛配信中!今日は「日常のラヂオ」第35回がランティスネットラジオ goo.gl/2tsIG にて22時から配信スタートです!「日常」が好きな人ならきっと楽しんでいただけますのでよろしくお願いします。 #nichijou' - mes = stub - mes.stubs(:to_show).returns(tweet) - mes.stubs(:[]).with(:entities). - returns({ :user_mentions=>[], - :urls => [{ :url=>"goo.gl/2tsIG", - :indices=>[38, 50], - :expanded_url=>nil } ], - :hashtags => [{ :indices=>[105, 114], - :text=>"nichijou" } ]}) - mes.stubs(:is_a?).with(Message).returns(true) - entity = Message::Entity.new(mes) - - assert_kind_of(String, entity.to_s) - assert_equal(tweet, entity.to_s.inspect) - end - - def test_7 - tweet = "@uebayasi I tried and it works as below:\n$ uname -srm\nNetBSD 6.0.1 amd64\n$ s ( ) { local b; b=1; echo $b; b=\"$@\"; echo $b; }\n$ s d e\n1\nd e" - mes = stub - mes.stubs(:to_show).returns(tweet) - mes.stubs(:[]).with(:id).returns(325862212793159680) - mes.stubs(:[]).with(:message).returns(tweet) - mes.stubs(:[]).with(:entities). - returns({ hashtags: [], - symbols: [{ indices: [103, 105], - text: "b"}, - { indices: [120, 122], - text: "b"}], - urls: [], - user_mentions: [{ id: 5864792, - id_str: "5864792", - indices: [0, 9], - name: "Masao Uebayashi", - screen_name: "uebayasi" }]}) - mes.stubs(:is_a?).with(Message).returns(true) - entity = Message::Entity.new(mes) - - assert_kind_of(String, entity.to_s) - assert_equal(tweet, entity.to_s.inspect) - end - - def test_8 - Plugin.stubs(:filtering).with(:expand_url, 'http://t.co/zYaNWyebgm').returns(["http://goo.gl/HDK5i"]) - Plugin.stubs(:filtering).with(:is_expanded, 'http://t.co/zYaNWyebgm').returns([false]) - Plugin.stubs(:filtering).with(:is_expanded, 'http://goo.gl/HDK5i').returns([true]) - Plugin.stubs(:filtering).with(:expand_url, 'https://t.co/DCbLaYFXeu').returns(["http://twitter.com/ph_toei/status/352644565875974144/photo/1"]) - Plugin.stubs(:filtering).with(:is_expanded, 'https://t.co/DCbLaYFXeu').returns([false]) - mes = stub - mes.stubs(:to_show).returns("【特価品】Celeron C1037U&HM77、デュアルLAN(82574L)を搭載したNAS向miniITXマザー Giada N70E-DR V2 14980円 http://t.co/zYaNWyebgm https://t.co/DCbLaYFXeu") - mes.stubs(:[]).with(:id).returns(429203799404593152) - mes.stubs(:[]).with(:message).returns("【特価品】Celeron C1037U&HM77、デュアルLAN(82574L)を搭載したNAS向miniITXマザー Giada N70E-DR V2 14980円 http://t.co/zYaNWyebgm https://t.co/DCbLaYFXeu") - mes.stubs(:[]).with(:entities). - returns({ hashtags: [], - symbols: [], - urls: - [{ url: "http://t.co/zYaNWyebgm", - expanded_url: "http://goo.gl/HDK5i", - display_url: "goo.gl/HDK5i", - indices: [88, 110]}], - user_mentions: [], - media: - [{ id: 352644565880168448, - id_str: "352644565880168448", - indices: [111, 134], - media_url: "http://pbs.twimg.com/media/BOTYXUFCYAAGmf_.jpg", - media_url_https: "https://pbs.twimg.com/media/BOTYXUFCYAAGmf_.jpg", - url: "https://t.co/DCbLaYFXeu", - display_url: "pic.twitter.com/DCbLaYFXeu", - expanded_url: - "http://twitter.com/ph_toei/status/352644565875974144/photo/1", - type: "photo", - sizes: - { medium: {w: 480, h: 437, resize: "fit"}, - thumb: {w: 150, h: 150, resize: "crop"}, - small: {w: 340, h: 310, resize: "fit"}, - large: {w: 480, h: 437, resize: "fit"}}, - source_status_id: 352644565875974144, - source_status_id_str: "352644565875974144"}]}) - mes.stubs(:is_a?).with(Message).returns(true) - entity = Message::Entity.new(mes) - - assert_kind_of(String, entity.to_s) - assert_equal("【特価品】Celeron C1037U&HM77、デュアルLAN(82574L)を搭載したNAS向miniITXマザー Giada N70E-DR V2 14980円 goo.gl/HDK5i pic.twitter.com/DCbLaYFXeu", entity.to_s.inspect) - end - -end - diff --git a/test/core/test_message.rb b/test/core/test_message.rb index b095912c..e35ab4fa 100644 --- a/test/core/test_message.rb +++ b/test/core/test_message.rb @@ -18,13 +18,13 @@ class TC_Message < Test::Unit::TestCase end # !> ambiguous first argument; put parentheses or even spaces must "hierarchy check" do - toshi = User.new_ifnecessary(:id => 123456, :idname => 'toshi_a', :name => 'toshi') - miku = User.new_ifnecessary(:id => 393939, :idname => 'ha2ne39', :name => 'miku') - c1 = Message.new_ifnecessary(:id => 11, :message => '@ha2ne39 みくちゃああああああああああああん', :user => toshi, :created => Time.now) - c2 = Message.new_ifnecessary(:id => 12, :message => '@toshi_a なに', :user => miku, :replyto =>c1, :created => Time.now) - c3 = Message.new_ifnecessary(:id => 13, :message => '@ha2ne39 ぺろぺろぺろぺろ(^ω^)', :user => toshi, :replyto =>c2, :created => Time.now) - c4 = Message.new_ifnecessary(:id => 14, :message => '@toshi_a 垢消せ', :user => miku, :replyto =>c3, :created => Time.now) - c5 = Message.new_ifnecessary(:id => 15, :message => '@toshi_a キモい', :user => miku, :replyto =>c3, :created => Time.now) + toshi = User.new(:id => 123456, :idname => 'toshi_a', :name => 'toshi') + miku = User.new(:id => 393939, :idname => 'ha2ne39', :name => 'miku') + c1 = Message.new(:id => 11, :message => '@ha2ne39 みくちゃああああああああああああん', :user => toshi, :created => Time.now) + c2 = Message.new(:id => 12, :message => '@toshi_a なに', :user => miku, :replyto =>c1, :created => Time.now) + c3 = Message.new(:id => 13, :message => '@ha2ne39 ぺろぺろぺろぺろ(^ω^)', :user => toshi, :replyto =>c2, :created => Time.now) + c4 = Message.new(:id => 14, :message => '@toshi_a 垢消せ', :user => miku, :replyto =>c3, :created => Time.now) + c5 = Message.new(:id => 15, :message => '@toshi_a キモい', :user => miku, :replyto =>c3, :created => Time.now) assert_equal(c1, c2.receive_message) assert_kind_of(Message, c2.receive_message) assert_kind_of(Message, c1) # !> method redefined; discarding old inspect @@ -43,12 +43,12 @@ class TC_Message < Test::Unit::TestCase end must "around check" do - toshi = User.new_ifnecessary(:id => 123456, :idname => 'toshi_a', :name => 'toshi') - miku = User.new_ifnecessary(:id => 393939, :idname => 'ha2ne39', :name => 'miku') - c1 = Message.new_ifnecessary(:id => 21, :message => 'おはよう', :user => toshi, :created => Time.now) - c2 = Message.new_ifnecessary(:id => 22, :message => '@toshi_a おはよう', :user => miku, :replyto =>c1, :created => Time.now) - c3 = Message.new_ifnecessary(:id => 23, :message => '@ha2ne39 ぺろぺろぺろぺろ(^ω^)', :user => toshi, :replyto =>c2, :created => Time.now) - c4 = Message.new_ifnecessary(:id => 24, :message => '@toshi_a おはよう', :user => toshi, :replyto =>c1, :created => Time.now) + toshi = User.new(:id => 123456, :idname => 'toshi_a', :name => 'toshi') + miku = User.new(:id => 393939, :idname => 'ha2ne39', :name => 'miku') + c1 = Message.new(:id => 21, :message => 'おはよう', :user => toshi, :created => Time.now) + c2 = Message.new(:id => 22, :message => '@toshi_a おはよう', :user => miku, :replyto =>c1, :created => Time.now) + c3 = Message.new(:id => 23, :message => '@ha2ne39 ぺろぺろぺろぺろ(^ω^)', :user => toshi, :replyto =>c2, :created => Time.now) + c4 = Message.new(:id => 24, :message => '@toshi_a おはよう', :user => toshi, :replyto =>c1, :created => Time.now) c1.children << c2 c2.children << c3 c1.children << c4 @@ -57,23 +57,24 @@ class TC_Message < Test::Unit::TestCase end must "receive user detect" do - toshi = User.new_ifnecessary(:id => 123456, :idname => 'toshi_a', :name => 'toshi') - message = Message.new_ifnecessary(:id => 11, :message => '@ha2ne39 @mikutter_bot hey, miku!', :user => toshi, :created => Time.now) + toshi = User.new(:id => 123456, :idname => 'toshi_a', :name => 'toshi') + message = Message.new(:id => 11, :message => '@ha2ne39 @mikutter_bot hey, miku!', :user => toshi, :created => Time.now) + assert_equal '@ha2ne39 @mikutter_bot hey, miku!', message[:message] assert_equal ["ha2ne39", "mikutter_bot"], message.receive_user_screen_names end must "receive user not detect" do - toshi = User.new_ifnecessary(:id => 123456, :idname => 'toshi_a', :name => 'toshi') - message = Message.new_ifnecessary(:id => 11, :message => 'nemui', :user => toshi, :created => Time.now) + toshi = User.new(:id => 123456, :idname => 'toshi_a', :name => 'toshi') + message = Message.new(:id => 11, :message => 'nemui', :user => toshi, :created => Time.now) assert message.receive_user_screen_names.empty? end must "message to me" do - toshi = User.new_ifnecessary(:id => 156, :idname => 'toshi', :name => 'toshi') - toshi_a = User.new_ifnecessary(:id => 123456, :idname => 'toshi_a', :name => 'toshi_a') - toshi_b = User.new_ifnecessary(:id => 1234567, :idname => 'toshi_b', :name => 'toshi_b') - toshi_a_a = User.new_ifnecessary(:id => 156156, :idname => 'toshi_a_a', :name => 'toshi_a_a') - message = Message.new_ifnecessary(id: 11, message: "krile で where user == @toshi_a | user == @toshi_a_a だけのタブ作っただけでわずかにタブ切り替えが遅くなってるのわかると思うしアカウント切り替えは極端に遅くなってる", system: true, created: Time.now, receiver: toshi_b) + toshi = User.new(:id => 156, :idname => 'toshi', :name => 'toshi') + toshi_a = User.new(:id => 123456, :idname => 'toshi_a', :name => 'toshi_a') + toshi_b = User.new(:id => 1234567, :idname => 'toshi_b', :name => 'toshi_b') + toshi_a_a = User.new(:id => 156156, :idname => 'toshi_a_a', :name => 'toshi_a_a') + message = Message.new(id: 11, message: "krile で where user == @toshi_a | user == @toshi_a_a だけのタブ作っただけでわずかにタブ切り替えが遅くなってるのわかると思うしアカウント切り替えは極端に遅くなってる", user: toshi, created: Time.now, receiver: toshi_b) assert !message.receive_to?(toshi), 'toshi宛てのメッセージではない' assert message.receive_to?(toshi_a), 'toshi_a宛てのメッセージ' assert message.receive_to?(toshi_a_a), 'toshi_a_a宛てのメッセージ' diff --git a/test/core/test_retriever.rb b/test/core/test_retriever.rb index 81cce60b..d866ff50 100644 --- a/test/core/test_retriever.rb +++ b/test/core/test_retriever.rb @@ -4,11 +4,11 @@ require File.expand_path(File.dirname(__FILE__) + '/../helper') miquire :core, 'retriever' class Message < Retriever::Model - self.keys = [[:id, :int, :required], - [:title, :string], - [:desc, :string], - [:replyto, Message], - [:created, :time]] + field.int :id, required: true + field.string :title + field.string :desc + field.has :replyto, Message + field.time :created end |