import os
import mock
import shutil
import tempfile
import unittest

import kojihub
from koji import GenericError


class TestGetUploadPath(unittest.TestCase):

    def setUp(self):
        self.topdir = tempfile.mkdtemp()
        mock.patch('koji.pathinfo._topdir', new=self.topdir).start()

    def tearDown(self):
        shutil.rmtree(self.topdir)
        mock.patch.stopall()

    def test_get_upload_path_invalid_filename(self):
        with self.assertRaises(GenericError):
            kojihub.get_upload_path(reldir='', name='. error')

    def test_get_upload_path_invalid_upload_dir_1(self):
        with self.assertRaises(GenericError):
            kojihub.get_upload_path(reldir='..', name='error')

    def test_get_upload_path_invalid_upload_dir_2(self):
        with self.assertRaises(GenericError):
            kojihub.get_upload_path(reldir='tasks/1', name='error', create=True)

    def test_get_upload_path_invalid_upload_dir_3(self):
        with self.assertRaises(GenericError):
            kojihub.get_upload_path(reldir='tasks/1/should_be_number', name='error', create=True)

    @mock.patch('kojihub.context')
    @mock.patch('kojihub.Host')
    def test_get_upload_path_invalid_upload_dir_owner(self, host, context):
        cursor = mock.MagicMock()
        context.cnx.cursor.return_value = cursor
        reldir = 'fake/1/1'
        fullpath = '%s/work/%s' % (self.topdir, reldir)
        os.makedirs(fullpath)

        with open('{0}/.user'.format(fullpath), 'wt', encoding='utf-8') as f:
            f.write('1')

        with self.assertRaises(GenericError):
            kojihub.get_upload_path(reldir=reldir, name='error', create=True)

    @mock.patch('kojihub.Host')
    def test_get_upload_path_invalid_upload_no_dir_owner(self, host):
        dir = kojihub.get_upload_path(reldir='tasks/1/1', name='error', create=False)
        assert dir == '%s/work/tasks/1/1/error' % self.topdir

