from base import BaseTestCase, Tweet, get_timeline_tweet
from parameterized import parameterized

# image = tweet + 'div.attachments.media-body > div > div > a > div > img'
# self.assert_true(self.get_image_url(image).split('/')[0] == 'http')

timeline = [
    [1, 'Test account', 'mobile_test', '10 Aug 2016', '763483571793174528',
     '.'],

    [3, 'Test account', 'mobile_test', '3 Mar 2016', '705522133443571712',
     'LIVE on #Periscope pscp.tv/w/aadiTzF6dkVOTXZSbX…'],

    [6, 'mobile test 2', 'mobile_test_2', '1 Oct 2014', '517449200045277184',
     'Testing. One two three four. Test.']
]

status = [
    [20, 'jack 🌍🌏🌎', 'jack', '21 Mar 2006', 'just setting up my twttr'],
    [134849778302464000, 'The Twoffice', 'TheTwoffice', '10 Nov 2011', 'test'],
    [105685475985080322, 'The Twoffice', 'TheTwoffice', '22 Aug 2011', 'regular tweet'],
    [572593440719912960, 'Test account', 'mobile_test', '2 Mar 2015', 'testing test']
]

invalid = [
    ['mobile_test/status/120938109238'],
    ['TheTwoffice/status/8931928312']
]

multiline = [
    [1142904127594401797, 'hot_pengu',
     """
New tileset, dust effects, background. The 'sea' has per-line parallax and wavey fx which we think is really cool even tho u didn't notice 🐶.  code: 
@exelotl
  #pixelart #gbadev #gba #indiedev"""],

    [400897186990284800, 'mobile_test_3',
     """
♔
  KEEP
 CALM
   AND
CLICHÉ
    ON"""]
]

link = [
    ['nim_lang/status/1110499584852353024', [
        'nim-lang.org/araq/ownedrefs.…',
        'news.ycombinator.com/item?id…',
        'old.reddit.com/r/programming…'
    ]],
    ['nim_lang/status/1125887775151140864', [
        'en.wikipedia.org/wiki/Nim_(p…)'
    ]],
    ['hiankun_taioan/status/1086916335215341570', [
        '(hackernoon.com/interview-wit…)'
    ]],
    ['archillinks/status/1146302618223951873', [
        'flickr.com/photos/87101284@N…',
        'hisafoto.tumblr.com/post/176…'
    ]],
    ['archillinks/status/1146292551936335873', [
        'flickr.com/photos/michaelrye…',
        'furtho.tumblr.com/post/16618…'
    ]]
]

username = [
    ['Bountysource/status/1094803522053320705', ['nim_lang']],
    ['leereilly/status/1058464250098704385', ['godotengine', 'unity3d', 'nim_lang']]
]

emoji = [
    ['Tesla/status/1134850442511257600', '🌈❤️🧡💛💚💙💜']
]

retweet = [
    [7, 'mobile_test_2', 'mobile test 2', 'Test account', '@mobile_test', '1234'],
    [3, 'mobile_test_8', 'mobile test 8', 'jack 🌍🌏🌎', '@jack', 'twttr']
]

reply = [
    ['mobile_test?after=471336696307392513', '@mobile_test', '@mobile_test'],
    ['mobile_test_2?after=375101899214561280', '@mobile_test_2', '@mobile_test']
]


class TweetTest(BaseTestCase):
    @parameterized.expand(timeline)
    def test_timeline(self, index, fullname, username, date, tid, text):
        self.open_nitter(username)
        tweet = get_timeline_tweet(index)
        self.assert_exact_text(fullname, tweet.fullname)
        self.assert_exact_text('@' + username, tweet.username)
        self.assert_exact_text(date, tweet.date)
        self.assert_text(text, tweet.text)
        permalink = self.find_element(tweet.date + ' a')
        self.assertIn(tid, permalink.get_attribute('href'))

    @parameterized.expand(status)
    def test_status(self, tid, fullname, username, date, text):
        tweet = Tweet()
        self.open_nitter(f'{username}/status/{tid}')
        self.assert_exact_text(fullname, tweet.fullname)
        self.assert_exact_text('@' + username, tweet.username)
        self.assert_exact_text(date, tweet.date)
        self.assert_text(text, tweet.text)

    @parameterized.expand(multiline)
    def test_multiline_formatting(self, tid, username, text):
        self.open_nitter(f'{username}/status/{tid}')
        self.assert_text(text.strip('\n'), '.main-tweet')

    @parameterized.expand(emoji)
    def test_emoji(self, tweet, text):
        self.open_nitter(tweet)
        self.assert_text(text, '.main-tweet')

    @parameterized.expand(link)
    def test_link(self, tweet, links):
        self.open_nitter(tweet)
        for link in links:
            self.assert_text(link, '.main-tweet')

    @parameterized.expand(username)
    def test_username(self, tweet, usernames):
        self.open_nitter(tweet)
        for un in usernames:
            link = self.find_link_text(f'@{un}')
            self.assertIn(f'/{un}', link.get_property('href'))

    @parameterized.expand(retweet)
    def test_retweet(self, index, url, retweet_by, fullname, username, text):
        self.open_nitter(url)
        tweet = get_timeline_tweet(index)
        self.assert_text(f'{retweet_by} retweeted', tweet.retweet)
        self.assert_text(text, tweet.text)
        self.assert_exact_text(fullname, tweet.fullname)
        self.assert_exact_text(username, tweet.username)

    @parameterized.expand(invalid)
    def test_invalid_id(self, tweet):
        self.open_nitter(tweet)
        self.assert_text('Tweet not found', '.error-panel')

    @parameterized.expand(reply)
    def test_reply(self, tweet, username, reply):
        self.open_nitter(tweet)
        tweet = get_timeline_tweet(2)
        self.assert_text(username, tweet.username)
        self.assert_text('Replying to ' + reply, tweet.reply)
