import unittest
import json
import random
import string
import os

from unittest.case import SkipTest

import pytumblr
from sneakers.channels import tumblrText

from sneakers.modules import Parameter

import sneakers
basePath = os.path.dirname(os.path.abspath(sneakers.__file__))

class TestTumblr(unittest.TestCase):

    # number of posts made by tests that need to be cleaned up
    toDelete = 0

    def setUp(self):
        configPath = os.path.join(basePath, 'config', 'tumblrText-config.json')
        try:
            with open(configPath, 'rb') as f:
                s = json.loads(f.read())
        except:
            raise SkipTest("Could not access Tumblr configuration file.")

        p_list = []
        for k,v in s['tumblrText'].iteritems():
            p = Parameter(k, False, '')
            p.value = v
            p_list.append(p)

        self.params = p_list

        json_params = s['tumblrText']
        self.json_params = json_params
        self.client = pytumblr.TumblrRestClient(
                        json_params['key'],
                        json_params['secret'],
                        json_params['token'],
                        json_params['token_secret'],
                 )

        self.randText = ''.join([random.choice(string.letters) for i in range(10)])

        self.apiParams = {}
        self.apiParams['filter'] = 'raw'

        from sneakers.channels.tumblrText import Tumblrtext

        self.chan = Tumblrtext()
        self.chan.params['sending'] = self.params
        self.chan.params['receiving'] = self.params

    def tearDown(self):
        resp = self.client.posts(self.json_params['username'])
        for i in range(self.toDelete):
            self.client.delete_post(self.json_params['username'], resp['posts'][i]['id'])
            self.toDelete -= 1

    def test_send(self):
        ''' test that the Tumblr module can send '''

        self.chan.send(self.randText)

        resp = self.client.posts(self.json_params['username'], **self.apiParams)
        self.assertEqual(resp['posts'][0]['body'], self.randText)

        self.toDelete += 1

    def test_receive(self):
        ''' test that the Tumblr module can receive '''
        self.client.create_text(self.json_params['username'],
                                state="private",
                                slug=self.randText,
                                title="unit test",
                                body=self.randText)
        self.toDelete += 1

        posts = self.chan.receive()

        self.assertEqual(posts[0], self.randText)


if __name__ == '__main__':
    unittest.main()