blob: a645edcec8603740dc72977107ae089cd770f4a2 [file] [log] [blame]
# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for issuelist module."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
try:
from mox3 import mox
except ImportError:
import mox
import mock
import unittest
import time
from google.appengine.ext import testbed
import ezt
from features import hotlistissues
from features import hotlist_helpers
from framework import framework_views
from framework import permissions
from framework import sorting
from framework import template_helpers
from framework import xsrf
from services import service_manager
from testing import fake
from testing import testing_helpers
class HotlistIssuesUnitTest(unittest.TestCase):
def setUp(self):
self.testbed = testbed.Testbed()
self.testbed.activate()
self.testbed.init_memcache_stub()
self.testbed.init_datastore_v3_stub()
self.services = service_manager.Services(
issue_star=fake.IssueStarService(),
config=fake.ConfigService(),
user=fake.UserService(),
issue=fake.IssueService(),
project=fake.ProjectService(),
features=fake.FeaturesService(),
cache_manager=fake.CacheManager(),
hotlist_star=fake.HotlistStarService())
self.servlet = hotlistissues.HotlistIssues(services=self.services)
self.user1 = self.services.user.TestAddUser('testuser@gmail.com', 111)
self.user2 = self.services.user.TestAddUser('testuser2@gmail.com', 222, )
self.services.project.TestAddProject('project-name', project_id=1)
self.issue1 = fake.MakeTestIssue(
1, 1, 'issue_summary', 'New', 111, project_name='project-name')
self.services.issue.TestAddIssue(self.issue1)
self.issue2 = fake.MakeTestIssue(
1, 2, 'issue_summary2', 'New', 111, project_name='project-name')
self.services.issue.TestAddIssue(self.issue2)
self.issue3 = fake.MakeTestIssue(
1, 3, 'issue_summary3', 'New', 222, project_name='project-name')
self.services.issue.TestAddIssue(self.issue3)
self.issues = [self.issue1, self.issue2, self.issue3]
self.hotlist_item_fields = [
(issue.issue_id, rank, 111, 1205079300, '') for
rank, issue in enumerate(self.issues)]
self.test_hotlist = self.services.features.TestAddHotlist(
'hotlist', hotlist_id=123, owner_ids=[222], editor_ids=[111],
hotlist_item_fields=self.hotlist_item_fields)
self.hotlistissues = self.test_hotlist.items
# Unless perms is specified,
# MakeMonorailRequest will return an mr with admin permissions.
self.mr = testing_helpers.MakeMonorailRequest(
hotlist=self.test_hotlist, path='/u/222/hotlists/123',
services=self.services, perms=permissions.EMPTY_PERMISSIONSET)
self.mr.hotlist_id = self.test_hotlist.hotlist_id
self.mr.auth.user_id = 111
self.mr.auth.effective_ids = {111}
self.mr.viewed_user_auth.user_id = 111
sorting.InitializeArtValues(self.services)
self.mox = mox.Mox()
def tearDown(self):
self.mox.UnsetStubs()
self.testbed.deactivate()
def testAssertBasePermissions(self):
private_hotlist = self.services.features.TestAddHotlist(
'privateHotlist', hotlist_id=321, owner_ids=[222],
hotlist_item_fields=self.hotlist_item_fields, is_private=True)
# non-members cannot view private hotlists
mr = testing_helpers.MakeMonorailRequest(
hotlist=private_hotlist, perms=permissions.EMPTY_PERMISSIONSET)
mr.auth.effective_ids = {333}
mr.hotlist_id = private_hotlist.hotlist_id
self.assertRaises(permissions.PermissionException,
self.servlet.AssertBasePermission, mr)
# members can view private hotlists
mr = testing_helpers.MakeMonorailRequest(
hotlist=private_hotlist, perms=permissions.EMPTY_PERMISSIONSET)
mr.auth.effective_ids = {222, 444}
mr.hotlist_id = private_hotlist.hotlist_id
self.servlet.AssertBasePermission(mr)
# non-members can view public hotlists
mr = testing_helpers.MakeMonorailRequest(
hotlist=self.test_hotlist, perms=permissions.EMPTY_PERMISSIONSET)
mr.auth.effective_ids = {333, 444}
mr.hotlist_id = self.test_hotlist.hotlist_id
self.servlet.AssertBasePermission(mr)
# members can view public hotlists
mr = testing_helpers.MakeMonorailRequest(
hotlist=self.test_hotlist, perms=permissions.EMPTY_PERMISSIONSET)
mr.auth.effective_ids = {111, 333}
mr.hotlist_id = self.test_hotlist.hotlist_id
self.servlet.AssertBasePermission(mr)
def testGatherPageData(self):
self.mr.mode = 'list'
self.mr.auth.effective_ids = {111}
self.mr.auth.user_id = 111
self.mr.sort_spec = 'rank stars'
page_data = self.servlet.GatherPageData(self.mr)
self.assertEqual(ezt.boolean(False), page_data['owner_permissions'])
self.assertEqual(ezt.boolean(True), page_data['editor_permissions'])
self.assertEqual(ezt.boolean(False), page_data['grid_mode'])
self.assertEqual(ezt.boolean(True), page_data['allow_rerank'])
self.mr.sort_spec = 'stars ranks'
page_data = self.servlet.GatherPageData(self.mr)
self.assertEqual(ezt.boolean(False), page_data['allow_rerank'])
def testGetTableViewData(self):
now = time.time()
self.mox.StubOutWithMock(time, 'time')
time.time().MultipleTimes().AndReturn(now)
self.mox.ReplayAll()
self.mr.auth.user_id = 222
self.mr.col_spec = 'Stars Projects Rank'
table_view_data = self.servlet.GetTableViewData(self.mr)
self.assertEqual(table_view_data['edit_hotlist_token'], xsrf.GenerateToken(
self.mr.auth.user_id, '/u/222/hotlists/hotlist.do'))
self.assertEqual(table_view_data['add_issues_selected'], ezt.boolean(False))
self.user2.obscure_email = False
table_view_data = self.servlet.GetTableViewData(self.mr)
self.assertEqual(table_view_data['edit_hotlist_token'], xsrf.GenerateToken(
self.mr.auth.user_id, '/u/222/hotlists/hotlist.do'))
self.mox.VerifyAll()
def testGetGridViewData(self):
# TODO(jojwang): Write this test
pass
def testProcessFormData_NoNewIssues(self):
post_data = fake.PostData(remove=['false'], add_local_ids=[''])
url = self.servlet.ProcessFormData(self.mr, post_data)
self.assertTrue(url.endswith('u/222/hotlists/hotlist'))
self.assertEqual(self.test_hotlist.items, self.hotlistissues)
def testProcessFormData_AddBadIssueRef(self):
self.servlet.PleaseCorrect = mock.Mock()
post_data = fake.PostData(
remove=['false'], add_local_ids=['no-such-project:999'])
url = self.servlet.ProcessFormData(self.mr, post_data)
self.assertIsNone(url)
self.servlet.PleaseCorrect.assert_called_once()
def testProcessFormData_RemoveBadIssueRef(self):
post_data = fake.PostData(
remove=['true'], add_local_ids=['no-such-project:999'])
url = self.servlet.ProcessFormData(self.mr, post_data)
self.assertIn('u/222/hotlists/hotlist', url)
self.assertEqual(self.test_hotlist.items, self.hotlistissues)
def testProcessFormData_NormalEditIssues(self):
issue4 = fake.MakeTestIssue(
1, 4, 'issue_summary4', 'New', 222, project_name='project-name')
self.services.issue.TestAddIssue(issue4)
issue5 = fake.MakeTestIssue(
1, 5, 'issue_summary5', 'New', 222, project_name='project-name')
self.services.issue.TestAddIssue(issue5)
post_data = fake.PostData(remove=['false'],
add_local_ids=['project-name:4, project-name:5'])
url = self.servlet.ProcessFormData(self.mr, post_data)
self.assertTrue('u/222/hotlists/hotlist' in url)
self.assertEqual(len(self.test_hotlist.items), 5)
self.assertEqual(
self.test_hotlist.items[3].issue_id, issue4.issue_id)
self.assertEqual(
self.test_hotlist.items[4].issue_id, issue5.issue_id)
post_data = fake.PostData(remove=['true'], remove_local_ids=[
'project-name:4, project-name:1, project-name:2'])
url = self.servlet.ProcessFormData(self.mr, post_data)
self.assertTrue('u/222/hotlists/hotlist' in url)
self.assertTrue(len(self.test_hotlist.items), 2)
issue_ids = [issue.issue_id for issue in self.test_hotlist.items]
self.assertTrue(issue5.issue_id in issue_ids)
self.assertTrue(self.issue3.issue_id in issue_ids)
def testProcessFormData_NoPermissions(self):
post_data = fake.PostData(remove=['false'],
add_local_ids=['project-name:4, project-name:5'])
self.mr.auth.effective_ids = {333}
self.mr.auth.user_id = 333
with self.assertRaises(permissions.PermissionException):
self.servlet.ProcessFormData(self.mr, post_data)