1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-09 02:42:47 +00:00

add test case

This commit is contained in:
王健辉
2019-06-04 23:49:14 +08:00
parent abf51f2610
commit 41aef04267
8 changed files with 306 additions and 59 deletions

View File

@@ -185,9 +185,9 @@ class MainSideNav extends React.Component {
<h3 className="sf-heading">{gettext('Database')}</h3> <h3 className="sf-heading">{gettext('Database')}</h3>
<ul className="nav nav-pills flex-column nav-container"> <ul className="nav nav-pills flex-column nav-container">
<li className="nav-item"> <li className="nav-item">
<Link className={`nav-link ellipsis ${this.getActiveClass('dtable')}`} to={siteRoot + 'dtable/'} title={gettext('DTable')} onClick={() => this.tabItemClick('dtable')}> <Link className={`nav-link ellipsis ${this.getActiveClass('dtable')}`} to={siteRoot + 'dtable/'} title='DTable' onClick={() => this.tabItemClick('dtable')}>
<span className="sf2-icon-star" aria-hidden="true"></span> <span className="sf2-icon-star" aria-hidden="true"></span>
<span className="nav-text">{gettext('DTable')}</span> <span className="nav-text">DTable</span>
</Link> </Link>
</li> </li>
</ul> </ul>

View File

@@ -420,7 +420,7 @@ class DTable extends Component {
<div className="main-panel-center"> <div className="main-panel-center">
<div className="cur-view-container" id="starred"> <div className="cur-view-container" id="starred">
<div className="cur-view-path"> <div className="cur-view-path">
<h3 className="sf-heading">{gettext('DTable')}</h3> <h3 className="sf-heading">DTable</h3>
</div> </div>
<div className="cur-view-content"> <div className="cur-view-content">
{this.state.loading && <Loading />} {this.state.loading && <Loading />}

View File

@@ -7,7 +7,7 @@ from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework import status from rest_framework import status
from rest_framework.response import Response from rest_framework.response import Response
from django.http import HttpResponse, Http404 from django.http import Http404
from django.shortcuts import render from django.shortcuts import render
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
@@ -18,11 +18,12 @@ from seahub.api2.authentication import TokenAuthentication
from seahub.api2.throttling import UserRateThrottle from seahub.api2.throttling import UserRateThrottle
from seahub.api2.utils import api_error from seahub.api2.utils import api_error
from seahub.api2.views import get_repo_file, HTTP_443_ABOVE_QUOTA from seahub.api2.views import get_repo_file, HTTP_443_ABOVE_QUOTA
from seahub.dtable.models import WorkSpaces from seahub.dtable.models import Workspaces
from seahub.base.templatetags.seahub_tags import email2nickname from seahub.base.templatetags.seahub_tags import email2nickname
from seahub.utils.timeutils import timestamp_to_isoformat_timestr from seahub.utils.timeutils import timestamp_to_isoformat_timestr
from seahub.utils import is_valid_dirent_name, is_org_context, normalize_file_path, \ from seahub.utils import is_valid_dirent_name, is_org_context, normalize_file_path, \
check_filename_with_rename, render_error, render_permission_error, gen_file_upload_url, CTABLE check_filename_with_rename, render_error, render_permission_error, gen_file_upload_url, \
get_file_type_and_ext, CTABLE
from seahub.views.file import send_file_access_msg from seahub.views.file import send_file_access_msg
from seahub.auth.decorators import login_required from seahub.auth.decorators import login_required
from seahub.settings import MAX_UPLOAD_FILE_NAME_LEN, SHARE_LINK_EXPIRE_DAYS_MIN, \ from seahub.settings import MAX_UPLOAD_FILE_NAME_LEN, SHARE_LINK_EXPIRE_DAYS_MIN, \
@@ -32,7 +33,7 @@ from seahub.settings import MAX_UPLOAD_FILE_NAME_LEN, SHARE_LINK_EXPIRE_DAYS_MIN
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class WorkSpacesView(APIView): class WorkspacesView(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication) authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated, ) permission_classes = (IsAuthenticated, )
@@ -43,7 +44,7 @@ class WorkSpacesView(APIView):
""" """
owner = request.user.username owner = request.user.username
try: try:
workspaces = WorkSpaces.objects.get_workspaces_by_owner(owner) workspaces = Workspaces.objects.get_workspaces_by_owner(owner)
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)
error_msg = 'Internal Server Error.' error_msg = 'Internal Server Error.'
@@ -107,7 +108,7 @@ class WorkSpacesView(APIView):
owner = request.user.username owner = request.user.username
try: try:
workspace = WorkSpaces.objects.create_workspace(name, owner, repo_id) workspace = Workspaces.objects.create_workspace(name, owner, repo_id)
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)
error_msg = 'Internal Server Error.' error_msg = 'Internal Server Error.'
@@ -120,7 +121,7 @@ class WorkSpacesView(APIView):
return Response({"workspace": res}, status=status.HTTP_201_CREATED) return Response({"workspace": res}, status=status.HTTP_201_CREATED)
class WorkSpaceView(APIView): class WorkspaceView(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication) authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated, ) permission_classes = (IsAuthenticated, )
@@ -135,10 +136,14 @@ class WorkSpaceView(APIView):
error_msg = 'name invalid.' error_msg = 'name invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
if not is_valid_dirent_name(workspace_name):
error_msg = 'name invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# resource check # resource check
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id) workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
if not workspace: if not workspace:
error_msg = 'WorkSpace %s not found.' % workspace_id error_msg = 'Workspace %s not found.' % workspace_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
repo_id = workspace.repo_id repo_id = workspace.repo_id
@@ -194,16 +199,14 @@ class WorkSpaceView(APIView):
"""delete a workspace """delete a workspace
""" """
# resource check # resource check
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id) workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
if not workspace: if not workspace:
error_msg = 'WorkSpace %s not found.' % workspace_id return Response({'success': True}, status=status.HTTP_200_OK)
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
repo_id = workspace.repo_id repo_id = workspace.repo_id
repo = seafile_api.get_repo(repo_id) repo = seafile_api.get_repo(repo_id)
if not repo: if not repo:
error_msg = 'Library %s not found.' % repo_id logger.warning('Library %s not found.' % repo_id)
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
# permission check # permission check
username = request.user.username username = request.user.username
@@ -212,22 +215,24 @@ class WorkSpaceView(APIView):
error_msg = 'Permission denied.' error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg) return api_error(status.HTTP_403_FORBIDDEN, error_msg)
# repo status check if repo:
repo_status = repo.status
if repo_status != 0:
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
# remove repo # repo status check
try: repo_status = repo.status
seafile_api.remove_repo(repo_id) if repo_status != 0:
except Exception as e: error_msg = 'Permission denied.'
logger.error(e) return api_error(status.HTTP_403_FORBIDDEN, error_msg)
error_msg = 'Internal Server Error.'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) # remove repo
try:
seafile_api.remove_repo(repo_id)
except Exception as e:
logger.error(e)
error_msg = 'Internal Server Error.'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
try: try:
WorkSpaces.objects.delete_workspace(workspace_id) Workspaces.objects.delete_workspace(workspace_id)
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)
error_msg = 'Internal Server Error.' error_msg = 'Internal Server Error.'
@@ -257,9 +262,9 @@ class DTableView(APIView):
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# resource check # resource check
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id) workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
if not workspace: if not workspace:
error_msg = 'WorkSpace %s not found.' % workspace_id error_msg = 'Workspace %s not found.' % workspace_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
repo_id = workspace.repo_id repo_id = workspace.repo_id
@@ -302,9 +307,9 @@ class DTableView(APIView):
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# resource check # resource check
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id) workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
if not workspace: if not workspace:
error_msg = 'WorkSpace %s not found.' % workspace_id error_msg = 'Workspace %s not found.' % workspace_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
repo_id = workspace.repo_id repo_id = workspace.repo_id
@@ -368,9 +373,9 @@ class DTableView(APIView):
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# resource check # resource check
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id) workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
if not workspace: if not workspace:
error_msg = 'WorkSpace %s not found.' % workspace_id error_msg = 'Workspace %s not found.' % workspace_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
repo_id = workspace.repo_id repo_id = workspace.repo_id
@@ -426,9 +431,9 @@ class DTableView(APIView):
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# resource check # resource check
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id) workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
if not workspace: if not workspace:
error_msg = 'WorkSpace %s not found.' % workspace_id error_msg = 'Workspace %s not found.' % workspace_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
repo_id = workspace.repo_id repo_id = workspace.repo_id
@@ -476,9 +481,9 @@ class DTableUpdateLinkView(APIView):
"""get table file update link """get table file update link
""" """
# resource check # resource check
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id) workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
if not workspace: if not workspace:
error_msg = 'WorkSpace %s not found.' % workspace_id error_msg = 'Workspace %s not found.' % workspace_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
repo_id = workspace.repo_id repo_id = workspace.repo_id
@@ -513,7 +518,7 @@ class DTableUpdateLinkView(APIView):
def dtable_file_view(request, workspace_id, name): def dtable_file_view(request, workspace_id, name):
# resource check # resource check
workspace = WorkSpaces.objects.get_workspace_by_id(workspace_id) workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
if not workspace: if not workspace:
raise Http404 raise Http404
@@ -533,15 +538,21 @@ def dtable_file_view(request, workspace_id, name):
if username != owner: if username != owner:
return render_permission_error(request, _(u'Unable to view file')) return render_permission_error(request, _(u'Unable to view file'))
filetype, fileext = get_file_type_and_ext(name)
return_dict = { return_dict = {
'repo': repo,
'workspace_id': workspace_id,
'path': table_path,
'filename': name,
'filetype': CTABLE,
'share_link_expire_days_default': SHARE_LINK_EXPIRE_DAYS_DEFAULT, 'share_link_expire_days_default': SHARE_LINK_EXPIRE_DAYS_DEFAULT,
'share_link_expire_days_min': SHARE_LINK_EXPIRE_DAYS_MIN, 'share_link_expire_days_min': SHARE_LINK_EXPIRE_DAYS_MIN,
'share_link_expire_days_max': SHARE_LINK_EXPIRE_DAYS_MAX, 'share_link_expire_days_max': SHARE_LINK_EXPIRE_DAYS_MAX,
} }
return render(request, 'ctable_file_view_react.html', return_dict) if filetype == CTABLE:
return_dict['repo'] = repo
return_dict['workspace_id'] = workspace_id
return_dict['path'] = table_path
return_dict['filename'] = name
return_dict['filetype'] = filetype
return render(request, 'ctable_file_view_react.html', return_dict)
else:
return_dict['err'] = "File preview unsupported"
return render(request, 'unknown_file_view_react.html', return_dict)

View File

@@ -7,23 +7,23 @@ from seahub.base.fields import LowerCaseCharField
from seahub.utils.timeutils import timestamp_to_isoformat_timestr, datetime_to_isoformat_timestr from seahub.utils.timeutils import timestamp_to_isoformat_timestr, datetime_to_isoformat_timestr
class WorkSpacesManager(models.Manager): class WorkspacesManager(models.Manager):
def get_workspaces_by_owner(self, owner): def get_workspaces_by_owner(self, owner):
try: try:
return super(WorkSpacesManager, self).filter(owner=owner) return super(WorkspacesManager, self).filter(owner=owner)
except self.model.DoesNotExist: except self.model.DoesNotExist:
return None return None
def get_workspace_by_id(self, workspace_id): def get_workspace_by_id(self, workspace_id):
try: try:
return super(WorkSpacesManager, self).get(pk=workspace_id) return super(WorkspacesManager, self).get(pk=workspace_id)
except self.model.DoesNotExist: except self.model.DoesNotExist:
return None return None
def create_workspace(self, name, owner, repo_id): def create_workspace(self, name, owner, repo_id):
try: try:
return super(WorkSpacesManager, self).get(name=name, owner=owner, repo_id=repo_id) return super(WorkspacesManager, self).get(name=name, owner=owner, repo_id=repo_id)
except self.model.DoesNotExist: except self.model.DoesNotExist:
workspace = self.model(name=name, owner=owner, repo_id=repo_id) workspace = self.model(name=name, owner=owner, repo_id=repo_id)
workspace.save() workspace.save()
@@ -31,21 +31,21 @@ class WorkSpacesManager(models.Manager):
def delete_workspace(self, workspace_id): def delete_workspace(self, workspace_id):
try: try:
workspace = super(WorkSpacesManager, self).get(pk=workspace_id) workspace = super(WorkspacesManager, self).get(pk=workspace_id)
workspace.delete() workspace.delete()
return True return True
except self.model.DoesNotExist: except self.model.DoesNotExist:
return False return False
class WorkSpaces(models.Model): class Workspaces(models.Model):
name = LowerCaseCharField(max_length=255) name = LowerCaseCharField(max_length=255)
owner = models.CharField(max_length=255) owner = models.CharField(max_length=255)
repo_id = models.CharField(max_length=36, db_index=True) repo_id = models.CharField(max_length=36, db_index=True)
created_at = models.DateTimeField(auto_now_add=True, db_index=True) created_at = models.DateTimeField(auto_now_add=True, db_index=True)
objects = WorkSpacesManager() objects = WorkspacesManager()
class Meta: class Meta:
unique_together = (('owner', 'repo_id'),) unique_together = (('owner', 'repo_id'),)

View File

@@ -84,7 +84,7 @@ from seahub.api2.endpoints.related_files import RelatedFilesView, RelatedFileVie
from seahub.api2.endpoints.webdav_secret import WebdavSecretView from seahub.api2.endpoints.webdav_secret import WebdavSecretView
from seahub.api2.endpoints.starred_items import StarredItems from seahub.api2.endpoints.starred_items import StarredItems
from seahub.api2.endpoints.markdown_lint import MarkdownLintView from seahub.api2.endpoints.markdown_lint import MarkdownLintView
from seahub.api2.endpoints.dtable import WorkSpacesView, WorkSpaceView, DTableView, \ from seahub.api2.endpoints.dtable import WorkspacesView, WorkspaceView, DTableView, \
DTableUpdateLinkView, dtable_file_view DTableUpdateLinkView, dtable_file_view
# Admin # Admin
@@ -346,10 +346,10 @@ urlpatterns = [
url(r'^api/v2.1/markdown-lint/$', MarkdownLintView.as_view(), name='api-v2.1-markdown-lint'), url(r'^api/v2.1/markdown-lint/$', MarkdownLintView.as_view(), name='api-v2.1-markdown-lint'),
# user: workspaces # user: workspaces
url(r'^api/v2.1/workspaces/$', WorkSpacesView.as_view(), name='api-v2.1-workspaces'), url(r'^api/v2.1/workspaces/$', WorkspacesView.as_view(), name='api-v2.1-workspaces'),
url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/$', WorkSpaceView.as_view(), name='api-v2.1-workspace'), url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/$', WorkspaceView.as_view(), name='api-v2.1-workspace'),
url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/dtable-update-link/$', DTableUpdateLinkView.as_view()), url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/dtable/$', DTableView.as_view(), name='api-v2.1-workspace-dtable'),
url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/dtable/$', DTableView.as_view(), name='api-v2.1-workspace-table'), url(r'^api/v2.1/workspace/(?P<workspace_id>\d+)/dtable-update-link/$', DTableUpdateLinkView.as_view(), name='api-v2.1-workspace-dtable-update-link'),
url(r'^workspace/(?P<workspace_id>\d+)/dtable/(?P<name>.*)/$', dtable_file_view, name='dtable-file-view'), url(r'^workspace/(?P<workspace_id>\d+)/dtable/(?P<name>.*)/$', dtable_file_view, name='dtable-file-view'),
# Deprecated # Deprecated

View File

@@ -0,0 +1,200 @@
# -*- coding: utf-8 -*-
import json
from django.core.urlresolvers import reverse
from seaserv import seafile_api
from seahub.dtable.models import Workspaces
from seahub.test_utils import BaseTestCase
class WorkspacesViewTest(BaseTestCase):
def setUp(self):
workspace = Workspaces.objects.create_workspace("name1", self.user.username, self.repo.id)
self.url = reverse('api-v2.1-workspaces')
self.login_as(self.user)
def test_can_list(self):
assert len(Workspaces.objects.all()) == 1
resp = self.client.get(self.url)
self.assertEqual(200, resp.status_code)
json_resp = json.loads(resp.content)
self.assertIsNotNone(json_resp["workspace_list"])
def test_list_with_invalid_repo(self):
assert len(Workspaces.objects.all()) == 1
url = reverse('api2-repo', args=[self.repo.id])
resp = self.client.delete(url, {}, 'application/x-www-form-urlencoded')
self.assertEqual(200, resp.status_code)
resp = self.client.get(self.url)
self.assertEqual(200, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp["workspace_list"] == []
def test_can_create(self):
assert len(Workspaces.objects.all()) == 1
resp = self.client.post(self.url, {'name': 'name2'})
self.assertEqual(201, resp.status_code)
assert len(Workspaces.objects.all()) == 2
json_resp = json.loads(resp.content)
assert json_resp["workspace"]["name"] == 'name2'
class WorkspaceViewTest(BaseTestCase):
def setUp(self):
self.workspace = Workspaces.objects.create_workspace("name1", self.user.username, self.repo.id)
self.url = reverse('api-v2.1-workspace', args=[self.workspace.id])
self.login_as(self.user)
def test_can_rename(self):
data = 'name=%s' % 'name2'
resp = self.client.put(self.url, data, 'application/x-www-form-urlencoded')
self.assertEqual(200, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp["workspace"]["name"] == 'name2'
def test_rename_with_invalid_permission(self):
self.logout()
self.login_as(self.admin)
data = 'name=%s' % 'name2'
resp = self.client.put(self.url, data, 'application/x-www-form-urlencoded')
self.assertEqual(403, resp.status_code)
def test_rename_with_invalid_repo(self):
url = reverse('api2-repo', args=[self.workspace.repo_id])
resp = self.client.delete(url, {}, 'application/x-www-form-urlencoded')
self.assertEqual(200, resp.status_code)
data = 'name=%s' % 'name2'
resp = self.client.put(self.url, data, 'application/x-www-form-urlencoded')
self.assertEqual(404, resp.status_code)
def test_can_delete(self):
assert len(Workspaces.objects.all()) == 1
resp = self.client.delete(self.url, {'name': 'name1'})
self.assertEqual(200, resp.status_code)
assert len(Workspaces.objects.all()) == 0
def test_delete_with_invalid_permission(self):
self.logout()
self.login_as(self.admin)
resp = self.client.delete(self.url, {'name': 'name1'})
self.assertEqual(403, resp.status_code)
class DTableTest(BaseTestCase):
def setUp(self):
self.workspace = Workspaces.objects.create_workspace("workspace", self.user.username, self.repo.id)
self.url = reverse('api-v2.1-workspace-dtable', args=[self.workspace.id])
self.login_as(self.user)
def test_can_create(self):
resp = self.client.post(self.url, {'name': 'table1'})
self.assertEqual(201, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp["table"]["name"] == 'table1'
def test_create_with_invalid_repo(self):
url = reverse('api2-repo', args=[self.workspace.repo_id])
resp = self.client.delete(url, {}, 'application/x-www-form-urlencoded')
self.assertEqual(200, resp.status_code)
resp = self.client.post(self.url, {'name': 'table1'})
self.assertEqual(404, resp.status_code)
def test_can_rename(self):
resp = self.client.post(self.url, {'name': 'table4'})
self.assertEqual(201, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp["table"]["name"] == 'table4'
old_name = json_resp["table"]["name"]
new_name = 'table5'
resp = self.client.put(
self.url,
'old_name=table4&new_name=table5',
'application/x-www-form-urlencoded'
)
self.assertEqual(200, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp["table"]["name"] == 'table5'
def test_rename_with_invalid_workspace(self):
resp = self.client.post(self.url, {'name': 'table6'})
self.assertEqual(201, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp["table"]["name"] == 'table6'
url = reverse('api-v2.1-workspace', args=[self.workspace.id])
resp = self.client.delete(url, {'name': 'workspace'})
self.assertEqual(200, resp.status_code)
resp = self.client.put(
self.url,
'old_name=table6&new_name=table7',
'application/x-www-form-urlencoded'
)
self.assertEqual(404, resp.status_code)
def test_can_delete(self):
resp = self.client.post(self.url, {'name': 'table1'})
self.assertEqual(201, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp["table"]["name"] == 'table1'
data = 'name=%s' % 'table1'
resp = self.client.delete(self.url, data, 'application/x-www-form-urlencoded')
self.assertEqual(200, resp.status_code)
def test_delete_with_invalid_permission(self):
resp = self.client.post(self.url, {'name': 'table2'})
self.assertEqual(201, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp["table"]["name"] == 'table2'
self.logout()
self.login_as(self.admin)
data = 'name=%s' % 'table2'
resp = self.client.delete(self.url, data, 'application/x-www-form-urlencoded')
self.assertEqual(403, resp.status_code)
def test_delete_with_repo_only_read(self):
resp = self.client.post(self.url, {'name': 'table3'})
self.assertEqual(201, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp["table"]["name"] == 'table3'
seafile_api.set_repo_status(self.workspace.repo_id, 1)
data = 'name=%s' % 'table3'
resp = self.client.delete(self.url, data, 'application/x-www-form-urlencoded')
self.assertEqual(403, resp.status_code)

View File

@@ -0,0 +1 @@
# -*- coding: utf-8 -*-

View File

@@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
from django.core.urlresolvers import reverse
from seahub.dtable.models import Workspaces
from seahub.test_utils import BaseTestCase
class WorkspacesManagerTest(BaseTestCase):
def test_get_workspaces_by_owner(self):
assert len(Workspaces.objects.all()) == 0
Workspaces.objects.create_workspace("test_name", self.user.username, self.repo.id)
workspace_list = Workspaces.objects.get_workspaces_by_owner(self.user.username)
assert len(workspace_list) == 1
def test_get_workspace_by_id(self):
assert len(Workspaces.objects.all()) == 0
workspace = Workspaces.objects.create_workspace("test_name", self.user.username, self.repo.id)
assert workspace is not None
workspace_id = workspace.id
workspace = Workspaces.objects.get_workspace_by_id(workspace_id)
assert workspace is not None
def test_delete_workspace(self):
assert len(Workspaces.objects.all()) == 0
workspace = Workspaces.objects.create_workspace("test_name", self.user.username, self.repo.id)
assert len(Workspaces.objects.all()) == 1
workspace_id = workspace.id
Workspaces.objects.delete_workspace(workspace_id)
assert len(Workspaces.objects.all()) == 0