blob: 5e9f488eaec08763a6398dbd35ecade988ce01fd [file] [log] [blame]
# Copyright 2018 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 services.template_svc module."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import mock
import unittest
from mock import Mock, patch
from mrproto import tracker_pb2
from services import template_svc
from testing import fake
from testing import testing_helpers
from tracker import tracker_bizobj
from tracker import tracker_constants
class TemplateSetTwoLevelCacheTest(unittest.TestCase):
def setUp(self):
self.ts2lc = template_svc.TemplateSetTwoLevelCache(
cache_manager=fake.CacheManager(),
template_service=Mock(spec=template_svc.TemplateService))
self.ts2lc.template_service.template_tbl = Mock()
def testFetchItems_Empty(self):
self.ts2lc.template_service.template_tbl.Select .return_value = []
actual = self.ts2lc.FetchItems(cnxn=None, keys=[1, 2])
self.assertEqual({1: [], 2: []}, actual)
def testFetchItems_Normal(self):
# pylint: disable=unused-argument
def mockSelect(cnxn, cols, project_id, order_by):
assert project_id in (1, 2)
if project_id == 1:
return [
(8, 1, 'template-8', 'content', 'summary', False, 111, 'status',
False, False, False),
(9, 1, 'template-9', 'content', 'summary', False, 111, 'status',
True, False, False)]
else:
return [
(7, 2, 'template-7', 'content', 'summary', False, 111, 'status',
False, False, False)]
self.ts2lc.template_service.template_tbl.Select.side_effect = mockSelect
actual = self.ts2lc.FetchItems(cnxn=None, keys=[1, 2])
expected = {
1: [(8, 'template-8', False), (9, 'template-9', True)],
2: [(7, 'template-7', False)],
}
self.assertEqual(expected, actual)
class TemplateDefTwoLevelCacheTest(unittest.TestCase):
def setUp(self):
self.template_def_2lc = template_svc.TemplateDefTwoLevelCache(
cache_manager=fake.CacheManager(),
template_service=Mock(spec=template_svc.TemplateService))
self.template_def_2lc.template_service.template_tbl = Mock()
self.template_def_2lc.template_service.template2label_tbl = Mock()
self.template_def_2lc.template_service.template2component_tbl = Mock()
self.template_def_2lc.template_service.template2admin_tbl = Mock()
self.template_def_2lc.template_service.template2fieldvalue_tbl = Mock()
self.template_def_2lc.template_service.issuephasedef_tbl = Mock()
self.template_def_2lc.template_service.template2approvalvalue_tbl = Mock()
def testFetchItems_Empty(self):
self.template_def_2lc.template_service.template_tbl.Select\
.return_value = []
self.template_def_2lc.template_service.template2label_tbl.Select\
.return_value = []
self.template_def_2lc.template_service.template2component_tbl.Select\
.return_value = []
self.template_def_2lc.template_service.template2admin_tbl.Select\
.return_value = []
self.template_def_2lc.template_service.template2fieldvalue_tbl.Select\
.return_value = []
self.template_def_2lc.template_service.template2approvalvalue_tbl.Select\
.return_value = []
actual = self.template_def_2lc.FetchItems(cnxn=None, keys=[1, 2])
self.assertEqual({}, actual)
def testFetchItems_Normal(self):
template_9_row = (9, 1, 'template-9', 'content', 'summary',
False, 111, 'status',
False, False, False)
template_8_row = (8, 1, 'template-8', 'content', 'summary',
False, 111, 'status',
False, False, False)
template_7_row = (7, 2, 'template-7', 'content', 'summary',
False, 111, 'status',
False, False, False)
self.template_def_2lc.template_service.template_tbl.Select\
.return_value = [template_7_row, template_8_row,
template_9_row]
self.template_def_2lc.template_service.template2label_tbl.Select\
.return_value = [(9, 'label-1'), (7, 'label-2')]
self.template_def_2lc.template_service.template2component_tbl.Select\
.return_value = [(9, 13), (7, 14)]
self.template_def_2lc.template_service.template2admin_tbl.Select\
.return_value = [(9, 111), (7, 222)]
fv1_row = (15, None, 'fv-1', None, None, None, False)
fv2_row = (16, None, 'fv-2', None, None, None, False)
fv1 = tracker_bizobj.MakeFieldValue(*fv1_row)
fv2 = tracker_bizobj.MakeFieldValue(*fv2_row)
self.template_def_2lc.template_service.template2fieldvalue_tbl.Select\
.return_value = [((9,) + fv1_row[:-1]), ((7,) + fv2_row[:-1])]
av1_row = (17, 9, 19, 'na')
av2_row = (18, 7, 20, 'not_set')
av1 = tracker_pb2.ApprovalValue(approval_id=17, phase_id=19,
status=tracker_pb2.ApprovalStatus('NA'))
av2 = tracker_pb2.ApprovalValue(approval_id=18, phase_id=20,
status=tracker_pb2.ApprovalStatus(
'NOT_SET'))
phase1_row = (19, 'phase-1', 1)
phase2_row = (20, 'phase-2', 2)
phase1 = tracker_pb2.Phase(phase_id=19, name='phase-1', rank=1)
phase2 = tracker_pb2.Phase(phase_id=20, name='phase-2', rank=2)
self.template_def_2lc.template_service.template2approvalvalue_tbl.Select\
.return_value = [av1_row, av2_row]
self.template_def_2lc.template_service.issuephasedef_tbl.Select\
.return_value = [phase1_row, phase2_row]
actual = self.template_def_2lc.FetchItems(cnxn=None, keys=[7, 8, 9])
self.assertEqual(3, len(list(actual.keys())))
self.assertTrue(isinstance(actual[7], tracker_pb2.TemplateDef))
self.assertTrue(isinstance(actual[8], tracker_pb2.TemplateDef))
self.assertTrue(isinstance(actual[9], tracker_pb2.TemplateDef))
self.assertEqual(7, actual[7].template_id)
self.assertEqual(8, actual[8].template_id)
self.assertEqual(9, actual[9].template_id)
self.assertEqual(['label-2'], actual[7].labels)
self.assertEqual([], actual[8].labels)
self.assertEqual(['label-1'], actual[9].labels)
self.assertEqual([14], actual[7].component_ids)
self.assertEqual([], actual[8].component_ids)
self.assertEqual([13], actual[9].component_ids)
self.assertEqual([222], actual[7].admin_ids)
self.assertEqual([], actual[8].admin_ids)
self.assertEqual([111], actual[9].admin_ids)
self.assertEqual([fv2], actual[7].field_values)
self.assertEqual([], actual[8].field_values)
self.assertEqual([fv1], actual[9].field_values)
self.assertEqual([phase2], actual[7].phases)
self.assertEqual([], actual[8].phases)
self.assertEqual([phase1], actual[9].phases)
self.assertEqual([av2], actual[7].approval_values)
self.assertEqual([], actual[8].approval_values)
self.assertEqual([av1], actual[9].approval_values)
class TemplateServiceTest(unittest.TestCase):
def setUp(self):
self.cnxn = Mock()
self.template_service = template_svc.TemplateService(fake.CacheManager())
self.template_service.template_set_2lc = Mock()
self.template_service.template_def_2lc = Mock()
def testCreateDefaultProjectTemplates_Normal(self):
self.template_service.CreateIssueTemplateDef = Mock()
self.template_service.CreateDefaultProjectTemplates(self.cnxn, 789)
expected_calls = [
mock.call(self.cnxn, 789, tpl['name'], tpl['content'], tpl['summary'],
tpl['summary_must_be_edited'], tpl['status'],
tpl.get('members_only', False), True, False, None, tpl['labels'],
[], [], [], [])
for tpl in tracker_constants.DEFAULT_TEMPLATES]
self.template_service.CreateIssueTemplateDef.assert_has_calls(
expected_calls, any_order=True)
def testGetTemplateByName_Normal(self):
"""GetTemplateByName returns a template that exists."""
result_dict = {789: [(1, 'one', 0)]}
template = tracker_pb2.TemplateDef(name='one')
self.template_service.template_set_2lc.GetAll.return_value = (
result_dict, None)
self.template_service.template_def_2lc.GetAll.return_value = (
{1: template}, None)
actual = self.template_service.GetTemplateByName(self.cnxn, 'one', 789)
self.assertEqual(actual.template_id, template.template_id)
def testGetTemplateByName_NotFound(self):
"""When GetTemplateByName is given the name of a template that does not
exist."""
result_dict = {789: [(1, 'one', 0)]}
template = tracker_pb2.TemplateDef(name='one')
self.template_service.template_set_2lc.GetAll.return_value = (
result_dict, None)
self.template_service.template_def_2lc.GetAll.return_value = (
{1: template}, None)
actual = self.template_service.GetTemplateByName(self.cnxn, 'two', 789)
self.assertEqual(actual, None)
def testGetTemplateById_Normal(self):
"""GetTemplateById_Normal returns a template that exists."""
template = tracker_pb2.TemplateDef(template_id=1, name='one')
self.template_service.template_def_2lc.GetAll.return_value = (
{1: template}, None)
actual = self.template_service.GetTemplateById(self.cnxn, 1)
self.assertEqual(actual.template_id, template.template_id)
def testGetTemplateById_NotFound(self):
"""When GetTemplateById is given the ID of a template that does not
exist."""
self.template_service.template_def_2lc.GetAll.return_value = (
{}, None)
actual = self.template_service.GetTemplateById(self.cnxn, 1)
self.assertEqual(actual, None)
def testGetTemplatesById_Normal(self):
"""GetTemplatesById_Normal returns a template that exists."""
template = tracker_pb2.TemplateDef(template_id=1, name='one')
self.template_service.template_def_2lc.GetAll.return_value = (
{1: template}, None)
actual = self.template_service.GetTemplatesById(self.cnxn, 1)
self.assertEqual(actual[0].template_id, template.template_id)
def testGetTemplatesById_NotFound(self):
"""When GetTemplatesById is given the ID of a template that does not
exist."""
self.template_service.template_def_2lc.GetAll.return_value = (
{}, None)
actual = self.template_service.GetTemplatesById(self.cnxn, 1)
self.assertEqual(actual, [])
def testGetProjectTemplates_Normal(self):
template_set = [(1, 'one', 0), (2, 'two', 1)]
result_dict = {789: template_set}
self.template_service.template_set_2lc.GetAll.return_value = (
result_dict, None)
self.template_service.template_def_2lc.GetAll.return_value = (
{1: tracker_pb2.TemplateDef()}, None)
self.assertEqual([tracker_pb2.TemplateDef()],
self.template_service.GetProjectTemplates(self.cnxn, 789))
self.template_service.template_set_2lc.GetAll.assert_called_once_with(
self.cnxn, [789])
def testExpungeProjectTemplates(self):
template_id_rows = [(1,), (2,)]
self.template_service.template_tbl.Select = Mock(
return_value=template_id_rows)
self.template_service.template2label_tbl.Delete = Mock()
self.template_service.template2component_tbl.Delete = Mock()
self.template_service.template_tbl.Delete = Mock()
self.template_service.ExpungeProjectTemplates(self.cnxn, 789)
self.template_service.template_tbl.Select\
.assert_called_once_with(self.cnxn, project_id=789, cols=['id'])
self.template_service.template2label_tbl.Delete\
.assert_called_once_with(self.cnxn, template_id=[1, 2])
self.template_service.template2component_tbl.Delete\
.assert_called_once_with(self.cnxn, template_id=[1, 2])
self.template_service.template_tbl.Delete\
.assert_called_once_with(self.cnxn, project_id=789)
class CreateIssueTemplateDefTest(TemplateServiceTest):
def setUp(self):
super(CreateIssueTemplateDefTest, self).setUp()
self.template_service.template_tbl.InsertRow = Mock(return_value=1)
self.template_service.template2label_tbl.InsertRows = Mock()
self.template_service.template2component_tbl.InsertRows = Mock()
self.template_service.template2admin_tbl.InsertRows = Mock()
self.template_service.template2fieldvalue_tbl.InsertRows = Mock()
self.template_service.issuephasedef_tbl.InsertRow = Mock(return_value=81)
self.template_service.template2approvalvalue_tbl.InsertRows = Mock()
self.template_service.template_set_2lc._StrToKey = Mock(return_value=789)
def testCreateIssueTemplateDef(self):
fv = tracker_bizobj.MakeFieldValue(
1, None, 'somestring', None, None, None, False)
av_23 = tracker_pb2.ApprovalValue(
approval_id=23, phase_id=11,
status=tracker_pb2.ApprovalStatus.NEEDS_REVIEW)
av_24 = tracker_pb2.ApprovalValue(approval_id=24, phase_id=11)
approval_values = [av_23, av_24]
phases = [tracker_pb2.Phase(
name='Canary', rank=11, phase_id=11)]
actual_template_id = self.template_service.CreateIssueTemplateDef(
self.cnxn, 789, 'template', 'content', 'summary', True, 'Available',
True, True, True, owner_id=111, labels=['label'], component_ids=[3],
admin_ids=[222], field_values=[fv], phases=phases,
approval_values=approval_values)
self.assertEqual(1, actual_template_id)
self.template_service.template_tbl.InsertRow\
.assert_called_once_with(self.cnxn, project_id=789, name='template',
content='content', summary='summary', summary_must_be_edited=True,
owner_id=111, status='Available', members_only=True,
owner_defaults_to_member=True, component_required=True,
commit=False)
self.template_service.template2label_tbl.InsertRows\
.assert_called_once_with(self.cnxn, template_svc.TEMPLATE2LABEL_COLS,
[(1, 'label')], commit=False)
self.template_service.template2component_tbl.InsertRows\
.assert_called_once_with(self.cnxn,
template_svc.TEMPLATE2COMPONENT_COLS,
[(1, 3)], commit=False)
self.template_service.template2admin_tbl.InsertRows\
.assert_called_once_with(self.cnxn, template_svc.TEMPLATE2ADMIN_COLS,
[(1, 222)], commit=False)
self.template_service.template2fieldvalue_tbl.InsertRows\
.assert_called_once_with(self.cnxn,
template_svc.TEMPLATE2FIELDVALUE_COLS,
[(1, 1, None, 'somestring', None, None, None)], commit=False)
self.template_service.issuephasedef_tbl.InsertRow\
.assert_called_once_with(self.cnxn, name='Canary',
rank=11, commit=False)
self.template_service.template2approvalvalue_tbl.InsertRows\
.assert_called_once_with(self.cnxn,
template_svc.TEMPLATE2APPROVALVALUE_COLS,
[(23, 1, 81, 'needs_review'), (24, 1, 81, 'not_set')], commit=False)
self.cnxn.Commit.assert_called_once_with()
self.template_service.template_set_2lc.InvalidateKeys\
.assert_called_once_with(self.cnxn, [789])
class UpdateIssueTemplateDefTest(TemplateServiceTest):
def setUp(self):
super(UpdateIssueTemplateDefTest, self).setUp()
self.template_service.template_tbl.Update = Mock()
self.template_service.template2label_tbl.Delete = Mock()
self.template_service.template2label_tbl.InsertRows = Mock()
self.template_service.template2admin_tbl.Delete = Mock()
self.template_service.template2admin_tbl.InsertRows = Mock()
self.template_service.template2approvalvalue_tbl.Delete = Mock()
self.template_service.issuephasedef_tbl.InsertRow = Mock(return_value=1)
self.template_service.template2approvalvalue_tbl.InsertRows = Mock()
self.template_service.template_set_2lc._StrToKey = Mock(return_value=789)
def testUpdateIssueTemplateDef(self):
av_20 = tracker_pb2.ApprovalValue(approval_id=20, phase_id=11)
av_21 = tracker_pb2.ApprovalValue(approval_id=21, phase_id=11)
approval_values = [av_20, av_21]
phases = [tracker_pb2.Phase(
name='Canary', phase_id=11, rank=11)]
self.template_service.UpdateIssueTemplateDef(
self.cnxn, 789, 1, content='content', summary='summary',
component_required=True, labels=[], admin_ids=[111],
phases=phases, approval_values=approval_values)
new_values = dict(
content='content', summary='summary', component_required=True)
self.template_service.template_tbl.Update\
.assert_called_once_with(self.cnxn, new_values, id=1, commit=False)
self.template_service.template2label_tbl.Delete\
.assert_called_once_with(self.cnxn, template_id=1, commit=False)
self.template_service.template2label_tbl.InsertRows\
.assert_called_once_with(self.cnxn, template_svc.TEMPLATE2LABEL_COLS,
[], commit=False)
self.template_service.template2admin_tbl.Delete\
.assert_called_once_with(self.cnxn, template_id=1, commit=False)
self.template_service.template2admin_tbl.InsertRows\
.assert_called_once_with(self.cnxn, template_svc.TEMPLATE2ADMIN_COLS,
[(1, 111)], commit=False)
self.template_service.template2approvalvalue_tbl.Delete\
.assert_called_once_with(self.cnxn, template_id=1, commit=False)
self.template_service.issuephasedef_tbl.InsertRow\
.assert_called_once_with(self.cnxn, name='Canary',
rank=11, commit=False)
self.template_service.template2approvalvalue_tbl.InsertRows\
.assert_called_once_with(self.cnxn,
template_svc.TEMPLATE2APPROVALVALUE_COLS,
[(20, 1, 1, 'not_set'), (21, 1, 1, 'not_set')], commit=False)
self.cnxn.Commit.assert_called_once_with()
self.template_service.template_set_2lc.InvalidateKeys\
.assert_called_once_with(self.cnxn, [789])
self.template_service.template_def_2lc.InvalidateKeys\
.assert_called_once_with(self.cnxn, [1])
class DeleteTemplateTest(TemplateServiceTest):
def testDeleteIssueTemplateDef(self):
self.template_service.template2label_tbl.Delete = Mock()
self.template_service.template2component_tbl.Delete = Mock()
self.template_service.template2admin_tbl.Delete = Mock()
self.template_service.template2fieldvalue_tbl.Delete = Mock()
self.template_service.template2approvalvalue_tbl.Delete = Mock()
self.template_service.template_tbl.Delete = Mock()
self.template_service.template_set_2lc._StrToKey = Mock(return_value=789)
self.template_service.DeleteIssueTemplateDef(self.cnxn, 789, 1)
self.template_service.template2label_tbl.Delete\
.assert_called_once_with(self.cnxn, template_id=1, commit=False)
self.template_service.template2component_tbl.Delete\
.assert_called_once_with(self.cnxn, template_id=1, commit=False)
self.template_service.template2admin_tbl.Delete\
.assert_called_once_with(self.cnxn, template_id=1, commit=False)
self.template_service.template2fieldvalue_tbl.Delete\
.assert_called_once_with(self.cnxn, template_id=1, commit=False)
self.template_service.template2approvalvalue_tbl.Delete\
.assert_called_once_with(self.cnxn, template_id=1, commit=False)
self.template_service.template_tbl.Delete\
.assert_called_once_with(self.cnxn, id=1, commit=False)
self.cnxn.Commit.assert_called_once_with()
self.template_service.template_set_2lc.InvalidateKeys\
.assert_called_once_with(self.cnxn, [789])
self.template_service.template_def_2lc.InvalidateKeys\
.assert_called_once_with(self.cnxn, [1])
class ExpungeUsersInTemplatesTest(TemplateServiceTest):
def setUp(self):
super(ExpungeUsersInTemplatesTest, self).setUp()
self.template_service.template2admin_tbl.Delete = Mock()
self.template_service.template2fieldvalue_tbl.Delete = Mock()
self.template_service.template_tbl.Update = Mock()
def testExpungeUsersInTemplates(self):
user_ids = [111, 222]
self.template_service.ExpungeUsersInTemplates(self.cnxn, user_ids, limit=60)
self.template_service.template2admin_tbl.Delete.assert_called_once_with(
self.cnxn, admin_id=user_ids, commit=False, limit=60)
self.template_service.template2fieldvalue_tbl\
.Delete.assert_called_once_with(
self.cnxn, user_id=user_ids, commit=False, limit=60)
self.template_service.template_tbl.Update.assert_called_once_with(
self.cnxn, {'owner_id': None}, owner_id=user_ids, commit=False)
class UnpackTemplateTest(unittest.TestCase):
def testEmpty(self):
with self.assertRaises(ValueError):
template_svc.UnpackTemplate(())
def testNormal(self):
row = (1, 2, 'name', 'content', 'summary', False, 3, 'status', False,
False, False)
self.assertEqual(
tracker_pb2.TemplateDef(template_id=1, name='name',
content='content', summary='summary', summary_must_be_edited=False,
owner_id=3, status='status', members_only=False,
owner_defaults_to_member=False,
component_required=False),
template_svc.UnpackTemplate(row))