diff --git a/seahub/test_utils.py b/seahub/test_utils.py new file mode 100644 index 0000000000..0265724f5b --- /dev/null +++ b/seahub/test_utils.py @@ -0,0 +1,50 @@ +from uuid import uuid4 + +from exam.decorators import fixture +from exam.cases import Exam +from seaserv import seafile_api, ccnet_threaded_rpc + +from seahub.base.accounts import User + +class Fixtures(Exam): + + @fixture + def user(self): + return self.create_user('test@test.com') + + @fixture + def repo(self): + r = seafile_api.get_repo(self.create_repo()) + return r + + @fixture + def file(self): + return self.create_file(repo_id=self.repo.id, + parent_dir='/', + filename='test.txt', + username='test@test.com') + + def create_user(self, email=None, **kwargs): + if not email: + email = uuid4().hex + '@test.com' + + kwargs.setdefault('email', email) + kwargs.setdefault('is_staff', False) + kwargs.setdefault('is_active', True) + + return User.objects.create_user(password='secret', **kwargs) + + def remove_user(self, email): + ccnet_threaded_rpc.remove_emailuser(email) + + def create_repo(self, **kwargs): + repo_id = seafile_api.create_repo('test-repo', '', + 'test@test.com', None) + return repo_id + + def remove_repo(self): + return seafile_api.remove_repo(self.repo.id) + + def create_file(self, **kwargs): + seafile_api.post_empty_file(**kwargs) + return kwargs['parent_dir'] + kwargs['filename'] diff --git a/test-requirements.txt b/test-requirements.txt index c44f83c656..01c3732845 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,3 +1,4 @@ +exam==0.10.5 splinter==0.7.2 requests==2.3.0 pytest==2.7.0 diff --git a/tests/seahub/views/__init__.py b/tests/seahub/views/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/seahub/views/test_file.py b/tests/seahub/views/test_file.py new file mode 100644 index 0000000000..30c2167d89 --- /dev/null +++ b/tests/seahub/views/test_file.py @@ -0,0 +1,124 @@ +from django.core.urlresolvers import reverse +from django.test import TestCase + +from seahub.share.models import FileShare, PrivateFileDirShare +from seahub.test_utils import Fixtures + + +class SharedFileTest(TestCase, Fixtures): + + def setUp(self): + share_file_info = { + 'username': 'test@test.com', + 'repo_id': self.repo.id, + 'path': self.file, + 'password': None, + 'expire_date': None, + } + self.fs = FileShare.objects.create_file_link(**share_file_info) + + def tearDown(self): + self.remove_repo() + + def test_can_render(self): + resp = self.client.get(reverse('view_shared_file', args=[self.fs.token])) + self.assertEqual(200, resp.status_code) + self.assertTemplateUsed(resp, 'shared_file_view.html') + self.assertContains(resp, self.file) + + dl_url_param = '?p=%s&dl=1' % self.file + self.assertContains(resp, dl_url_param) + + def test_can_download(self): + dl_url = reverse('view_shared_file', args=[self.fs.token]) + \ + '?p=%s&dl=1' % self.file + resp = self.client.get(dl_url) + self.assertEqual(302, resp.status_code) + assert '8082/files/' in resp.get('location') + + def test_can_view_raw(self): + dl_url = reverse('view_shared_file', args=[self.fs.token]) + \ + '?p=%s&raw=1' % self.file + resp = self.client.get(dl_url) + self.assertEqual(302, resp.status_code) + assert '8082/files/' in resp.get('location') + + +class FileViaSharedDirTest(TestCase, Fixtures): + def setUp(self): + share_file_info = { + 'username': 'test@test.com', + 'repo_id': self.repo.id, + 'path': '/', + 'password': None, + 'expire_date': None, + } + self.fs = FileShare.objects.create_file_link(**share_file_info) + + def tearDown(self): + self.remove_repo() + + def test_can_render(self): + resp = self.client.get( + reverse('view_file_via_shared_dir', args=[self.fs.token]) + \ + '?p=%s' % self.file + ) + self.assertEqual(200, resp.status_code) + self.assertTemplateUsed(resp, 'shared_file_view.html') + self.assertContains(resp, self.file) + + dl_url_param = '?p=%s&dl=1' % self.file + self.assertContains(resp, dl_url_param) + + def test_can_download(self): + dl_url = reverse('view_file_via_shared_dir', args=[self.fs.token]) + \ + '?p=%s&dl=1' % self.file + resp = self.client.get(dl_url) + self.assertEqual(302, resp.status_code) + assert '8082/files/' in resp.get('location') + + +class PrivateSharedFileTest(TestCase, Fixtures): + def setUp(self): + self.user2 = self.create_user('test2@test.com') + share_file_info = { + 'from_user': self.user.username, + 'to_user': self.user2.username, + 'repo_id': self.repo.id, + 'path': self.file, + } + self.fs = PrivateFileDirShare.objects.add_read_only_priv_file_share( + **share_file_info) + + def tearDown(self): + self.remove_repo() + self.remove_user(self.user.username) + self.remove_user(self.user2.username) + + def test_can_render(self): + self.client.post( + reverse('auth_login'), {'username': self.user2.username, + 'password': 'secret'} + ) + + resp = self.client.get( + reverse('view_priv_shared_file', args=[self.fs.token]) + ) + self.assertEqual(200, resp.status_code) + self.assertTemplateUsed(resp, 'shared_file_view.html') + self.assertContains(resp, self.file) + + dl_url_param = '?p=%s&dl=1' % self.file + self.assertContains(resp, dl_url_param) + + def test_can_download(self): + self.client.post( + reverse('auth_login'), {'username': self.user2.username, + 'password': 'secret'} + ) + + dl_url = reverse('view_priv_shared_file', args=[self.fs.token]) + \ + '?p=%s&dl=1' % self.file + resp = self.client.get(dl_url) + self.assertEqual(302, resp.status_code) + assert '8082/files/' in resp.get('location')