If a tweet had a prefix (@names that it was replying to) then the length
of these is counted in the indices that show the locations of entities
within the tweet. But we were applying those indices to the 'display'
part of the tweet that doesn't include the prefix.
So, if the tweet was:
@bob Please meet @bill
and the prefix was `@bob `, then the indices for linking `@bill`
are something like `17,21`. But we were applying the link around
`@bill` to the display text part of the tweet, which is:
Please meet @bill
And so the indices no longer lined up with `@bill`.
Now they do, and the same for URLs and hashtags.
130 lines
7.5 KiB
Python
130 lines
7.5 KiB
Python
# -*- coding: utf-8 -*-
|
||
import json
|
||
import os
|
||
|
||
from twython import Twython, TwythonError
|
||
|
||
from .config import unittest
|
||
|
||
|
||
class TestHtmlForTweetTestCase(unittest.TestCase):
|
||
def setUp(self):
|
||
self.api = Twython('', '', '', '')
|
||
|
||
def load_tweet(self, name):
|
||
f = open(os.path.join(
|
||
os.path.dirname(__file__),
|
||
'tweets',
|
||
'%s.json' % name
|
||
))
|
||
tweet = json.load(f)
|
||
f.close()
|
||
return tweet
|
||
|
||
def test_basic(self):
|
||
"""Test HTML for Tweet returns what we want"""
|
||
tweet_object = self.load_tweet('basic')
|
||
tweet_text = self.api.html_for_tweet(tweet_object)
|
||
self.assertEqual(tweet_text,
|
||
'<a href="http://t.co/FCmXyI6VHd" class="twython-url">google.com</a> is a <a href="https://twitter.com/search?q=%23cool" class="twython-hashtag">#cool</a> site, lol! <a href="https://twitter.com/mikehelmick" class="twython-mention">@mikehelmick</a> shd <a href="https://twitter.com/search?q=%23checkitout" class="twython-hashtag">#checkitout</a>. Love, <a href="https://twitter.com/__twython__" class="twython-mention">@__twython__</a> <a href="https://t.co/67pwRvY6z9" class="twython-url">github.com</a> <a href="http://t.co/N6InAO4B71" class="twython-media">pic.twitter.com/N6InAO4B71</a>')
|
||
|
||
def test_reply(self):
|
||
"""Test HTML for Tweet links the replied-to username."""
|
||
tweet_object = self.load_tweet('reply')
|
||
tweet_text = self.api.html_for_tweet(tweet_object)
|
||
self.assertEqual(tweet_text,
|
||
u'<span class="twython-tweet-prefix"><a href="https://twitter.com/philgyford" class="twython-mention">@philgyford</a> </span>Here’s a test tweet that goes on as much as possible and includes an image. Hi to my fans in testland!<span class="twython-tweet-suffix"> https://t.co/tzhyk2QWSr</span>')
|
||
|
||
def test_expanded_url(self):
|
||
"""Test using expanded url in HTML for Tweet displays full urls"""
|
||
tweet_object = self.load_tweet('basic')
|
||
tweet_text = self.api.html_for_tweet(tweet_object,
|
||
use_expanded_url=True)
|
||
# Make sure full url is in HTML
|
||
self.assertTrue('http://google.com' in tweet_text)
|
||
|
||
def test_short_url(self):
|
||
"""Test using expanded url in HTML for Tweet displays full urls"""
|
||
tweet_object = self.load_tweet('basic')
|
||
tweet_text = self.api.html_for_tweet(tweet_object, False)
|
||
# Make sure HTML doesn't contain the display OR expanded url
|
||
self.assertTrue('http://google.com' not in tweet_text)
|
||
self.assertTrue('google.com' not in tweet_text)
|
||
|
||
def test_identical_urls(self):
|
||
"""If the 'url's for different url entities are identical, they should link correctly."""
|
||
tweet_object = self.load_tweet('identical_urls')
|
||
tweet_text = self.api.html_for_tweet(tweet_object)
|
||
self.assertEqual(tweet_text,
|
||
u'Use Cases, Trials and Making 5G a Reality <a href="https://t.co/W0uArTMk9N" class="twython-url">buff.ly/2sEhrgO</a> #5G #innovation via @5GWorldSeries <a href="https://t.co/W0uArTMk9N" class="twython-url">buff.ly/2sEhrgO</a>')
|
||
|
||
def test_symbols(self):
|
||
tweet_object = self.load_tweet('symbols')
|
||
tweet_text = self.api.html_for_tweet(tweet_object)
|
||
# Should only link symbols listed in entities:
|
||
self.assertTrue('<a href="https://twitter.com/search?q=%24AAPL" class="twython-symbol">$AAPL</a>' in tweet_text)
|
||
self.assertTrue('<a href="https://twitter.com/search?q=%24ANOTHER" class="twython-symbol">$ANOTHER</a>' not in tweet_text)
|
||
|
||
def test_no_symbols(self):
|
||
"""Should still work if tweet object has no symbols list"""
|
||
tweet = self.load_tweet('symbols')
|
||
# Save a copy:
|
||
symbols = tweet['entities']['symbols']
|
||
del tweet['entities']['symbols']
|
||
tweet_text = self.api.html_for_tweet(tweet)
|
||
self.assertTrue('symbols: $AAPL and' in tweet_text)
|
||
self.assertTrue('and $ANOTHER and $A.' in tweet_text)
|
||
|
||
def test_compatmode(self):
|
||
tweet_object = self.load_tweet('compat')
|
||
tweet_text = self.api.html_for_tweet(tweet_object)
|
||
# link to compat web status link
|
||
self.assertTrue(
|
||
u'<a href="https://t.co/SRmsuks2ru" class="twython-url">twitter.com/i/web/status/7…</a>' in tweet_text)
|
||
|
||
def test_extendedmode(self):
|
||
tweet_object = self.load_tweet('extended')
|
||
tweet_text = self.api.html_for_tweet(tweet_object)
|
||
# full tweet rendered with suffix
|
||
self.assertEqual(tweet_text,
|
||
'Say more about what\'s happening! Rolling out now: photos, videos, GIFs, polls, and Quote Tweets no longer count toward your 140 characters.<span class="twython-tweet-suffix"> <a href="https://t.co/I9pUC0NdZC" class="twython-media">pic.twitter.com/I9pUC0NdZC</a></span>')
|
||
|
||
def test_entities_with_prefix(self):
|
||
"""
|
||
If there is a username mention at the start of a tweet it's in the
|
||
"prefix" and so isn't part of the main tweet display text.
|
||
But its length is still counted in the indices of any subsequent
|
||
mentions, urls, hashtags, etc.
|
||
"""
|
||
self.maxDiff = 2000
|
||
tweet_object = self.load_tweet('entities_with_prefix')
|
||
tweet_text = self.api.html_for_tweet(tweet_object)
|
||
self.assertEqual(tweet_text,
|
||
'<span class="twython-tweet-prefix"><a href="https://twitter.com/philgyford" class="twython-mention">@philgyford</a> </span>This is a test for <a href="https://twitter.com/visionphil" class="twython-mention">@visionphil</a> that includes a link <a href="https://t.co/sKw4J3A8SZ" class="twython-url">example.org</a> and <a href="https://twitter.com/search?q=%23hashtag" class="twython-hashtag">#hashtag</a> and 😃 for good measure AND that is longer than 140 characters. <a href="https://t.co/jnQdy7Zg7u" class="twython-url">example.com</a>')
|
||
|
||
def test_media(self):
|
||
tweet_object = self.load_tweet('media')
|
||
tweet_text = self.api.html_for_tweet(tweet_object)
|
||
|
||
self.assertEqual(
|
||
u"""I made some D3.js charts showing the years covered by books in a series compared to their publishing dates <a href="https://t.co/2yUmmn3TOc" class="twython-url">gyford.com/phil/writing/2\u2026</a><span class="twython-tweet-suffix"> <a href="https://t.co/OwNc6uJklg" class="twython-media">pic.twitter.com/OwNc6uJklg</a></span>""",
|
||
tweet_text)
|
||
|
||
def test_quoted(self):
|
||
"With expand_quoted_status=True it should include a quoted tweet."
|
||
tweet_object = self.load_tweet('quoted')
|
||
tweet_text = self.api.html_for_tweet(tweet_object,
|
||
expand_quoted_status=True)
|
||
self.assertEqual(
|
||
u"""Here\u2019s a quoted tweet. <a href="https://t.co/3neKzof0gT" class="twython-url">twitter.com/philgyford/sta\u2026</a><blockquote class="twython-quote">The quoted tweet text.<cite><a href="https://twitter.com/philgyford/status/917699069916729344"><span class="twython-quote-user-name">Phil Gyford</span><span class="twython-quote-user-screenname">@philgyford</span></a></cite></blockquote>""",
|
||
tweet_text)
|
||
|
||
def test_retweet(self):
|
||
"With expand_quoted_status=True it should include a quoted tweet."
|
||
tweet_object = self.load_tweet('retweet')
|
||
tweet_text = self.api.html_for_tweet(tweet_object)
|
||
|
||
self.assertEqual(
|
||
u"""My aunt and uncle in a very ill humour one with another, but I made shift with much ado to keep them from scolding.""",
|
||
tweet_text)
|
||
|