# -*- coding: utf-8 -*-
"""
Tests for static parts of Twitter package
"""

import os
import unittest
from nose import SkipTest

try:
    import twython
except ImportError as e:
    raise SkipTest("The twython library has not been installed.")

from nltk.twitter import Authenticate


class TestCredentials(unittest.TestCase):
    """
    Tests that Twitter credentials information from file is handled correctly.
    """

    def setUp(self):
        self.subdir = os.path.join(os.path.dirname(__file__), 'files')
        self.auth = Authenticate()
        os.environ['TWITTER'] = 'twitter-files'

    def test_environment(self):
        """
        Test that environment variable has been read correctly.
        """
        fn = os.path.basename(self.auth.creds_subdir)
        self.assertEqual(fn, os.environ['TWITTER'])

    def test_empty_subdir1(self):
        """
        Setting subdir to empty path should raise an error.
        """
        try:
            self.auth.load_creds(subdir='')
        # raises ValueError (zero length field name in format) for python 2.6
        # OSError for the rest
        except OSError:
            pass
        except ValueError:
            pass
        except Exception as e:
            self.fail('Unexpected exception thrown: %s' % e)
        else:
            self.fail('OSError exception not thrown.')

    def test_empty_subdir2(self):
        """
        Setting subdir to `None` should raise an error.
        """
        self.auth.creds_subdir = None
        try:
            self.auth.load_creds()
        except ValueError:
            pass
        except Exception as e:
            self.fail('Unexpected exception thrown: %s' % e)
        else:
            self.fail('ValueError exception not thrown.')

    def test_missingdir(self):
        """
        Setting subdir to nonexistent directory should raise an error.
        """
        try:
            self.auth.load_creds(subdir='/nosuchdir')
        # raises ValueError (zero length field name in format) for python 2.6
        # OSError for the rest
        except OSError:
            pass
        except ValueError:
            pass
        except Exception as e:
            self.fail('Unexpected exception thrown: %s' % e)
        else:
            self.fail('OSError exception not thrown.')

    def test_missingfile1(self):
        """
        Defaults for authentication will fail since 'credentials.txt' not
        present in default subdir, as read from `os.environ['TWITTER']`.
        """
        try:
            self.auth.load_creds()
        # raises ValueError (zero length field name in format) for python 2.6
        # OSError for the rest
        except OSError:
            pass
        except ValueError:
            pass
        except Exception as e:
            self.fail('Unexpected exception thrown: %s' % e)
        else:
            self.fail('OSError exception not thrown.')

    def test_missingfile2(self):
        """
        Credentials file 'foobar' cannot be found in default subdir.
        """
        try:
            self.auth.load_creds(creds_file='foobar')
        # raises ValueError (zero length field name in format) for python 2.6
        # OSError for the rest
        except OSError:
            pass
        except ValueError:
            pass
        except Exception as e:
            self.fail('Unexpected exception thrown: %s' % e)
        else:
            self.fail('OSError exception not thrown.')

    def test_incomplete_file(self):
        """
        Credentials file 'bad_oauth1-1.txt' is incomplete
        """
        try:
            self.auth.load_creds(creds_file='bad_oauth1-1.txt',
                                 subdir=self.subdir)
        except ValueError:
            pass
        except Exception as e:
            self.fail('Unexpected exception thrown: %s' % e)
        else:
            self.fail('ValueError exception not thrown.')

    def test_malformed_file1(self):
        """
        First key in credentials file 'bad_oauth1-2.txt' is ill-formed
        """
        try:
            self.auth.load_creds(creds_file='bad_oauth1-2.txt',
                                 subdir=self.subdir)
        except ValueError:
            pass
        except Exception as e:
            self.fail('Unexpected exception thrown: %s' % e)
        else:
            self.fail('ValueError exception not thrown.')

    def test_malformed_file2(self):
        """
        First key in credentials file 'bad_oauth1-2.txt' is ill-formed
        """
        try:
            self.auth.load_creds(creds_file='bad_oauth1-3.txt',
                                 subdir=self.subdir)
        except ValueError:
            pass
        except Exception as e:
            self.fail('Unexpected exception thrown: %s' % e)
        else:
            self.fail('ValueError exception not thrown.')

    def test_correct_path(self):
        """
        Path to default credentials file is well-formed, given specified
        subdir.
        """
        self.auth.load_creds(subdir=self.subdir)
        self.auth.creds_fullpath = os.path.join(self.subdir, self.auth.creds_file)

    def test_correct_file1(self):
        """
        Default credentials file is identified
        """
        self.auth.load_creds(subdir=self.subdir)
        self.assertEqual(self.auth.creds_file, 'credentials.txt')

    def test_correct_file2(self):
        """
        Default credentials file has been read correctluy
        """
        oauth = self.auth.load_creds(subdir=self.subdir)
        self.assertEqual(oauth['app_key'], 'a')


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

