diff --git a/seahub/api2/views.py b/seahub/api2/views.py index 4e786a95f0..ae64fdcc28 100644 --- a/seahub/api2/views.py +++ b/seahub/api2/views.py @@ -1582,7 +1582,7 @@ class StarredFileView(APIView): def delete(self, request, format=None): # remove starred file repo_id = request.GET.get('repo_id', '') - path = unquote(request.GET.get('p', '').encode('utf-8')) + path = request.GET.get('p', '') if not (repo_id and path): return api_error(status.HTTP_400_BAD_REQUEST, 'Repo_id or path is missing.') diff --git a/seahub/test_utils.py b/seahub/test_utils.py index 828ae0e0e4..feb71a2fb7 100644 --- a/seahub/test_utils.py +++ b/seahub/test_utils.py @@ -1,12 +1,15 @@ import os from uuid import uuid4 +from django.core.urlresolvers import reverse +from django.test import TestCase 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 @@ -82,3 +85,11 @@ class Fixtures(Exam): def remove_group(self): return ccnet_threaded_rpc.remove_group(self.group.id, self.user.username) + + +class BaseTestCase(TestCase, Fixtures): + def login_as(self, user): + self.client.post( + reverse('auth_login'), {'username': user.username, + 'password': 'secret'} + ) diff --git a/tests/api/test_starredfiles.py b/tests/api/test_starredfiles.py new file mode 100644 index 0000000000..5711cc3f37 --- /dev/null +++ b/tests/api/test_starredfiles.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +import json +import urllib2 + +from django.core.urlresolvers import reverse + +from seahub.base.models import UserStarredFiles +from seahub.test_utils import BaseTestCase, Fixtures + + +class StarredFileTest(BaseTestCase, Fixtures): + def setUp(self): + UserStarredFiles(email=self.user.username, org_id=-1, + repo_id=self.repo.id, path=self.file, + is_dir=False).save() + + def tearDown(self): + self.remove_repo() + + def js_encodeURIComponent(self, string): + return urllib2.quote(string.encode('utf-8'), safe='~()*!.\'') + + def test_can_list(self): + self.login_as(self.user) + + resp = self.client.get(reverse('starredfiles')) + self.assertEqual(200, resp.status_code) + json_resp = json.loads(resp.content) + self.assertEqual(1, len(json_resp)) + + def test_can_add(self): + self.login_as(self.user) + + resp = self.client.post(reverse('starredfiles'), { + 'repo_id': self.repo.id, + 'p': self.file + }) + self.assertEqual(201, resp.status_code) + self.assertEqual('"success"', resp.content) + + def test_can_delete(self): + self.login_as(self.user) + + resp = self.client.delete(reverse('starredfiles') + '?repo_id=' + + self.repo.id + '&p=' + self.file) + self.assertEqual(200, resp.status_code) + self.assertEqual(0, len(UserStarredFiles.objects.all())) + + def test_can_add_unicode(self): + self.login_as(self.user) + + resp = self.client.post(reverse('starredfiles'), { + 'repo_id': self.repo.id, + 'p': self.js_encodeURIComponent(u'März_中文_%2F_FG2_SW#1a.jpg'), + }) + self.assertEqual(201, resp.status_code) + self.assertEqual('"success"', resp.content) + self.assertEqual(2, len(UserStarredFiles.objects.all())) + + def test_can_delete_unicode(self): + self.login_as(self.user) + + resp = self.client.post(reverse('starredfiles'), { + 'repo_id': self.repo.id, + 'p': self.js_encodeURIComponent(u'März_中文_%2F_FG2_SW#1a.jpg') + }) + self.assertEqual(201, resp.status_code) + self.assertEqual(2, len(UserStarredFiles.objects.all())) + + resp = self.client.delete(reverse('starredfiles') + '?repo_id=' + + self.repo.id + '&p=' + + self.js_encodeURIComponent(u'März_中文_%2F_FG2_SW#1a.jpg')) + self.assertEqual(200, resp.status_code) + self.assertEqual(1, len(UserStarredFiles.objects.all()))