File Diff Resource¶
Provides information on per-file diffs.
Each of these contains a single, self-contained diff file that applies to exactly one file on a repository.
Details¶
Name | file |
URI | /api/review-requests/{review_request_id}/diffs/{diff_revision}/files/{filediff_id}/ |
Token Policy ID | file_diff |
HTTP Methods | |
Parent Resource | |
Child Resources | |
Anonymous Access | Yes, if anonymous site access is enabled |
Fields¶
binaryBoolean | Whether this represents a binary file. Added in 4.0.6 |
dest_attachmentDiff File Attachment Resource | The file attachment for the contents of the patched file for this file diff, if representing a binary file. Added in 2.0 |
dest_detailString | Additional information of the destination file. This is parsed from the diff, but is usually not used for anything. |
dest_fileString | The new name of the patched file. This may be the same as the existing file. |
extra_dataDictionary | Extra data as part of the diff. This can be set by the API or extensions. Added in 2.0 |
idInteger | The numeric ID of the file diff. |
source_attachmentDiff File Attachment Resource | The file attachment for the contents of the original file for this file diff, if representing a binary file. Added in 2.0 |
source_fileString | The original name of the modified file in the diff. |
source_revisionString | The revision of the file being modified. This is a valid revision in the repository. |
statusString | The status of the file. This is one of copied, deleted, modified, moved, or unknown. Added in 2.5.11 |
Links¶
Name |
Method |
Resource |
---|---|---|
diff_comments | GET |
|
patched_file | GET |
|
self | GET |
|
update | PUT |
HTTP GET¶
Returns the information or contents on a per-file diff.
The output varies by mimetype.
If application/json or application/xml is used, then the fields for the diff are returned, like with any other resource.
If text/x-patch is used, then the actual diff file itself is returned. This diff should be as it was when uploaded originally, for this file only, with potentially some extra SCM-specific headers stripped.
If application/vnd.reviewboard.org.diff.data+json or application/vnd.reviewboard.org.diff.data+xml is used, then the raw diff data (lists of inserts, deletes, replaces, moves, header information, etc.) is returned in either JSON or XML. This contains nearly all of the information used to render the diff in the diff viewer, and can be useful for building a diff viewer that interfaces with Review Board.
If ?syntax-highlighting=1
is passed, the rendered diff content
for each line will contain HTML markup showing syntax highlighting.
Otherwise, the content will be in plain text.
The format of the diff data is a bit complex. The data is stored
under a top-level diff_data
element and contains the following
information:
binaryBoolean | Whether or not the file is a binary file. Binary files won’t have any diff content to display. |
changed_chunk_indexesList of Integer | The list of chunks in the diff that have actual changes (inserts, deletes, or replaces). |
chunksList of Dictionary | A list of chunks. These are used to render the diff. See below. |
new_fileBoolean | Whether or not this is a newly added file, rather than an existing file in the repository. |
num_changesInteger | The number of changes made in this file (chunks of adds, removes, or deletes). |
Each chunk contains the following fields:
changeOne of equal , delete , insert , replace |
The type of change on this chunk. The type influences what sort of information is available for the chunk. |
collapsableBoolean | Whether or not this chunk is collapseable. A collapseable
chunk is one that is hidden by default in the diff viewer,
but can be expanded. These will always be |
indexInteger | The index of the chunk. This is 0-based. |
linesList of List | The list of rendered lines for a side-by-side diff. Each entry in the list is itself a list with 8 items:
|
metaDictionary | Additional information about the chunk. See below for more information. |
numlinesInteger | The number of lines in the chunk. |
A chunk’s meta information contains:
headersList of [String, String] | Class definitions, function definitions, or other useful headers that should be displayed before this chunk. This helps users to identify where in a file they are and what the current chunk may be a part of. |
whitespace_chunkBoolean | Whether or not the entire chunk consists only of whitespace changes. |
whitespace_linesList of [Integer, Integer] | A list of |
Other meta information may be available, but most is intended for internal use and shouldn’t be relied upon.
Errors¶
100 - Does Not ExistHTTP 404 - Not Found | Object does not exist |
101 - Permission DeniedHTTP 403 - Forbidden | You don’t have permission for this |
103 - Not Logged InHTTP 401 - Unauthorized | You are not logged in |
112 - OAuth2 Missing Scope ErrorHTTP 403 - Forbidden | Your OAuth2 token lacks the necessary scopes for this request. |
113 - OAuth2 Access Denied ErrorHTTP 403 - Forbidden | OAuth2 token access for this resource is prohibited. |
HTTP PUT¶
Updates a per-file diff.
This is used solely for updating extra data on a file’s diff. The contents of a diff cannot be modified.
Extra data can be stored later lookup. See Storing/Accessing Extra Data for more information.
Errors¶
100 - Does Not ExistHTTP 404 - Not Found | Object does not exist |
101 - Permission DeniedHTTP 403 - Forbidden | You don’t have permission for this |
103 - Not Logged InHTTP 401 - Unauthorized | You are not logged in |
105 - Invalid Form DataHTTP 400 - Bad Request | One or more fields had errors |
112 - OAuth2 Missing Scope ErrorHTTP 403 - Forbidden | Your OAuth2 token lacks the necessary scopes for this request. |
113 - OAuth2 Access Denied ErrorHTTP 403 - Forbidden | OAuth2 token access for this resource is prohibited. |
Examples¶
text/x-patch¶
$ curl http://reviews.example.com/api10/1/44/ -H "Accept: text/x-patch"
Content-Type: text/x-patch
Content-Disposition: inline; filename=tests.py.patch
Last-Modified: Fri, 10 Aug 2018 22:16:22 GMT
ETag: 3b3461101547c83f9392f712359af6e7616af6da
Vary: Accept, Cookie
diff --git a/tests.py b/tests.py
new file mode 100644
index 0000000000000000000000000000000000000000..0dd5ce553d79b5b09b2d979cda92f321e1757e26
--- /dev/null
+++ b/tests.py
@@ -0,0 +1,4058 @@
+import os
+
+from django.conf import settings
+from django.contrib.auth.models import User, Permission
+from django.core import mail
+from django.test import TestCase
+from django.utils import simplejson
+from djblets.siteconfig.models import SiteConfiguration
+from djblets.webapi.errors import DOES_NOT_EXIST, INVALID_ATTRIBUTE, \
+ INVALID_FORM_DATA, PERMISSION_DENIED
+
+from reviewboard import initialize
+from reviewboard.diffviewer.models import DiffSet
+from reviewboard.notifications.tests import EmailTestHelper
+from reviewboard.reviews.models import Group, ReviewRequest, \
+ ReviewRequestDraft, Review, \
+ Comment, Screenshot, ScreenshotComment
+from reviewboard.scmtools.models import Repository, Tool
+from reviewboard.site.urlresolvers import local_site_reverse
+from reviewboard.site.models import LocalSite
+from reviewboard.webapi.errors import INVALID_REPOSITORY
+
+
+class BaseWebAPITestCase(TestCase, EmailTestHelper):
+ fixtures = ['test_users', 'test_reviewrequests', 'test_scmtools',
+ 'test_site']
+ local_site_name = 'local-site-1'
+
+ def setUp(self):
+ initialize()
+
+ siteconfig = SiteConfiguration.objects.get_current()
+ siteconfig.set("mail_send_review_mail", True)
+ siteconfig.set("auth_require_sitewide_login", False)
+ siteconfig.save()
+ mail.outbox = []
+
+ svn_repo_path = os.path.join(os.path.dirname(__file__),
+ '../scmtools/testdata/svn_repo')
+ self.repository = Repository(name='Subversion SVN',
+ path='file://' + svn_repo_path,
+ tool=Tool.objects.get(name='Subversion'))
+ self.repository.save()
+
+ self.client.login(username="grumpy", password="grumpy")
+ self.user = User.objects.get(username="grumpy")
+
+ self.base_url = 'http://testserver'
+
+ def tearDown(self):
+ self.client.logout()
+
+ def api_func_wrapper(self, api_func, path, query, expected_status,
+ follow_redirects, expected_redirects):
+ response = api_func(path, query, follow=follow_redirects)
+ self.assertEqual(response.status_code, expected_status)
+
+ if expected_redirects:
+ self.assertEqual(len(response.redirect_chain),
+ len(expected_redirects))
+
+ for redirect in expected_redirects:
+ self.assertEqual(response.redirect_chain[0][0],
+ self.base_url + expected_redirects[0])
+
+ return response
+
+ def apiGet(self, path, query={}, follow_redirects=False,
+ expected_status=200, expected_redirects=[]):
+ path = self._normalize_path(path)
+
+ print 'GETing %s' % path
+ print "Query data: %s" % query
+
+ response = self.api_func_wrapper(self.client.get, path, query,
+ expected_status, follow_redirects,
+ expected_redirects)
+
+ print "Raw response: %s" % response.content
+
+ rsp = simplejson.loads(response.content)
+ print "Response: %s" % rsp
+
+ return rsp
+
+ def api_post_with_response(self, path, query={}, expected_status=201):
+ path = self._normalize_path(path)
+
+ print 'POSTing to %s' % path
+ print "Post data: %s" % query
+ response = self.client.post(path, query)
+ print "Raw response: %s" % response.content
+ self.assertEqual(response.status_code, expected_status)
+
+ return self._get_result(response, expected_status), response
+
+ def apiPost(self, *args, **kwargs):
+ rsp, result = self.api_post_with_response(*args, **kwargs)
+
+ return rsp
+
+ def apiPut(self, path, query={}, expected_status=200,
+ follow_redirects=False, expected_redirects=[]):
+ path = self._normalize_path(path)
+
+ print 'PUTing to %s' % path
+ print "Post data: %s" % query
+ response = self.api_func_wrapper(self.client.put, path, query,
+ expected_status, follow_redirects,
+ expected_redirects)
+ print "Raw response: %s" % response.content
+ self.assertEqual(response.status_code, expected_status)
+
+ return self._get_result(response, expected_status)
+
+ def apiDelete(self, path, expected_status=204):
+ path = self._normalize_path(path)
+
+ print 'DELETEing %s' % path
+ response = self.client.delete(path)
+ print "Raw response: %s" % response.content
+ self.assertEqual(response.status_code, expected_status)
+
+ return self._get_result(response, expected_status)
+
+ def _normalize_path(self, path):
+ if path.startswith(self.base_url):
+ return path[len(self.base_url):]
+ else:
+ return path
+
+ def _get_result(self, response, expected_status):
+ if expected_status == 204:
+ self.assertEqual(response.content, '')
+ rsp = None
+ else:
+ rsp = simplejson.loads(response.content)
+ print "Response: %s" % rsp
+
+ return rsp
+
+ #
+ # Some utility functions shared across test suites.
+ #
+ def _postNewReviewRequest(self, local_site_name=None,
+ repository=None):
+ """Creates a review request and returns the payload response."""
+ if not repository:
+ repository = self.repository
+ rsp = self.apiPost(
+ ReviewRequestResourceTests.get_list_url(local_site_name),
+ { 'repository': repository.path, })
+
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(
+ rsp['review_request']['links']['repository']['href'],
+ self.base_url +
+ RepositoryResourceTests.get_item_url(repository.id,
+ local_site_name))
+
+ return rsp
+
+ def _postNewReview(self, review_request, body_top="",
+ body_bottom=""):
+ """Creates a review and returns the payload response."""
+ if review_request.local_site:
+ local_site_name = review_request.local_site.name
+ else:
+ local_site_name = None
+
+ post_data = {
+ 'body_top': body_top,
+ 'body_bottom': body_bottom,
+ }
+
+ rsp = self.apiPost(ReviewResourceTests.get_list_url(review_request,
+ local_site_name),
+ post_data)
+
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['review']['body_top'], body_top)
+ self.assertEqual(rsp['review']['body_bottom'], body_bottom)
+
+ return rsp
+
+ def _postNewDiffComment(self, review_request, review_id, comment_text,
+ filediff_id=None, interfilediff_id=None,
+ first_line=10, num_lines=5):
+ """Creates a diff comment and returns the payload response."""
+ if filediff_id is None:
+ diffset = review_request.diffset_history.diffsets.latest()
+ filediff = diffset.files.all()[0]
+ filediff_id = filediff.id
+
+ data = {
+ 'filediff_id': filediff_id,
+ 'text': comment_text,
+ 'first_line': first_line,
+ 'num_lines': num_lines,
+ }
+
+ if interfilediff_id is not None:
+ data['interfilediff_id'] = interfilediff_id
+
+ if review_request.local_site:
+ local_site_name = review_request.local_site.name
+ else:
+ local_site_name = None
+
+ review = Review.objects.get(pk=review_id)
+
+ rsp = self.apiPost(
+ ReviewCommentResourceTests.get_list_url(review, local_site_name),
+ data)
+ self.assertEqual(rsp['stat'], 'ok')
+
+ return rsp
+
+ def _postNewScreenshotComment(self, review_request, review_id, screenshot,
+ comment_text, x, y, w, h):
+ """Creates a screenshot comment and returns the payload response."""
+ if review_request.local_site:
+ local_site_name = review_request.local_site.name
+ else:
+ local_site_name = None
+
+ post_data = {
+ 'screenshot_id': screenshot.id,
+ 'text': comment_text,
+ 'x': x,
+ 'y': y,
+ 'w': w,
+ 'h': h,
+ }
+
+ review = Review.objects.get(pk=review_id)
+ rsp = self.apiPost(
+ DraftReviewScreenshotCommentResourceTests.get_list_url(
+ review, local_site_name),
+ post_data)
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ return rsp
+
+ def _postNewScreenshot(self, review_request):
+ """Creates a screenshot and returns the payload response."""
+ if review_request.local_site:
+ local_site_name = review_request.local_site.name
+ else:
+ local_site_name = None
+
+ f = open(self._getTrophyFilename(), "r")
+ self.assert_(f)
+
+ post_data = {
+ 'path': f,
+ }
+
+ rsp = self.apiPost(
+ ScreenshotResourceTests.get_list_url(review_request,
+ local_site_name),
+ post_data)
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ return rsp
+
+ def _postNewDiff(self, review_request):
+ """Creates a diff and returns the payload response."""
+ diff_filename = os.path.join(
+ os.path.dirname(os.path.dirname(__file__)),
+ "scmtools", "testdata", "svn_makefile.diff")
+
+ f = open(diff_filename, "r")
+ rsp = self.apiPost(DiffResourceTests.get_list_url(review_request), {
+ 'path': f,
+ 'basedir': "/trunk",
+ })
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ return rsp
+
+ def _getTrophyFilename(self):
+ return os.path.join(settings.HTDOCS_ROOT,
+ "media", "rb", "images", "trophy.png")
+
+
+class ServerInfoResourceTests(BaseWebAPITestCase):
+ """Testing the ServerInfoResource APIs."""
+ def test_get_server_info(self):
+ """Testing the GET info/ API"""
+ rsp = self.apiGet(self.get_url())
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('info' in rsp)
+ self.assertTrue('product' in rsp['info'])
+ self.assertTrue('site' in rsp['info'])
+
+ def test_get_server_info_with_site(self):
+ """Testing the GET info/ API with a local site"""
+ self.client.logout()
+ self.client.login(username="doc", password="doc")
+
+ rsp = self.apiGet(self.get_url(self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('info' in rsp)
+ self.assertTrue('product' in rsp['info'])
+ self.assertTrue('site' in rsp['info'])
+
+ def test_get_server_info_with_site_no_access(self):
+ """Testing the GET info/ API with a local site and Permission Denied error"""
+ self.apiGet(self.get_url(self.local_site_name),
+ expected_status=403)
+
+ def get_url(self, local_site_name=None):
+ return local_site_reverse('info-resource',
+ local_site_name=local_site_name)
+
+
+class SessionResourceTests(BaseWebAPITestCase):
+ """Testing the SessionResource APIs."""
+ def test_get_session_with_logged_in_user(self):
+ """Testing the GET session/ API with logged in user"""
+ rsp = self.apiGet(self.get_url())
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('session' in rsp)
+ self.assertTrue(rsp['session']['authenticated'])
+ self.assertEqual(rsp['session']['links']['user']['title'],
+ self.user.username)
+
+ def test_get_session_with_anonymous_user(self):
+ """Testing the GET session/ API with anonymous user"""
+ self.client.logout()
+
+ rsp = self.apiGet(self.get_url())
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('session' in rsp)
+ self.assertFalse(rsp['session']['authenticated'])
+
+ def test_get_session_with_site(self):
+ """Testing the GET session/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self.apiGet(self.get_url(self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('session' in rsp)
+ self.assertTrue(rsp['session']['authenticated'])
+ self.assertEqual(rsp['session']['links']['user']['title'], 'doc')
+
+ def test_get_session_with_site_no_access(self):
+ """Testing the GET session/ API with a local site and Permission Denied error"""
+ self.apiGet(self.get_url(self.local_site_name),
+ expected_status=403)
+
+ def get_url(self, local_site_name=None):
+ return local_site_reverse('session-resource',
+ local_site_name=local_site_name)
+
+
+class RepositoryResourceTests(BaseWebAPITestCase):
+ """Testing the RepositoryResource APIs."""
+
+ def test_get_repositories(self):
+ """Testing the GET repositories/ API"""
+ rsp = self.apiGet(self.get_list_url())
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['repositories']),
+ Repository.objects.accessible(self.user).count())
+
+ def test_get_repositories_with_site(self):
+ """Testing the GET repositories/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self.apiGet(self.get_list_url(self.local_site_name))
+ self.assertEqual(len(rsp['repositories']),
+ Repository.objects.filter(
+ local_site__name=self.local_site_name).count())
+
+ def test_get_repositories_with_site_no_access(self):
+ """Testing the GET repositories/ API with a local site and Permission Denied error"""
+ self.apiGet(self.get_list_url(self.local_site_name),
+ expected_status=403)
+
+ def get_list_url(self, local_site_name=None):
+ return local_site_reverse('repositories-resource',
+ local_site_name=local_site_name)
+
+ @classmethod
+ def get_item_url(cls, repository_id, local_site_name=None):
+ return local_site_reverse('repository-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'repository_id': repository_id,
+ })
+
+
+class RepositoryInfoResourceTests(BaseWebAPITestCase):
+ """Testing the RepositoryInfoResource APIs."""
+ def test_get_repository_info(self):
+ """Testing the GET repositories/<id>/info API"""
+ rsp = self.apiGet(self.get_url(self.repository))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['info'],
+ self.repository.get_scmtool().get_repository_info())
+
+ def test_get_repository_info_with_site(self):
+ """Testing the GET repositories/<id>/info API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ repository = Repository.objects.get(name='V8 SVN')
+ rsp = self.apiGet(self.get_url(repository, self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['info'],
+ repository.get_scmtool().get_repository_info())
+
+ def test_get_repository_info_with_site_no_access(self):
+ """Testing the GET repositories/<id>/info API with a local site and Permission Denied error"""
+ repository = Repository.objects.get(name='V8 SVN')
+
+ self.apiGet(self.get_url(self.repository, self.local_site_name),
+ expected_status=403)
+
+ def get_url(self, repository, local_site_name=None):
+ return local_site_reverse('info-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'repository_id': repository.pk,
+ })
+
+
+class ReviewGroupResourceTests(BaseWebAPITestCase):
+ """Testing the ReviewGroupResource APIs."""
+
+ def test_get_groups(self):
+ """Testing the GET groups/ API"""
+ rsp = self.apiGet(self.get_list_url())
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['groups']),
+ Group.objects.accessible(self.user).count())
+ self.assertEqual(len(rsp['groups']), 4)
+
+ def test_get_groups_with_site(self):
+ """Testing the GET groups/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ groups = Group.objects.accessible(self.user, local_site=local_site)
+
+ rsp = self.apiGet(self.get_list_url(self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['groups']), groups.count())
+ self.assertEqual(len(rsp['groups']), 1)
+
+ def test_get_groups_with_site_no_access(self):
+ """Testing the GET groups/ API with a local site and Permission Denied error"""
+ self.apiGet(self.get_list_url(self.local_site_name),
+ expected_status=403)
+
+ def test_get_groups_with_q(self):
+ """Testing the GET groups/?q= API"""
+ rsp = self.apiGet(self.get_list_url(), {'q': 'dev'})
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['groups']), 1) #devgroup
+
+ def test_get_group_public(self):
+ """Testing the GET groups/<id>/ API"""
+ group = Group.objects.create(name='test-group')
+
+ rsp = self.apiGet(self.get_item_url(group.name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['group']['name'], group.name)
+ self.assertEqual(rsp['group']['display_name'], group.display_name)
+ self.assertEqual(rsp['group']['invite_only'], False)
+
+ def test_get_group_invite_only(self):
+ """Testing the GET groups/<id>/ API with invite-only"""
+ group = Group.objects.create(name='test-group', invite_only=True)
+ group.users.add(self.user)
+
+ rsp = self.apiGet(self.get_item_url(group.name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['group']['invite_only'], True)
+
+ def test_get_group_invite_only_with_permission_denied_error(self):
+ """Testing the GET groups/<id>/ API with invite-only and Permission Denied error"""
+ group = Group.objects.create(name='test-group', invite_only=True)
+
+ rsp = self.apiGet(self.get_item_url(group.name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_get_group_with_site(self):
+ """Testing the GET groups/<id>/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ group = Group.objects.get(name='sitegroup')
+
+ rsp = self.apiGet(self.get_item_url('sitegroup', self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['group']['name'], group.name)
+ self.assertEqual(rsp['group']['display_name'], group.display_name)
+
+ def test_get_group_with_site_no_access(self):
+ """Testing the GET groups/<id>/ API with a local site and Permission Denied error"""
+ self.apiGet(self.get_item_url('sitegroup', self.local_site_name),
+ expected_status=403)
+
+ def get_list_url(self, local_site_name=None):
+ return local_site_reverse('groups-resource',
+ local_site_name=local_site_name)
+
+ def get_item_url(self, group_name, local_site_name=None):
+ return local_site_reverse('group-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'group_name': group_name,
+ })
+
+
+class UserResourceTests(BaseWebAPITestCase):
+ """Testing the UserResource API tests."""
+
+ def test_get_users(self):
+ """Testing the GET users/ API"""
+ rsp = self.apiGet(self.get_list_url())
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['users']), User.objects.count())
+
+ def test_get_users_with_q(self):
+ """Testing the GET users/?q= API"""
+ rsp = self.apiGet(self.get_list_url(), {'q': 'gru'})
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['users']), 1) # grumpy
+
+ def test_get_users_with_site(self):
+ """Testing the GET users/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ rsp = self.apiGet(self.get_list_url(self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['users']), local_site.users.count())
+
+ def test_get_users_with_site_no_access(self):
+ """Testing the GET users/ API with a local site and Permission Denied error"""
+ self.apiGet(self.get_list_url(self.local_site_name),
+ expected_status=403)
+
+ def test_get_user(self):
+ """Testing the GET users/<username>/ API"""
+ username = 'doc'
+ user = User.objects.get(username=username)
+
+ rsp = self.apiGet(self.get_item_url(username))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['user']['username'], user.username)
+ self.assertEqual(rsp['user']['first_name'], user.first_name)
+ self.assertEqual(rsp['user']['last_name'], user.last_name)
+ self.assertEqual(rsp['user']['id'], user.id)
+ self.assertEqual(rsp['user']['email'], user.email)
+
+ def test_get_user_with_site(self):
+ """Testing the GET users/<username>/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ username = 'doc'
+ user = User.objects.get(username=username)
+
+ rsp = self.apiGet(self.get_item_url(username, self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['user']['username'], user.username)
+ self.assertEqual(rsp['user']['first_name'], user.first_name)
+ self.assertEqual(rsp['user']['last_name'], user.last_name)
+ self.assertEqual(rsp['user']['id'], user.id)
+ self.assertEqual(rsp['user']['email'], user.email)
+
+ def test_get_missing_user_with_site(self):
+ """Testing the GET users/<username>/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self.apiGet(self.get_item_url('dopey', self.local_site_name),
+ expected_status=404)
+
+ def test_get_user_with_site_no_access(self):
+ """Testing the GET users/<username>/ API with a local site and Permission Denied error."""
+ self.apiGet(self.get_item_url('doc', self.local_site_name),
+ expected_status=403)
+
+ def get_list_url(self, local_site_name=None):
+ return local_site_reverse('users-resource',
+ local_site_name=local_site_name)
+
+ @classmethod
+ def get_item_url(cls, username, local_site_name=None):
+ return local_site_reverse('user-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'username': username,
+ })
+
+
+class WatchedReviewRequestResourceTests(BaseWebAPITestCase):
+ """Testing the WatchedReviewRequestResource API tests."""
+
+ def test_post_watched_review_request(self):
+ """Testing the POST users/<username>/watched/review_request/ API"""
+ review_request = ReviewRequest.objects.public()[0]
+ rsp = self.apiPost(self.get_list_url(self.user.username), {
+ 'object_id': review_request.display_id,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assert_(review_request in
+ self.user.get_profile().starred_review_requests.all())
+
+ def test_post_watched_review_request_with_does_not_exist_error(self):
+ """Testing the POST users/<username>/watched/review_request/ with Does Not Exist error"""
+ rsp = self.apiPost(self.get_list_url(self.user.username), {
+ 'object_id': 999,
+ }, expected_status=404)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)
+
+ def test_post_watched_review_request_with_site(self):
+ """Testing the POST users/<username>/watched/review_request/ API with a local site"""
+ username = 'doc'
+ user = User.objects.get(username=username)
+
+ self.client.logout()
+ self.client.login(username=username, password='doc')
+
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+
+ rsp = self.apiPost(self.get_list_url(username, self.local_site_name),
+ { 'object_id': review_request.display_id, })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue(review_request in
+ user.get_profile().starred_review_requests.all())
+
+ def test_post_watched_review_request_with_site_does_not_exist_error(self):
+ """Testing the POST users/<username>/watched/review_request/ API with a local site and Does Not Exist error"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self.apiPost(self.get_list_url('doc', self.local_site_name),
+ { 'object_id': 10, },
+ expected_status=404)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)
+
+ def test_post_watched_review_request_with_site_no_access(self):
+ """Testing the POST users/<username>/watched/review_request/ API with a local site and Permission Denied error"""
+ rsp = self.apiPost(self.get_list_url('doc', self.local_site_name),
+ { 'object_id': 10, },
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_delete_watched_review_request(self):
+ """Testing the DELETE users/<username>/watched/review_request/ API"""
+ # First, star it.
+ self.test_post_watched_review_request()
+
+ review_request = ReviewRequest.objects.public()[0]
+ self.apiDelete(self.get_item_url(self.user.username,
+ review_request.display_id))
+ self.assertTrue(review_request not in
+ self.user.get_profile().starred_review_requests.all())
+
+ def test_delete_watched_review_request_with_does_not_exist_error(self):
+ """Testing the DELETE users/<username>/watched/review_request/ API with Does Not Exist error"""
+ rsp = self.apiDelete(self.get_item_url(self.user.username, 999),
+ expected_status=404)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)
+
+ def test_delete_watched_review_request_with_site(self):
+ """Testing the DELETE users/<username>/watched/review_request/ API with a local site"""
+ self.test_post_watched_review_request_with_site()
+
+ user = User.objects.get(username='doc')
+ review_request = ReviewRequest.objects.get(
+ local_id=1, local_site__name=self.local_site_name)
+
+ self.apiDelete(self.get_item_url(user.username,
+ review_request.display_id,
+ self.local_site_name))
+ self.assertTrue(review_request not in
+ user.get_profile().starred_review_requests.all())
+
+ def test_delete_watched_review_request_with_site_no_access(self):
+ """Testing the DELETE users/<username>/watched/review_request/ API with a local site and Permission Denied error"""
+ rsp = self.apiDelete(self.get_item_url(self.user.username, 1,
+ self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_get_watched_review_requests(self):
+ """Testing the GET users/<username>/watched/review_request/ API"""
+ self.test_post_watched_review_request()
+
+ rsp = self.apiGet(self.get_list_url(self.user.username))
+ self.assertEqual(rsp['stat'], 'ok')
+
+ watched = self.user.get_profile().starred_review_requests.all()
+ apiwatched = rsp['watched_review_requests']
+
+ self.assertEqual(len(watched), len(apiwatched))
+ for i in range(len(watched)):
+ self.assertEqual(watched[i].id,
+ apiwatched[i]['watched_review_request']['id'])
+ self.assertEqual(watched[i].summary,
+ apiwatched[i]['watched_review_request']['summary'])
+
+ def test_get_watched_review_requests_with_site(self):
+ """Testing the GET users/<username>/watched/review_request/ API with a local site"""
+ username = 'doc'
+ user = User.objects.get(username=username)
+
+ self.test_post_watched_review_request_with_site()
+
+ rsp = self.apiGet(self.get_list_url(username, self.local_site_name))
+
+ watched = user.get_profile().starred_review_requests.filter(
+ local_site__name=self.local_site_name)
+ apiwatched = rsp['watched_review_requests']
+
+ self.assertEqual(len(watched), len(apiwatched))
+ for i in range(len(watched)):
+ self.assertEqual(watched[i].display_id,
+ apiwatched[i]['watched_review_request']['id'])
+ self.assertEqual(watched[i].summary,
+ apiwatched[i]['watched_review_request']['summary'])
+
+ def test_get_watched_review_requests_with_site_no_access(self):
+ """Testing the GET users/<username>/watched/review_request/ API with a local site and Permission Denied error"""
+ rsp = self.apiGet(self.get_list_url(self.user.username,
+ self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_get_watched_review_requests_with_site_does_not_exist(self):
+ """Testing the GET users/<username>/watched/review_request/ API with a local site and Does Not Exist error"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self.apiGet(self.get_list_url(self.user.username,
+ self.local_site_name),
+ expected_status=404)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)
+
+ def get_list_url(self, username, local_site_name=None):
+ return local_site_reverse('watched-review-requests-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'username': username,
+ })
+
+ def get_item_url(self, username, object_id, local_site_name=None):
+ return local_site_reverse('watched-review-request-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'username': username,
+ 'watched_obj_id': object_id,
+ })
+
+
+class WatchedReviewGroupResourceTests(BaseWebAPITestCase):
+ """Testing the WatchedReviewGroupResource API tests."""
+
+ def test_post_watched_review_group(self):
+ """Testing the POST users/<username>/watched/review-groups/ API"""
+ group = Group.objects.get(name='devgroup', local_site=None)
+
+ rsp = self.apiPost(self.get_list_url(self.user.username), {
+ 'object_id': group.name,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assert_(group in self.user.get_profile().starred_groups.all())
+
+ def test_post_watched_review_group_with_does_not_exist_error(self):
+ """Testing the POST users/<username>/watched/review-groups/ API with Does Not Exist error"""
+ rsp = self.apiPost(self.get_list_url(self.user.username), {
+ 'object_id': 'invalidgroup',
+ }, expected_status=404)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)
+
+ def test_post_watched_review_group_with_site(self):
+ """Testing the POST users/<username>/watched/review-groups/ API with a local site"""
+ username = 'doc'
+ user = User.objects.get(username=username)
+
+ self.client.logout()
+ self.client.login(username=username, password='doc')
+
+ group = Group.objects.get(name='sitegroup',
+ local_site__name=self.local_site_name)
+
+ rsp = self.apiPost(self.get_list_url(username, self.local_site_name),
+ { 'object_id': group.name, })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue(group in user.get_profile().starred_groups.all())
+
+ def test_post_watched_review_group_with_site_does_not_exist_error(self):
+ """Testing the POST users/<username>/watched/review-groups/ API with a local site and Does Not Exist error"""
+ username = 'doc'
+
+ self.client.logout()
+ self.client.login(username=username, password='doc')
+
+ rsp = self.apiPost(self.get_list_url(username, self.local_site_name),
+ { 'object_id': 'devgroup', },
+ expected_status=404)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)
+
+ def test_post_watched_review_group_with_site_no_access(self):
+ """Testing the POST users/<username>/watched/review-groups/ API with a local site and Permission Denied error"""
+ rsp = self.apiPost(self.get_list_url(self.user.username,
+ self.local_site_name),
+ { 'object_id': 'devgroup', },
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+
+ def test_delete_watched_review_group(self):
+ """Testing the DELETE users/<username>/watched/review-groups/<id>/ API"""
+ # First, star it.
+ self.test_post_watched_review_group()
+
+ group = Group.objects.get(name='devgroup', local_site=None)
+
+ self.apiDelete(self.get_item_url(self.user.username, group.name))
+ self.assertFalse(group in
+ self.user.get_profile().starred_groups.all())
+
+ def test_delete_watched_review_group_with_does_not_exist_error(self):
+ """Testing the DELETE users/<username>/watched/review-groups/<id>/ API with Does Not Exist error"""
+ rsp = self.apiDelete(self.get_item_url(self.user.username,
+ 'invalidgroup'),
+ expected_status=404)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)
+
+ def test_delete_watched_review_group_with_site(self):
+ """Testing the DELETE users/<username>/watched/review-groups/<id>/ API with a local site"""
+ self.test_post_watched_review_group_with_site()
+
+ user = User.objects.get(username='doc')
+ group = Group.objects.get(name='sitegroup',
+ local_site__name=self.local_site_name)
+
+ self.apiDelete(self.get_item_url(user.username, group.name,
+ self.local_site_name))
+ self.assertFalse(group in user.get_profile().starred_groups.all())
+
+ def test_delete_watched_review_group_with_site_no_access(self):
+ """Testing the DELETE users/<username>/watched/review-groups/<id>/ API with a local site and Permission Denied error"""
+ rsp = self.apiDelete(self.get_item_url(self.user.username, 'group',
+ self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_get_watched_review_groups(self):
+ """Testing the GET users/<username>/watched/review-groups/ API"""
+ self.test_post_watched_review_group()
+
+ rsp = self.apiGet(self.get_list_url(self.user.username))
+ self.assertEqual(rsp['stat'], 'ok')
+
+ watched = self.user.get_profile().starred_groups.all()
+ apigroups = rsp['watched_review_groups']
+
+ self.assertEqual(len(apigroups), len(watched))
+
+ for id in range(len(watched)):
+ self.assertEqual(apigroups[id]['watched_review_group']['name'],
+ watched[id].name)
+
+ def test_get_watched_review_groups_with_site(self):
+ """Testing the GET users/<username>/watched/review-groups/ API with a local site"""
+ self.test_post_watched_review_group_with_site()
+
+ rsp = self.apiGet(self.get_list_url('doc', self.local_site_name))
+
+ watched = self.user.get_profile().starred_groups.filter(
+ local_site__name=self.local_site_name)
+ apigroups = rsp['watched_review_groups']
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ for id in range(len(watched)):
+ self.assertEqual(apigroups[id]['watched_review_group']['name'],
+ watched[id].name)
+
+ def test_get_watched_review_groups_with_site_no_access(self):
+ """Testing the GET users/<username>/watched/review-groups/ API with a local site and Permission Denied error"""
+ watched_url = \
+ local_site_reverse('watched-review-groups-resource',
+ local_site_name=self.local_site_name,
+ kwargs={ 'username': self.user.username })
+
+ rsp = self.apiGet(self.get_list_url(self.user.username,
+ self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def get_list_url(self, username, local_site_name=None):
+ return local_site_reverse('watched-review-groups-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'username': username,
+ })
+
+ def get_item_url(self, username, object_id, local_site_name=None):
+ return local_site_reverse('watched-review-group-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'username': username,
+ 'watched_obj_id': object_id,
+ })
+
+
+class ReviewRequestResourceTests(BaseWebAPITestCase):
+ """Testing the ReviewRequestResource API tests."""
+
+ def test_get_reviewrequests(self):
+ """Testing the GET review-requests/ API"""
+ rsp = self.apiGet(self.get_list_url())
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.public().count())
+
+ def test_get_reviewrequests_with_site(self):
+ """Testing the GET review-requests/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+
+ rsp = self.apiGet(self.get_list_url(self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.public(
+ local_site=local_site).count())
+
+ def test_get_reviewrequests_with_site_no_access(self):
+ """Testing the GET review-requests/ API with a local site and Permission Denied error"""
+ self.apiGet(self.get_list_url(self.local_site_name),
+ expected_status=403)
+
+ def test_get_reviewrequests_with_status(self):
+ """Testing the GET review-requests/?status= API"""
+ url = self.get_list_url()
+
+ rsp = self.apiGet(url, {'status': 'submitted'})
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.public(status='S').count())
+
+ rsp = self.apiGet(url, {'status': 'discarded'})
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.public(status='D').count())
+
+ rsp = self.apiGet(url, {'status': 'all'})
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.public(status=None).count())
+
+ def test_get_reviewrequests_with_counts_only(self):
+ """Testing the GET review-requests/?counts-only=1 API"""
+ rsp = self.apiGet(self.get_list_url(), {
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'], ReviewRequest.objects.public().count())
+
+ def test_get_reviewrequests_with_to_groups(self):
+ """Testing the GET review-requests/?to-groups= API"""
+ rsp = self.apiGet(self.get_list_url(), {
+ 'to-groups': 'devgroup',
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.to_group("devgroup",
+ None).count())
+
+ def test_get_reviewrequests_with_to_groups_and_status(self):
+ """Testing the GET review-requests/?to-groups=&status= API"""
+ url = self.get_list_url()
+
+ rsp = self.apiGet(url, {
+ 'status': 'submitted',
+ 'to-groups': 'devgroup',
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.to_group("devgroup", None,
+ status='S').count())
+
+ rsp = self.apiGet(url, {
+ 'status': 'discarded',
+ 'to-groups': 'devgroup',
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.to_group("devgroup", None,
+ status='D').count())
+
+ def test_get_reviewrequests_with_to_groups_and_counts_only(self):
+ """Testing the GET review-requests/?to-groups=&counts-only=1 API"""
+ rsp = self.apiGet(self.get_list_url(), {
+ 'to-groups': 'devgroup',
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'],
+ ReviewRequest.objects.to_group("devgroup",
+ None).count())
+
+ def test_get_reviewrequests_with_to_users(self):
+ """Testing the GET review-requests/?to-users= API"""
+ rsp = self.apiGet(self.get_list_url(), {
+ 'to-users': 'grumpy',
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.to_user("grumpy").count())
+
+ def test_get_reviewrequests_with_to_users_and_status(self):
+ """Testing the GET review-requests/?to-users=&status= API"""
+ url = self.get_list_url()
+
+ rsp = self.apiGet(url, {
+ 'status': 'submitted',
+ 'to-users': 'grumpy',
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.to_user("grumpy", status='S').count())
+
+ rsp = self.apiGet(url, {
+ 'status': 'discarded',
+ 'to-users': 'grumpy',
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.to_user("grumpy", status='D').count())
+
+ def test_get_reviewrequests_with_to_users_and_counts_only(self):
+ """Testing the GET review-requests/?to-users=&counts-only=1 API"""
+ rsp = self.apiGet(self.get_list_url(), {
+ 'to-users': 'grumpy',
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'],
+ ReviewRequest.objects.to_user("grumpy").count())
+
+ def test_get_reviewrequests_with_to_users_directly(self):
+ """Testing the GET review-requests/?to-users-directly= API"""
+ rsp = self.apiGet(self.get_list_url(), {
+ 'to-users-directly': 'doc',
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.to_user_directly("doc").count())
+
+ def test_get_reviewrequests_with_to_users_directly_and_status(self):
+ """Testing the GET review-requests/?to-users-directly=&status= API"""
+ url = self.get_list_url()
+
+ rsp = self.apiGet(url, {
+ 'status': 'submitted',
+ 'to-users-directly': 'doc'
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.to_user_directly("doc", status='S').count())
+
+ rsp = self.apiGet(url, {
+ 'status': 'discarded',
+ 'to-users-directly': 'doc'
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.to_user_directly("doc", status='D').count())
+
+ def test_get_reviewrequests_with_to_users_directly_and_counts_only(self):
+ """Testing the GET review-requests/?to-users-directly=&counts-only=1 API"""
+ rsp = self.apiGet(self.get_list_url(), {
+ 'to-users-directly': 'doc',
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'],
+ ReviewRequest.objects.to_user_directly("doc").count())
+
+ def test_get_reviewrequests_with_from_user(self):
+ """Testing the GET review-requests/?from-user= API"""
+ rsp = self.apiGet(self.get_list_url(), {
+ 'from-user': 'grumpy',
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.from_user("grumpy").count())
+
+ def test_get_reviewrequests_with_from_user_and_status(self):
+ """Testing the GET review-requests/?from-user=&status= API"""
+ url = self.get_list_url()
+
+ rsp = self.apiGet(url, {
+ 'status': 'submitted',
+ 'from-user': 'grumpy',
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.from_user("grumpy", status='S').count())
+
+ rsp = self.apiGet(url, {
+ 'status': 'discarded',
+ 'from-user': 'grumpy',
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']),
+ ReviewRequest.objects.from_user("grumpy", status='D').count())
+
+ def test_get_reviewrequests_with_from_user_and_counts_only(self):
+ """Testing the GET review-requests/?from-user=&counts-only=1 API"""
+ rsp = self.apiGet(self.get_list_url(), {
+ 'from-user': 'grumpy',
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'],
+ ReviewRequest.objects.from_user("grumpy").count())
+
+ def test_get_reviewrequests_with_time_added_from(self):
+ """Testing the GET review-requests/?time-added-from= API"""
+ start_index = 3
+
+ public_review_requests = \
+ ReviewRequest.objects.public().order_by('time_added')
+ r = public_review_requests[start_index]
+ timestamp = r.time_added.isoformat()
+
+ rsp = self.apiGet(self.get_list_url(), {
+ 'time-added-from': timestamp,
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'],
+ public_review_requests.count() - start_index)
+ self.assertEqual(rsp['count'],
+ public_review_requests.filter(
+ time_added__gte=r.time_added).count())
+
+ def test_get_reviewrequests_with_time_added_to(self):
+ """Testing the GET review-requests/?time-added-to= API"""
+ start_index = 3
+
+ public_review_requests = \
+ ReviewRequest.objects.public().order_by('time_added')
+ r = public_review_requests[start_index]
+ timestamp = r.time_added.isoformat()
+
+ rsp = self.apiGet(self.get_list_url(), {
+ 'time-added-to': timestamp,
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'],
+ public_review_requests.count() - start_index + 1)
+ self.assertEqual(rsp['count'],
+ public_review_requests.filter(
+ time_added__lt=r.time_added).count())
+
+ def test_get_reviewrequests_with_last_updated_from(self):
+ """Testing the GET review-requests/?last-updated-from= API"""
+ start_index = 3
+
+ public_review_requests = \
+ ReviewRequest.objects.public().order_by('last_updated')
+ r = public_review_requests[start_index]
+ timestamp = r.last_updated.isoformat()
+
+ rsp = self.apiGet(self.get_list_url(), {
+ 'last-updated-from': timestamp,
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'],
+ public_review_requests.count() - start_index)
+ self.assertEqual(rsp['count'],
+ public_review_requests.filter(
+ last_updated__gte=r.last_updated).count())
+
+ def test_get_reviewrequests_with_last_updated_to(self):
+ """Testing the GET review-requests/?last-updated-to= API"""
+ start_index = 3
+
+ public_review_requests = \
+ ReviewRequest.objects.public().order_by('last_updated')
+ r = public_review_requests[start_index]
+ timestamp = r.last_updated.isoformat()
+
+ rsp = self.apiGet(self.get_list_url(), {
+ 'last-updated-to': timestamp,
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'],
+ public_review_requests.count() - start_index + 1)
+ self.assertEqual(rsp['count'],
+ public_review_requests.filter(
+ last_updated__lt=r.last_updated).count())
+
+ def test_post_reviewrequests(self):
+ """Testing the POST review-requests/ API"""
+ rsp = self.apiPost(self.get_list_url(), {
+ 'repository': self.repository.path,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(
+ rsp['review_request']['links']['repository']['href'],
+ self.base_url +
+ RepositoryResourceTests.get_item_url(self.repository.id))
+
+ # See if we can fetch this. Also return it for use in other
+ # unit tests.
+ return ReviewRequest.objects.get(pk=rsp['review_request']['id'])
+
+ def test_post_reviewrequests_with_site(self):
+ """Testing the POST review-requests/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ repository = Repository.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ rsp = self.apiPost(self.get_list_url(self.local_site_name),
+ { 'repository': repository.path, })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['review_request']['links']['repository']['title'],
+ repository.name)
+
+ def test_post_reviewrequests_with_site_no_access(self):
+ """Testing the POST review-requests/ API with a local site and Permission Denied error"""
+ repository = Repository.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ self.apiPost(self.get_list_url(self.local_site_name),
+ { 'repository': repository.path, },
+ expected_status=403)
+
+ def test_post_reviewrequests_with_site_invalid_repository_error(self):
+ """Testing the POST review-requests/ API with a local site and Invalid Repository error"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self.apiPost(self.get_list_url(self.local_site_name),
+ { 'repository': self.repository.path, },
+ expected_status=400)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], INVALID_REPOSITORY.code)
+
+ def test_post_reviewrequests_with_invalid_repository_error(self):
+ """Testing the POST review-requests/ API with Invalid Repository error"""
+ rsp = self.apiPost(self.get_list_url(), {
+ 'repository': 'gobbledygook',
+ }, expected_status=400)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], INVALID_REPOSITORY.code)
+
+ def test_post_reviewrequests_with_no_site_invalid_repository_error(self):
+ """Testing the POST review-requests/ API with Invalid Repository error from a site-local repository"""
+ repository = Repository.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ rsp = self.apiPost(self.get_list_url(), {
+ 'repository': repository.path,
+ }, expected_status=400)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], INVALID_REPOSITORY.code)
+
+ def test_post_reviewrequests_with_submit_as(self):
+ """Testing the POST review-requests/?submit_as= API"""
+ self.user.is_superuser = True
+ self.user.save()
+
+ rsp = self.apiPost(self.get_list_url(), {
+ 'repository': self.repository.path,
+ 'submit_as': 'doc',
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(
+ rsp['review_request']['links']['repository']['href'],
+ self.base_url +
+ RepositoryResourceTests.get_item_url(self.repository.id))
+ self.assertEqual(
+ rsp['review_request']['links']['submitter']['href'],
+ self.base_url +
+ UserResourceTests.get_item_url('doc'))
+
+ ReviewRequest.objects.get(pk=rsp['review_request']['id'])
+
+ def test_post_reviewrequests_with_submit_as_and_permission_denied_error(self):
+ """Testing the POST review-requests/?submit_as= API with Permission Denied error"""
+ rsp = self.apiPost(self.get_list_url(), {
+ 'repository': self.repository.path,
+ 'submit_as': 'doc',
+ }, expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_put_reviewrequest_status_discarded(self):
+ """Testing the PUT review-requests/<id>/?status=discarded API"""
+ r = ReviewRequest.objects.filter(public=True, status='P',
+ submitter=self.user)[0]
+
+ rsp = self.apiPut(self.get_item_url(r.display_id), {
+ 'status': 'discarded',
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ r = ReviewRequest.objects.get(pk=r.id)
+ self.assertEqual(r.status, 'D')
+
+ def test_put_reviewrequest_status_pending(self):
+ """Testing the PUT review-requests/<id>/?status=pending API"""
+ r = ReviewRequest.objects.filter(public=True, status='P',
+ submitter=self.user)[0]
+ r.close(ReviewRequest.SUBMITTED)
+ r.save()
+
+ rsp = self.apiPut(self.get_item_url(r.display_id), {
+ 'status': 'pending',
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ r = ReviewRequest.objects.get(pk=r.id)
+ self.assertEqual(r.status, 'P')
+
+ def test_put_reviewrequest_status_submitted(self):
+ """Testing the PUT review-requests/<id>/?status=submitted API"""
+ r = ReviewRequest.objects.filter(public=True, status='P',
+ submitter=self.user)[0]
+
+ rsp = self.apiPut(self.get_item_url(r.display_id), {
+ 'status': 'submitted',
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ r = ReviewRequest.objects.get(pk=r.id)
+ self.assertEqual(r.status, 'S')
+
+ def test_put_reviewrequest_status_submitted_with_site(self):
+ """Testing the PUT review-requests/<id>/?status=submitted API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ r = ReviewRequest.objects.filter(public=True, status='P',
+ submitter__username='doc',
+ local_site__name=self.local_site_name)[0]
+
+ rsp = self.apiPut(self.get_item_url(r.display_id,
+ self.local_site_name),
+ { 'status': 'submitted' })
+ self.assertEqual(rsp['stat'], 'ok')
+
+ r = ReviewRequest.objects.get(pk=r.id)
+ self.assertEqual(r.status, 'S')
+
+ def test_put_reviewrequest_status_submitted_with_site_no_access(self):
+ """Testing the PUT review-requests/<id>/?status=submitted API with a local site and Permission Denied error"""
+ r = ReviewRequest.objects.filter(public=True, status='P',
+ submitter__username='doc',
+ local_site__name=self.local_site_name)[0]
+
+ self.apiPut(self.get_item_url(r.display_id, self.local_site_name),
+ { 'status': 'submitted' },
+ expected_status=403)
+
+ def test_get_reviewrequest(self):
+ """Testing the GET review-requests/<id>/ API"""
+ review_request = ReviewRequest.objects.public()[0]
+
+ rsp = self.apiGet(self.get_item_url(review_request.display_id))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['review_request']['id'], review_request.display_id)
+ self.assertEqual(rsp['review_request']['summary'],
+ review_request.summary)
+
+ def test_get_reviewrequest_with_site(self):
+ """Testing the GET review-requests/<id>/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+
+ rsp = self.apiGet(self.get_item_url(review_request.display_id,
+ self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['review_request']['id'],
+ review_request.display_id)
+ self.assertEqual(rsp['review_request']['summary'],
+ review_request.summary)
+
+ def test_get_reviewrequest_with_site_no_access(self):
+ """Testing the GET review-requests/<id>/ API with a local site and Permission Denied error"""
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+
+ self.apiGet(self.get_item_url(review_request.display_id,
+ self.local_site_name),
+ expected_status=403)
+
+ def test_get_reviewrequest_with_non_public_and_permission_denied_error(self):
+ """Testing the GET review-requests/<id>/ API with non-public and Permission Denied error"""
+ review_request = ReviewRequest.objects.filter(public=False,
+ local_site=None).exclude(submitter=self.user)[0]
+
+ rsp = self.apiGet(self.get_item_url(review_request.display_id),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_get_reviewrequest_with_invite_only_group_and_permission_denied_error(self):
+ """Testing the GET review-requests/<id>/ API with invite-only group and Permission Denied error"""
+ review_request = ReviewRequest.objects.filter(public=True,
+ local_site=None).exclude(submitter=self.user)[0]
+ review_request.target_groups.clear()
+ review_request.target_people.clear()
+
+ group = Group(name='test-group', invite_only=True)
+ group.save()
+
+ review_request.target_groups.add(group)
+ review_request.save()
+
+ rsp = self.apiGet(self.get_item_url(review_request.display_id),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_get_reviewrequest_with_invite_only_group_and_target_user(self):
+ """Testing the GET review-requests/<id>/ API with invite-only group and target user"""
+ review_request = ReviewRequest.objects.filter(public=True,
+ local_site=None).exclude(submitter=self.user)[0]
+ review_request.target_groups.clear()
+ review_request.target_people.clear()
+
+ group = Group(name='test-group', invite_only=True)
+ group.save()
+
+ review_request.target_groups.add(group)
+ review_request.target_people.add(self.user)
+ review_request.save()
+
+ rsp = self.apiGet(self.get_item_url(review_request.display_id))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['review_request']['id'], review_request.display_id)
+ self.assertEqual(rsp['review_request']['summary'],
+ review_request.summary)
+
+ def test_get_reviewrequest_with_repository_and_changenum(self):
+ """Testing the GET review-requests/?repository=&changenum= API"""
+ review_request = \
+ ReviewRequest.objects.filter(changenum__isnull=False)[0]
+
+ rsp = self.apiGet(self.get_list_url(), {
+ 'repository': review_request.repository.id,
+ 'changenum': review_request.changenum,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['review_requests']), 1)
+ self.assertEqual(rsp['review_requests'][0]['id'],
+ review_request.display_id)
+ self.assertEqual(rsp['review_requests'][0]['summary'],
+ review_request.summary)
+ self.assertEqual(rsp['review_requests'][0]['changenum'],
+ review_request.changenum)
+
+ def test_delete_reviewrequest(self):
+ """Testing the DELETE review-requests/<id>/ API"""
+ self.user.user_permissions.add(
+ Permission.objects.get(codename='delete_reviewrequest'))
+ self.user.save()
+ self.assert_(self.user.has_perm('reviews.delete_reviewrequest'))
+
+ review_request = ReviewRequest.objects.from_user(self.user.username)[0]
+
+ rsp = self.apiDelete(self.get_item_url(review_request.display_id))
+ self.assertEqual(rsp, None)
+ self.assertRaises(ReviewRequest.DoesNotExist,
+ ReviewRequest.objects.get,
+ pk=review_request.pk)
+
+ def test_delete_reviewrequest_with_permission_denied_error(self):
+ """Testing the DELETE review-requests/<id>/ API with Permission Denied error"""
+ review_request = ReviewRequest.objects.filter(
+ local_site=None).exclude(submitter=self.user)[0]
+
+ rsp = self.apiDelete(self.get_item_url(review_request.display_id),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_delete_reviewrequest_with_does_not_exist_error(self):
+ """Testing the DELETE review-requests/<id>/ API with Does Not Exist error"""
+ self.user.user_permissions.add(
+ Permission.objects.get(codename='delete_reviewrequest'))
+ self.user.save()
+ self.assert_(self.user.has_perm('reviews.delete_reviewrequest'))
+
+ rsp = self.apiDelete(self.get_item_url(999), expected_status=404)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)
+
+ def test_delete_reviewrequest_with_site(self):
+ """Testing the DELETE review-requests/<id>/ API with a lotal site"""
+ user = User.objects.get(username='doc')
+ user.user_permissions.add(
+ Permission.objects.get(codename='delete_reviewrequest'))
+ user.save()
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.filter(local_site=local_site,
+ submitter__username='doc')[0]
+
+ rsp = self.apiDelete(self.get_item_url(review_request.display_id,
+ self.local_site_name))
+ self.assertEqual(rsp, None)
+ self.assertRaises(ReviewRequest.DoesNotExist,
+ ReviewRequest.objects.get, pk=review_request.pk)
+
+ @classmethod
+ def get_list_url(cls, local_site_name=None):
+ return local_site_reverse('review-requests-resource',
+ local_site_name=local_site_name)
+
+ def get_item_url(self, review_request_id, local_site_name=None):
+ return local_site_reverse('review-request-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review_request_id,
+ })
+
+
+class ReviewRequestDraftResourceTests(BaseWebAPITestCase):
+ """Testing the ReviewRequestDraftResource API tests."""
+
+ def _create_update_review_request(self, apiFunc, expected_status,
+ review_request=None,
+ local_site_name=None):
+ summary = "My Summary"
+ description = "My Description"
+ testing_done = "My Testing Done"
+ branch = "My Branch"
+ bugs = "#123,456"
+
+ if review_request is None:
+ review_request = \
+ ReviewRequest.objects.from_user(self.user.username)[0]
+
+ func_kwargs = {
+ 'summary': summary,
+ 'description': description,
+ 'testing_done': testing_done,
+ 'branch': branch,
+ 'bugs_closed': bugs,
+ }
+
+ rsp = apiFunc(self.get_url(review_request, local_site_name),
+ func_kwargs,
+ expected_status=expected_status)
+
+ if expected_status >= 200 and expected_status < 300:
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['draft']['summary'], summary)
+ self.assertEqual(rsp['draft']['description'], description)
+ self.assertEqual(rsp['draft']['testing_done'], testing_done)
+ self.assertEqual(rsp['draft']['branch'], branch)
+ self.assertEqual(rsp['draft']['bugs_closed'], ['123', '456'])
+
+ draft = ReviewRequestDraft.objects.get(pk=rsp['draft']['id'])
+ self.assertEqual(draft.summary, summary)
+ self.assertEqual(draft.description, description)
+ self.assertEqual(draft.testing_done, testing_done)
+ self.assertEqual(draft.branch, branch)
+ self.assertEqual(draft.get_bug_list(), ['123', '456'])
+
+ return rsp
+
+ def _create_update_review_request_with_site(self, apiFunc, expected_status,
+ relogin=True,
+ review_request=None):
+ if relogin:
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ if review_request is None:
+ review_request = ReviewRequest.objects.from_user('doc',
+ local_site=LocalSite.objects.get(name=self.local_site_name))[0]
+
+ return self._create_update_review_request(
+ apiFunc, expected_status, review_request, self.local_site_name)
+
+ def test_put_reviewrequestdraft(self):
+ """Testing the PUT review-requests/<id>/draft/ API"""
+ self._create_update_review_request(self.apiPut, 200)
+
+ def test_put_reviewrequestdraft_with_site(self):
+ """Testing the PUT review-requests/<id>/draft/ API with a local site"""
+ self._create_update_review_request_with_site(self.apiPut, 200)
+
+ def test_put_reviewrequestdraft_with_site_no_access(self):
+ """Testing the PUT review-requests/<id>/draft/ API with a local site and Permission Denied error"""
+ rsp = self._create_update_review_request_with_site(
+ self.apiPut, 403, relogin=False)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_post_reviewrequestdraft(self):
+ """Testing the POST review-requests/<id>/draft/ API"""
+ self._create_update_review_request(self.apiPost, 201)
+
+ def test_post_reviewrequestdraft_with_site(self):
+ """Testing the POST review-requests/<id>/draft/ API with a local site"""
+ self._create_update_review_request_with_site(self.apiPost, 201)
+
+ def test_post_reviewrequestdraft_with_site_no_access(self):
+ """Testing the POST review-requests/<id>/draft/ API with a local site and Permission Denied error"""
+ rsp = self._create_update_review_request_with_site(
+ self.apiPost, 403, relogin=False)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_put_reviewrequestdraft_with_changedesc(self):
+ """Testing the PUT review-requests/<id>/draft/ API with a change description"""
+ changedesc = 'This is a test change description.'
+ review_request = ReviewRequest.objects.create(self.user,
+ self.repository)
+ review_request.publish(self.user)
+
+ rsp = self.apiPost(self.get_url(review_request), {
+ 'changedescription': changedesc,
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['draft']['changedescription'], changedesc)
+
+ draft = ReviewRequestDraft.objects.get(pk=rsp['draft']['id'])
+ self.assertNotEqual(draft.changedesc, None)
+ self.assertEqual(draft.changedesc.text, changedesc)
+
+ def test_put_reviewrequestdraft_with_invalid_field_name(self):
+ """Testing the PUT review-requests/<id>/draft/ API with Invalid Form Data error"""
+ review_request = ReviewRequest.objects.from_user(self.user.username)[0]
+
+ rsp = self.apiPut(self.get_url(review_request), {
+ 'foobar': 'foo',
+ }, 400)
+
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], INVALID_FORM_DATA.code)
+ self.assertTrue('foobar' in rsp['fields'])
+
+ def test_put_reviewrequestdraft_with_permission_denied_error(self):
+ """Testing the PUT review-requests/<id>/draft/ API with Permission Denied error"""
+ bugs_closed = '123,456'
+ review_request = ReviewRequest.objects.from_user('admin')[0]
+
+ rsp = self.apiPut(self.get_url(review_request), {
+ 'bugs_closed': bugs_closed,
+ }, 403)
+
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_put_reviewrequestdraft_publish(self):
+ """Testing the PUT review-requests/<id>/draft/?public=1 API"""
+ # Set some data first.
+ self.test_put_reviewrequestdraft()
+
+ review_request = ReviewRequest.objects.from_user(self.user.username)[0]
+
+ rsp = self.apiPut(self.get_url(review_request), {
+ 'public': True,
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ review_request = ReviewRequest.objects.get(pk=review_request.id)
+ self.assertEqual(review_request.summary, "My Summary")
+ self.assertEqual(review_request.description, "My Description")
+ self.assertEqual(review_request.testing_done, "My Testing Done")
+ self.assertEqual(review_request.branch, "My Branch")
+ self.assertTrue(review_request.public)
+
+ self.assertEqual(len(mail.outbox), 1)
+ self.assertEqual(mail.outbox[0].subject, "Review Request: My Summary")
+ self.assertValidRecipients(["doc", "grumpy"], [])
+
+ def test_put_reviewrequestdraft_publish_with_new_review_request(self):
+ """Testing the PUT review-requests/<id>/draft/?public=1 API with a new review request"""
+ # Set some data first.
+ review_request = ReviewRequest.objects.create(self.user,
+ self.repository)
+ review_request.target_people = [
+ User.objects.get(username='doc')
+ ]
+ review_request.save()
+
+ self._create_update_review_request(self.apiPut, 200, review_request)
+
+ rsp = self.apiPut(self.get_url(review_request), {
+ 'public': True,
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ review_request = ReviewRequest.objects.get(pk=review_request.id)
+ self.assertEqual(review_request.summary, "My Summary")
+ self.assertEqual(review_request.description, "My Description")
+ self.assertEqual(review_request.testing_done, "My Testing Done")
+ self.assertEqual(review_request.branch, "My Branch")
+ self.assertTrue(review_request.public)
+
+ self.assertEqual(len(mail.outbox), 1)
+ self.assertEqual(mail.outbox[0].subject, "Review Request: My Summary")
+ self.assertValidRecipients(["doc", "grumpy"], [])
+
+ def test_delete_reviewrequestdraft(self):
+ """Testing the DELETE review-requests/<id>/draft/ API"""
+ review_request = ReviewRequest.objects.from_user(self.user.username)[0]
+ summary = review_request.summary
+ description = review_request.description
+
+ # Set some data.
+ self.test_put_reviewrequestdraft()
+
+ self.apiDelete(self.get_url(review_request))
+
+ review_request = ReviewRequest.objects.get(pk=review_request.id)
+ self.assertEqual(review_request.summary, summary)
+ self.assertEqual(review_request.description, description)
+
+ def test_delete_reviewrequestdraft_with_site(self):
+ """Testing the DELETE review-requests/<id>/draft/ API with a local site"""
+ review_request = ReviewRequest.objects.from_user('doc',
+ local_site=LocalSite.objects.get(name=self.local_site_name))[0]
+ summary = review_request.summary
+ description = review_request.description
+
+ self.test_put_reviewrequestdraft_with_site()
+
+ self.apiDelete(self.get_url(review_request, self.local_site_name))
+
+ review_request = ReviewRequest.objects.get(pk=review_request.id)
+ self.assertEqual(review_request.summary, summary)
+ self.assertEqual(review_request.description, description)
+
+ def test_delete_reviewrequestdraft_with_site_no_access(self):
+ """Testing the DELETE review-requests/<id>/draft/ API with a local site and Permission Denied error"""
+ review_request = ReviewRequest.objects.from_user('doc',
+ local_site=LocalSite.objects.get(name=self.local_site_name))[0]
+ rsp = self.apiDelete(
+ self.get_url(review_request, self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def get_url(self, review_request, local_site_name=None):
+ return local_site_reverse(
+ 'draft-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review_request.display_id,
+ })
+
+
+class ReviewResourceTests(BaseWebAPITestCase):
+ """Testing the ReviewResource APIs."""
+
+ def test_get_reviews(self):
+ """Testing the GET review-requests/<id>/reviews/ API"""
+ review_request = Review.objects.filter()[0].review_request
+ rsp = self.apiGet(self.get_list_url(review_request))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['reviews']), review_request.reviews.count())
+
+ def test_get_reviews_with_site(self):
+ """Testing the GET review-requests/<id>/reviews/ API with a local site"""
+ self.test_post_reviews_with_site(public=True)
+
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+
+ rsp = self.apiGet(self.get_list_url(review_request,
+ self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['reviews']), review_request.reviews.count())
+
+ def test_get_reviews_with_site_no_access(self):
+ """Testing the GET review-requests/<id>/reviews/ API with a local site and Permission Denied error"""
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+ rsp = self.apiGet(self.get_list_url(review_request,
+ self.local_site_name),
+ expected_status=403)
+
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_get_reviews_with_counts_only(self):
+ """Testing the GET review-requests/<id>/reviews/?counts-only=1 API"""
+ review_request = Review.objects.all()[0].review_request
+ rsp = self.apiGet(self.get_list_url(review_request), {
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'], review_request.reviews.count())
+
+ def test_post_reviews(self):
+ """Testing the POST review-requests/<id>/reviews/ API"""
+ body_top = ""
+ body_bottom = "My Body Bottom"
+ ship_it = True
+
+ # Clear out any reviews on the first review request we find.
+ review_request = ReviewRequest.objects.public(local_site=None)[0]
+ review_request.reviews = []
+ review_request.save()
+
+ rsp, response = self.api_post_with_response(
+ self.get_list_url(review_request),
+ {
+ 'ship_it': ship_it,
+ 'body_top': body_top,
+ 'body_bottom': body_bottom,
+ })
+
+ self.assertTrue('stat' in rsp)
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('Location' in response)
+
+ reviews = review_request.reviews.filter(user=self.user)
+ self.assertEqual(len(reviews), 1)
+ review = reviews[0]
+
+ self.assertEqual(response['Location'],
+ self.base_url +
+ self.get_item_url(review_request, review.id))
+
+ self.assertEqual(review.ship_it, ship_it)
+ self.assertEqual(review.body_top, body_top)
+ self.assertEqual(review.body_bottom, body_bottom)
+ self.assertEqual(review.public, False)
+
+ self.assertEqual(len(mail.outbox), 0)
+
+ def test_post_reviews_with_site(self, public=False):
+ """Testing the POST review-requests/<id>/reviews/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ body_top = ""
+ body_bottom = "My Body Bottom"
+ ship_it = True
+
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+
+ # Clear out any reviews on the first review request we find.
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+ review_request.reviews = []
+ review_request.save()
+
+ post_data = {
+ 'ship_it': ship_it,
+ 'body_top': body_top,
+ 'body_bottom': body_bottom,
+ 'public': public,
+ }
+
+ rsp, response = self.api_post_with_response(
+ self.get_list_url(review_request, self.local_site_name),
+ post_data)
+
+ self.assertTrue('stat' in rsp)
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('Location' in response)
+
+ reviews = review_request.reviews.all()
+ self.assertEqual(len(reviews), 1)
+ review = reviews[0]
+
+ self.assertEqual(rsp['review']['id'], review.id)
+
+ self.assertEqual(review.ship_it, ship_it)
+ self.assertEqual(review.body_top, body_top)
+ self.assertEqual(review.body_bottom, body_bottom)
+ self.assertEqual(review.public, public)
+
+ if public:
+ self.assertEqual(len(mail.outbox), 1)
+ else:
+ self.assertEqual(len(mail.outbox), 0)
+
+ def test_post_reviews_with_site_no_access(self):
+ """Testing the POST review-requests/<id>/reviews/ API with a local site and Permission Denied error"""
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+
+ rsp = self.apiPost(self.get_list_url(review_request,
+ self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_put_review(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/ API"""
+ body_top = ""
+ body_bottom = "My Body Bottom"
+ ship_it = True
+
+ # Clear out any reviews on the first review request we find.
+ review_request = ReviewRequest.objects.public(local_site=None)[0]
+ review_request.reviews = []
+ review_request.save()
+
+ rsp, response = self.api_post_with_response(
+ self.get_list_url(review_request))
+
+ self.assertTrue('stat' in rsp)
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('Location' in response)
+
+ review_url = response['Location']
+
+ rsp = self.apiPut(review_url, {
+ 'ship_it': ship_it,
+ 'body_top': body_top,
+ 'body_bottom': body_bottom,
+ })
+
+ reviews = review_request.reviews.filter(user=self.user)
+ self.assertEqual(len(reviews), 1)
+ review = reviews[0]
+
+ self.assertEqual(review.ship_it, ship_it)
+ self.assertEqual(review.body_top, body_top)
+ self.assertEqual(review.body_bottom, body_bottom)
+ self.assertEqual(review.public, False)
+
+ self.assertEqual(len(mail.outbox), 0)
+
+ # Make this easy to use in other tests.
+ return review
+
+ def test_put_review_with_site(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ body_top = ""
+ body_bottom = "My Body Bottom"
+ ship_it = True
+
+ # Clear out any reviews on the first review request we find.
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+ review_request.reviews = []
+ review_request.save()
+
+ rsp, response = self.api_post_with_response(
+ self.get_list_url(review_request, self.local_site_name))
+
+ self.assertTrue('stat' in rsp)
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('Location' in response)
+
+ review_url = response['Location']
+
+ rsp = self.apiPut(review_url, {
+ 'ship_it': ship_it,
+ 'body_top': body_top,
+ 'body_bottom': body_bottom,
+ })
+
+ reviews = review_request.reviews.filter(user__username='doc')
+ self.assertEqual(len(reviews), 1)
+ review = reviews[0]
+
+ self.assertEqual(review.ship_it, ship_it)
+ self.assertEqual(review.body_top, body_top)
+ self.assertEqual(review.body_bottom, body_bottom)
+ self.assertEqual(review.public, False)
+
+ self.assertEqual(len(mail.outbox), 0)
+
+ # Make this easy to use in other tests.
+ return review
+
+ def test_put_review_with_site_no_access(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/ API with a local site and Permission Denied error"""
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.save()
+
+ rsp = self.apiPut(self.get_item_url(review_request, review.id,
+ self.local_site_name),
+ { 'ship_it': True, },
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_put_review_with_published_review(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/ API with pre-published review"""
+ review = Review.objects.filter(user=self.user, public=True,
+ base_reply_to__isnull=True)[0]
+
+ self.apiPut(self.get_item_url(review.review_request, review.id), {
+ 'ship_it': True,
+ }, expected_status=403)
+
+ def test_put_review_publish(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/?public=1 API"""
+ body_top = "My Body Top"
+ body_bottom = ""
+ ship_it = True
+
+ # Clear out any reviews on the first review request we find.
+ review_request = ReviewRequest.objects.public()[0]
+ review_request.reviews = []
+ review_request.save()
+
+ rsp, response = \
+ self.api_post_with_response(self.get_list_url(review_request))
+
+ self.assertTrue('stat' in rsp)
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('Location' in response)
+
+ review_url = response['Location']
+
+ rsp = self.apiPut(review_url, {
+ 'public': True,
+ 'ship_it': ship_it,
+ 'body_top': body_top,
+ 'body_bottom': body_bottom,
+ })
+
+ reviews = review_request.reviews.filter(user=self.user)
+ self.assertEqual(len(reviews), 1)
+ review = reviews[0]
+
+ self.assertEqual(review.ship_it, ship_it)
+ self.assertEqual(review.body_top, body_top)
+ self.assertEqual(review.body_bottom, body_bottom)
+ self.assertEqual(review.public, True)
+
+ self.assertEqual(len(mail.outbox), 1)
+ self.assertEqual(mail.outbox[0].subject,
+ "Re: Review Request: Interdiff Revision Test")
+ self.assertValidRecipients(["admin", "grumpy"], [])
+
+ def test_delete_review(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/ API"""
+ # Set up the draft to delete.
+ review = self.test_put_review()
+ review_request = review.review_request
+
+ self.apiDelete(self.get_item_url(review_request, review.id))
+ self.assertEqual(review_request.reviews.count(), 0)
+
+ def test_delete_review_with_permission_denied(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/ API with Permission Denied error"""
+ # Set up the draft to delete.
+ review = self.test_put_review()
+ review.user = User.objects.get(username='doc')
+ review.save()
+
+ review_request = review.review_request
+ old_count = review_request.reviews.count()
+
+ self.apiDelete(self.get_item_url(review_request, review.id),
+ expected_status=403)
+ self.assertEqual(review_request.reviews.count(), old_count)
+
+ def test_delete_review_with_published_review(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/ API with pre-published review"""
+ review = Review.objects.filter(user=self.user, public=True,
+ base_reply_to__isnull=True)[0]
+ review_request = review.review_request
+ old_count = review_request.reviews.count()
+
+ self.apiDelete(self.get_item_url(review_request, review.id),
+ expected_status=403)
+ self.assertEqual(review_request.reviews.count(), old_count)
+
+ def test_delete_review_with_does_not_exist(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/ API with Does Not Exist error"""
+ review_request = ReviewRequest.objects.public()[0]
+ rsp = self.apiDelete(self.get_item_url(review_request, 919239),
+ expected_status=404)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)
+
+ def test_delete_review_with_local_site(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/ API with a local site"""
+ review = self.test_put_review_with_site()
+
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+
+ self.apiDelete(self.get_item_url(review_request, review.id,
+ self.local_site_name))
+ self.assertEqual(review_request.reviews.count(), 0)
+
+ def test_delete_review_with_local_site_no_access(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/ API with a local site and Permission Denied error"""
+ local_site = LocalSite.objects.get(name=self.local_site_name)
+ review_request = ReviewRequest.objects.public(local_site=local_site)[0]
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.save()
+
+ rsp = self.apiDelete(self.get_item_url(review_request, review.id,
+ self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ @classmethod
+ def get_list_url(cls, review_request, local_site_name=None):
+ return local_site_reverse(
+ 'reviews-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review_request.display_id,
+ })
+
+ def get_item_url(self, review_request, review_id, local_site_name=None):
+ return local_site_reverse(
+ 'review-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review_request.display_id,
+ 'review_id': review_id,
+ })
+
+
+class ReviewCommentResourceTests(BaseWebAPITestCase):
+ """Testing the ReviewCommentResource APIs."""
+ def test_get_diff_comments(self):
+ """Testing the GET review-requests/<id>/reviews/<id>/diff-comments/ API"""
+ review = Review.objects.filter(comments__pk__gt=0)[0]
+
+ rsp = self.apiGet(self.get_list_url(review))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['diff_comments']), review.comments.count())
+
+ def test_get_diff_comments_with_counts_only(self):
+ """Testing the GET review-requests/<id>/reviews/<id>/diff-comments/?counts-only=1 API"""
+ review = Review.objects.filter(comments__pk__gt=0)[0]
+
+ rsp = self.apiGet(self.get_list_url(review), {
+ 'counts-only': 1,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'], review.comments.count())
+
+ def test_get_diff_comments_with_site(self):
+ """Testing the GET review-requests/<id>/reviews/<id>/diff-comments/ API with a local site"""
+ review_id = self.test_post_diff_comments_with_site()
+ review = Review.objects.get(pk=review_id)
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ rsp = self.apiGet(self.get_list_url(review, self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['diff_comments']), review.comments.count())
+
+ def test_get_diff_comments_with_site_no_access(self):
+ """Testing the GET review-requests/<id>/reviews/<id>/diff-comments/ API with a local site and Permission Denied error"""
+ review_id = self.test_post_diff_comments_with_site()
+ review = Review.objects.get(pk=review_id)
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ self.client.logout()
+ self.client.login(username='grumpy', password='grumpy')
+
+ rsp = self.apiGet(self.get_list_url(review, self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_post_diff_comments(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/diff-comments/ API"""
+ diff_comment_text = "Test diff comment"
+
+ # Post the review request
+ rsp = self._postNewReviewRequest()
+ review_request = ReviewRequest.objects.get(
+ pk=rsp['review_request']['id'])
+
+ # Post the diff.
+ rsp = self._postNewDiff(review_request)
+ DiffSet.objects.get(pk=rsp['diff']['id'])
+
+ # Make these public.
+ review_request.publish(self.user)
+
+ rsp = self.apiPost(ReviewResourceTests.get_list_url(review_request))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('review' in rsp)
+ review_id = rsp['review']['id']
+
+ self._postNewDiffComment(review_request, review_id, diff_comment_text)
+ review = Review.objects.get(pk=review_id)
+
+ rsp = self.apiGet(self.get_list_url(review))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('diff_comments' in rsp)
+ self.assertEqual(len(rsp['diff_comments']), 1)
+ self.assertEqual(rsp['diff_comments'][0]['text'], diff_comment_text)
+
+ def test_post_diff_comments_with_site(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/diff-comments/ API with a local site"""
+ diff_comment_text = "Test diff comment"
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self.apiPost(
+ ReviewResourceTests.get_list_url(review_request,
+ self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('review' in rsp)
+ review_id = rsp['review']['id']
+
+ self._postNewDiffComment(review_request, review_id, diff_comment_text)
+ review = Review.objects.get(pk=review_id)
+
+ rsp = self.apiGet(self.get_list_url(review, self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('diff_comments' in rsp)
+ self.assertEqual(len(rsp['diff_comments']), 1)
+ self.assertEqual(rsp['diff_comments'][0]['text'], diff_comment_text)
+
+ return review_id
+
+ def test_post_diff_comments_with_site_no_access(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/diff-comments/ API with a local site and Permission Denied error"""
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.save()
+
+ rsp = self.apiPost(self.get_list_url(review, self.local_site_name),
+ {},
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+
+ def test_post_diff_comments_with_interdiff(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/diff-comments/ API with interdiff"""
+ comment_text = "Test diff comment"
+
+ rsp, review_request_id, review_id, interdiff_revision = \
+ self._common_post_interdiff_comments(comment_text)
+
+ review_request = ReviewRequest.objects.get(pk=review_request_id)
+ review = Review.objects.get(pk=review_id)
+
+ rsp = self.apiGet(self.get_list_url(review))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('diff_comments' in rsp)
+ self.assertEqual(len(rsp['diff_comments']), 1)
+ self.assertEqual(rsp['diff_comments'][0]['text'], comment_text)
+
+ def test_get_diff_comments_with_interdiff(self):
+ """Testing the GET review-requests/<id>/reviews/<id>/diff-comments/ API with interdiff"""
+ comment_text = "Test diff comment"
+
+ rsp, review_request_id, review_id, interdiff_revision = \
+ self._common_post_interdiff_comments(comment_text)
+
+ review_request = ReviewRequest.objects.get(pk=review_request_id)
+ review = Review.objects.get(pk=review_id)
+
+ rsp = self.apiGet(self.get_list_url(review), {
+ 'interdiff-revision': interdiff_revision,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('diff_comments' in rsp)
+ self.assertEqual(len(rsp['diff_comments']), 1)
+ self.assertEqual(rsp['diff_comments'][0]['text'], comment_text)
+
+ def test_delete_diff_comment_with_interdiff(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/diff-comments/<id>/ API"""
+ comment_text = "This is a test comment."
+
+ rsp, review_request_id, review_id, interdiff_revision = \
+ self._common_post_interdiff_comments(comment_text)
+
+ rsp = self.apiDelete(rsp['diff_comment']['links']['self']['href'])
+
+ review_request = ReviewRequest.objects.get(pk=review_request_id)
+ review = Review.objects.get(pk=review_id)
+
+ rsp = self.apiGet(self.get_list_url(review))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('diff_comments' in rsp)
+ self.assertEqual(len(rsp['diff_comments']), 0)
+
+ def test_delete_diff_comment_with_site(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/diff-comments/<id>/ API with a local site"""
+ review_id = self.test_post_diff_comments_with_site()
+ review = Review.objects.get(pk=review_id)
+ review_request = review.review_request
+ comment = review.comments.all()[0]
+ comment_count = review.comments.count()
+
+ self.apiDelete(self.get_item_url(review, comment.id,
+ self.local_site_name))
+
+ self.assertEqual(review.comments.count(), comment_count - 1)
+
+ def test_delete_diff_comment_with_site_no_access(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/diff-comments/<id>/ API with a local site and Permission Denied error"""
+ review_id = self.test_post_diff_comments_with_site()
+ review = Review.objects.get(pk=review_id)
+ review_request = review.review_request
+ comment = review.comments.all()[0]
+
+ self.client.logout()
+ self.client.login(username='grumpy', password='grumpy')
+
+ rsp = self.apiDelete(
+ self.get_item_url(review, comment.id, self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def _common_post_interdiff_comments(self, comment_text):
+ # Post the review request
+ rsp = self._postNewReviewRequest()
+ review_request = ReviewRequest.objects.get(
+ pk=rsp['review_request']['id'])
+
+ # Post the diff.
+ rsp = self._postNewDiff(review_request)
+ review_request.publish(self.user)
+ diffset = DiffSet.objects.get(pk=rsp['diff']['id'])
+ filediff = diffset.files.all()[0]
+
+ # Post the second diff.
+ rsp = self._postNewDiff(review_request)
+ review_request.publish(self.user)
+ interdiffset = DiffSet.objects.get(pk=rsp['diff']['id'])
+ interfilediff = interdiffset.files.all()[0]
+
+ rsp = self.apiPost(ReviewResourceTests.get_list_url(review_request))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('review' in rsp)
+ review_id = rsp['review']['id']
+
+ rsp = self._postNewDiffComment(review_request, review_id,
+ comment_text,
+ filediff_id=filediff.id,
+ interfilediff_id=interfilediff.id)
+
+ return rsp, review_request.id, review_id, interdiffset.revision
+
+ @classmethod
+ def get_list_url(cls, review, local_site_name=None):
+ return local_site_reverse(
+ 'diff-comments-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review.review_request.display_id,
+ 'review_id': review.pk,
+ })
+
+ def get_item_url(self, review, comment_id, local_site_name=None):
+ return local_site_reverse(
+ 'diff-comment-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review.review_request.display_id,
+ 'review_id': review.pk,
+ 'comment_id': comment_id,
+ })
+
+
+class DraftReviewScreenshotCommentResourceTests(BaseWebAPITestCase):
+ """Testing the ReviewScreenshotCommentResource APIs."""
+ def test_get_review_screenshot_comments(self):
+ """Testing the GET review-requests/<id>/reviews/draft/screenshot-comments/ API"""
+ screenshot_comment_text = "Test screenshot comment"
+ x, y, w, h = 2, 2, 10, 10
+
+ # Post the review request
+ rsp = self._postNewReviewRequest()
+ review_request = ReviewRequest.objects.get(
+ pk=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+
+ # Make these public.
+ review_request.publish(self.user)
+
+ rsp = self.apiPost(ReviewResourceTests.get_list_url(review_request))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('review' in rsp)
+ review_id = rsp['review']['id']
+ review = Review.objects.get(pk=review_id)
+
+ self._postNewScreenshotComment(review_request, review_id, screenshot,
+ screenshot_comment_text, x, y, w, h)
+
+ rsp = self.apiGet(self.get_list_url(review))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('screenshot_comments' in rsp)
+ self.assertEqual(len(rsp['screenshot_comments']), 1)
+ self.assertEqual(rsp['screenshot_comments'][0]['text'],
+ screenshot_comment_text)
+
+ def test_get_review_screenshot_comments_with_site(self):
+ """Testing the GET review-requests/<id>/reviews/draft/screenshot-comments/ APIs with a local site"""
+ screenshot_comment_text = "Test screenshot comment"
+ x, y, w, h = 2, 2, 10, 10
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+ review_request.publish(User.objects.get(username='doc'))
+
+ rsp = self.apiPost(
+ ReviewResourceTests.get_list_url(review_request,
+ self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('review' in rsp)
+ review_id = rsp['review']['id']
+ review = Review.objects.get(pk=review_id)
+
+ self._postNewScreenshotComment(review_request, review_id, screenshot,
+ screenshot_comment_text, x, y, w, h)
+
+ rsp = self.apiGet(self.get_list_url(review, self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('screenshot_comments' in rsp)
+ self.assertEqual(len(rsp['screenshot_comments']), 1)
+ self.assertEqual(rsp['screenshot_comments'][0]['text'],
+ screenshot_comment_text)
+
+ @classmethod
+ def get_list_url(self, review, local_site_name=None):
+ return local_site_reverse(
+ 'screenshot-comments-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review.review_request.display_id,
+ 'review_id': review.pk,
+ })
+
+ def get_item_url(self, review, comment_id, local_site_name=None):
+ return local_site_reverse(
+ 'screenshot-comment-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review.review_request.display_id,
+ 'review_id': review.pk,
+ 'comment_id': comment_id,
+ })
+
+
+class ReviewReplyResourceTests(BaseWebAPITestCase):
+ """Testing the ReviewReplyResource APIs."""
+ def test_get_replies(self):
+ """Testing the GET review-requests/<id>/reviews/<id>/replies API"""
+ review = \
+ Review.objects.filter(base_reply_to__isnull=True, public=True)[0]
+ self.test_put_reply()
+
+ public_replies = review.public_replies()
+
+ rsp = self.apiGet(self.get_list_url(review))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['replies']), public_replies.count())
+
+ for i in range(public_replies.count()):
+ reply = public_replies[i]
+ self.assertEqual(rsp['replies'][i]['id'], reply.id)
+ self.assertEqual(rsp['replies'][i]['body_top'], reply.body_top)
+ self.assertEqual(rsp['replies'][i]['body_bottom'],
+ reply.body_bottom)
+
+ def test_get_replies_with_counts_only(self):
+ """Testing the GET review-requests/<id>/reviews/<id>/replies/?counts-only=1 API"""
+ review = \
+ Review.objects.filter(base_reply_to__isnull=True, public=True)[0]
+ self.test_put_reply()
+
+ rsp = self.apiGet('%s?counts-only=1' % self.get_list_url(review))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['count'], review.public_replies().count())
+
+ def test_get_replies_with_site(self):
+ """Testing the GET review-requests/<id>/reviews/<id>/replies/ API with a local site"""
+ review_request = \
+ ReviewRequest.objects.filter(local_site__name=self.local_site_name)[0]
+
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.public = True
+ review.save()
+
+ reply = Review()
+ reply.review_request = review_request
+ reply.user = review.user
+ reply.public = True
+ reply.base_reply_to = review
+ reply.save()
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ public_replies = review.public_replies()
+
+ rsp = self.apiGet(self.get_list_url(review, self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(rsp['replies']), public_replies.count())
+
+ for i in range(public_replies.count()):
+ reply = public_replies[i]
+ self.assertEqual(rsp['replies'][i]['id'], reply.id)
+ self.assertEqual(rsp['replies'][i]['body_top'], reply.body_top)
+ self.assertEqual(rsp['replies'][i]['body_bottom'],
+ reply.body_bottom)
+
+ def test_get_replies_with_site_no_access(self):
+ """Testing the GET review-requests/<id>/reviews/<id>/replies/ API with a local site and Permission Denied error"""
+ review_request = \
+ ReviewRequest.objects.filter(local_site__name=self.local_site_name)[0]
+
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.public = True
+ review.save()
+
+ rsp = self.apiGet(self.get_list_url(review, self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_post_replies(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/replies/ API"""
+ review = \
+ Review.objects.filter(base_reply_to__isnull=True, public=True)[0]
+
+ rsp = self.apiPost(self.get_list_url(review), {
+ 'body_top': 'Test',
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ self.assertEqual(len(mail.outbox), 0)
+
+ def test_post_replies_with_site(self):
+ """Testing the POST review-requsets/<id>/reviews/<id>/replies/ API with a local site"""
+ review_request = \
+ ReviewRequest.objects.filter(local_site__name=self.local_site_name)[0]
+
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.public = True
+ review.save()
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self.apiPost(self.get_list_url(review, self.local_site_name),
+ { 'body_top': 'Test', })
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(len(mail.outbox), 0)
+
+ def test_post_replies_with_site_no_access(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/replies/ API with a local site and Permission Denied error"""
+ review_request = \
+ ReviewRequest.objects.filter(local_site__name=self.local_site_name)[0]
+
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.public = True
+ review.save()
+
+ rsp = self.apiPost(self.get_list_url(review, self.local_site_name),
+ { 'body_top': 'Test', },
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_post_replies_with_body_top(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/replies/ API with body_top"""
+ body_top = 'My Body Top'
+
+ review = \
+ Review.objects.filter(base_reply_to__isnull=True, public=True)[0]
+
+ rsp = self.apiPost(self.get_list_url(review), {
+ 'body_top': body_top,
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ reply = Review.objects.get(pk=rsp['reply']['id'])
+ self.assertEqual(reply.body_top, body_top)
+
+ def test_post_replies_with_body_bottom(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/replies/ API with body_bottom"""
+ body_bottom = 'My Body Bottom'
+
+ review = \
+ Review.objects.filter(base_reply_to__isnull=True, public=True)[0]
+
+ rsp = self.apiPost(self.get_list_url(review), {
+ 'body_bottom': body_bottom,
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ reply = Review.objects.get(pk=rsp['reply']['id'])
+ self.assertEqual(reply.body_bottom, body_bottom)
+
+ def test_put_reply(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/replies/<id>/ API"""
+ review = \
+ Review.objects.filter(base_reply_to__isnull=True, public=True)[0]
+
+ rsp, response = self.api_post_with_response(self.get_list_url(review))
+
+ self.assertTrue('Location' in response)
+ self.assertTrue('stat' in rsp)
+ self.assertEqual(rsp['stat'], 'ok')
+
+ rsp = self.apiPut(response['Location'], {
+ 'body_top': 'Test',
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ def test_put_reply_with_site(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/replies/<id>/ API with a local site"""
+ review_request = \
+ ReviewRequest.objects.filter(local_site__name=self.local_site_name)[0]
+
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.public = True
+ review.save()
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp, response = self.api_post_with_response(
+ self.get_list_url(review, self.local_site_name))
+ self.assertTrue('Location' in response)
+ self.assertTrue('stat' in rsp)
+ self.assertEqual(rsp['stat'], 'ok')
+
+ rsp = self.apiPut(response['Location'],
+ { 'body_top': 'Test', })
+ self.assertEqual(rsp['stat'], 'ok')
+
+ def test_put_reply_with_site_no_access(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/replies/<id>/ API with a local site and Permission Denied error"""
+ review_request = \
+ ReviewRequest.objects.filter(local_site__name=self.local_site_name)[0]
+
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.public = True
+ review.save()
+
+ reply = Review()
+ reply.review_request = review_request
+ reply.user = review.user
+ reply.public = True
+ reply.base_reply_to = review
+ reply.save()
+
+ rsp = self.apiPut(self.get_item_url(review, reply.id,
+ self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_put_reply_publish(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/replies/<id>/?public=1 API"""
+ review = \
+ Review.objects.filter(base_reply_to__isnull=True, public=True)[0]
+
+ rsp, response = self.api_post_with_response(self.get_list_url(review))
+
+ self.assertTrue('Location' in response)
+ self.assertTrue('stat' in rsp)
+ self.assertEqual(rsp['stat'], 'ok')
+
+ rsp = self.apiPut(response['Location'], {
+ 'body_top': 'Test',
+ 'public': True,
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ reply = Review.objects.get(pk=rsp['reply']['id'])
+ self.assertEqual(reply.public, True)
+
+ self.assertEqual(len(mail.outbox), 1)
+
+ def test_delete_reply(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/replies/<id>/ API"""
+ review = \
+ Review.objects.filter(base_reply_to__isnull=True, public=True)[0]
+
+ rsp = self.apiPost(self.get_list_url(review), {
+ 'body_top': 'Test',
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ reply_id = rsp['reply']['id']
+ rsp = self.apiDelete(rsp['reply']['links']['self']['href'])
+
+ self.assertEqual(Review.objects.filter(pk=reply_id).count(), 0)
+
+ def test_delete_reply_with_site(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/replies/<id>/ API with a local site"""
+ review_request = \
+ ReviewRequest.objects.filter(local_site__name=self.local_site_name)[0]
+
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.public = True
+ review.save()
+
+ reply = Review()
+ reply.review_request = review_request
+ reply.user = review.user
+ reply.public = False
+ reply.base_reply_to = review
+ reply.save()
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ self.apiDelete(self.get_item_url(review, reply.id,
+ self.local_site_name))
+ self.assertEqual(review.replies.count(), 0)
+
+ def test_delete_reply_with_site_no_access(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/replies/<id>/ API with a local site and Permission Denied error"""
+ review_request = \
+ ReviewRequest.objects.filter(local_site__name=self.local_site_name)[0]
+
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.public = True
+ review.save()
+
+ reply = Review()
+ reply.review_request = review_request
+ reply.user = review.user
+ reply.public = False
+ reply.base_reply_to = review
+ reply.save()
+
+ rsp = self.apiDelete(self.get_item_url(review, reply.id,
+ self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ @classmethod
+ def get_list_url(cls, review, local_site_name=None):
+ return local_site_reverse(
+ 'replies-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review.review_request.display_id,
+ 'review_id': review.pk,
+ })
+
+ def get_item_url(self, review, reply_id, local_site_name=None):
+ return local_site_reverse(
+ 'reply-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review.review_request.display_id,
+ 'review_id': review.pk,
+ 'reply_id': reply_id,
+ })
+
+
+class ReviewReplyDiffCommentResourceTests(BaseWebAPITestCase):
+ """Testing the ReviewReplyDiffCommentResource APIs."""
+ def test_post_reply_with_diff_comment(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/replies/<id>/diff-comments/ API"""
+ comment_text = "My Comment Text"
+
+ comment = Comment.objects.all()[0]
+ review = comment.review.get()
+
+ # Create the reply
+ rsp = self.apiPost(ReviewReplyResourceTests.get_list_url(review))
+ self.assertEqual(rsp['stat'], 'ok')
+
+ self.assertTrue('reply' in rsp)
+ self.assertNotEqual(rsp['reply'], None)
+ self.assertTrue('links' in rsp['reply'])
+ self.assertTrue('diff_comments' in rsp['reply']['links'])
+
+ rsp = self.apiPost(rsp['reply']['links']['diff_comments']['href'], {
+ 'reply_to_id': comment.id,
+ 'text': comment_text,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+
+ reply_comment = Comment.objects.get(pk=rsp['diff_comment']['id'])
+ self.assertEqual(reply_comment.text, comment_text)
+
+ return rsp
+
+ def test_post_reply_with_diff_comment_and_local_site(self, badlogin=False):
+ """Testing the POST review-requests/<id>/reviews/<id>/replies/<id>/diff-comments/ API with a local site"""
+ comment_text = 'My Comment Text'
+
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ review = Review()
+ review.review_request = review_request
+ review.user = User.objects.get(username='doc')
+ review.save()
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self._postNewDiffComment(review_request, review.id, 'Comment')
+ review = Review.objects.get(pk=review.id)
+ review.public = True
+ review.save()
+
+ self.assertTrue('diff_comment' in rsp)
+ self.assertTrue('id' in rsp['diff_comment'])
+ comment_id = rsp['diff_comment']['id']
+
+ rsp = self.apiPost(
+ ReviewReplyResourceTests.get_list_url(review, self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+
+ self.assertTrue('reply' in rsp)
+ self.assertNotEqual(rsp['reply'], None)
+ self.assertTrue('links' in rsp['reply'])
+ self.assertTrue('diff_comments' in rsp['reply']['links'])
+
+ post_data = {
+ 'reply_to_id': comment_id,
+ 'text': comment_text,
+ }
+
+ if badlogin:
+ self.client.logout()
+ self.client.login(username='grumpy', password='grumpy')
+ rsp = self.apiPost(rsp['reply']['links']['diff_comments']['href'],
+ post_data,
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+ else:
+ rsp = self.apiPost(rsp['reply']['links']['diff_comments']['href'],
+ post_data)
+ self.assertEqual(rsp['stat'], 'ok')
+
+ reply_comment = Comment.objects.get(pk=rsp['diff_comment']['id'])
+ self.assertEqual(reply_comment.text, comment_text)
+
+ return rsp
+
+ def test_post_reply_with_diff_comment_and_local_site_no_access(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/replies/<id>/diff-comments/ API with a local site and Permission Denied error"""
+ self.test_post_reply_with_diff_comment_and_local_site(True)
+
+ def test_put_reply_with_diff_comment(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/replies/<id>/diff-comments/ API"""
+ new_comment_text = 'My new comment text'
+
+ # First, create a comment that we can update.
+ rsp = self.test_post_reply_with_diff_comment()
+
+ reply_comment = Comment.objects.get(pk=rsp['diff_comment']['id'])
+
+ rsp = self.apiPut(rsp['diff_comment']['links']['self']['href'], {
+ 'text': new_comment_text,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+
+ reply_comment = Comment.objects.get(pk=rsp['diff_comment']['id'])
+ self.assertEqual(reply_comment.text, new_comment_text)
+
+ def test_put_reply_with_diff_comment_and_local_site(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/replies/<id>/diff-comments/ API with a local site"""
+ new_comment_text = 'My new comment text'
+
+ rsp = self.test_post_reply_with_diff_comment_and_local_site()
+
+ reply_comment = Comment.objects.get(pk=rsp['diff_comment']['id'])
+
+ rsp = self.apiPut(rsp['diff_comment']['links']['self']['href'],
+ { 'text': new_comment_text, })
+ self.assertEqual(rsp['stat'], 'ok')
+
+ reply_comment = Comment.objects.get(pk=rsp['diff_comment']['id'])
+ self.assertEqual(reply_comment.text, new_comment_text)
+
+ def test_put_reply_with_diff_comment_and_local_site_no_access(self):
+ """Testing the PUT review-requests/<id>/reviews/<id>/replies/<id>/diff-comments/ API with a local site and Permission Denied error"""
+ new_comment_text = 'My new comment text'
+
+ rsp = self.test_post_reply_with_diff_comment_and_local_site()
+
+ reply_comment = Comment.objects.get(pk=rsp['diff_comment']['id'])
+
+ self.client.logout()
+ self.client.login(username='grumpy', password='grumpy')
+
+ rsp = self.apiPut(rsp['diff_comment']['links']['self']['href'],
+ { 'text': new_comment_text, },
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+
+class ReviewReplyScreenshotCommentResourceTests(BaseWebAPITestCase):
+ """Testing the ReviewReplyScreenshotCommentResource APIs."""
+ def test_post_reply_with_screenshot_comment(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/replies/<id>/screenshot-comments/ API"""
+ comment_text = "My Comment Text"
+ x, y, w, h = 10, 10, 20, 20
+
+ rsp = self._postNewReviewRequest()
+ review_request = \
+ ReviewRequest.objects.get(pk=rsp['review_request']['id'])
+
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+ replies_url = rsp['review']['links']['replies']['href']
+
+ rsp = self._postNewScreenshotComment(review_request, review.id,
+ screenshot, comment_text,
+ x, y, w, h)
+
+ self.assertTrue('screenshot_comment' in rsp)
+ self.assertEqual(rsp['screenshot_comment']['text'], comment_text)
+ self.assertEqual(rsp['screenshot_comment']['x'], x)
+ self.assertEqual(rsp['screenshot_comment']['y'], y)
+ self.assertEqual(rsp['screenshot_comment']['w'], w)
+ self.assertEqual(rsp['screenshot_comment']['h'], h)
+
+ comment = ScreenshotComment.objects.get(
+ pk=rsp['screenshot_comment']['id'])
+
+ rsp = self.apiPost(replies_url)
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('reply' in rsp)
+ self.assertNotEqual(rsp['reply'], None)
+ self.assertTrue('links' in rsp['reply'])
+ self.assertTrue('screenshot_comments' in rsp['reply']['links'])
+
+ screenshot_comments_url = \
+ rsp['reply']['links']['screenshot_comments']['href']
+
+ rsp = self.apiPost(screenshot_comments_url, {
+ 'reply_to_id': comment.id,
+ 'text': comment_text,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+
+ reply_comment = ScreenshotComment.objects.get(
+ pk=rsp['screenshot_comment']['id'])
+ self.assertEqual(reply_comment.text, comment_text)
+ self.assertEqual(reply_comment.reply_to, comment)
+
+ def test_post_reply_with_screenshot_comment_and_local_site(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/replies/<id>/screenshot-comments/ API with a local site"""
+ comment_text = "My Comment Text"
+ x, y, w, h = 10, 10, 20, 20
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+ replies_url = rsp['review']['links']['replies']['href']
+
+ rsp = self._postNewScreenshotComment(review_request, review.id,
+ screenshot, comment_text,
+ x, y, w, h)
+
+ self.assertTrue('screenshot_comment' in rsp)
+ self.assertEqual(rsp['screenshot_comment']['text'], comment_text)
+ self.assertEqual(rsp['screenshot_comment']['x'], x)
+ self.assertEqual(rsp['screenshot_comment']['y'], y)
+ self.assertEqual(rsp['screenshot_comment']['w'], w)
+ self.assertEqual(rsp['screenshot_comment']['h'], h)
+
+ comment = ScreenshotComment.objects.get(
+ pk=rsp['screenshot_comment']['id'])
+
+ rsp = self.apiPost(replies_url)
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('reply' in rsp)
+ self.assertNotEqual(rsp['reply'], None)
+ self.assertTrue('links' in rsp['reply'])
+ self.assertTrue('screenshot_comments' in rsp['reply']['links'])
+
+ screenshot_comments_url = \
+ rsp['reply']['links']['screenshot_comments']['href']
+
+ post_data = {
+ 'reply_to_id': comment.id,
+ 'text': comment_text,
+ }
+
+ rsp = self.apiPost(screenshot_comments_url, post_data)
+ self.assertEqual(rsp['stat'], 'ok')
+
+ reply_comment = ScreenshotComment.objects.get(
+ pk=rsp['screenshot_comment']['id'])
+ self.assertEqual(reply_comment.text, comment_text)
+
+
+class DiffResourceTests(BaseWebAPITestCase):
+ """Testing the DiffResource APIs."""
+
+ def test_post_diffs(self):
+ """Testing the POST review-requests/<id>/diffs/ API"""
+ rsp = self._postNewReviewRequest()
+ self.assertEqual(rsp['stat'], 'ok')
+ ReviewRequest.objects.get(pk=rsp['review_request']['id'])
+
+ diff_filename = os.path.join(
+ os.path.dirname(os.path.dirname(__file__)),
+ "scmtools", "testdata", "svn_makefile.diff")
+ f = open(diff_filename, "r")
+ rsp = self.apiPost(rsp['review_request']['links']['diffs']['href'], {
+ 'path': f,
+ 'basedir': "/trunk",
+ })
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ def test_post_diffs_with_missing_data(self):
+ """Testing the POST review-requests/<id>/diffs/ API with Invalid Form Data"""
+ rsp = self._postNewReviewRequest()
+ self.assertEqual(rsp['stat'], 'ok')
+ ReviewRequest.objects.get(pk=rsp['review_request']['id'])
+
+ rsp = self.apiPost(rsp['review_request']['links']['diffs']['href'],
+ expected_status=400)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], INVALID_FORM_DATA.code)
+ self.assert_('path' in rsp['fields'])
+
+ # Now test with a valid path and an invalid basedir.
+ # This is necessary because basedir is "optional" as defined by
+ # the resource, but may be required by the form that processes the
+ # diff.
+ rsp = self._postNewReviewRequest()
+ self.assertEqual(rsp['stat'], 'ok')
+ ReviewRequest.objects.get(pk=rsp['review_request']['id'])
+
+ diff_filename = os.path.join(
+ os.path.dirname(os.path.dirname(__file__)),
+ "scmtools", "testdata", "svn_makefile.diff")
+ f = open(diff_filename, "r")
+ rsp = self.apiPost(rsp['review_request']['links']['diffs']['href'], {
+ 'path': f,
+ }, expected_status=400)
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], INVALID_FORM_DATA.code)
+ self.assert_('basedir' in rsp['fields'])
+
+ def test_post_diffs_with_site(self):
+ """Testing the POST review-requests/<id>/diffs/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ repo = Repository.objects.get(name='Review Board Git')
+ rsp = self._postNewReviewRequest(local_site_name=self.local_site_name,
+ repository=repo)
+
+ self.assertEqual(rsp['stat'], 'ok')
+ review_request = ReviewRequest.objects.get(
+ local_id=rsp['review_request']['id'],
+ local_site__name=self.local_site_name)
+
+ diff_filename = os.path.join(
+ os.path.dirname(os.path.dirname(__file__)),
+ 'scmtools', 'testdata', 'git_deleted_file_indication.diff')
+ f = open(diff_filename, 'r')
+ rsp = self.apiPost(rsp['review_request']['links']['diffs']['href'],
+ { 'path': f, })
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['diff']['name'],
+ 'git_deleted_file_indication.diff')
+
+
+ def test_get_diffs(self):
+ """Testing the GET review-requests/<id>/diffs/ API"""
+ review_request = ReviewRequest.objects.get(pk=2)
+ rsp = self.apiGet(self.get_list_url(review_request))
+
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['diffs'][0]['id'], 2)
+ self.assertEqual(rsp['diffs'][0]['name'], 'cleaned_data.diff')
+
+ def test_get_diffs_with_site(self):
+ """Testing the GET review-requests/<id>/diffs API with a local site"""
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self.apiGet(self.get_list_url(review_request,
+ self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['diffs'][0]['id'],
+ review_request.diffset_history.diffsets.latest().id)
+ self.assertEqual(rsp['diffs'][0]['name'],
+ review_request.diffset_history.diffsets.latest().name)
+
+ def test_get_diffs_with_site_no_access(self):
+ """Testing the GET review-requests/<id>/diffs API with a local site and Permission Denied error"""
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+ self.apiGet(self.get_list_url(review_request, self.local_site_name),
+ expected_status=403)
+
+ def test_get_diff(self):
+ """Testing the GET review-requests/<id>/diffs/<revision>/ API"""
+ review_request = ReviewRequest.objects.get(pk=2)
+ rsp = self.apiGet(self.get_item_url(review_request, 1))
+
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['diff']['id'], 2)
+ self.assertEqual(rsp['diff']['name'], 'cleaned_data.diff')
+
+ def test_get_diff_with_site(self):
+ """Testing the GET review-requests/<id>/diffs/<revision>/ API with a local site"""
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+ diff = review_request.diffset_history.diffsets.latest()
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ rsp = self.apiGet(self.get_item_url(review_request, diff.revision,
+ self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['diff']['id'], diff.id)
+ self.assertEqual(rsp['diff']['name'], diff.name)
+
+ def test_get_diff_with_site_no_access(self):
+ """Testing the GET review-requests/<id>/diffs/<revision>/ API with a local site and Permission Denied error"""
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+ diff = review_request.diffset_history.diffsets.latest()
+ self.apiGet(self.get_item_url(review_request, diff.revision,
+ self.local_site_name),
+ expected_status=403)
+
+ @classmethod
+ def get_list_url(cls, review_request, local_site_name=None):
+ return local_site_reverse(
+ 'diffs-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review_request.display_id,
+ })
+
+ def get_item_url(self, review_request, diff_revision, local_site_name=None):
+ return local_site_reverse(
+ 'diff-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review_request.display_id,
+ 'diff_revision': diff_revision,
+ })
+
+
+class ScreenshotDraftResourceTests(BaseWebAPITestCase):
+ """Testing the ScreenshotDraftResource APIs."""
+ def test_post_screenshots(self):
+ """Testing the POST review-requests/<id>/draft/screenshots/ API"""
+ rsp = self._postNewReviewRequest()
+ self.assertEqual(rsp['stat'], 'ok')
+ ReviewRequest.objects.get(pk=rsp['review_request']['id'])
+
+ screenshots_url = rsp['review_request']['links']['screenshots']['href']
+
+ f = open(self._getTrophyFilename(), "r")
+ self.assertNotEqual(f, None)
+ rsp = self.apiPost(screenshots_url, {
+ 'path': f,
+ })
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ def test_post_screenshots_with_permission_denied_error(self):
+ """Testing the POST review-requests/<id>/draft/screenshots/ API with Permission Denied error"""
+ review_request = ReviewRequest.objects.filter(public=True,
+ local_site=None).exclude(submitter=self.user)[0]
+
+ f = open(self._getTrophyFilename(), "r")
+ self.assert_(f)
+ rsp = self.apiPost(self.get_list_url(review_request), {
+ 'caption': 'Trophy',
+ 'path': f,
+ }, expected_status=403)
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_post_screenshots_with_site(self):
+ """Testing the POST review-requests/<id>/draft/screenshots/ API with a local site"""
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ repo = Repository.objects.get(name='Review Board Git')
+ rsp = self._postNewReviewRequest(local_site_name=self.local_site_name,
+ repository=repo)
+ self.assertEqual(rsp['stat'], 'ok')
+ review_request = ReviewRequest.objects.get(
+ local_site__name=self.local_site_name,
+ local_id=rsp['review_request']['id'])
+
+ f = open(self._getTrophyFilename(), 'r')
+ self.assertNotEqual(f, None)
+
+ post_data = {
+ 'path': f,
+ 'caption': 'Trophy',
+ }
+
+ rsp = self.apiPost(self.get_list_url(review_request,
+ self.local_site_name),
+ post_data)
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertEqual(rsp['draft_screenshot']['caption'], 'Trophy')
+
+ draft = review_request.get_draft(User.objects.get(username='doc'))
+ self.assertNotEqual(draft, None)
+
+ return review_request, rsp['draft_screenshot']['id']
+
+ def test_post_screenshots_with_site_no_access(self):
+ """Testing the POST review-requests/<id>/draft/screenshots/ API with a local site and Permission Denied error"""
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+
+ f = open(self._getTrophyFilename(), 'r')
+ self.assertNotEqual(f, None)
+ rsp = self.apiPost(self.get_list_url(review_request,
+ self.local_site_name),
+ { 'path': f, },
+ expected_status=403)
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_put_screenshot(self):
+ """Testing the PUT review-requests/<id>/draft/screenshots/<id>/ API"""
+ draft_caption = 'The new caption'
+
+ rsp = self._postNewReviewRequest()
+ self.assertEqual(rsp['stat'], 'ok')
+ review_request = \
+ ReviewRequest.objects.get(pk=rsp['review_request']['id'])
+
+ f = open(self._getTrophyFilename(), "r")
+ self.assert_(f)
+ rsp = self.apiPost(self.get_list_url(review_request), {
+ 'caption': 'Trophy',
+ 'path': f,
+ })
+ f.close()
+ review_request.publish(self.user)
+
+ screenshot = Screenshot.objects.get(pk=rsp['draft_screenshot']['id'])
+
+ # Now modify the caption.
+ rsp = self.apiPut(self.get_item_url(review_request, screenshot.id), {
+ 'caption': draft_caption,
+ })
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ draft = review_request.get_draft(self.user)
+ self.assertNotEqual(draft, None)
+
+ screenshot = Screenshot.objects.get(pk=screenshot.id)
+ self.assertEqual(screenshot.draft_caption, draft_caption)
+
+ def test_put_screenshot_with_site(self):
+ """Testing the PUT review-requests/<id>/draft/screenshots/<id>/ API with a local site"""
+ draft_caption = 'The new caption'
+ user = User.objects.get(username='doc')
+
+ review_request, screenshot_id = self.test_post_screenshots_with_site()
+ review_request.publish(user)
+
+ rsp = self.apiPut(self.get_item_url(review_request, screenshot_id,
+ self.local_site_name),
+ { 'caption': draft_caption, })
+ self.assertEqual(rsp['stat'], 'ok')
+
+ draft = review_request.get_draft(user)
+ self.assertNotEqual(draft, None)
+
+ screenshot = Screenshot.objects.get(pk=screenshot_id)
+ self.assertEqual(screenshot.draft_caption, draft_caption)
+
+ def test_put_screenshot_with_site_no_access(self):
+ """Testing the PUT review-requests/<id>/draft/screenshots/<id>/ API with a local site and Permission Denied error"""
+ review_request, screenshot_id = self.test_post_screenshots_with_site()
+ review_request.publish(User.objects.get(username='doc'))
+
+ self.client.logout()
+ self.client.login(username='grumpy', password='grumpy')
+
+ rsp = self.apiPut(self.get_item_url(review_request, screenshot_id,
+ self.local_site_name),
+ { 'caption': 'test', },
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def get_list_url(self, review_request, local_site_name=None):
+ return local_site_reverse(
+ 'draft-screenshots-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review_request.display_id,
+ })
+
+ def get_item_url(self, review_request, screenshot_id, local_site_name=None):
+ return local_site_reverse(
+ 'draft-screenshot-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review_request.display_id,
+ 'screenshot_id': screenshot_id,
+ })
+
+
+class ScreenshotResourceTests(BaseWebAPITestCase):
+ """Testing the ScreenshotResource APIs."""
+ def test_post_screenshots(self):
+ """Testing the POST review-requests/<id>/screenshots/ API"""
+ rsp = self._postNewReviewRequest()
+ self.assertEqual(rsp['stat'], 'ok')
+ ReviewRequest.objects.get(pk=rsp['review_request']['id'])
+
+ screenshots_url = rsp['review_request']['links']['screenshots']['href']
+
+ f = open(self._getTrophyFilename(), "r")
+ self.assertNotEqual(f, None)
+ rsp = self.apiPost(screenshots_url, {
+ 'path': f,
+ })
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ def test_post_screenshots_with_permission_denied_error(self):
+ """Testing the POST review-requests/<id>/screenshots/ API with Permission Denied error"""
+ review_request = ReviewRequest.objects.filter(public=True,
+ local_site=None).exclude(submitter=self.user)[0]
+
+ f = open(self._getTrophyFilename(), "r")
+ self.assert_(f)
+ rsp = self.apiPost(self.get_list_url(review_request), {
+ 'caption': 'Trophy',
+ 'path': f,
+ }, expected_status=403)
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def _test_review_request_with_site(self):
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ repo = Repository.objects.get(name='Review Board Git')
+ rsp = self._postNewReviewRequest(local_site_name=self.local_site_name,
+ repository=repo)
+ self.assertEqual(rsp['stat'], 'ok')
+ review_request = ReviewRequest.objects.get(
+ local_site__name=self.local_site_name,
+ local_id=rsp['review_request']['id'])
+
+ return rsp['review_request']['links']['screenshots']['href']
+
+ def test_post_screenshots_with_site(self):
+ """Testing the POST review-requests/<id>/screenshots/ API with a local site"""
+ screenshots_url = self._test_review_request_with_site()
+
+ f = open(self._getTrophyFilename(), 'r')
+ self.assertNotEqual(f, None)
+ rsp = self.apiPost(screenshots_url, { 'path': f, })
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'ok')
+
+ def test_post_screenshots_with_site_no_access(self):
+ """Testing the POST review-requests/<id>/screenshots/ API with a local site and Permission Denied error"""
+ screenshots_url = self._test_review_request_with_site()
+ self.client.logout()
+ self.client.login(username='grumpy', password='grumpy')
+
+ f = open(self._getTrophyFilename(), 'r')
+ self.assertNotEqual(f, None)
+ rsp = self.apiPost(screenshots_url,
+ { 'path': f, },
+ expected_status=403)
+ f.close()
+
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ @classmethod
+ def get_list_url(cls, review_request, local_site_name=None):
+ return local_site_reverse(
+ 'screenshots-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review_request.display_id,
+ })
+
+
+class FileDiffCommentResourceTests(BaseWebAPITestCase):
+ """Testing the FileDiffCommentResource APIs."""
+ def test_get_comments(self):
+ """Testing the GET review-requests/<id>/diffs/<revision>/files/<id>/diff-comments/ API"""
+ diff_comment_text = 'Sample comment.'
+
+ review_request = ReviewRequest.objects.public()[0]
+ diffset = review_request.diffset_history.diffsets.latest()
+ filediff = diffset.files.all()[0]
+
+ rsp = self.apiPost(ReviewResourceTests.get_list_url(review_request))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('review' in rsp)
+ review_id = rsp['review']['id']
+
+ self._postNewDiffComment(review_request, review_id, diff_comment_text)
+
+ rsp = self.apiGet(self.get_list_url(filediff))
+ self.assertEqual(rsp['stat'], 'ok')
+
+ comments = Comment.objects.filter(filediff=filediff)
+ self.assertEqual(len(rsp['diff_comments']), comments.count())
+
+ for i in range(0, len(rsp['diff_comments'])):
+ self.assertEqual(rsp['diff_comments'][i]['text'], comments[i].text)
+
+ def test_get_comments_with_site(self):
+ """Testing the GET review-requests/<id>/diffs/<revision>/files/<id>/diff-comments/ API with a local site"""
+ diff_comment_text = 'Sample comment.'
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+ diffset = review_request.diffset_history.diffsets.latest()
+ filediff = diffset.files.all()[0]
+
+ rsp = self.apiPost(
+ ReviewResourceTests.get_list_url(review_request,
+ self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('review' in rsp)
+ review_id = rsp['review']['id']
+
+ self._postNewDiffComment(review_request, review_id, diff_comment_text)
+
+ rsp = self.apiGet(self.get_list_url(filediff, self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+
+ comments = Comment.objects.filter(filediff=filediff)
+ self.assertEqual(len(rsp['diff_comments']), comments.count())
+
+ for i in range(0, len(rsp['diff_comments'])):
+ self.assertEqual(rsp['diff_comments'][i]['text'], comments[i].text)
+
+ def test_get_comments_with_site_no_access(self):
+ """Testing the GET review-requests/<id>/diffs/<revision>/files/<id>/diff-comments/ API with a local site and Permission Denied error"""
+ diff_comment_text = 'Sample comment.'
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ review_request = ReviewRequest.objects.filter(
+ local_site__name=self.local_site_name)[0]
+ diffset = review_request.diffset_history.diffsets.latest()
+ filediff = diffset.files.all()[0]
+
+ rsp = self.apiPost(
+ ReviewResourceTests.get_list_url(review_request,
+ self.local_site_name))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('review' in rsp)
+ review_id = rsp['review']['id']
+
+ self._postNewDiffComment(review_request, review_id, diff_comment_text)
+
+ self.client.logout()
+ self.client.login(username='grumpy', password='grumpy')
+
+ rsp = self.apiGet(self.get_list_url(filediff, self.local_site_name),
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_get_comments_with_line(self):
+ """Testing the GET review-requests/<id>/diffs/<revision>/files/<id>/diff-comments/?line= API"""
+ diff_comment_text = 'Sample comment.'
+ diff_comment_line = 10
+
+ review_request = ReviewRequest.objects.public()[0]
+ diffset = review_request.diffset_history.diffsets.latest()
+ filediff = diffset.files.all()[0]
+
+ rsp = self.apiPost(ReviewResourceTests.get_list_url(review_request))
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('review' in rsp)
+ review_id = rsp['review']['id']
+
+ self._postNewDiffComment(review_request, review_id, diff_comment_text,
+ first_line=diff_comment_line)
+
+ self._postNewDiffComment(review_request, review_id, diff_comment_text,
+ first_line=diff_comment_line + 1)
+
+ rsp = self.apiGet(self.get_list_url(filediff), {
+ 'line': diff_comment_line,
+ })
+ self.assertEqual(rsp['stat'], 'ok')
+
+ comments = Comment.objects.filter(filediff=filediff,
+ first_line=diff_comment_line)
+ self.assertEqual(len(rsp['diff_comments']), comments.count())
+
+ for i in range(0, len(rsp['diff_comments'])):
+ self.assertEqual(rsp['diff_comments'][i]['text'], comments[i].text)
+ self.assertEqual(rsp['diff_comments'][i]['first_line'],
+ comments[i].first_line)
+
+ def get_list_url(self, filediff, local_site_name=None):
+ diffset = filediff.diffset
+ review_request = diffset.history.review_request.get()
+
+ return local_site_reverse(
+ 'diff-comments-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review_request.display_id,
+ 'diff_revision': filediff.diffset.revision,
+ 'filediff_id': filediff.pk,
+ })
+
+
+class ScreenshotCommentResourceTests(BaseWebAPITestCase):
+ """Testing the ScreenshotCommentResource APIs."""
+ def test_get_screenshot_comments(self):
+ """Testing the GET review-requests/<id>/screenshots/<id>/comments/ API"""
+ comment_text = "This is a test comment."
+ x, y, w, h = (2, 2, 10, 10)
+
+ # Post the review request
+ rsp = self._postNewReviewRequest()
+ review_request = ReviewRequest.objects.get(
+ pk=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+ self.assertTrue('links' in rsp['screenshot'])
+ self.assertTrue('screenshot_comments' in rsp['screenshot']['links'])
+ comments_url = rsp['screenshot']['links']['screenshot_comments']['href']
+
+ # Make these public.
+ review_request.publish(self.user)
+
+ # Post the review.
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+
+ self._postNewScreenshotComment(review_request, review.id, screenshot,
+ comment_text, x, y, w, h)
+
+ rsp = self.apiGet(comments_url)
+ self.assertEqual(rsp['stat'], 'ok')
+
+ comments = ScreenshotComment.objects.filter(screenshot=screenshot)
+ rsp_comments = rsp['screenshot_comments']
+ self.assertEqual(len(rsp_comments), comments.count())
+
+ for i in range(0, len(comments)):
+ self.assertEqual(rsp_comments[i]['text'], comments[i].text)
+ self.assertEqual(rsp_comments[i]['x'], comments[i].x)
+ self.assertEqual(rsp_comments[i]['y'], comments[i].y)
+ self.assertEqual(rsp_comments[i]['w'], comments[i].w)
+ self.assertEqual(rsp_comments[i]['h'], comments[i].h)
+
+ def test_get_screenshot_comments_with_site(self):
+ """Testing the GET review-requests/<id>/screenshots/<id>/comments/ API with a local site"""
+ comment_text = 'This is a test comment.'
+ x, y, w, h = (2, 2, 10, 10)
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ # Post the review request.
+ repo = Repository.objects.get(name='Review Board Git')
+ rsp = self._postNewReviewRequest(local_site_name=self.local_site_name,
+ repository=repo)
+ self.assertEqual(rsp['stat'], 'ok')
+ review_request = ReviewRequest.objects.get(
+ local_site__name=self.local_site_name,
+ local_id=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+ self.assertTrue('links' in rsp['screenshot'])
+ self.assertTrue('screenshot_comments' in rsp['screenshot']['links'])
+ comments_url = rsp['screenshot']['links']['screenshot_comments']['href']
+
+ # Make these public.
+ review_request.publish(User.objects.get(username='doc'))
+
+ # Post the review.
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+
+ self._postNewScreenshotComment(review_request, review.id, screenshot,
+ comment_text, x, y, w, h)
+
+ rsp = self.apiGet(comments_url)
+ self.assertEqual(rsp['stat'], 'ok')
+
+ comments = ScreenshotComment.objects.filter(screenshot=screenshot)
+ rsp_comments = rsp['screenshot_comments']
+ self.assertEqual(len(rsp_comments), comments.count())
+
+ for i in range(0, len(comments)):
+ self.assertEqual(rsp_comments[i]['text'], comments[i].text)
+ self.assertEqual(rsp_comments[i]['x'], comments[i].x)
+ self.assertEqual(rsp_comments[i]['y'], comments[i].y)
+ self.assertEqual(rsp_comments[i]['w'], comments[i].w)
+ self.assertEqual(rsp_comments[i]['h'], comments[i].h)
+
+ def test_get_screenshot_comments_with_site_no_access(self):
+ """Testing the GET review-requests/<id>/screenshots/<id>/comments/ API with a local site and Permission Denied error"""
+ comment_text = 'This is a test comment.'
+ x, y, w, h = (2, 2, 10, 10)
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ # Post the review request.
+ repo = Repository.objects.get(name='Review Board Git')
+ rsp = self._postNewReviewRequest(local_site_name=self.local_site_name,
+ repository=repo)
+ self.assertEqual(rsp['stat'], 'ok')
+ review_request = ReviewRequest.objects.get(
+ local_site__name=self.local_site_name,
+ local_id=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+ self.assertTrue('links' in rsp['screenshot'])
+ self.assertTrue('screenshot_comments' in rsp['screenshot']['links'])
+ comments_url = rsp['screenshot']['links']['screenshot_comments']['href']
+
+ # Make these public.
+ review_request.publish(User.objects.get(username='doc'))
+
+ # Post the review.
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+
+ self._postNewScreenshotComment(review_request, review.id, screenshot,
+ comment_text, x, y, w, h)
+
+ self.client.logout()
+ self.client.login(username='grumpy', password='grumpy')
+
+ rsp = self.apiGet(comments_url, expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+
+class ReviewScreenshotCommentResourceTests(BaseWebAPITestCase):
+ """Testing the ReviewScreenshotCommentResource APIs."""
+ def test_post_screenshot_comments(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/screenshot-comments/ API"""
+ comment_text = "This is a test comment."
+ x, y, w, h = (2, 2, 10, 10)
+
+ # Post the review request
+ rsp = self._postNewReviewRequest()
+ review_request = ReviewRequest.objects.get(
+ pk=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+
+ # Make these public.
+ review_request.publish(self.user)
+
+ # Post the review.
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+
+ rsp = self._postNewScreenshotComment(review_request, review.id,
+ screenshot, comment_text,
+ x, y, w, h)
+
+ self.assertEqual(rsp['screenshot_comment']['text'], comment_text)
+ self.assertEqual(rsp['screenshot_comment']['x'], x)
+ self.assertEqual(rsp['screenshot_comment']['y'], y)
+ self.assertEqual(rsp['screenshot_comment']['w'], w)
+ self.assertEqual(rsp['screenshot_comment']['h'], h)
+
+ def test_post_screenshot_comments_with_site(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/screenshot-comments/ API with a local site"""
+ comment_text = 'This is a test comment.'
+ x, y, w, h = (2, 2, 10, 10)
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ # Post the review request
+ repo = Repository.objects.get(name='Review Board Git')
+ rsp = self._postNewReviewRequest(local_site_name=self.local_site_name,
+ repository=repo)
+ self.assertEqual(rsp['stat'], 'ok')
+ review_request = ReviewRequest.objects.get(
+ local_site__name=self.local_site_name,
+ local_id=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+
+ # Make these public.
+ review_request.publish(User.objects.get(username='doc'))
+
+ # Post the review.
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+
+ rsp = self._postNewScreenshotComment(review_request, review.id,
+ screenshot, comment_text,
+ x, y, w, h)
+
+ self.assertEqual(rsp['screenshot_comment']['text'], comment_text)
+ self.assertEqual(rsp['screenshot_comment']['x'], x)
+ self.assertEqual(rsp['screenshot_comment']['y'], y)
+ self.assertEqual(rsp['screenshot_comment']['w'], w)
+ self.assertEqual(rsp['screenshot_comment']['h'], h)
+
+ def test_post_screenshot_comments_with_site_no_access(self):
+ """Testing the POST review-requests/<id>/reviews/<id>/screenshot-comments/ API with a local site and Permission Denied error"""
+ comment_text = 'This is a test comment.'
+ x, y, w, h = (2, 2, 10, 10)
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ # Post the review request
+ repo = Repository.objects.get(name='Review Board Git')
+ rsp = self._postNewReviewRequest(local_site_name=self.local_site_name,
+ repository=repo)
+ self.assertEqual(rsp['stat'], 'ok')
+ review_request = ReviewRequest.objects.get(
+ local_site__name=self.local_site_name,
+ local_id=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+
+ # Make these public.
+ review_request.publish(User.objects.get(username='doc'))
+
+ # Post the review.
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+
+ self.client.logout()
+ self.client.login(username='grumpy', password='grumpy')
+
+ rsp = self.apiPost(self.get_list_url(review, self.local_site_name),
+ { 'screenshot_id': screenshot.id, },
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_delete_screenshot_comment(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API"""
+ comment_text = "This is a test comment."
+ x, y, w, h = (2, 2, 10, 10)
+
+ # Post the review request
+ rsp = self._postNewReviewRequest()
+ review_request = ReviewRequest.objects.get(
+ pk=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+
+ # Make these public.
+ review_request.publish(self.user)
+
+ # Post the review.
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+ screenshot_comments_url = \
+ rsp['review']['links']['screenshot_comments']['href']
+
+ rsp = self._postNewScreenshotComment(review_request, review.id,
+ screenshot, comment_text,
+ x, y, w, h)
+
+ self.apiDelete(rsp['screenshot_comment']['links']['self']['href'])
+
+ rsp = self.apiGet(screenshot_comments_url)
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('screenshot_comments' in rsp)
+ self.assertEqual(len(rsp['screenshot_comments']), 0)
+
+ def test_delete_screenshot_comment_with_local_site(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/screenshot-comments/<id> API with a local site"""
+ comment_text = 'This is a test comment.'
+ x, y, w, h = (2, 2, 10, 10)
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ # Post the review request
+ repo = Repository.objects.get(name='Review Board Git')
+ rsp = self._postNewReviewRequest(local_site_name=self.local_site_name,
+ repository=repo)
+ self.assertEqual(rsp['stat'], 'ok')
+ review_request = ReviewRequest.objects.get(
+ local_site__name=self.local_site_name,
+ local_id=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+
+ # Make these public.
+ review_request.publish(User.objects.get(username='doc'))
+
+ # Post the review.
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+
+ screenshot_comments_url = \
+ rsp['review']['links']['screenshot_comments']['href']
+
+ rsp = self._postNewScreenshotComment(review_request, review.id,
+ screenshot, comment_text,
+ x, y, w, h)
+
+ self.apiDelete(rsp['screenshot_comment']['links']['self']['href'])
+
+ rsp = self.apiGet(screenshot_comments_url)
+ self.assertEqual(rsp['stat'], 'ok')
+ self.assertTrue('screenshot_comments' in rsp)
+ self.assertEqual(len(rsp['screenshot_comments']), 0)
+
+ def test_delete_screenshot_comment_with_local_site_no_access(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/screenshot-comments/<id> API with a local site and Permission Denied error"""
+ comment_text = 'This is a test comment.'
+ x, y, w, h = (2, 2, 10, 10)
+
+ self.client.logout()
+ self.client.login(username='doc', password='doc')
+
+ # Post the review request
+ repo = Repository.objects.get(name='Review Board Git')
+ rsp = self._postNewReviewRequest(local_site_name=self.local_site_name,
+ repository=repo)
+ self.assertEqual(rsp['stat'], 'ok')
+ review_request = ReviewRequest.objects.get(
+ local_site__name=self.local_site_name,
+ local_id=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ screenshot = Screenshot.objects.get(pk=rsp['screenshot']['id'])
+
+ # Make these public.
+ review_request.publish(User.objects.get(username='doc'))
+
+ # Post the review.
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+
+ screenshot_comments_url = \
+ rsp['review']['links']['screenshot_comments']['href']
+
+ rsp = self._postNewScreenshotComment(review_request, review.id,
+ screenshot, comment_text,
+ x, y, w, h)
+
+ self.client.logout()
+ self.client.login(username='grumpy', password='grumpy')
+
+ rsp = self.apiDelete(rsp['screenshot_comment']['links']['self']['href'],
+ expected_status=403)
+ self.assertEqual(rsp['stat'], 'fail')
+ self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)
+
+ def test_delete_screenshot_comment_with_does_not_exist_error(self):
+ """Testing the DELETE review-requests/<id>/reviews/<id>/screenshot-comments/<id>/ API with Does Not Exist error"""
+ x, y, w, h = (2, 2, 10, 10)
+
+ # Post the review request
+ rsp = self._postNewReviewRequest()
+ review_request = ReviewRequest.objects.get(
+ pk=rsp['review_request']['id'])
+
+ # Post the screenshot.
+ rsp = self._postNewScreenshot(review_request)
+ Screenshot.objects.get(pk=rsp['screenshot']['id'])
+
+ # Make these public.
+ review_request.publish(self.user)
+
+ # Post the review.
+ rsp = self._postNewReview(review_request)
+ review = Review.objects.get(pk=rsp['review']['id'])
+
+ self.apiDelete(self.get_item_url(review, 123), expected_status=404)
+
+ @classmethod
+ def get_list_url(cls, review, local_site_name=None):
+ return local_site_reverse(
+ 'screenshot-comments-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review.review_request.display_id,
+ 'review_id': review.pk,
+ })
+
+ def get_item_url(cls, review, comment_id, local_site_name=None):
+ return local_site_reverse(
+ 'screenshot-comment-resource',
+ local_site_name=local_site_name,
+ kwargs={
+ 'review_request_id': review.review_request.display_id,
+ 'review_id': review.pk,
+ 'comment_id': comment_id,
+ })
application/vnd.reviewboard.org.diff.data+json¶
$ curl http://reviews.example.com/api10/1/44/ -H "Accept: application/json"
Content-Type: application/json
X-Content-Type-Options: nosniff
Last-Modified: Fri, 10 Aug 2018 22:16:22 GMT
ETag: 1c167e656806a95016e920297ff7695d6eb6aa61
Vary: Accept, Cookie
{
"diff_data": {
"binary": false,
"changed_chunk_indexes": [
0
],
"chunks": [
{
"change": "insert",
"collapsable": false,
"index": 0,
"lines": [
[
1,
"",
"",
[],
1,
"import os",
[],
false
],
[
2,
"",
"",
[],
2,
"",
[],
false
],
[
3,
"",
"",
[],
3,
"from django.conf import settings",
[],
false
],
[
4,
"",
"",
[],
4,
"from django.contrib.auth.models import User, Permission",
[],
false
],
[
5,
"",
"",
[],
5,
"from django.core import mail",
[],
false
],
[
6,
"",
"",
[],
6,
"from django.test import TestCase",
[],
false
],
[
7,
"",
"",
[],
7,
"from django.utils import simplejson",
[],
false
],
[
8,
"",
"",
[],
8,
"from djblets.siteconfig.models import SiteConfiguration",
[],
false
],
[
9,
"",
"",
[],
9,
"from djblets.webapi.errors import DOES_NOT_EXIST, INVALID_ATTRIBUTE, \\",
[],
false
],
[
10,
"",
"",
[],
10,
" INVALID_FORM_DATA, PERMISSION_DENIED",
[],
false
],
[
11,
"",
"",
[],
11,
"",
[],
false
],
[
12,
"",
"",
[],
12,
"from reviewboard import initialize",
[],
false
],
[
13,
"",
"",
[],
13,
"from reviewboard.diffviewer.models import DiffSet",
[],
false
],
[
14,
"",
"",
[],
14,
"from reviewboard.notifications.tests import EmailTestHelper",
[],
false
],
[
15,
"",
"",
[],
15,
"from reviewboard.reviews.models import Group, ReviewRequest, \\",
[],
false
],
[
16,
"",
"",
[],
16,
" ReviewRequestDraft, Review, \\",
[],
false
],
[
17,
"",
"",
[],
17,
" Comment, Screenshot, ScreenshotComment",
[],
false
],
[
18,
"",
"",
[],
18,
"from reviewboard.scmtools.models import Repository, Tool",
[],
false
],
[
19,
"",
"",
[],
19,
"from reviewboard.site.urlresolvers import local_site_reverse",
[],
false
],
[
20,
"",
"",
[],
20,
"from reviewboard.site.models import LocalSite",
[],
false
],
[
21,
"",
"",
[],
21,
"from reviewboard.webapi.errors import INVALID_REPOSITORY",
[],
false
],
[
22,
"",
"",
[],
22,
"",
[],
false
],
[
23,
"",
"",
[],
23,
"",
[],
false
],
[
24,
"",
"",
[],
24,
"class BaseWebAPITestCase(TestCase, EmailTestHelper):",
[],
false
],
[
25,
"",
"",
[],
25,
" fixtures = ['test_users', 'test_reviewrequests', 'test_scmtools',",
[],
false
],
[
26,
"",
"",
[],
26,
" 'test_site']",
[],
false
],
[
27,
"",
"",
[],
27,
" local_site_name = 'local-site-1'",
[],
false
],
[
28,
"",
"",
[],
28,
"",
[],
false
],
[
29,
"",
"",
[],
29,
" def setUp(self):",
[],
false
],
[
30,
"",
"",
[],
30,
" initialize()",
[],
false
],
[
31,
"",
"",
[],
31,
"",
[],
false
],
[
32,
"",
"",
[],
32,
" siteconfig = SiteConfiguration.objects.get_current()",
[],
false
],
[
33,
"",
"",
[],
33,
" siteconfig.set("mail_send_review_mail", True)",
[],
false
],
[
34,
"",
"",
[],
34,
" siteconfig.set("auth_require_sitewide_login", False)",
[],
false
],
[
35,
"",
"",
[],
35,
" siteconfig.save()",
[],
false
],
[
36,
"",
"",
[],
36,
" mail.outbox = []",
[],
false
],
[
37,
"",
"",
[],
37,
"",
[],
false
],
[
38,
"",
"",
[],
38,
" svn_repo_path = os.path.join(os.path.dirname(__file__),",
[],
false
],
[
39,
"",
"",
[],
39,
" '../scmtools/testdata/svn_repo')",
[],
false
],
[
40,
"",
"",
[],
40,
" self.repository = Repository(name='Subversion SVN',",
[],
false
],
[
41,
"",
"",
[],
41,
" path='file://' + svn_repo_path,",
[],
false
],
[
42,
"",
"",
[],
42,
" tool=Tool.objects.get(name='Subversion'))",
[],
false
],
[
43,
"",
"",
[],
43,
" self.repository.save()",
[],
false
],
[
44,
"",
"",
[],
44,
"",
[],
false
],
[
45,
"",
"",
[],
45,
" self.client.login(username="grumpy", password="grumpy")",
[],
false
],
[
46,
"",
"",
[],
46,
" self.user = User.objects.get(username="grumpy")",
[],
false
],
[
47,
"",
"",
[],
47,
"",
[],
false
],
[
48,
"",
"",
[],
48,
" self.base_url = 'http://testserver'",
[],
false
],
[
49,
"",
"",
[],
49,
"",
[],
false
],
[
50,
"",
"",
[],
50,
" def tearDown(self):",
[],
false
],
[
51,
"",
"",
[],
51,
" self.client.logout()",
[],
false
],
[
52,
"",
"",
[],
52,
"",
[],
false
],
[
53,
"",
"",
[],
53,
" def api_func_wrapper(self, api_func, path, query, expected_status,",
[],
false
],
[
54,
"",
"",
[],
54,
" follow_redirects, expected_redirects):",
[],
false
],
[
55,
"",
"",
[],
55,
" response = api_func(path, query, follow=follow_redirects)",
[],
false
],
[
56,
"",
"",
[],
56,
" self.assertEqual(response.status_code, expected_status)",
[],
false
],
[
57,
"",
"",
[],
57,
"",
[],
false
],
[
58,
"",
"",
[],
58,
" if expected_redirects:",
[],
false
],
[
59,
"",
"",
[],
59,
" self.assertEqual(len(response.redirect_chain),",
[],
false
],
[
60,
"",
"",
[],
60,
" len(expected_redirects))",
[],
false
],
[
61,
"",
"",
[],
61,
"",
[],
false
],
[
62,
"",
"",
[],
62,
" for redirect in expected_redirects:",
[],
false
],
[
63,
"",
"",
[],
63,
" self.assertEqual(response.redirect_chain[0][0],",
[],
false
],
[
64,
"",
"",
[],
64,
" self.base_url + expected_redirects[0])",
[],
false
],
[
65,
"",
"",
[],
65,
"",
[],
false
],
[
66,
"",
"",
[],
66,
" return response",
[],
false
],
[
67,
"",
"",
[],
67,
"",
[],
false
],
[
68,
"",
"",
[],
68,
" def apiGet(self, path, query={}, follow_redirects=False,",
[],
false
],
[
69,
"",
"",
[],
69,
" expected_status=200, expected_redirects=[]):",
[],
false
],
[
70,
"",
"",
[],
70,
" path = self._normalize_path(path)",
[],
false
],
[
71,
"",
"",
[],
71,
"",
[],
false
],
[
72,
"",
"",
[],
72,
" print 'GETing %s' % path",
[],
false
],
[
73,
"",
"",
[],
73,
" print "Query data: %s" % query",
[],
false
],
[
74,
"",
"",
[],
74,
"",
[],
false
],
[
75,
"",
"",
[],
75,
" response = self.api_func_wrapper(self.client.get, path, query,",
[],
false
],
[
76,
"",
"",
[],
76,
" expected_status, follow_redirects,",
[],
false
],
[
77,
"",
"",
[],
77,
" expected_redirects)",
[],
false
],
[
78,
"",
"",
[],
78,
"",
[],
false
],
[
79,
"",
"",
[],
79,
" print "Raw response: %s" % response.content",
[],
false
],
[
80,
"",
"",
[],
80,
"",
[],
false
],
[
81,
"",
"",
[],
81,
" rsp = simplejson.loads(response.content)",
[],
false
],
[
82,
"",
"",
[],
82,
" print "Response: %s" % rsp",
[],
false
],
[
83,
"",
"",
[],
83,
"",
[],
false
],
[
84,
"",
"",
[],
84,
" return rsp",
[],
false
],
[
85,
"",
"",
[],
85,
"",
[],
false
],
[
86,
"",
"",
[],
86,
" def api_post_with_response(self, path, query={}, expected_status=201):",
[],
false
],
[
87,
"",
"",
[],
87,
" path = self._normalize_path(path)",
[],
false
],
[
88,
"",
"",
[],
88,
"",
[],
false
],
[
89,
"",
"",
[],
89,
" print 'POSTing to %s' % path",
[],
false
],
[
90,
"",
"",
[],
90,
" print "Post data: %s" % query",
[],
false
],
[
91,
"",
"",
[],
91,
" response = self.client.post(path, query)",
[],
false
],
[
92,
"",
"",
[],
92,
" print "Raw response: %s" % response.content",
[],
false
],
[
93,
"",
"",
[],
93,
" self.assertEqual(response.status_code, expected_status)",
[],
false
],
[
94,
"",
"",
[],
94,
"",
[],
false
],
[
95,
"",
"",
[],
95,
" return self._get_result(response, expected_status), response",
[],
false
],
[
96,
"",
"",
[],
96,
"",
[],
false
],
[
97,
"",
"",
[],
97,
" def apiPost(self, *args, **kwargs):",
[],
false
],
[
98,
"",
"",
[],
98,
" rsp, result = self.api_post_with_response(*args, **kwargs)",
[],
false
],
[
99,
"",
"",
[],
99,
"",
[],
false
],
[
100,
"",
"",
[],
100,
" return rsp",
[],
false
],
[
101,
"",
"",
[],
101,
"",
[],
false
],
[
102,
"",
"",
[],
102,
" def apiPut(self, path, query={}, expected_status=200,",
[],
false
],
[
103,
"",
"",
[],
103,
" follow_redirects=False, expected_redirects=[]):",
[],
false
],
[
104,
"",
"",
[],
104,
" path = self._normalize_path(path)",
[],
false
],
[
105,
"",
"",
[],
105,
"",
[],
false
],
[
106,
"",
"",
[],
106,
" print 'PUTing to %s' % path",
[],
false
],
[
107,
"",
"",
[],
107,
" print "Post data: %s" % query",
[],
false
],
[
108,
"",
"",
[],
108,
" response = self.api_func_wrapper(self.client.put, path, query,",
[],
false
],
[
109,
"",
"",
[],
109,
" expected_status, follow_redirects,",
[],
false
],
[
110,
"",
"",
[],
110,
" expected_redirects)",
[],
false
],
[
111,
"",
"",
[],
111,
" print "Raw response: %s" % response.content",
[],
false
],
[
112,
"",
"",
[],
112,
" self.assertEqual(response.status_code, expected_status)",
[],
false
],
[
113,
"",
"",
[],
113,
"",
[],
false
],
[
114,
"",
"",
[],
114,
" return self._get_result(response, expected_status)",
[],
false
],
[
115,
"",
"",
[],
115,
"",
[],
false
],
[
116,
"",
"",
[],
116,
" def apiDelete(self, path, expected_status=204):",
[],
false
],
[
117,
"",
"",
[],
117,
" path = self._normalize_path(path)",
[],
false
],
[
118,
"",
"",
[],
118,
"",
[],
false
],
[
119,
"",
"",
[],
119,
" print 'DELETEing %s' % path",
[],
false
],
[
120,
"",
"",
[],
120,
" response = self.client.delete(path)",
[],
false
],
[
121,
"",
"",
[],
121,
" print "Raw response: %s" % response.content",
[],
false
],
[
122,
"",
"",
[],
122,
" self.assertEqual(response.status_code, expected_status)",
[],
false
],
[
123,
"",
"",
[],
123,
"",
[],
false
],
[
124,
"",
"",
[],
124,
" return self._get_result(response, expected_status)",
[],
false
],
[
125,
"",
"",
[],
125,
"",
[],
false
],
[
126,
"",
"",
[],
126,
" def _normalize_path(self, path):",
[],
false
],
[
127,
"",
"",
[],
127,
" if path.startswith(self.base_url):",
[],
false
],
[
128,
"",
"",
[],
128,
" return path[len(self.base_url):]",
[],
false
],
[
129,
"",
"",
[],
129,
" else:",
[],
false
],
[
130,
"",
"",
[],
130,
" return path",
[],
false
],
[
131,
"",
"",
[],
131,
"",
[],
false
],
[
132,
"",
"",
[],
132,
" def _get_result(self, response, expected_status):",
[],
false
],
[
133,
"",
"",
[],
133,
" if expected_status == 204:",
[],
false
],
[
134,
"",
"",
[],
134,
" self.assertEqual(response.content, '')",
[],
false
],
[
135,
"",
"",
[],
135,
" rsp = None",
[],
false
],
[
136,
"",
"",
[],
136,
" else:",
[],
false
],
[
137,
"",
"",
[],
137,
" rsp = simplejson.loads(response.content)",
[],
false
],
[
138,
"",
"",
[],
138,
" print "Response: %s" % rsp",
[],
false
],
[
139,
"",
"",
[],
139,
"",
[],
false
],
[
140,
"",
"",
[],
140,
" return rsp",
[],
false
],
[
141,
"",
"",
[],
141,
"",
[],
false
],
[
142,
"",
"",
[],
142,
" #",
[],
false
],
[
143,
"",
"",
[],
143,
" # Some utility functions shared across test suites.",
[],
false
],
[
144,
"",
"",
[],
144,
" #",
[],
false
],
[
145,
"",
"",
[],
145,
" def _postNewReviewRequest(self, local_site_name=None,",
[],
false
],
[
146,
"",
"",
[],
146,
" repository=None):",
[],
false
],
[
147,
"",
"",
[],
147,
" """Creates a review request and returns the payload response."""",
[],
false
],
[
148,
"",
"",
[],
148,
" if not repository:",
[],
false
],
[
149,
"",
"",
[],
149,
" repository = self.repository",
[],
false
],
[
150,
"",
"",
[],
150,
" rsp = self.apiPost(",
[],
false
],
[
151,
"",
"",
[],
151,
" ReviewRequestResourceTests.get_list_url(local_site_name),",
[],
false
],
[
152,
"",
"",
[],
152,
" { 'repository': repository.path, })",
[],
false
],
[
153,
"",
"",
[],
153,
"",
[],
false
],
[
154,
"",
"",
[],
154,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
155,
"",
"",
[],
155,
" self.assertEqual(",
[],
false
],
[
156,
"",
"",
[],
156,
" rsp['review_request']['links']['repository']['href'],",
[],
false
],
[
157,
"",
"",
[],
157,
" self.base_url +",
[],
false
],
[
158,
"",
"",
[],
158,
" RepositoryResourceTests.get_item_url(repository.id,",
[],
false
],
[
159,
"",
"",
[],
159,
" local_site_name))",
[],
false
],
[
160,
"",
"",
[],
160,
"",
[],
false
],
[
161,
"",
"",
[],
161,
" return rsp",
[],
false
],
[
162,
"",
"",
[],
162,
"",
[],
false
],
[
163,
"",
"",
[],
163,
" def _postNewReview(self, review_request, body_top="",",
[],
false
],
[
164,
"",
"",
[],
164,
" body_bottom=""):",
[],
false
],
[
165,
"",
"",
[],
165,
" """Creates a review and returns the payload response."""",
[],
false
],
[
166,
"",
"",
[],
166,
" if review_request.local_site:",
[],
false
],
[
167,
"",
"",
[],
167,
" local_site_name = review_request.local_site.name",
[],
false
],
[
168,
"",
"",
[],
168,
" else:",
[],
false
],
[
169,
"",
"",
[],
169,
" local_site_name = None",
[],
false
],
[
170,
"",
"",
[],
170,
"",
[],
false
],
[
171,
"",
"",
[],
171,
" post_data = {",
[],
false
],
[
172,
"",
"",
[],
172,
" 'body_top': body_top,",
[],
false
],
[
173,
"",
"",
[],
173,
" 'body_bottom': body_bottom,",
[],
false
],
[
174,
"",
"",
[],
174,
" }",
[],
false
],
[
175,
"",
"",
[],
175,
"",
[],
false
],
[
176,
"",
"",
[],
176,
" rsp = self.apiPost(ReviewResourceTests.get_list_url(review_request,",
[],
false
],
[
177,
"",
"",
[],
177,
" local_site_name),",
[],
false
],
[
178,
"",
"",
[],
178,
" post_data)",
[],
false
],
[
179,
"",
"",
[],
179,
"",
[],
false
],
[
180,
"",
"",
[],
180,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
181,
"",
"",
[],
181,
" self.assertEqual(rsp['review']['body_top'], body_top)",
[],
false
],
[
182,
"",
"",
[],
182,
" self.assertEqual(rsp['review']['body_bottom'], body_bottom)",
[],
false
],
[
183,
"",
"",
[],
183,
"",
[],
false
],
[
184,
"",
"",
[],
184,
" return rsp",
[],
false
],
[
185,
"",
"",
[],
185,
"",
[],
false
],
[
186,
"",
"",
[],
186,
" def _postNewDiffComment(self, review_request, review_id, comment_text,",
[],
false
],
[
187,
"",
"",
[],
187,
" filediff_id=None, interfilediff_id=None,",
[],
false
],
[
188,
"",
"",
[],
188,
" first_line=10, num_lines=5):",
[],
false
],
[
189,
"",
"",
[],
189,
" """Creates a diff comment and returns the payload response."""",
[],
false
],
[
190,
"",
"",
[],
190,
" if filediff_id is None:",
[],
false
],
[
191,
"",
"",
[],
191,
" diffset = review_request.diffset_history.diffsets.latest()",
[],
false
],
[
192,
"",
"",
[],
192,
" filediff = diffset.files.all()[0]",
[],
false
],
[
193,
"",
"",
[],
193,
" filediff_id = filediff.id",
[],
false
],
[
194,
"",
"",
[],
194,
"",
[],
false
],
[
195,
"",
"",
[],
195,
" data = {",
[],
false
],
[
196,
"",
"",
[],
196,
" 'filediff_id': filediff_id,",
[],
false
],
[
197,
"",
"",
[],
197,
" 'text': comment_text,",
[],
false
],
[
198,
"",
"",
[],
198,
" 'first_line': first_line,",
[],
false
],
[
199,
"",
"",
[],
199,
" 'num_lines': num_lines,",
[],
false
],
[
200,
"",
"",
[],
200,
" }",
[],
false
],
[
201,
"",
"",
[],
201,
"",
[],
false
],
[
202,
"",
"",
[],
202,
" if interfilediff_id is not None:",
[],
false
],
[
203,
"",
"",
[],
203,
" data['interfilediff_id'] = interfilediff_id",
[],
false
],
[
204,
"",
"",
[],
204,
"",
[],
false
],
[
205,
"",
"",
[],
205,
" if review_request.local_site:",
[],
false
],
[
206,
"",
"",
[],
206,
" local_site_name = review_request.local_site.name",
[],
false
],
[
207,
"",
"",
[],
207,
" else:",
[],
false
],
[
208,
"",
"",
[],
208,
" local_site_name = None",
[],
false
],
[
209,
"",
"",
[],
209,
"",
[],
false
],
[
210,
"",
"",
[],
210,
" review = Review.objects.get(pk=review_id)",
[],
false
],
[
211,
"",
"",
[],
211,
"",
[],
false
],
[
212,
"",
"",
[],
212,
" rsp = self.apiPost(",
[],
false
],
[
213,
"",
"",
[],
213,
" ReviewCommentResourceTests.get_list_url(review, local_site_name),",
[],
false
],
[
214,
"",
"",
[],
214,
" data)",
[],
false
],
[
215,
"",
"",
[],
215,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
216,
"",
"",
[],
216,
"",
[],
false
],
[
217,
"",
"",
[],
217,
" return rsp",
[],
false
],
[
218,
"",
"",
[],
218,
"",
[],
false
],
[
219,
"",
"",
[],
219,
" def _postNewScreenshotComment(self, review_request, review_id, screenshot,",
[],
false
],
[
220,
"",
"",
[],
220,
" comment_text, x, y, w, h):",
[],
false
],
[
221,
"",
"",
[],
221,
" """Creates a screenshot comment and returns the payload response."""",
[],
false
],
[
222,
"",
"",
[],
222,
" if review_request.local_site:",
[],
false
],
[
223,
"",
"",
[],
223,
" local_site_name = review_request.local_site.name",
[],
false
],
[
224,
"",
"",
[],
224,
" else:",
[],
false
],
[
225,
"",
"",
[],
225,
" local_site_name = None",
[],
false
],
[
226,
"",
"",
[],
226,
"",
[],
false
],
[
227,
"",
"",
[],
227,
" post_data = {",
[],
false
],
[
228,
"",
"",
[],
228,
" 'screenshot_id': screenshot.id,",
[],
false
],
[
229,
"",
"",
[],
229,
" 'text': comment_text,",
[],
false
],
[
230,
"",
"",
[],
230,
" 'x': x,",
[],
false
],
[
231,
"",
"",
[],
231,
" 'y': y,",
[],
false
],
[
232,
"",
"",
[],
232,
" 'w': w,",
[],
false
],
[
233,
"",
"",
[],
233,
" 'h': h,",
[],
false
],
[
234,
"",
"",
[],
234,
" }",
[],
false
],
[
235,
"",
"",
[],
235,
"",
[],
false
],
[
236,
"",
"",
[],
236,
" review = Review.objects.get(pk=review_id)",
[],
false
],
[
237,
"",
"",
[],
237,
" rsp = self.apiPost(",
[],
false
],
[
238,
"",
"",
[],
238,
" DraftReviewScreenshotCommentResourceTests.get_list_url(",
[],
false
],
[
239,
"",
"",
[],
239,
" review, local_site_name),",
[],
false
],
[
240,
"",
"",
[],
240,
" post_data)",
[],
false
],
[
241,
"",
"",
[],
241,
"",
[],
false
],
[
242,
"",
"",
[],
242,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
243,
"",
"",
[],
243,
"",
[],
false
],
[
244,
"",
"",
[],
244,
" return rsp",
[],
false
],
[
245,
"",
"",
[],
245,
"",
[],
false
],
[
246,
"",
"",
[],
246,
" def _postNewScreenshot(self, review_request):",
[],
false
],
[
247,
"",
"",
[],
247,
" """Creates a screenshot and returns the payload response."""",
[],
false
],
[
248,
"",
"",
[],
248,
" if review_request.local_site:",
[],
false
],
[
249,
"",
"",
[],
249,
" local_site_name = review_request.local_site.name",
[],
false
],
[
250,
"",
"",
[],
250,
" else:",
[],
false
],
[
251,
"",
"",
[],
251,
" local_site_name = None",
[],
false
],
[
252,
"",
"",
[],
252,
"",
[],
false
],
[
253,
"",
"",
[],
253,
" f = open(self._getTrophyFilename(), "r")",
[],
false
],
[
254,
"",
"",
[],
254,
" self.assert_(f)",
[],
false
],
[
255,
"",
"",
[],
255,
"",
[],
false
],
[
256,
"",
"",
[],
256,
" post_data = {",
[],
false
],
[
257,
"",
"",
[],
257,
" 'path': f,",
[],
false
],
[
258,
"",
"",
[],
258,
" }",
[],
false
],
[
259,
"",
"",
[],
259,
"",
[],
false
],
[
260,
"",
"",
[],
260,
" rsp = self.apiPost(",
[],
false
],
[
261,
"",
"",
[],
261,
" ScreenshotResourceTests.get_list_url(review_request,",
[],
false
],
[
262,
"",
"",
[],
262,
" local_site_name),",
[],
false
],
[
263,
"",
"",
[],
263,
" post_data)",
[],
false
],
[
264,
"",
"",
[],
264,
" f.close()",
[],
false
],
[
265,
"",
"",
[],
265,
"",
[],
false
],
[
266,
"",
"",
[],
266,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
267,
"",
"",
[],
267,
"",
[],
false
],
[
268,
"",
"",
[],
268,
" return rsp",
[],
false
],
[
269,
"",
"",
[],
269,
"",
[],
false
],
[
270,
"",
"",
[],
270,
" def _postNewDiff(self, review_request):",
[],
false
],
[
271,
"",
"",
[],
271,
" """Creates a diff and returns the payload response."""",
[],
false
],
[
272,
"",
"",
[],
272,
" diff_filename = os.path.join(",
[],
false
],
[
273,
"",
"",
[],
273,
" os.path.dirname(os.path.dirname(__file__)),",
[],
false
],
[
274,
"",
"",
[],
274,
" "scmtools", "testdata", "svn_makefile.diff")",
[],
false
],
[
275,
"",
"",
[],
275,
"",
[],
false
],
[
276,
"",
"",
[],
276,
" f = open(diff_filename, "r")",
[],
false
],
[
277,
"",
"",
[],
277,
" rsp = self.apiPost(DiffResourceTests.get_list_url(review_request), {",
[],
false
],
[
278,
"",
"",
[],
278,
" 'path': f,",
[],
false
],
[
279,
"",
"",
[],
279,
" 'basedir': "/trunk",",
[],
false
],
[
280,
"",
"",
[],
280,
" })",
[],
false
],
[
281,
"",
"",
[],
281,
" f.close()",
[],
false
],
[
282,
"",
"",
[],
282,
"",
[],
false
],
[
283,
"",
"",
[],
283,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
284,
"",
"",
[],
284,
"",
[],
false
],
[
285,
"",
"",
[],
285,
" return rsp",
[],
false
],
[
286,
"",
"",
[],
286,
"",
[],
false
],
[
287,
"",
"",
[],
287,
" def _getTrophyFilename(self):",
[],
false
],
[
288,
"",
"",
[],
288,
" return os.path.join(settings.HTDOCS_ROOT,",
[],
false
],
[
289,
"",
"",
[],
289,
" "media", "rb", "images", "trophy.png")",
[],
false
],
[
290,
"",
"",
[],
290,
"",
[],
false
],
[
291,
"",
"",
[],
291,
"",
[],
false
],
[
292,
"",
"",
[],
292,
"class ServerInfoResourceTests(BaseWebAPITestCase):",
[],
false
],
[
293,
"",
"",
[],
293,
" """Testing the ServerInfoResource APIs."""",
[],
false
],
[
294,
"",
"",
[],
294,
" def test_get_server_info(self):",
[],
false
],
[
295,
"",
"",
[],
295,
" """Testing the GET info/ API"""",
[],
false
],
[
296,
"",
"",
[],
296,
" rsp = self.apiGet(self.get_url())",
[],
false
],
[
297,
"",
"",
[],
297,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
298,
"",
"",
[],
298,
" self.assertTrue('info' in rsp)",
[],
false
],
[
299,
"",
"",
[],
299,
" self.assertTrue('product' in rsp['info'])",
[],
false
],
[
300,
"",
"",
[],
300,
" self.assertTrue('site' in rsp['info'])",
[],
false
],
[
301,
"",
"",
[],
301,
"",
[],
false
],
[
302,
"",
"",
[],
302,
" def test_get_server_info_with_site(self):",
[],
false
],
[
303,
"",
"",
[],
303,
" """Testing the GET info/ API with a local site"""",
[],
false
],
[
304,
"",
"",
[],
304,
" self.client.logout()",
[],
false
],
[
305,
"",
"",
[],
305,
" self.client.login(username="doc", password="doc")",
[],
false
],
[
306,
"",
"",
[],
306,
"",
[],
false
],
[
307,
"",
"",
[],
307,
" rsp = self.apiGet(self.get_url(self.local_site_name))",
[],
false
],
[
308,
"",
"",
[],
308,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
309,
"",
"",
[],
309,
" self.assertTrue('info' in rsp)",
[],
false
],
[
310,
"",
"",
[],
310,
" self.assertTrue('product' in rsp['info'])",
[],
false
],
[
311,
"",
"",
[],
311,
" self.assertTrue('site' in rsp['info'])",
[],
false
],
[
312,
"",
"",
[],
312,
"",
[],
false
],
[
313,
"",
"",
[],
313,
" def test_get_server_info_with_site_no_access(self):",
[],
false
],
[
314,
"",
"",
[],
314,
" """Testing the GET info/ API with a local site and Permission Denied error"""",
[],
false
],
[
315,
"",
"",
[],
315,
" self.apiGet(self.get_url(self.local_site_name),",
[],
false
],
[
316,
"",
"",
[],
316,
" expected_status=403)",
[],
false
],
[
317,
"",
"",
[],
317,
"",
[],
false
],
[
318,
"",
"",
[],
318,
" def get_url(self, local_site_name=None):",
[],
false
],
[
319,
"",
"",
[],
319,
" return local_site_reverse('info-resource',",
[],
false
],
[
320,
"",
"",
[],
320,
" local_site_name=local_site_name)",
[],
false
],
[
321,
"",
"",
[],
321,
"",
[],
false
],
[
322,
"",
"",
[],
322,
"",
[],
false
],
[
323,
"",
"",
[],
323,
"class SessionResourceTests(BaseWebAPITestCase):",
[],
false
],
[
324,
"",
"",
[],
324,
" """Testing the SessionResource APIs."""",
[],
false
],
[
325,
"",
"",
[],
325,
" def test_get_session_with_logged_in_user(self):",
[],
false
],
[
326,
"",
"",
[],
326,
" """Testing the GET session/ API with logged in user"""",
[],
false
],
[
327,
"",
"",
[],
327,
" rsp = self.apiGet(self.get_url())",
[],
false
],
[
328,
"",
"",
[],
328,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
329,
"",
"",
[],
329,
" self.assertTrue('session' in rsp)",
[],
false
],
[
330,
"",
"",
[],
330,
" self.assertTrue(rsp['session']['authenticated'])",
[],
false
],
[
331,
"",
"",
[],
331,
" self.assertEqual(rsp['session']['links']['user']['title'],",
[],
false
],
[
332,
"",
"",
[],
332,
" self.user.username)",
[],
false
],
[
333,
"",
"",
[],
333,
"",
[],
false
],
[
334,
"",
"",
[],
334,
" def test_get_session_with_anonymous_user(self):",
[],
false
],
[
335,
"",
"",
[],
335,
" """Testing the GET session/ API with anonymous user"""",
[],
false
],
[
336,
"",
"",
[],
336,
" self.client.logout()",
[],
false
],
[
337,
"",
"",
[],
337,
"",
[],
false
],
[
338,
"",
"",
[],
338,
" rsp = self.apiGet(self.get_url())",
[],
false
],
[
339,
"",
"",
[],
339,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
340,
"",
"",
[],
340,
" self.assertTrue('session' in rsp)",
[],
false
],
[
341,
"",
"",
[],
341,
" self.assertFalse(rsp['session']['authenticated'])",
[],
false
],
[
342,
"",
"",
[],
342,
"",
[],
false
],
[
343,
"",
"",
[],
343,
" def test_get_session_with_site(self):",
[],
false
],
[
344,
"",
"",
[],
344,
" """Testing the GET session/ API with a local site"""",
[],
false
],
[
345,
"",
"",
[],
345,
" self.client.logout()",
[],
false
],
[
346,
"",
"",
[],
346,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
347,
"",
"",
[],
347,
"",
[],
false
],
[
348,
"",
"",
[],
348,
" rsp = self.apiGet(self.get_url(self.local_site_name))",
[],
false
],
[
349,
"",
"",
[],
349,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
350,
"",
"",
[],
350,
" self.assertTrue('session' in rsp)",
[],
false
],
[
351,
"",
"",
[],
351,
" self.assertTrue(rsp['session']['authenticated'])",
[],
false
],
[
352,
"",
"",
[],
352,
" self.assertEqual(rsp['session']['links']['user']['title'], 'doc')",
[],
false
],
[
353,
"",
"",
[],
353,
"",
[],
false
],
[
354,
"",
"",
[],
354,
" def test_get_session_with_site_no_access(self):",
[],
false
],
[
355,
"",
"",
[],
355,
" """Testing the GET session/ API with a local site and Permission Denied error"""",
[],
false
],
[
356,
"",
"",
[],
356,
" self.apiGet(self.get_url(self.local_site_name),",
[],
false
],
[
357,
"",
"",
[],
357,
" expected_status=403)",
[],
false
],
[
358,
"",
"",
[],
358,
"",
[],
false
],
[
359,
"",
"",
[],
359,
" def get_url(self, local_site_name=None):",
[],
false
],
[
360,
"",
"",
[],
360,
" return local_site_reverse('session-resource',",
[],
false
],
[
361,
"",
"",
[],
361,
" local_site_name=local_site_name)",
[],
false
],
[
362,
"",
"",
[],
362,
"",
[],
false
],
[
363,
"",
"",
[],
363,
"",
[],
false
],
[
364,
"",
"",
[],
364,
"class RepositoryResourceTests(BaseWebAPITestCase):",
[],
false
],
[
365,
"",
"",
[],
365,
" """Testing the RepositoryResource APIs."""",
[],
false
],
[
366,
"",
"",
[],
366,
"",
[],
false
],
[
367,
"",
"",
[],
367,
" def test_get_repositories(self):",
[],
false
],
[
368,
"",
"",
[],
368,
" """Testing the GET repositories/ API"""",
[],
false
],
[
369,
"",
"",
[],
369,
" rsp = self.apiGet(self.get_list_url())",
[],
false
],
[
370,
"",
"",
[],
370,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
371,
"",
"",
[],
371,
" self.assertEqual(len(rsp['repositories']),",
[],
false
],
[
372,
"",
"",
[],
372,
" Repository.objects.accessible(self.user).count())",
[],
false
],
[
373,
"",
"",
[],
373,
"",
[],
false
],
[
374,
"",
"",
[],
374,
" def test_get_repositories_with_site(self):",
[],
false
],
[
375,
"",
"",
[],
375,
" """Testing the GET repositories/ API with a local site"""",
[],
false
],
[
376,
"",
"",
[],
376,
" self.client.logout()",
[],
false
],
[
377,
"",
"",
[],
377,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
378,
"",
"",
[],
378,
"",
[],
false
],
[
379,
"",
"",
[],
379,
" rsp = self.apiGet(self.get_list_url(self.local_site_name))",
[],
false
],
[
380,
"",
"",
[],
380,
" self.assertEqual(len(rsp['repositories']),",
[],
false
],
[
381,
"",
"",
[],
381,
" Repository.objects.filter(",
[],
false
],
[
382,
"",
"",
[],
382,
" local_site__name=self.local_site_name).count())",
[],
false
],
[
383,
"",
"",
[],
383,
"",
[],
false
],
[
384,
"",
"",
[],
384,
" def test_get_repositories_with_site_no_access(self):",
[],
false
],
[
385,
"",
"",
[],
385,
" """Testing the GET repositories/ API with a local site and Permission Denied error"""",
[],
false
],
[
386,
"",
"",
[],
386,
" self.apiGet(self.get_list_url(self.local_site_name),",
[],
false
],
[
387,
"",
"",
[],
387,
" expected_status=403)",
[],
false
],
[
388,
"",
"",
[],
388,
"",
[],
false
],
[
389,
"",
"",
[],
389,
" def get_list_url(self, local_site_name=None):",
[],
false
],
[
390,
"",
"",
[],
390,
" return local_site_reverse('repositories-resource',",
[],
false
],
[
391,
"",
"",
[],
391,
" local_site_name=local_site_name)",
[],
false
],
[
392,
"",
"",
[],
392,
"",
[],
false
],
[
393,
"",
"",
[],
393,
" @classmethod",
[],
false
],
[
394,
"",
"",
[],
394,
" def get_item_url(cls, repository_id, local_site_name=None):",
[],
false
],
[
395,
"",
"",
[],
395,
" return local_site_reverse('repository-resource',",
[],
false
],
[
396,
"",
"",
[],
396,
" local_site_name=local_site_name,",
[],
false
],
[
397,
"",
"",
[],
397,
" kwargs={",
[],
false
],
[
398,
"",
"",
[],
398,
" 'repository_id': repository_id,",
[],
false
],
[
399,
"",
"",
[],
399,
" })",
[],
false
],
[
400,
"",
"",
[],
400,
"",
[],
false
],
[
401,
"",
"",
[],
401,
"",
[],
false
],
[
402,
"",
"",
[],
402,
"class RepositoryInfoResourceTests(BaseWebAPITestCase):",
[],
false
],
[
403,
"",
"",
[],
403,
" """Testing the RepositoryInfoResource APIs."""",
[],
false
],
[
404,
"",
"",
[],
404,
" def test_get_repository_info(self):",
[],
false
],
[
405,
"",
"",
[],
405,
" """Testing the GET repositories/<id>/info API"""",
[],
false
],
[
406,
"",
"",
[],
406,
" rsp = self.apiGet(self.get_url(self.repository))",
[],
false
],
[
407,
"",
"",
[],
407,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
408,
"",
"",
[],
408,
" self.assertEqual(rsp['info'],",
[],
false
],
[
409,
"",
"",
[],
409,
" self.repository.get_scmtool().get_repository_info())",
[],
false
],
[
410,
"",
"",
[],
410,
"",
[],
false
],
[
411,
"",
"",
[],
411,
" def test_get_repository_info_with_site(self):",
[],
false
],
[
412,
"",
"",
[],
412,
" """Testing the GET repositories/<id>/info API with a local site"""",
[],
false
],
[
413,
"",
"",
[],
413,
" self.client.logout()",
[],
false
],
[
414,
"",
"",
[],
414,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
415,
"",
"",
[],
415,
"",
[],
false
],
[
416,
"",
"",
[],
416,
" repository = Repository.objects.get(name='V8 SVN')",
[],
false
],
[
417,
"",
"",
[],
417,
" rsp = self.apiGet(self.get_url(repository, self.local_site_name))",
[],
false
],
[
418,
"",
"",
[],
418,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
419,
"",
"",
[],
419,
" self.assertEqual(rsp['info'],",
[],
false
],
[
420,
"",
"",
[],
420,
" repository.get_scmtool().get_repository_info())",
[],
false
],
[
421,
"",
"",
[],
421,
"",
[],
false
],
[
422,
"",
"",
[],
422,
" def test_get_repository_info_with_site_no_access(self):",
[],
false
],
[
423,
"",
"",
[],
423,
" """Testing the GET repositories/<id>/info API with a local site and Permission Denied error"""",
[],
false
],
[
424,
"",
"",
[],
424,
" repository = Repository.objects.get(name='V8 SVN')",
[],
false
],
[
425,
"",
"",
[],
425,
"",
[],
false
],
[
426,
"",
"",
[],
426,
" self.apiGet(self.get_url(self.repository, self.local_site_name),",
[],
false
],
[
427,
"",
"",
[],
427,
" expected_status=403)",
[],
false
],
[
428,
"",
"",
[],
428,
"",
[],
false
],
[
429,
"",
"",
[],
429,
" def get_url(self, repository, local_site_name=None):",
[],
false
],
[
430,
"",
"",
[],
430,
" return local_site_reverse('info-resource',",
[],
false
],
[
431,
"",
"",
[],
431,
" local_site_name=local_site_name,",
[],
false
],
[
432,
"",
"",
[],
432,
" kwargs={",
[],
false
],
[
433,
"",
"",
[],
433,
" 'repository_id': repository.pk,",
[],
false
],
[
434,
"",
"",
[],
434,
" })",
[],
false
],
[
435,
"",
"",
[],
435,
"",
[],
false
],
[
436,
"",
"",
[],
436,
"",
[],
false
],
[
437,
"",
"",
[],
437,
"class ReviewGroupResourceTests(BaseWebAPITestCase):",
[],
false
],
[
438,
"",
"",
[],
438,
" """Testing the ReviewGroupResource APIs."""",
[],
false
],
[
439,
"",
"",
[],
439,
"",
[],
false
],
[
440,
"",
"",
[],
440,
" def test_get_groups(self):",
[],
false
],
[
441,
"",
"",
[],
441,
" """Testing the GET groups/ API"""",
[],
false
],
[
442,
"",
"",
[],
442,
" rsp = self.apiGet(self.get_list_url())",
[],
false
],
[
443,
"",
"",
[],
443,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
444,
"",
"",
[],
444,
" self.assertEqual(len(rsp['groups']),",
[],
false
],
[
445,
"",
"",
[],
445,
" Group.objects.accessible(self.user).count())",
[],
false
],
[
446,
"",
"",
[],
446,
" self.assertEqual(len(rsp['groups']), 4)",
[],
false
],
[
447,
"",
"",
[],
447,
"",
[],
false
],
[
448,
"",
"",
[],
448,
" def test_get_groups_with_site(self):",
[],
false
],
[
449,
"",
"",
[],
449,
" """Testing the GET groups/ API with a local site"""",
[],
false
],
[
450,
"",
"",
[],
450,
" self.client.logout()",
[],
false
],
[
451,
"",
"",
[],
451,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
452,
"",
"",
[],
452,
"",
[],
false
],
[
453,
"",
"",
[],
453,
" local_site = LocalSite.objects.get(name=self.local_site_name)",
[],
false
],
[
454,
"",
"",
[],
454,
" groups = Group.objects.accessible(self.user, local_site=local_site)",
[],
false
],
[
455,
"",
"",
[],
455,
"",
[],
false
],
[
456,
"",
"",
[],
456,
" rsp = self.apiGet(self.get_list_url(self.local_site_name))",
[],
false
],
[
457,
"",
"",
[],
457,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
458,
"",
"",
[],
458,
" self.assertEqual(len(rsp['groups']), groups.count())",
[],
false
],
[
459,
"",
"",
[],
459,
" self.assertEqual(len(rsp['groups']), 1)",
[],
false
],
[
460,
"",
"",
[],
460,
"",
[],
false
],
[
461,
"",
"",
[],
461,
" def test_get_groups_with_site_no_access(self):",
[],
false
],
[
462,
"",
"",
[],
462,
" """Testing the GET groups/ API with a local site and Permission Denied error"""",
[],
false
],
[
463,
"",
"",
[],
463,
" self.apiGet(self.get_list_url(self.local_site_name),",
[],
false
],
[
464,
"",
"",
[],
464,
" expected_status=403)",
[],
false
],
[
465,
"",
"",
[],
465,
"",
[],
false
],
[
466,
"",
"",
[],
466,
" def test_get_groups_with_q(self):",
[],
false
],
[
467,
"",
"",
[],
467,
" """Testing the GET groups/?q= API"""",
[],
false
],
[
468,
"",
"",
[],
468,
" rsp = self.apiGet(self.get_list_url(), {'q': 'dev'})",
[],
false
],
[
469,
"",
"",
[],
469,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
470,
"",
"",
[],
470,
" self.assertEqual(len(rsp['groups']), 1) #devgroup",
[],
false
],
[
471,
"",
"",
[],
471,
"",
[],
false
],
[
472,
"",
"",
[],
472,
" def test_get_group_public(self):",
[],
false
],
[
473,
"",
"",
[],
473,
" """Testing the GET groups/<id>/ API"""",
[],
false
],
[
474,
"",
"",
[],
474,
" group = Group.objects.create(name='test-group')",
[],
false
],
[
475,
"",
"",
[],
475,
"",
[],
false
],
[
476,
"",
"",
[],
476,
" rsp = self.apiGet(self.get_item_url(group.name))",
[],
false
],
[
477,
"",
"",
[],
477,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
478,
"",
"",
[],
478,
" self.assertEqual(rsp['group']['name'], group.name)",
[],
false
],
[
479,
"",
"",
[],
479,
" self.assertEqual(rsp['group']['display_name'], group.display_name)",
[],
false
],
[
480,
"",
"",
[],
480,
" self.assertEqual(rsp['group']['invite_only'], False)",
[],
false
],
[
481,
"",
"",
[],
481,
"",
[],
false
],
[
482,
"",
"",
[],
482,
" def test_get_group_invite_only(self):",
[],
false
],
[
483,
"",
"",
[],
483,
" """Testing the GET groups/<id>/ API with invite-only"""",
[],
false
],
[
484,
"",
"",
[],
484,
" group = Group.objects.create(name='test-group', invite_only=True)",
[],
false
],
[
485,
"",
"",
[],
485,
" group.users.add(self.user)",
[],
false
],
[
486,
"",
"",
[],
486,
"",
[],
false
],
[
487,
"",
"",
[],
487,
" rsp = self.apiGet(self.get_item_url(group.name))",
[],
false
],
[
488,
"",
"",
[],
488,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
489,
"",
"",
[],
489,
" self.assertEqual(rsp['group']['invite_only'], True)",
[],
false
],
[
490,
"",
"",
[],
490,
"",
[],
false
],
[
491,
"",
"",
[],
491,
" def test_get_group_invite_only_with_permission_denied_error(self):",
[],
false
],
[
492,
"",
"",
[],
492,
" """Testing the GET groups/<id>/ API with invite-only and Permission Denied error"""",
[],
false
],
[
493,
"",
"",
[],
493,
" group = Group.objects.create(name='test-group', invite_only=True)",
[],
false
],
[
494,
"",
"",
[],
494,
"",
[],
false
],
[
495,
"",
"",
[],
495,
" rsp = self.apiGet(self.get_item_url(group.name),",
[],
false
],
[
496,
"",
"",
[],
496,
" expected_status=403)",
[],
false
],
[
497,
"",
"",
[],
497,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
498,
"",
"",
[],
498,
" self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)",
[],
false
],
[
499,
"",
"",
[],
499,
"",
[],
false
],
[
500,
"",
"",
[],
500,
" def test_get_group_with_site(self):",
[],
false
],
[
501,
"",
"",
[],
501,
" """Testing the GET groups/<id>/ API with a local site"""",
[],
false
],
[
502,
"",
"",
[],
502,
" self.client.logout()",
[],
false
],
[
503,
"",
"",
[],
503,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
504,
"",
"",
[],
504,
"",
[],
false
],
[
505,
"",
"",
[],
505,
" group = Group.objects.get(name='sitegroup')",
[],
false
],
[
506,
"",
"",
[],
506,
"",
[],
false
],
[
507,
"",
"",
[],
507,
" rsp = self.apiGet(self.get_item_url('sitegroup', self.local_site_name))",
[],
false
],
[
508,
"",
"",
[],
508,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
509,
"",
"",
[],
509,
" self.assertEqual(rsp['group']['name'], group.name)",
[],
false
],
[
510,
"",
"",
[],
510,
" self.assertEqual(rsp['group']['display_name'], group.display_name)",
[],
false
],
[
511,
"",
"",
[],
511,
"",
[],
false
],
[
512,
"",
"",
[],
512,
" def test_get_group_with_site_no_access(self):",
[],
false
],
[
513,
"",
"",
[],
513,
" """Testing the GET groups/<id>/ API with a local site and Permission Denied error"""",
[],
false
],
[
514,
"",
"",
[],
514,
" self.apiGet(self.get_item_url('sitegroup', self.local_site_name),",
[],
false
],
[
515,
"",
"",
[],
515,
" expected_status=403)",
[],
false
],
[
516,
"",
"",
[],
516,
"",
[],
false
],
[
517,
"",
"",
[],
517,
" def get_list_url(self, local_site_name=None):",
[],
false
],
[
518,
"",
"",
[],
518,
" return local_site_reverse('groups-resource',",
[],
false
],
[
519,
"",
"",
[],
519,
" local_site_name=local_site_name)",
[],
false
],
[
520,
"",
"",
[],
520,
"",
[],
false
],
[
521,
"",
"",
[],
521,
" def get_item_url(self, group_name, local_site_name=None):",
[],
false
],
[
522,
"",
"",
[],
522,
" return local_site_reverse('group-resource',",
[],
false
],
[
523,
"",
"",
[],
523,
" local_site_name=local_site_name,",
[],
false
],
[
524,
"",
"",
[],
524,
" kwargs={",
[],
false
],
[
525,
"",
"",
[],
525,
" 'group_name': group_name,",
[],
false
],
[
526,
"",
"",
[],
526,
" })",
[],
false
],
[
527,
"",
"",
[],
527,
"",
[],
false
],
[
528,
"",
"",
[],
528,
"",
[],
false
],
[
529,
"",
"",
[],
529,
"class UserResourceTests(BaseWebAPITestCase):",
[],
false
],
[
530,
"",
"",
[],
530,
" """Testing the UserResource API tests."""",
[],
false
],
[
531,
"",
"",
[],
531,
"",
[],
false
],
[
532,
"",
"",
[],
532,
" def test_get_users(self):",
[],
false
],
[
533,
"",
"",
[],
533,
" """Testing the GET users/ API"""",
[],
false
],
[
534,
"",
"",
[],
534,
" rsp = self.apiGet(self.get_list_url())",
[],
false
],
[
535,
"",
"",
[],
535,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
536,
"",
"",
[],
536,
" self.assertEqual(len(rsp['users']), User.objects.count())",
[],
false
],
[
537,
"",
"",
[],
537,
"",
[],
false
],
[
538,
"",
"",
[],
538,
" def test_get_users_with_q(self):",
[],
false
],
[
539,
"",
"",
[],
539,
" """Testing the GET users/?q= API"""",
[],
false
],
[
540,
"",
"",
[],
540,
" rsp = self.apiGet(self.get_list_url(), {'q': 'gru'})",
[],
false
],
[
541,
"",
"",
[],
541,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
542,
"",
"",
[],
542,
" self.assertEqual(len(rsp['users']), 1) # grumpy",
[],
false
],
[
543,
"",
"",
[],
543,
"",
[],
false
],
[
544,
"",
"",
[],
544,
" def test_get_users_with_site(self):",
[],
false
],
[
545,
"",
"",
[],
545,
" """Testing the GET users/ API with a local site"""",
[],
false
],
[
546,
"",
"",
[],
546,
" self.client.logout()",
[],
false
],
[
547,
"",
"",
[],
547,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
548,
"",
"",
[],
548,
"",
[],
false
],
[
549,
"",
"",
[],
549,
" local_site = LocalSite.objects.get(name=self.local_site_name)",
[],
false
],
[
550,
"",
"",
[],
550,
" rsp = self.apiGet(self.get_list_url(self.local_site_name))",
[],
false
],
[
551,
"",
"",
[],
551,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
552,
"",
"",
[],
552,
" self.assertEqual(len(rsp['users']), local_site.users.count())",
[],
false
],
[
553,
"",
"",
[],
553,
"",
[],
false
],
[
554,
"",
"",
[],
554,
" def test_get_users_with_site_no_access(self):",
[],
false
],
[
555,
"",
"",
[],
555,
" """Testing the GET users/ API with a local site and Permission Denied error"""",
[],
false
],
[
556,
"",
"",
[],
556,
" self.apiGet(self.get_list_url(self.local_site_name),",
[],
false
],
[
557,
"",
"",
[],
557,
" expected_status=403)",
[],
false
],
[
558,
"",
"",
[],
558,
"",
[],
false
],
[
559,
"",
"",
[],
559,
" def test_get_user(self):",
[],
false
],
[
560,
"",
"",
[],
560,
" """Testing the GET users/<username>/ API"""",
[],
false
],
[
561,
"",
"",
[],
561,
" username = 'doc'",
[],
false
],
[
562,
"",
"",
[],
562,
" user = User.objects.get(username=username)",
[],
false
],
[
563,
"",
"",
[],
563,
"",
[],
false
],
[
564,
"",
"",
[],
564,
" rsp = self.apiGet(self.get_item_url(username))",
[],
false
],
[
565,
"",
"",
[],
565,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
566,
"",
"",
[],
566,
" self.assertEqual(rsp['user']['username'], user.username)",
[],
false
],
[
567,
"",
"",
[],
567,
" self.assertEqual(rsp['user']['first_name'], user.first_name)",
[],
false
],
[
568,
"",
"",
[],
568,
" self.assertEqual(rsp['user']['last_name'], user.last_name)",
[],
false
],
[
569,
"",
"",
[],
569,
" self.assertEqual(rsp['user']['id'], user.id)",
[],
false
],
[
570,
"",
"",
[],
570,
" self.assertEqual(rsp['user']['email'], user.email)",
[],
false
],
[
571,
"",
"",
[],
571,
"",
[],
false
],
[
572,
"",
"",
[],
572,
" def test_get_user_with_site(self):",
[],
false
],
[
573,
"",
"",
[],
573,
" """Testing the GET users/<username>/ API with a local site"""",
[],
false
],
[
574,
"",
"",
[],
574,
" self.client.logout()",
[],
false
],
[
575,
"",
"",
[],
575,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
576,
"",
"",
[],
576,
"",
[],
false
],
[
577,
"",
"",
[],
577,
" username = 'doc'",
[],
false
],
[
578,
"",
"",
[],
578,
" user = User.objects.get(username=username)",
[],
false
],
[
579,
"",
"",
[],
579,
"",
[],
false
],
[
580,
"",
"",
[],
580,
" rsp = self.apiGet(self.get_item_url(username, self.local_site_name))",
[],
false
],
[
581,
"",
"",
[],
581,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
582,
"",
"",
[],
582,
" self.assertEqual(rsp['user']['username'], user.username)",
[],
false
],
[
583,
"",
"",
[],
583,
" self.assertEqual(rsp['user']['first_name'], user.first_name)",
[],
false
],
[
584,
"",
"",
[],
584,
" self.assertEqual(rsp['user']['last_name'], user.last_name)",
[],
false
],
[
585,
"",
"",
[],
585,
" self.assertEqual(rsp['user']['id'], user.id)",
[],
false
],
[
586,
"",
"",
[],
586,
" self.assertEqual(rsp['user']['email'], user.email)",
[],
false
],
[
587,
"",
"",
[],
587,
"",
[],
false
],
[
588,
"",
"",
[],
588,
" def test_get_missing_user_with_site(self):",
[],
false
],
[
589,
"",
"",
[],
589,
" """Testing the GET users/<username>/ API with a local site"""",
[],
false
],
[
590,
"",
"",
[],
590,
" self.client.logout()",
[],
false
],
[
591,
"",
"",
[],
591,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
592,
"",
"",
[],
592,
"",
[],
false
],
[
593,
"",
"",
[],
593,
" rsp = self.apiGet(self.get_item_url('dopey', self.local_site_name),",
[],
false
],
[
594,
"",
"",
[],
594,
" expected_status=404)",
[],
false
],
[
595,
"",
"",
[],
595,
"",
[],
false
],
[
596,
"",
"",
[],
596,
" def test_get_user_with_site_no_access(self):",
[],
false
],
[
597,
"",
"",
[],
597,
" """Testing the GET users/<username>/ API with a local site and Permission Denied error."""",
[],
false
],
[
598,
"",
"",
[],
598,
" self.apiGet(self.get_item_url('doc', self.local_site_name),",
[],
false
],
[
599,
"",
"",
[],
599,
" expected_status=403)",
[],
false
],
[
600,
"",
"",
[],
600,
"",
[],
false
],
[
601,
"",
"",
[],
601,
" def get_list_url(self, local_site_name=None):",
[],
false
],
[
602,
"",
"",
[],
602,
" return local_site_reverse('users-resource',",
[],
false
],
[
603,
"",
"",
[],
603,
" local_site_name=local_site_name)",
[],
false
],
[
604,
"",
"",
[],
604,
"",
[],
false
],
[
605,
"",
"",
[],
605,
" @classmethod",
[],
false
],
[
606,
"",
"",
[],
606,
" def get_item_url(cls, username, local_site_name=None):",
[],
false
],
[
607,
"",
"",
[],
607,
" return local_site_reverse('user-resource',",
[],
false
],
[
608,
"",
"",
[],
608,
" local_site_name=local_site_name,",
[],
false
],
[
609,
"",
"",
[],
609,
" kwargs={",
[],
false
],
[
610,
"",
"",
[],
610,
" 'username': username,",
[],
false
],
[
611,
"",
"",
[],
611,
" })",
[],
false
],
[
612,
"",
"",
[],
612,
"",
[],
false
],
[
613,
"",
"",
[],
613,
"",
[],
false
],
[
614,
"",
"",
[],
614,
"class WatchedReviewRequestResourceTests(BaseWebAPITestCase):",
[],
false
],
[
615,
"",
"",
[],
615,
" """Testing the WatchedReviewRequestResource API tests."""",
[],
false
],
[
616,
"",
"",
[],
616,
"",
[],
false
],
[
617,
"",
"",
[],
617,
" def test_post_watched_review_request(self):",
[],
false
],
[
618,
"",
"",
[],
618,
" """Testing the POST users/<username>/watched/review_request/ API"""",
[],
false
],
[
619,
"",
"",
[],
619,
" review_request = ReviewRequest.objects.public()[0]",
[],
false
],
[
620,
"",
"",
[],
620,
" rsp = self.apiPost(self.get_list_url(self.user.username), {",
[],
false
],
[
621,
"",
"",
[],
621,
" 'object_id': review_request.display_id,",
[],
false
],
[
622,
"",
"",
[],
622,
" })",
[],
false
],
[
623,
"",
"",
[],
623,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
624,
"",
"",
[],
624,
" self.assert_(review_request in",
[],
false
],
[
625,
"",
"",
[],
625,
" self.user.get_profile().starred_review_requests.all())",
[],
false
],
[
626,
"",
"",
[],
626,
"",
[],
false
],
[
627,
"",
"",
[],
627,
" def test_post_watched_review_request_with_does_not_exist_error(self):",
[],
false
],
[
628,
"",
"",
[],
628,
" """Testing the POST users/<username>/watched/review_request/ with Does Not Exist error"""",
[],
false
],
[
629,
"",
"",
[],
629,
" rsp = self.apiPost(self.get_list_url(self.user.username), {",
[],
false
],
[
630,
"",
"",
[],
630,
" 'object_id': 999,",
[],
false
],
[
631,
"",
"",
[],
631,
" }, expected_status=404)",
[],
false
],
[
632,
"",
"",
[],
632,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
633,
"",
"",
[],
633,
" self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)",
[],
false
],
[
634,
"",
"",
[],
634,
"",
[],
false
],
[
635,
"",
"",
[],
635,
" def test_post_watched_review_request_with_site(self):",
[],
false
],
[
636,
"",
"",
[],
636,
" """Testing the POST users/<username>/watched/review_request/ API with a local site"""",
[],
false
],
[
637,
"",
"",
[],
637,
" username = 'doc'",
[],
false
],
[
638,
"",
"",
[],
638,
" user = User.objects.get(username=username)",
[],
false
],
[
639,
"",
"",
[],
639,
"",
[],
false
],
[
640,
"",
"",
[],
640,
" self.client.logout()",
[],
false
],
[
641,
"",
"",
[],
641,
" self.client.login(username=username, password='doc')",
[],
false
],
[
642,
"",
"",
[],
642,
"",
[],
false
],
[
643,
"",
"",
[],
643,
" local_site = LocalSite.objects.get(name=self.local_site_name)",
[],
false
],
[
644,
"",
"",
[],
644,
" review_request = ReviewRequest.objects.public(local_site=local_site)[0]",
[],
false
],
[
645,
"",
"",
[],
645,
"",
[],
false
],
[
646,
"",
"",
[],
646,
" rsp = self.apiPost(self.get_list_url(username, self.local_site_name),",
[],
false
],
[
647,
"",
"",
[],
647,
" { 'object_id': review_request.display_id, })",
[],
false
],
[
648,
"",
"",
[],
648,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
649,
"",
"",
[],
649,
" self.assertTrue(review_request in",
[],
false
],
[
650,
"",
"",
[],
650,
" user.get_profile().starred_review_requests.all())",
[],
false
],
[
651,
"",
"",
[],
651,
"",
[],
false
],
[
652,
"",
"",
[],
652,
" def test_post_watched_review_request_with_site_does_not_exist_error(self):",
[],
false
],
[
653,
"",
"",
[],
653,
" """Testing the POST users/<username>/watched/review_request/ API with a local site and Does Not Exist error"""",
[],
false
],
[
654,
"",
"",
[],
654,
" self.client.logout()",
[],
false
],
[
655,
"",
"",
[],
655,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
656,
"",
"",
[],
656,
"",
[],
false
],
[
657,
"",
"",
[],
657,
" rsp = self.apiPost(self.get_list_url('doc', self.local_site_name),",
[],
false
],
[
658,
"",
"",
[],
658,
" { 'object_id': 10, },",
[],
false
],
[
659,
"",
"",
[],
659,
" expected_status=404)",
[],
false
],
[
660,
"",
"",
[],
660,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
661,
"",
"",
[],
661,
" self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)",
[],
false
],
[
662,
"",
"",
[],
662,
"",
[],
false
],
[
663,
"",
"",
[],
663,
" def test_post_watched_review_request_with_site_no_access(self):",
[],
false
],
[
664,
"",
"",
[],
664,
" """Testing the POST users/<username>/watched/review_request/ API with a local site and Permission Denied error"""",
[],
false
],
[
665,
"",
"",
[],
665,
" rsp = self.apiPost(self.get_list_url('doc', self.local_site_name),",
[],
false
],
[
666,
"",
"",
[],
666,
" { 'object_id': 10, },",
[],
false
],
[
667,
"",
"",
[],
667,
" expected_status=403)",
[],
false
],
[
668,
"",
"",
[],
668,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
669,
"",
"",
[],
669,
" self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)",
[],
false
],
[
670,
"",
"",
[],
670,
"",
[],
false
],
[
671,
"",
"",
[],
671,
" def test_delete_watched_review_request(self):",
[],
false
],
[
672,
"",
"",
[],
672,
" """Testing the DELETE users/<username>/watched/review_request/ API"""",
[],
false
],
[
673,
"",
"",
[],
673,
" # First, star it.",
[],
false
],
[
674,
"",
"",
[],
674,
" self.test_post_watched_review_request()",
[],
false
],
[
675,
"",
"",
[],
675,
"",
[],
false
],
[
676,
"",
"",
[],
676,
" review_request = ReviewRequest.objects.public()[0]",
[],
false
],
[
677,
"",
"",
[],
677,
" self.apiDelete(self.get_item_url(self.user.username,",
[],
false
],
[
678,
"",
"",
[],
678,
" review_request.display_id))",
[],
false
],
[
679,
"",
"",
[],
679,
" self.assertTrue(review_request not in",
[],
false
],
[
680,
"",
"",
[],
680,
" self.user.get_profile().starred_review_requests.all())",
[],
false
],
[
681,
"",
"",
[],
681,
"",
[],
false
],
[
682,
"",
"",
[],
682,
" def test_delete_watched_review_request_with_does_not_exist_error(self):",
[],
false
],
[
683,
"",
"",
[],
683,
" """Testing the DELETE users/<username>/watched/review_request/ API with Does Not Exist error"""",
[],
false
],
[
684,
"",
"",
[],
684,
" rsp = self.apiDelete(self.get_item_url(self.user.username, 999),",
[],
false
],
[
685,
"",
"",
[],
685,
" expected_status=404)",
[],
false
],
[
686,
"",
"",
[],
686,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
687,
"",
"",
[],
687,
" self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)",
[],
false
],
[
688,
"",
"",
[],
688,
"",
[],
false
],
[
689,
"",
"",
[],
689,
" def test_delete_watched_review_request_with_site(self):",
[],
false
],
[
690,
"",
"",
[],
690,
" """Testing the DELETE users/<username>/watched/review_request/ API with a local site"""",
[],
false
],
[
691,
"",
"",
[],
691,
" self.test_post_watched_review_request_with_site()",
[],
false
],
[
692,
"",
"",
[],
692,
"",
[],
false
],
[
693,
"",
"",
[],
693,
" user = User.objects.get(username='doc')",
[],
false
],
[
694,
"",
"",
[],
694,
" review_request = ReviewRequest.objects.get(",
[],
false
],
[
695,
"",
"",
[],
695,
" local_id=1, local_site__name=self.local_site_name)",
[],
false
],
[
696,
"",
"",
[],
696,
"",
[],
false
],
[
697,
"",
"",
[],
697,
" self.apiDelete(self.get_item_url(user.username,",
[],
false
],
[
698,
"",
"",
[],
698,
" review_request.display_id,",
[],
false
],
[
699,
"",
"",
[],
699,
" self.local_site_name))",
[],
false
],
[
700,
"",
"",
[],
700,
" self.assertTrue(review_request not in",
[],
false
],
[
701,
"",
"",
[],
701,
" user.get_profile().starred_review_requests.all())",
[],
false
],
[
702,
"",
"",
[],
702,
"",
[],
false
],
[
703,
"",
"",
[],
703,
" def test_delete_watched_review_request_with_site_no_access(self):",
[],
false
],
[
704,
"",
"",
[],
704,
" """Testing the DELETE users/<username>/watched/review_request/ API with a local site and Permission Denied error"""",
[],
false
],
[
705,
"",
"",
[],
705,
" rsp = self.apiDelete(self.get_item_url(self.user.username, 1,",
[],
false
],
[
706,
"",
"",
[],
706,
" self.local_site_name),",
[],
false
],
[
707,
"",
"",
[],
707,
" expected_status=403)",
[],
false
],
[
708,
"",
"",
[],
708,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
709,
"",
"",
[],
709,
" self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)",
[],
false
],
[
710,
"",
"",
[],
710,
"",
[],
false
],
[
711,
"",
"",
[],
711,
" def test_get_watched_review_requests(self):",
[],
false
],
[
712,
"",
"",
[],
712,
" """Testing the GET users/<username>/watched/review_request/ API"""",
[],
false
],
[
713,
"",
"",
[],
713,
" self.test_post_watched_review_request()",
[],
false
],
[
714,
"",
"",
[],
714,
"",
[],
false
],
[
715,
"",
"",
[],
715,
" rsp = self.apiGet(self.get_list_url(self.user.username))",
[],
false
],
[
716,
"",
"",
[],
716,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
717,
"",
"",
[],
717,
"",
[],
false
],
[
718,
"",
"",
[],
718,
" watched = self.user.get_profile().starred_review_requests.all()",
[],
false
],
[
719,
"",
"",
[],
719,
" apiwatched = rsp['watched_review_requests']",
[],
false
],
[
720,
"",
"",
[],
720,
"",
[],
false
],
[
721,
"",
"",
[],
721,
" self.assertEqual(len(watched), len(apiwatched))",
[],
false
],
[
722,
"",
"",
[],
722,
" for i in range(len(watched)):",
[],
false
],
[
723,
"",
"",
[],
723,
" self.assertEqual(watched[i].id,",
[],
false
],
[
724,
"",
"",
[],
724,
" apiwatched[i]['watched_review_request']['id'])",
[],
false
],
[
725,
"",
"",
[],
725,
" self.assertEqual(watched[i].summary,",
[],
false
],
[
726,
"",
"",
[],
726,
" apiwatched[i]['watched_review_request']['summary'])",
[],
false
],
[
727,
"",
"",
[],
727,
"",
[],
false
],
[
728,
"",
"",
[],
728,
" def test_get_watched_review_requests_with_site(self):",
[],
false
],
[
729,
"",
"",
[],
729,
" """Testing the GET users/<username>/watched/review_request/ API with a local site"""",
[],
false
],
[
730,
"",
"",
[],
730,
" username = 'doc'",
[],
false
],
[
731,
"",
"",
[],
731,
" user = User.objects.get(username=username)",
[],
false
],
[
732,
"",
"",
[],
732,
"",
[],
false
],
[
733,
"",
"",
[],
733,
" self.test_post_watched_review_request_with_site()",
[],
false
],
[
734,
"",
"",
[],
734,
"",
[],
false
],
[
735,
"",
"",
[],
735,
" rsp = self.apiGet(self.get_list_url(username, self.local_site_name))",
[],
false
],
[
736,
"",
"",
[],
736,
"",
[],
false
],
[
737,
"",
"",
[],
737,
" watched = user.get_profile().starred_review_requests.filter(",
[],
false
],
[
738,
"",
"",
[],
738,
" local_site__name=self.local_site_name)",
[],
false
],
[
739,
"",
"",
[],
739,
" apiwatched = rsp['watched_review_requests']",
[],
false
],
[
740,
"",
"",
[],
740,
"",
[],
false
],
[
741,
"",
"",
[],
741,
" self.assertEqual(len(watched), len(apiwatched))",
[],
false
],
[
742,
"",
"",
[],
742,
" for i in range(len(watched)):",
[],
false
],
[
743,
"",
"",
[],
743,
" self.assertEqual(watched[i].display_id,",
[],
false
],
[
744,
"",
"",
[],
744,
" apiwatched[i]['watched_review_request']['id'])",
[],
false
],
[
745,
"",
"",
[],
745,
" self.assertEqual(watched[i].summary,",
[],
false
],
[
746,
"",
"",
[],
746,
" apiwatched[i]['watched_review_request']['summary'])",
[],
false
],
[
747,
"",
"",
[],
747,
"",
[],
false
],
[
748,
"",
"",
[],
748,
" def test_get_watched_review_requests_with_site_no_access(self):",
[],
false
],
[
749,
"",
"",
[],
749,
" """Testing the GET users/<username>/watched/review_request/ API with a local site and Permission Denied error"""",
[],
false
],
[
750,
"",
"",
[],
750,
" rsp = self.apiGet(self.get_list_url(self.user.username,",
[],
false
],
[
751,
"",
"",
[],
751,
" self.local_site_name),",
[],
false
],
[
752,
"",
"",
[],
752,
" expected_status=403)",
[],
false
],
[
753,
"",
"",
[],
753,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
754,
"",
"",
[],
754,
" self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)",
[],
false
],
[
755,
"",
"",
[],
755,
"",
[],
false
],
[
756,
"",
"",
[],
756,
" def test_get_watched_review_requests_with_site_does_not_exist(self):",
[],
false
],
[
757,
"",
"",
[],
757,
" """Testing the GET users/<username>/watched/review_request/ API with a local site and Does Not Exist error"""",
[],
false
],
[
758,
"",
"",
[],
758,
" self.client.logout()",
[],
false
],
[
759,
"",
"",
[],
759,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
760,
"",
"",
[],
760,
"",
[],
false
],
[
761,
"",
"",
[],
761,
" rsp = self.apiGet(self.get_list_url(self.user.username,",
[],
false
],
[
762,
"",
"",
[],
762,
" self.local_site_name),",
[],
false
],
[
763,
"",
"",
[],
763,
" expected_status=404)",
[],
false
],
[
764,
"",
"",
[],
764,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
765,
"",
"",
[],
765,
" self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)",
[],
false
],
[
766,
"",
"",
[],
766,
"",
[],
false
],
[
767,
"",
"",
[],
767,
" def get_list_url(self, username, local_site_name=None):",
[],
false
],
[
768,
"",
"",
[],
768,
" return local_site_reverse('watched-review-requests-resource',",
[],
false
],
[
769,
"",
"",
[],
769,
" local_site_name=local_site_name,",
[],
false
],
[
770,
"",
"",
[],
770,
" kwargs={",
[],
false
],
[
771,
"",
"",
[],
771,
" 'username': username,",
[],
false
],
[
772,
"",
"",
[],
772,
" })",
[],
false
],
[
773,
"",
"",
[],
773,
"",
[],
false
],
[
774,
"",
"",
[],
774,
" def get_item_url(self, username, object_id, local_site_name=None):",
[],
false
],
[
775,
"",
"",
[],
775,
" return local_site_reverse('watched-review-request-resource',",
[],
false
],
[
776,
"",
"",
[],
776,
" local_site_name=local_site_name,",
[],
false
],
[
777,
"",
"",
[],
777,
" kwargs={",
[],
false
],
[
778,
"",
"",
[],
778,
" 'username': username,",
[],
false
],
[
779,
"",
"",
[],
779,
" 'watched_obj_id': object_id,",
[],
false
],
[
780,
"",
"",
[],
780,
" })",
[],
false
],
[
781,
"",
"",
[],
781,
"",
[],
false
],
[
782,
"",
"",
[],
782,
"",
[],
false
],
[
783,
"",
"",
[],
783,
"class WatchedReviewGroupResourceTests(BaseWebAPITestCase):",
[],
false
],
[
784,
"",
"",
[],
784,
" """Testing the WatchedReviewGroupResource API tests."""",
[],
false
],
[
785,
"",
"",
[],
785,
"",
[],
false
],
[
786,
"",
"",
[],
786,
" def test_post_watched_review_group(self):",
[],
false
],
[
787,
"",
"",
[],
787,
" """Testing the POST users/<username>/watched/review-groups/ API"""",
[],
false
],
[
788,
"",
"",
[],
788,
" group = Group.objects.get(name='devgroup', local_site=None)",
[],
false
],
[
789,
"",
"",
[],
789,
"",
[],
false
],
[
790,
"",
"",
[],
790,
" rsp = self.apiPost(self.get_list_url(self.user.username), {",
[],
false
],
[
791,
"",
"",
[],
791,
" 'object_id': group.name,",
[],
false
],
[
792,
"",
"",
[],
792,
" })",
[],
false
],
[
793,
"",
"",
[],
793,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
794,
"",
"",
[],
794,
" self.assert_(group in self.user.get_profile().starred_groups.all())",
[],
false
],
[
795,
"",
"",
[],
795,
"",
[],
false
],
[
796,
"",
"",
[],
796,
" def test_post_watched_review_group_with_does_not_exist_error(self):",
[],
false
],
[
797,
"",
"",
[],
797,
" """Testing the POST users/<username>/watched/review-groups/ API with Does Not Exist error"""",
[],
false
],
[
798,
"",
"",
[],
798,
" rsp = self.apiPost(self.get_list_url(self.user.username), {",
[],
false
],
[
799,
"",
"",
[],
799,
" 'object_id': 'invalidgroup',",
[],
false
],
[
800,
"",
"",
[],
800,
" }, expected_status=404)",
[],
false
],
[
801,
"",
"",
[],
801,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
802,
"",
"",
[],
802,
" self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)",
[],
false
],
[
803,
"",
"",
[],
803,
"",
[],
false
],
[
804,
"",
"",
[],
804,
" def test_post_watched_review_group_with_site(self):",
[],
false
],
[
805,
"",
"",
[],
805,
" """Testing the POST users/<username>/watched/review-groups/ API with a local site"""",
[],
false
],
[
806,
"",
"",
[],
806,
" username = 'doc'",
[],
false
],
[
807,
"",
"",
[],
807,
" user = User.objects.get(username=username)",
[],
false
],
[
808,
"",
"",
[],
808,
"",
[],
false
],
[
809,
"",
"",
[],
809,
" self.client.logout()",
[],
false
],
[
810,
"",
"",
[],
810,
" self.client.login(username=username, password='doc')",
[],
false
],
[
811,
"",
"",
[],
811,
"",
[],
false
],
[
812,
"",
"",
[],
812,
" group = Group.objects.get(name='sitegroup',",
[],
false
],
[
813,
"",
"",
[],
813,
" local_site__name=self.local_site_name)",
[],
false
],
[
814,
"",
"",
[],
814,
"",
[],
false
],
[
815,
"",
"",
[],
815,
" rsp = self.apiPost(self.get_list_url(username, self.local_site_name),",
[],
false
],
[
816,
"",
"",
[],
816,
" { 'object_id': group.name, })",
[],
false
],
[
817,
"",
"",
[],
817,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
818,
"",
"",
[],
818,
" self.assertTrue(group in user.get_profile().starred_groups.all())",
[],
false
],
[
819,
"",
"",
[],
819,
"",
[],
false
],
[
820,
"",
"",
[],
820,
" def test_post_watched_review_group_with_site_does_not_exist_error(self):",
[],
false
],
[
821,
"",
"",
[],
821,
" """Testing the POST users/<username>/watched/review-groups/ API with a local site and Does Not Exist error"""",
[],
false
],
[
822,
"",
"",
[],
822,
" username = 'doc'",
[],
false
],
[
823,
"",
"",
[],
823,
"",
[],
false
],
[
824,
"",
"",
[],
824,
" self.client.logout()",
[],
false
],
[
825,
"",
"",
[],
825,
" self.client.login(username=username, password='doc')",
[],
false
],
[
826,
"",
"",
[],
826,
"",
[],
false
],
[
827,
"",
"",
[],
827,
" rsp = self.apiPost(self.get_list_url(username, self.local_site_name),",
[],
false
],
[
828,
"",
"",
[],
828,
" { 'object_id': 'devgroup', },",
[],
false
],
[
829,
"",
"",
[],
829,
" expected_status=404)",
[],
false
],
[
830,
"",
"",
[],
830,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
831,
"",
"",
[],
831,
" self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)",
[],
false
],
[
832,
"",
"",
[],
832,
"",
[],
false
],
[
833,
"",
"",
[],
833,
" def test_post_watched_review_group_with_site_no_access(self):",
[],
false
],
[
834,
"",
"",
[],
834,
" """Testing the POST users/<username>/watched/review-groups/ API with a local site and Permission Denied error"""",
[],
false
],
[
835,
"",
"",
[],
835,
" rsp = self.apiPost(self.get_list_url(self.user.username,",
[],
false
],
[
836,
"",
"",
[],
836,
" self.local_site_name),",
[],
false
],
[
837,
"",
"",
[],
837,
" { 'object_id': 'devgroup', },",
[],
false
],
[
838,
"",
"",
[],
838,
" expected_status=403)",
[],
false
],
[
839,
"",
"",
[],
839,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
840,
"",
"",
[],
840,
" self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)",
[],
false
],
[
841,
"",
"",
[],
841,
"",
[],
false
],
[
842,
"",
"",
[],
842,
"",
[],
false
],
[
843,
"",
"",
[],
843,
" def test_delete_watched_review_group(self):",
[],
false
],
[
844,
"",
"",
[],
844,
" """Testing the DELETE users/<username>/watched/review-groups/<id>/ API"""",
[],
false
],
[
845,
"",
"",
[],
845,
" # First, star it.",
[],
false
],
[
846,
"",
"",
[],
846,
" self.test_post_watched_review_group()",
[],
false
],
[
847,
"",
"",
[],
847,
"",
[],
false
],
[
848,
"",
"",
[],
848,
" group = Group.objects.get(name='devgroup', local_site=None)",
[],
false
],
[
849,
"",
"",
[],
849,
"",
[],
false
],
[
850,
"",
"",
[],
850,
" self.apiDelete(self.get_item_url(self.user.username, group.name))",
[],
false
],
[
851,
"",
"",
[],
851,
" self.assertFalse(group in",
[],
false
],
[
852,
"",
"",
[],
852,
" self.user.get_profile().starred_groups.all())",
[],
false
],
[
853,
"",
"",
[],
853,
"",
[],
false
],
[
854,
"",
"",
[],
854,
" def test_delete_watched_review_group_with_does_not_exist_error(self):",
[],
false
],
[
855,
"",
"",
[],
855,
" """Testing the DELETE users/<username>/watched/review-groups/<id>/ API with Does Not Exist error"""",
[],
false
],
[
856,
"",
"",
[],
856,
" rsp = self.apiDelete(self.get_item_url(self.user.username,",
[],
false
],
[
857,
"",
"",
[],
857,
" 'invalidgroup'),",
[],
false
],
[
858,
"",
"",
[],
858,
" expected_status=404)",
[],
false
],
[
859,
"",
"",
[],
859,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
860,
"",
"",
[],
860,
" self.assertEqual(rsp['err']['code'], DOES_NOT_EXIST.code)",
[],
false
],
[
861,
"",
"",
[],
861,
"",
[],
false
],
[
862,
"",
"",
[],
862,
" def test_delete_watched_review_group_with_site(self):",
[],
false
],
[
863,
"",
"",
[],
863,
" """Testing the DELETE users/<username>/watched/review-groups/<id>/ API with a local site"""",
[],
false
],
[
864,
"",
"",
[],
864,
" self.test_post_watched_review_group_with_site()",
[],
false
],
[
865,
"",
"",
[],
865,
"",
[],
false
],
[
866,
"",
"",
[],
866,
" user = User.objects.get(username='doc')",
[],
false
],
[
867,
"",
"",
[],
867,
" group = Group.objects.get(name='sitegroup',",
[],
false
],
[
868,
"",
"",
[],
868,
" local_site__name=self.local_site_name)",
[],
false
],
[
869,
"",
"",
[],
869,
"",
[],
false
],
[
870,
"",
"",
[],
870,
" self.apiDelete(self.get_item_url(user.username, group.name,",
[],
false
],
[
871,
"",
"",
[],
871,
" self.local_site_name))",
[],
false
],
[
872,
"",
"",
[],
872,
" self.assertFalse(group in user.get_profile().starred_groups.all())",
[],
false
],
[
873,
"",
"",
[],
873,
"",
[],
false
],
[
874,
"",
"",
[],
874,
" def test_delete_watched_review_group_with_site_no_access(self):",
[],
false
],
[
875,
"",
"",
[],
875,
" """Testing the DELETE users/<username>/watched/review-groups/<id>/ API with a local site and Permission Denied error"""",
[],
false
],
[
876,
"",
"",
[],
876,
" rsp = self.apiDelete(self.get_item_url(self.user.username, 'group',",
[],
false
],
[
877,
"",
"",
[],
877,
" self.local_site_name),",
[],
false
],
[
878,
"",
"",
[],
878,
" expected_status=403)",
[],
false
],
[
879,
"",
"",
[],
879,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
880,
"",
"",
[],
880,
" self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)",
[],
false
],
[
881,
"",
"",
[],
881,
"",
[],
false
],
[
882,
"",
"",
[],
882,
" def test_get_watched_review_groups(self):",
[],
false
],
[
883,
"",
"",
[],
883,
" """Testing the GET users/<username>/watched/review-groups/ API"""",
[],
false
],
[
884,
"",
"",
[],
884,
" self.test_post_watched_review_group()",
[],
false
],
[
885,
"",
"",
[],
885,
"",
[],
false
],
[
886,
"",
"",
[],
886,
" rsp = self.apiGet(self.get_list_url(self.user.username))",
[],
false
],
[
887,
"",
"",
[],
887,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
888,
"",
"",
[],
888,
"",
[],
false
],
[
889,
"",
"",
[],
889,
" watched = self.user.get_profile().starred_groups.all()",
[],
false
],
[
890,
"",
"",
[],
890,
" apigroups = rsp['watched_review_groups']",
[],
false
],
[
891,
"",
"",
[],
891,
"",
[],
false
],
[
892,
"",
"",
[],
892,
" self.assertEqual(len(apigroups), len(watched))",
[],
false
],
[
893,
"",
"",
[],
893,
"",
[],
false
],
[
894,
"",
"",
[],
894,
" for id in range(len(watched)):",
[],
false
],
[
895,
"",
"",
[],
895,
" self.assertEqual(apigroups[id]['watched_review_group']['name'],",
[],
false
],
[
896,
"",
"",
[],
896,
" watched[id].name)",
[],
false
],
[
897,
"",
"",
[],
897,
"",
[],
false
],
[
898,
"",
"",
[],
898,
" def test_get_watched_review_groups_with_site(self):",
[],
false
],
[
899,
"",
"",
[],
899,
" """Testing the GET users/<username>/watched/review-groups/ API with a local site"""",
[],
false
],
[
900,
"",
"",
[],
900,
" self.test_post_watched_review_group_with_site()",
[],
false
],
[
901,
"",
"",
[],
901,
"",
[],
false
],
[
902,
"",
"",
[],
902,
" rsp = self.apiGet(self.get_list_url('doc', self.local_site_name))",
[],
false
],
[
903,
"",
"",
[],
903,
"",
[],
false
],
[
904,
"",
"",
[],
904,
" watched = self.user.get_profile().starred_groups.filter(",
[],
false
],
[
905,
"",
"",
[],
905,
" local_site__name=self.local_site_name)",
[],
false
],
[
906,
"",
"",
[],
906,
" apigroups = rsp['watched_review_groups']",
[],
false
],
[
907,
"",
"",
[],
907,
"",
[],
false
],
[
908,
"",
"",
[],
908,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
909,
"",
"",
[],
909,
"",
[],
false
],
[
910,
"",
"",
[],
910,
" for id in range(len(watched)):",
[],
false
],
[
911,
"",
"",
[],
911,
" self.assertEqual(apigroups[id]['watched_review_group']['name'],",
[],
false
],
[
912,
"",
"",
[],
912,
" watched[id].name)",
[],
false
],
[
913,
"",
"",
[],
913,
"",
[],
false
],
[
914,
"",
"",
[],
914,
" def test_get_watched_review_groups_with_site_no_access(self):",
[],
false
],
[
915,
"",
"",
[],
915,
" """Testing the GET users/<username>/watched/review-groups/ API with a local site and Permission Denied error"""",
[],
false
],
[
916,
"",
"",
[],
916,
" watched_url = \\",
[],
false
],
[
917,
"",
"",
[],
917,
" local_site_reverse('watched-review-groups-resource',",
[],
false
],
[
918,
"",
"",
[],
918,
" local_site_name=self.local_site_name,",
[],
false
],
[
919,
"",
"",
[],
919,
" kwargs={ 'username': self.user.username })",
[],
false
],
[
920,
"",
"",
[],
920,
"",
[],
false
],
[
921,
"",
"",
[],
921,
" rsp = self.apiGet(self.get_list_url(self.user.username,",
[],
false
],
[
922,
"",
"",
[],
922,
" self.local_site_name),",
[],
false
],
[
923,
"",
"",
[],
923,
" expected_status=403)",
[],
false
],
[
924,
"",
"",
[],
924,
" self.assertEqual(rsp['stat'], 'fail')",
[],
false
],
[
925,
"",
"",
[],
925,
" self.assertEqual(rsp['err']['code'], PERMISSION_DENIED.code)",
[],
false
],
[
926,
"",
"",
[],
926,
"",
[],
false
],
[
927,
"",
"",
[],
927,
" def get_list_url(self, username, local_site_name=None):",
[],
false
],
[
928,
"",
"",
[],
928,
" return local_site_reverse('watched-review-groups-resource',",
[],
false
],
[
929,
"",
"",
[],
929,
" local_site_name=local_site_name,",
[],
false
],
[
930,
"",
"",
[],
930,
" kwargs={",
[],
false
],
[
931,
"",
"",
[],
931,
" 'username': username,",
[],
false
],
[
932,
"",
"",
[],
932,
" })",
[],
false
],
[
933,
"",
"",
[],
933,
"",
[],
false
],
[
934,
"",
"",
[],
934,
" def get_item_url(self, username, object_id, local_site_name=None):",
[],
false
],
[
935,
"",
"",
[],
935,
" return local_site_reverse('watched-review-group-resource',",
[],
false
],
[
936,
"",
"",
[],
936,
" local_site_name=local_site_name,",
[],
false
],
[
937,
"",
"",
[],
937,
" kwargs={",
[],
false
],
[
938,
"",
"",
[],
938,
" 'username': username,",
[],
false
],
[
939,
"",
"",
[],
939,
" 'watched_obj_id': object_id,",
[],
false
],
[
940,
"",
"",
[],
940,
" })",
[],
false
],
[
941,
"",
"",
[],
941,
"",
[],
false
],
[
942,
"",
"",
[],
942,
"",
[],
false
],
[
943,
"",
"",
[],
943,
"class ReviewRequestResourceTests(BaseWebAPITestCase):",
[],
false
],
[
944,
"",
"",
[],
944,
" """Testing the ReviewRequestResource API tests."""",
[],
false
],
[
945,
"",
"",
[],
945,
"",
[],
false
],
[
946,
"",
"",
[],
946,
" def test_get_reviewrequests(self):",
[],
false
],
[
947,
"",
"",
[],
947,
" """Testing the GET review-requests/ API"""",
[],
false
],
[
948,
"",
"",
[],
948,
" rsp = self.apiGet(self.get_list_url())",
[],
false
],
[
949,
"",
"",
[],
949,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
950,
"",
"",
[],
950,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
951,
"",
"",
[],
951,
" ReviewRequest.objects.public().count())",
[],
false
],
[
952,
"",
"",
[],
952,
"",
[],
false
],
[
953,
"",
"",
[],
953,
" def test_get_reviewrequests_with_site(self):",
[],
false
],
[
954,
"",
"",
[],
954,
" """Testing the GET review-requests/ API with a local site"""",
[],
false
],
[
955,
"",
"",
[],
955,
" self.client.logout()",
[],
false
],
[
956,
"",
"",
[],
956,
" self.client.login(username='doc', password='doc')",
[],
false
],
[
957,
"",
"",
[],
957,
" local_site = LocalSite.objects.get(name=self.local_site_name)",
[],
false
],
[
958,
"",
"",
[],
958,
"",
[],
false
],
[
959,
"",
"",
[],
959,
" rsp = self.apiGet(self.get_list_url(self.local_site_name))",
[],
false
],
[
960,
"",
"",
[],
960,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
961,
"",
"",
[],
961,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
962,
"",
"",
[],
962,
" ReviewRequest.objects.public(",
[],
false
],
[
963,
"",
"",
[],
963,
" local_site=local_site).count())",
[],
false
],
[
964,
"",
"",
[],
964,
"",
[],
false
],
[
965,
"",
"",
[],
965,
" def test_get_reviewrequests_with_site_no_access(self):",
[],
false
],
[
966,
"",
"",
[],
966,
" """Testing the GET review-requests/ API with a local site and Permission Denied error"""",
[],
false
],
[
967,
"",
"",
[],
967,
" self.apiGet(self.get_list_url(self.local_site_name),",
[],
false
],
[
968,
"",
"",
[],
968,
" expected_status=403)",
[],
false
],
[
969,
"",
"",
[],
969,
"",
[],
false
],
[
970,
"",
"",
[],
970,
" def test_get_reviewrequests_with_status(self):",
[],
false
],
[
971,
"",
"",
[],
971,
" """Testing the GET review-requests/?status= API"""",
[],
false
],
[
972,
"",
"",
[],
972,
" url = self.get_list_url()",
[],
false
],
[
973,
"",
"",
[],
973,
"",
[],
false
],
[
974,
"",
"",
[],
974,
" rsp = self.apiGet(url, {'status': 'submitted'})",
[],
false
],
[
975,
"",
"",
[],
975,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
976,
"",
"",
[],
976,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
977,
"",
"",
[],
977,
" ReviewRequest.objects.public(status='S').count())",
[],
false
],
[
978,
"",
"",
[],
978,
"",
[],
false
],
[
979,
"",
"",
[],
979,
" rsp = self.apiGet(url, {'status': 'discarded'})",
[],
false
],
[
980,
"",
"",
[],
980,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
981,
"",
"",
[],
981,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
982,
"",
"",
[],
982,
" ReviewRequest.objects.public(status='D').count())",
[],
false
],
[
983,
"",
"",
[],
983,
"",
[],
false
],
[
984,
"",
"",
[],
984,
" rsp = self.apiGet(url, {'status': 'all'})",
[],
false
],
[
985,
"",
"",
[],
985,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
986,
"",
"",
[],
986,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
987,
"",
"",
[],
987,
" ReviewRequest.objects.public(status=None).count())",
[],
false
],
[
988,
"",
"",
[],
988,
"",
[],
false
],
[
989,
"",
"",
[],
989,
" def test_get_reviewrequests_with_counts_only(self):",
[],
false
],
[
990,
"",
"",
[],
990,
" """Testing the GET review-requests/?counts-only=1 API"""",
[],
false
],
[
991,
"",
"",
[],
991,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
992,
"",
"",
[],
992,
" 'counts-only': 1,",
[],
false
],
[
993,
"",
"",
[],
993,
" })",
[],
false
],
[
994,
"",
"",
[],
994,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
995,
"",
"",
[],
995,
" self.assertEqual(rsp['count'], ReviewRequest.objects.public().count())",
[],
false
],
[
996,
"",
"",
[],
996,
"",
[],
false
],
[
997,
"",
"",
[],
997,
" def test_get_reviewrequests_with_to_groups(self):",
[],
false
],
[
998,
"",
"",
[],
998,
" """Testing the GET review-requests/?to-groups= API"""",
[],
false
],
[
999,
"",
"",
[],
999,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1000,
"",
"",
[],
1000,
" 'to-groups': 'devgroup',",
[],
false
],
[
1001,
"",
"",
[],
1001,
" })",
[],
false
],
[
1002,
"",
"",
[],
1002,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1003,
"",
"",
[],
1003,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1004,
"",
"",
[],
1004,
" ReviewRequest.objects.to_group("devgroup",",
[],
false
],
[
1005,
"",
"",
[],
1005,
" None).count())",
[],
false
],
[
1006,
"",
"",
[],
1006,
"",
[],
false
],
[
1007,
"",
"",
[],
1007,
" def test_get_reviewrequests_with_to_groups_and_status(self):",
[],
false
],
[
1008,
"",
"",
[],
1008,
" """Testing the GET review-requests/?to-groups=&status= API"""",
[],
false
],
[
1009,
"",
"",
[],
1009,
" url = self.get_list_url()",
[],
false
],
[
1010,
"",
"",
[],
1010,
"",
[],
false
],
[
1011,
"",
"",
[],
1011,
" rsp = self.apiGet(url, {",
[],
false
],
[
1012,
"",
"",
[],
1012,
" 'status': 'submitted',",
[],
false
],
[
1013,
"",
"",
[],
1013,
" 'to-groups': 'devgroup',",
[],
false
],
[
1014,
"",
"",
[],
1014,
" })",
[],
false
],
[
1015,
"",
"",
[],
1015,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1016,
"",
"",
[],
1016,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1017,
"",
"",
[],
1017,
" ReviewRequest.objects.to_group("devgroup", None,",
[],
false
],
[
1018,
"",
"",
[],
1018,
" status='S').count())",
[],
false
],
[
1019,
"",
"",
[],
1019,
"",
[],
false
],
[
1020,
"",
"",
[],
1020,
" rsp = self.apiGet(url, {",
[],
false
],
[
1021,
"",
"",
[],
1021,
" 'status': 'discarded',",
[],
false
],
[
1022,
"",
"",
[],
1022,
" 'to-groups': 'devgroup',",
[],
false
],
[
1023,
"",
"",
[],
1023,
" })",
[],
false
],
[
1024,
"",
"",
[],
1024,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1025,
"",
"",
[],
1025,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1026,
"",
"",
[],
1026,
" ReviewRequest.objects.to_group("devgroup", None,",
[],
false
],
[
1027,
"",
"",
[],
1027,
" status='D').count())",
[],
false
],
[
1028,
"",
"",
[],
1028,
"",
[],
false
],
[
1029,
"",
"",
[],
1029,
" def test_get_reviewrequests_with_to_groups_and_counts_only(self):",
[],
false
],
[
1030,
"",
"",
[],
1030,
" """Testing the GET review-requests/?to-groups=&counts-only=1 API"""",
[],
false
],
[
1031,
"",
"",
[],
1031,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1032,
"",
"",
[],
1032,
" 'to-groups': 'devgroup',",
[],
false
],
[
1033,
"",
"",
[],
1033,
" 'counts-only': 1,",
[],
false
],
[
1034,
"",
"",
[],
1034,
" })",
[],
false
],
[
1035,
"",
"",
[],
1035,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1036,
"",
"",
[],
1036,
" self.assertEqual(rsp['count'],",
[],
false
],
[
1037,
"",
"",
[],
1037,
" ReviewRequest.objects.to_group("devgroup",",
[],
false
],
[
1038,
"",
"",
[],
1038,
" None).count())",
[],
false
],
[
1039,
"",
"",
[],
1039,
"",
[],
false
],
[
1040,
"",
"",
[],
1040,
" def test_get_reviewrequests_with_to_users(self):",
[],
false
],
[
1041,
"",
"",
[],
1041,
" """Testing the GET review-requests/?to-users= API"""",
[],
false
],
[
1042,
"",
"",
[],
1042,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1043,
"",
"",
[],
1043,
" 'to-users': 'grumpy',",
[],
false
],
[
1044,
"",
"",
[],
1044,
" })",
[],
false
],
[
1045,
"",
"",
[],
1045,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1046,
"",
"",
[],
1046,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1047,
"",
"",
[],
1047,
" ReviewRequest.objects.to_user("grumpy").count())",
[],
false
],
[
1048,
"",
"",
[],
1048,
"",
[],
false
],
[
1049,
"",
"",
[],
1049,
" def test_get_reviewrequests_with_to_users_and_status(self):",
[],
false
],
[
1050,
"",
"",
[],
1050,
" """Testing the GET review-requests/?to-users=&status= API"""",
[],
false
],
[
1051,
"",
"",
[],
1051,
" url = self.get_list_url()",
[],
false
],
[
1052,
"",
"",
[],
1052,
"",
[],
false
],
[
1053,
"",
"",
[],
1053,
" rsp = self.apiGet(url, {",
[],
false
],
[
1054,
"",
"",
[],
1054,
" 'status': 'submitted',",
[],
false
],
[
1055,
"",
"",
[],
1055,
" 'to-users': 'grumpy',",
[],
false
],
[
1056,
"",
"",
[],
1056,
" })",
[],
false
],
[
1057,
"",
"",
[],
1057,
"",
[],
false
],
[
1058,
"",
"",
[],
1058,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1059,
"",
"",
[],
1059,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1060,
"",
"",
[],
1060,
" ReviewRequest.objects.to_user("grumpy", status='S').count())",
[],
false
],
[
1061,
"",
"",
[],
1061,
"",
[],
false
],
[
1062,
"",
"",
[],
1062,
" rsp = self.apiGet(url, {",
[],
false
],
[
1063,
"",
"",
[],
1063,
" 'status': 'discarded',",
[],
false
],
[
1064,
"",
"",
[],
1064,
" 'to-users': 'grumpy',",
[],
false
],
[
1065,
"",
"",
[],
1065,
" })",
[],
false
],
[
1066,
"",
"",
[],
1066,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1067,
"",
"",
[],
1067,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1068,
"",
"",
[],
1068,
" ReviewRequest.objects.to_user("grumpy", status='D').count())",
[],
false
],
[
1069,
"",
"",
[],
1069,
"",
[],
false
],
[
1070,
"",
"",
[],
1070,
" def test_get_reviewrequests_with_to_users_and_counts_only(self):",
[],
false
],
[
1071,
"",
"",
[],
1071,
" """Testing the GET review-requests/?to-users=&counts-only=1 API"""",
[],
false
],
[
1072,
"",
"",
[],
1072,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1073,
"",
"",
[],
1073,
" 'to-users': 'grumpy',",
[],
false
],
[
1074,
"",
"",
[],
1074,
" 'counts-only': 1,",
[],
false
],
[
1075,
"",
"",
[],
1075,
" })",
[],
false
],
[
1076,
"",
"",
[],
1076,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1077,
"",
"",
[],
1077,
" self.assertEqual(rsp['count'],",
[],
false
],
[
1078,
"",
"",
[],
1078,
" ReviewRequest.objects.to_user("grumpy").count())",
[],
false
],
[
1079,
"",
"",
[],
1079,
"",
[],
false
],
[
1080,
"",
"",
[],
1080,
" def test_get_reviewrequests_with_to_users_directly(self):",
[],
false
],
[
1081,
"",
"",
[],
1081,
" """Testing the GET review-requests/?to-users-directly= API"""",
[],
false
],
[
1082,
"",
"",
[],
1082,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1083,
"",
"",
[],
1083,
" 'to-users-directly': 'doc',",
[],
false
],
[
1084,
"",
"",
[],
1084,
" })",
[],
false
],
[
1085,
"",
"",
[],
1085,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1086,
"",
"",
[],
1086,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1087,
"",
"",
[],
1087,
" ReviewRequest.objects.to_user_directly("doc").count())",
[],
false
],
[
1088,
"",
"",
[],
1088,
"",
[],
false
],
[
1089,
"",
"",
[],
1089,
" def test_get_reviewrequests_with_to_users_directly_and_status(self):",
[],
false
],
[
1090,
"",
"",
[],
1090,
" """Testing the GET review-requests/?to-users-directly=&status= API"""",
[],
false
],
[
1091,
"",
"",
[],
1091,
" url = self.get_list_url()",
[],
false
],
[
1092,
"",
"",
[],
1092,
"",
[],
false
],
[
1093,
"",
"",
[],
1093,
" rsp = self.apiGet(url, {",
[],
false
],
[
1094,
"",
"",
[],
1094,
" 'status': 'submitted',",
[],
false
],
[
1095,
"",
"",
[],
1095,
" 'to-users-directly': 'doc'",
[],
false
],
[
1096,
"",
"",
[],
1096,
" })",
[],
false
],
[
1097,
"",
"",
[],
1097,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1098,
"",
"",
[],
1098,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1099,
"",
"",
[],
1099,
" ReviewRequest.objects.to_user_directly("doc", status='S').count())",
[],
false
],
[
1100,
"",
"",
[],
1100,
"",
[],
false
],
[
1101,
"",
"",
[],
1101,
" rsp = self.apiGet(url, {",
[],
false
],
[
1102,
"",
"",
[],
1102,
" 'status': 'discarded',",
[],
false
],
[
1103,
"",
"",
[],
1103,
" 'to-users-directly': 'doc'",
[],
false
],
[
1104,
"",
"",
[],
1104,
" })",
[],
false
],
[
1105,
"",
"",
[],
1105,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1106,
"",
"",
[],
1106,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1107,
"",
"",
[],
1107,
" ReviewRequest.objects.to_user_directly("doc", status='D').count())",
[],
false
],
[
1108,
"",
"",
[],
1108,
"",
[],
false
],
[
1109,
"",
"",
[],
1109,
" def test_get_reviewrequests_with_to_users_directly_and_counts_only(self):",
[],
false
],
[
1110,
"",
"",
[],
1110,
" """Testing the GET review-requests/?to-users-directly=&counts-only=1 API"""",
[],
false
],
[
1111,
"",
"",
[],
1111,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1112,
"",
"",
[],
1112,
" 'to-users-directly': 'doc',",
[],
false
],
[
1113,
"",
"",
[],
1113,
" 'counts-only': 1,",
[],
false
],
[
1114,
"",
"",
[],
1114,
" })",
[],
false
],
[
1115,
"",
"",
[],
1115,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1116,
"",
"",
[],
1116,
" self.assertEqual(rsp['count'],",
[],
false
],
[
1117,
"",
"",
[],
1117,
" ReviewRequest.objects.to_user_directly("doc").count())",
[],
false
],
[
1118,
"",
"",
[],
1118,
"",
[],
false
],
[
1119,
"",
"",
[],
1119,
" def test_get_reviewrequests_with_from_user(self):",
[],
false
],
[
1120,
"",
"",
[],
1120,
" """Testing the GET review-requests/?from-user= API"""",
[],
false
],
[
1121,
"",
"",
[],
1121,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1122,
"",
"",
[],
1122,
" 'from-user': 'grumpy',",
[],
false
],
[
1123,
"",
"",
[],
1123,
" })",
[],
false
],
[
1124,
"",
"",
[],
1124,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1125,
"",
"",
[],
1125,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1126,
"",
"",
[],
1126,
" ReviewRequest.objects.from_user("grumpy").count())",
[],
false
],
[
1127,
"",
"",
[],
1127,
"",
[],
false
],
[
1128,
"",
"",
[],
1128,
" def test_get_reviewrequests_with_from_user_and_status(self):",
[],
false
],
[
1129,
"",
"",
[],
1129,
" """Testing the GET review-requests/?from-user=&status= API"""",
[],
false
],
[
1130,
"",
"",
[],
1130,
" url = self.get_list_url()",
[],
false
],
[
1131,
"",
"",
[],
1131,
"",
[],
false
],
[
1132,
"",
"",
[],
1132,
" rsp = self.apiGet(url, {",
[],
false
],
[
1133,
"",
"",
[],
1133,
" 'status': 'submitted',",
[],
false
],
[
1134,
"",
"",
[],
1134,
" 'from-user': 'grumpy',",
[],
false
],
[
1135,
"",
"",
[],
1135,
" })",
[],
false
],
[
1136,
"",
"",
[],
1136,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1137,
"",
"",
[],
1137,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1138,
"",
"",
[],
1138,
" ReviewRequest.objects.from_user("grumpy", status='S').count())",
[],
false
],
[
1139,
"",
"",
[],
1139,
"",
[],
false
],
[
1140,
"",
"",
[],
1140,
" rsp = self.apiGet(url, {",
[],
false
],
[
1141,
"",
"",
[],
1141,
" 'status': 'discarded',",
[],
false
],
[
1142,
"",
"",
[],
1142,
" 'from-user': 'grumpy',",
[],
false
],
[
1143,
"",
"",
[],
1143,
" })",
[],
false
],
[
1144,
"",
"",
[],
1144,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1145,
"",
"",
[],
1145,
" self.assertEqual(len(rsp['review_requests']),",
[],
false
],
[
1146,
"",
"",
[],
1146,
" ReviewRequest.objects.from_user("grumpy", status='D').count())",
[],
false
],
[
1147,
"",
"",
[],
1147,
"",
[],
false
],
[
1148,
"",
"",
[],
1148,
" def test_get_reviewrequests_with_from_user_and_counts_only(self):",
[],
false
],
[
1149,
"",
"",
[],
1149,
" """Testing the GET review-requests/?from-user=&counts-only=1 API"""",
[],
false
],
[
1150,
"",
"",
[],
1150,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1151,
"",
"",
[],
1151,
" 'from-user': 'grumpy',",
[],
false
],
[
1152,
"",
"",
[],
1152,
" 'counts-only': 1,",
[],
false
],
[
1153,
"",
"",
[],
1153,
" })",
[],
false
],
[
1154,
"",
"",
[],
1154,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1155,
"",
"",
[],
1155,
" self.assertEqual(rsp['count'],",
[],
false
],
[
1156,
"",
"",
[],
1156,
" ReviewRequest.objects.from_user("grumpy").count())",
[],
false
],
[
1157,
"",
"",
[],
1157,
"",
[],
false
],
[
1158,
"",
"",
[],
1158,
" def test_get_reviewrequests_with_time_added_from(self):",
[],
false
],
[
1159,
"",
"",
[],
1159,
" """Testing the GET review-requests/?time-added-from= API"""",
[],
false
],
[
1160,
"",
"",
[],
1160,
" start_index = 3",
[],
false
],
[
1161,
"",
"",
[],
1161,
"",
[],
false
],
[
1162,
"",
"",
[],
1162,
" public_review_requests = \\",
[],
false
],
[
1163,
"",
"",
[],
1163,
" ReviewRequest.objects.public().order_by('time_added')",
[],
false
],
[
1164,
"",
"",
[],
1164,
" r = public_review_requests[start_index]",
[],
false
],
[
1165,
"",
"",
[],
1165,
" timestamp = r.time_added.isoformat()",
[],
false
],
[
1166,
"",
"",
[],
1166,
"",
[],
false
],
[
1167,
"",
"",
[],
1167,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1168,
"",
"",
[],
1168,
" 'time-added-from': timestamp,",
[],
false
],
[
1169,
"",
"",
[],
1169,
" 'counts-only': 1,",
[],
false
],
[
1170,
"",
"",
[],
1170,
" })",
[],
false
],
[
1171,
"",
"",
[],
1171,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1172,
"",
"",
[],
1172,
" self.assertEqual(rsp['count'],",
[],
false
],
[
1173,
"",
"",
[],
1173,
" public_review_requests.count() - start_index)",
[],
false
],
[
1174,
"",
"",
[],
1174,
" self.assertEqual(rsp['count'],",
[],
false
],
[
1175,
"",
"",
[],
1175,
" public_review_requests.filter(",
[],
false
],
[
1176,
"",
"",
[],
1176,
" time_added__gte=r.time_added).count())",
[],
false
],
[
1177,
"",
"",
[],
1177,
"",
[],
false
],
[
1178,
"",
"",
[],
1178,
" def test_get_reviewrequests_with_time_added_to(self):",
[],
false
],
[
1179,
"",
"",
[],
1179,
" """Testing the GET review-requests/?time-added-to= API"""",
[],
false
],
[
1180,
"",
"",
[],
1180,
" start_index = 3",
[],
false
],
[
1181,
"",
"",
[],
1181,
"",
[],
false
],
[
1182,
"",
"",
[],
1182,
" public_review_requests = \\",
[],
false
],
[
1183,
"",
"",
[],
1183,
" ReviewRequest.objects.public().order_by('time_added')",
[],
false
],
[
1184,
"",
"",
[],
1184,
" r = public_review_requests[start_index]",
[],
false
],
[
1185,
"",
"",
[],
1185,
" timestamp = r.time_added.isoformat()",
[],
false
],
[
1186,
"",
"",
[],
1186,
"",
[],
false
],
[
1187,
"",
"",
[],
1187,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1188,
"",
"",
[],
1188,
" 'time-added-to': timestamp,",
[],
false
],
[
1189,
"",
"",
[],
1189,
" 'counts-only': 1,",
[],
false
],
[
1190,
"",
"",
[],
1190,
" })",
[],
false
],
[
1191,
"",
"",
[],
1191,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1192,
"",
"",
[],
1192,
" self.assertEqual(rsp['count'],",
[],
false
],
[
1193,
"",
"",
[],
1193,
" public_review_requests.count() - start_index + 1)",
[],
false
],
[
1194,
"",
"",
[],
1194,
" self.assertEqual(rsp['count'],",
[],
false
],
[
1195,
"",
"",
[],
1195,
" public_review_requests.filter(",
[],
false
],
[
1196,
"",
"",
[],
1196,
" time_added__lt=r.time_added).count())",
[],
false
],
[
1197,
"",
"",
[],
1197,
"",
[],
false
],
[
1198,
"",
"",
[],
1198,
" def test_get_reviewrequests_with_last_updated_from(self):",
[],
false
],
[
1199,
"",
"",
[],
1199,
" """Testing the GET review-requests/?last-updated-from= API"""",
[],
false
],
[
1200,
"",
"",
[],
1200,
" start_index = 3",
[],
false
],
[
1201,
"",
"",
[],
1201,
"",
[],
false
],
[
1202,
"",
"",
[],
1202,
" public_review_requests = \\",
[],
false
],
[
1203,
"",
"",
[],
1203,
" ReviewRequest.objects.public().order_by('last_updated')",
[],
false
],
[
1204,
"",
"",
[],
1204,
" r = public_review_requests[start_index]",
[],
false
],
[
1205,
"",
"",
[],
1205,
" timestamp = r.last_updated.isoformat()",
[],
false
],
[
1206,
"",
"",
[],
1206,
"",
[],
false
],
[
1207,
"",
"",
[],
1207,
" rsp = self.apiGet(self.get_list_url(), {",
[],
false
],
[
1208,
"",
"",
[],
1208,
" 'last-updated-from': timestamp,",
[],
false
],
[
1209,
"",
"",
[],
1209,
" 'counts-only': 1,",
[],
false
],
[
1210,
"",
"",
[],
1210,
" })",
[],
false
],
[
1211,
"",
"",
[],
1211,
" self.assertEqual(rsp['stat'], 'ok')",
[],
false
],
[
1212,
"",
"",
[],
1212,
" self.assertEqual(rsp['count'],",
[],
false
],
[
1213,
"",
"",
[],
1213,
" public_review_requests.count() - start_index)",
[],
false
],
[
1214,
"",
"",
[],
1214,
" self.assertEqual(rsp['count'],",
[],
false
],
[
1215,
"",
"",
[],
1215,
" public_review_requests.filter(",
[],
false
],
[
1216,
"",
"",
[],
1216,
" last_updated__gte=r.last_updated).count())",
[],
false
],
[
1217,
"",
"",
[],
1217,
"",
[],
false
],
[
1218,
"",
"",
[],
1218,
" def test_get_reviewrequests_with_last_updated_to(self):",
[],
false
],
[<