| Index: appengine/monorail/services/test/api_pb2_v1_helpers_test.py
|
| diff --git a/appengine/monorail/services/test/api_pb2_v1_helpers_test.py b/appengine/monorail/services/test/api_pb2_v1_helpers_test.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1a64d9cf8ad189728ed72fd1697beb563b3000a6
|
| --- /dev/null
|
| +++ b/appengine/monorail/services/test/api_pb2_v1_helpers_test.py
|
| @@ -0,0 +1,333 @@
|
| +# Copyright 2016 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is govered by a BSD-style
|
| +# license that can be found in the LICENSE file or at
|
| +# https://developers.google.com/open-source/licenses/bsd
|
| +
|
| +"""Tests for the API v1 helpers."""
|
| +
|
| +import datetime
|
| +import mock
|
| +import unittest
|
| +
|
| +from framework import permissions
|
| +from services import api_pb2_v1_helpers
|
| +from services import service_manager
|
| +from proto import api_pb2_v1
|
| +from proto import project_pb2
|
| +from proto import tracker_pb2
|
| +from proto import usergroup_pb2
|
| +from testing import fake
|
| +
|
| +
|
| +def MakeTemplate(prefix):
|
| + return tracker_pb2.TemplateDef(
|
| + name='%s-template' % prefix,
|
| + content='%s-content' % prefix,
|
| + summary='%s-summary' % prefix,
|
| + summary_must_be_edited=True,
|
| + status='New',
|
| + labels=['%s-label1' % prefix, '%s-label2' % prefix],
|
| + members_only=True,
|
| + owner_defaults_to_member=True,
|
| + component_required=True,
|
| + )
|
| +
|
| +
|
| +def MakeLabel(prefix):
|
| + return tracker_pb2.LabelDef(
|
| + label='%s-label' % prefix,
|
| + label_docstring='%s-description' % prefix
|
| + )
|
| +
|
| +
|
| +def MakeStatus(prefix):
|
| + return tracker_pb2.StatusDef(
|
| + status='%s-New' % prefix,
|
| + means_open=True,
|
| + status_docstring='%s-status' % prefix
|
| + )
|
| +
|
| +
|
| +def MakeProjectIssueConfig(prefix):
|
| + return tracker_pb2.ProjectIssueConfig(
|
| + restrict_to_known=True,
|
| + default_col_spec='ID Type Priority Summary',
|
| + default_sort_spec='ID Priority',
|
| + well_known_statuses=[
|
| + MakeStatus('%s-status1' % prefix),
|
| + MakeStatus('%s-status2' % prefix),
|
| + ],
|
| + well_known_labels=[
|
| + MakeLabel('%s-label1' % prefix),
|
| + MakeLabel('%s-label2' % prefix),
|
| + ],
|
| + templates=[
|
| + MakeTemplate('%s-template1' % prefix),
|
| + MakeTemplate('%s-template2' % prefix),
|
| + ],
|
| + default_template_for_developers=1,
|
| + default_template_for_users=2
|
| + )
|
| +
|
| +
|
| +def MakeProject(prefix):
|
| + return project_pb2.MakeProject(
|
| + project_name='%s-project' % prefix,
|
| + summary='%s-summary' % prefix,
|
| + description='%s-description' % prefix,
|
| + )
|
| +
|
| +
|
| +class ApiV1HelpersTest(unittest.TestCase):
|
| +
|
| + def testConvertTemplate(self):
|
| + """Test convert_template."""
|
| + template = MakeTemplate('test')
|
| + prompt = api_pb2_v1_helpers.convert_template(template)
|
| + self.assertEquals(template.name, prompt.name)
|
| + self.assertEquals(template.summary, prompt.title)
|
| + self.assertEquals(template.content, prompt.description)
|
| + self.assertEquals(
|
| + template.summary_must_be_edited, prompt.titleMustBeEdited)
|
| + self.assertEquals(template.status, prompt.status)
|
| + self.assertEquals(template.labels, prompt.labels)
|
| + self.assertEquals(template.members_only, prompt.membersOnly)
|
| + self.assertEquals(
|
| + template.owner_defaults_to_member, prompt.defaultToMember)
|
| + self.assertEquals(template.component_required, prompt.componentRequired)
|
| +
|
| + def testConvertLabel(self):
|
| + """Test convert_label."""
|
| + labeldef = MakeLabel('test')
|
| + label = api_pb2_v1_helpers.convert_label(labeldef)
|
| + self.assertEquals(labeldef.label, label.label)
|
| + self.assertEquals(labeldef.label_docstring, label.description)
|
| +
|
| + def testConvertStatus(self):
|
| + """Test convert_status."""
|
| + statusdef = MakeStatus('test')
|
| + status = api_pb2_v1_helpers.convert_status(statusdef)
|
| + self.assertEquals(statusdef.status, status.status)
|
| + self.assertEquals(statusdef.means_open, status.meansOpen)
|
| + self.assertEquals(statusdef.status_docstring, status.description)
|
| +
|
| + def testConvertProjectIssueConfig(self):
|
| + """Test convert_project_config."""
|
| + config = MakeProjectIssueConfig('test')
|
| + config_api = api_pb2_v1_helpers.convert_project_config(config)
|
| + self.assertEquals(config.restrict_to_known, config_api.restrictToKnown)
|
| + self.assertEquals(
|
| + config.default_col_spec.split(), config_api.defaultColumns)
|
| + self.assertEquals(
|
| + config.default_sort_spec.split(), config_api.defaultSorting)
|
| + self.assertEquals(2, len(config_api.statuses))
|
| + self.assertEquals(2, len(config_api.labels))
|
| + self.assertEquals(2, len(config_api.prompts))
|
| + self.assertEquals(
|
| + config.default_template_for_developers,
|
| + config_api.defaultPromptForMembers)
|
| + self.assertEquals(
|
| + config.default_template_for_users,
|
| + config_api.defaultPromptForNonMembers)
|
| +
|
| + def testConvertProject(self):
|
| + """Test convert_project."""
|
| + project = MakeProject('testprj')
|
| + config = MakeProjectIssueConfig('testconfig')
|
| + role = api_pb2_v1.Role.owner
|
| + project_api = api_pb2_v1_helpers.convert_project(project, config, role)
|
| + self.assertEquals(project.project_name, project_api.name)
|
| + self.assertEquals(project.project_name, project_api.externalId)
|
| + self.assertEquals('/p/%s/' % project.project_name, project_api.htmlLink)
|
| + self.assertEquals(project.summary, project_api.summary)
|
| + self.assertEquals(project.description, project_api.description)
|
| + self.assertEquals(role, project_api.role)
|
| + self.assertIsInstance(
|
| + project_api.issuesConfig, api_pb2_v1.ProjectIssueConfig)
|
| +
|
| + def testConvertPerson(self):
|
| + """Test convert_person."""
|
| + svcs = service_manager.Services()
|
| + svcs.user = fake.UserService()
|
| + svcs.user.TestAddUser('user@example.com', 1)
|
| + result = api_pb2_v1_helpers.convert_person(1, None, svcs)
|
| + self.assertIsInstance(result, api_pb2_v1.AtomPerson)
|
| + self.assertEquals('user@example.com', result.name)
|
| +
|
| + def testConvertIssueIDs(self):
|
| + """Test convert_issue_ids."""
|
| + svcs = service_manager.Services()
|
| + svcs.issue = fake.IssueService()
|
| + issue1 = fake.MakeTestIssue(789, 1, 'one', 'New', 111L)
|
| + svcs.issue.TestAddIssue(issue1)
|
| + issue_ids = [100001]
|
| + mar = mock.Mock()
|
| + mar.cnxn = None
|
| + mar.project_name = 'test-project'
|
| + result = api_pb2_v1_helpers.convert_issue_ids(issue_ids, mar, svcs)
|
| + self.assertEquals(1, len(result))
|
| + self.assertEquals(1, result[0].issueId)
|
| +
|
| + def testConvertIssueRef(self):
|
| + """Test convert_issueref_pbs."""
|
| + svcs = service_manager.Services()
|
| + svcs.issue = fake.IssueService()
|
| + issue1 = fake.MakeTestIssue(12345, 1, 'one', 'New', 111L)
|
| + svcs.issue.TestAddIssue(issue1)
|
| + svcs.project = fake.ProjectService()
|
| + svcs.project.TestAddProject(
|
| + 'test-project', owner_ids=[2],
|
| + project_id=12345)
|
| + mar = mock.Mock()
|
| + mar.cnxn = None
|
| + mar.project_name = 'test-project'
|
| + mar.project_id = 12345
|
| + ir = api_pb2_v1.IssueRef(
|
| + issueId=1,
|
| + projectId='test-project'
|
| + )
|
| + result = api_pb2_v1_helpers.convert_issueref_pbs([ir], mar, svcs)
|
| + self.assertEquals(1, len(result))
|
| + self.assertEquals(100001, result[0])
|
| +
|
| + def testConvertAttachment(self):
|
| + """Test convert_attachment."""
|
| +
|
| + attachment = tracker_pb2.Attachment(
|
| + attachment_id=1,
|
| + filename='stats.txt',
|
| + filesize=12345,
|
| + mimetype='text/plain',
|
| + deleted=False)
|
| +
|
| + result = api_pb2_v1_helpers.convert_attachment(attachment)
|
| + self.assertEquals(attachment.attachment_id, result.attachmentId)
|
| + self.assertEquals(attachment.filename, result.fileName)
|
| + self.assertEquals(attachment.filesize, result.fileSize)
|
| + self.assertEquals(attachment.mimetype, result.mimetype)
|
| + self.assertEquals(attachment.deleted, result.isDeleted)
|
| +
|
| + def testConvertAmendments(self):
|
| + """Test convert_amendments."""
|
| +
|
| + svcs = service_manager.Services()
|
| + svcs.user = fake.UserService()
|
| + svcs.user.TestAddUser('user@example.com', 1)
|
| + svcs.user.TestAddUser('user2@example.com', 2)
|
| + mar = mock.Mock()
|
| + mar.cnxn = None
|
| + issue = mock.Mock()
|
| + issue.project_name = 'test-project'
|
| +
|
| + amendment_summary = tracker_pb2.Amendment(
|
| + field=tracker_pb2.FieldID.SUMMARY,
|
| + newvalue='new summary')
|
| + amendment_status = tracker_pb2.Amendment(
|
| + field=tracker_pb2.FieldID.STATUS,
|
| + newvalue='new status')
|
| + amendment_owner = tracker_pb2.Amendment(
|
| + field=tracker_pb2.FieldID.OWNER,
|
| + added_user_ids=[1])
|
| + amendment_labels = tracker_pb2.Amendment(
|
| + field=tracker_pb2.FieldID.LABELS,
|
| + newvalue='label1 -label2')
|
| + amendment_cc_add = tracker_pb2.Amendment(
|
| + field=tracker_pb2.FieldID.CC,
|
| + added_user_ids=[1])
|
| + amendment_cc_remove = tracker_pb2.Amendment(
|
| + field=tracker_pb2.FieldID.CC,
|
| + removed_user_ids=[2])
|
| + amendment_blockedon = tracker_pb2.Amendment(
|
| + field=tracker_pb2.FieldID.BLOCKEDON,
|
| + newvalue='1')
|
| + amendment_blocking = tracker_pb2.Amendment(
|
| + field=tracker_pb2.FieldID.BLOCKING,
|
| + newvalue='other:2 -3')
|
| + amendment_mergedinto = tracker_pb2.Amendment(
|
| + field=tracker_pb2.FieldID.MERGEDINTO,
|
| + newvalue='4')
|
| + amendments = [
|
| + amendment_summary, amendment_status, amendment_owner,
|
| + amendment_labels, amendment_cc_add, amendment_cc_remove,
|
| + amendment_blockedon, amendment_blocking, amendment_mergedinto]
|
| +
|
| + result = api_pb2_v1_helpers.convert_amendments(
|
| + issue, amendments, mar, svcs)
|
| + self.assertEquals(amendment_summary.newvalue, result.summary)
|
| + self.assertEquals(amendment_status.newvalue, result.status)
|
| + self.assertEquals('user@example.com', result.owner)
|
| + self.assertEquals(['label1', '-label2'], result.labels)
|
| + self.assertEquals(['user@example.com', '-user2@example.com'], result.cc)
|
| + self.assertEquals(['test-project:1'], result.blockedOn)
|
| + self.assertEquals(['other:2', '-test-project:3'], result.blocking)
|
| + self.assertEquals(amendment_mergedinto.newvalue, result.mergedInto)
|
| +
|
| + def testConvertComment(self):
|
| + """Test convert_comment."""
|
| +
|
| + svcs = service_manager.Services()
|
| + svcs.user = fake.UserService()
|
| + svcs.user.TestAddUser('user@example.com', 1)
|
| + mar = mock.Mock()
|
| + mar.cnxn = None
|
| + issue = fake.MakeTestIssue(project_id=12345, local_id=1, summary='sum',
|
| + status='New', owner_id=1001)
|
| +
|
| + comment = tracker_pb2.IssueComment(
|
| + user_id=1,
|
| + content='test content',
|
| + sequence=1,
|
| + deleted_by=1,
|
| + timestamp=1437700000,
|
| + )
|
| + result = api_pb2_v1_helpers.convert_comment(
|
| + issue, comment, mar, svcs, None)
|
| + self.assertEquals('user@example.com', result.author.name)
|
| + self.assertEquals(comment.content, result.content)
|
| + self.assertEquals('user@example.com', result.deletedBy.name)
|
| + self.assertEquals(1, result.id)
|
| + # Ensure that the published timestamp falls in a timestamp range to account
|
| + # for the test being run in different timezones.
|
| + # Using "Fri, 23 Jul 2015 00:00:00" and "Fri, 25 Jul 2015 00:00:00".
|
| + self.assertTrue(
|
| + datetime.datetime(2015, 7, 23, 0, 0, 0) <= result.published <=
|
| + datetime.datetime(2015, 7, 25, 0, 0, 0))
|
| +
|
| + def testSplitRemoveAdd(self):
|
| + """Test split_remove_add."""
|
| +
|
| + items = ['1', '-2', '-3', '4']
|
| + list_to_add, list_to_remove = api_pb2_v1_helpers.split_remove_add(items)
|
| +
|
| + self.assertEquals(['1', '4'], list_to_add)
|
| + self.assertEquals(['2', '3'], list_to_remove)
|
| +
|
| + def testIssueGlobalIDs(self):
|
| + """Test issue_global_ids."""
|
| +
|
| + svcs = service_manager.Services()
|
| + svcs.issue = fake.IssueService()
|
| + issue1 = fake.MakeTestIssue(12345, 1, 'one', 'New', 111L)
|
| + svcs.issue.TestAddIssue(issue1)
|
| + svcs.project = fake.ProjectService()
|
| + svcs.project.TestAddProject(
|
| + 'test-project', owner_ids=[2],
|
| + project_id=12345)
|
| + mar = mock.Mock()
|
| + mar.cnxn = None
|
| + mar.project_name = 'test-project'
|
| + mar.project_id = 12345
|
| + pairs = ['test-project:1']
|
| + result = api_pb2_v1_helpers.issue_global_ids(pairs, 12345, mar, svcs)
|
| + self.assertEquals(100001, result[0])
|
| +
|
| + def testConvertGroupSettings(self):
|
| + """Test convert_group_settings."""
|
| +
|
| + setting = usergroup_pb2.MakeSettings('owners', 'mdb', 0)
|
| + result = api_pb2_v1_helpers.convert_group_settings('test-group', setting)
|
| + self.assertEquals('test-group', result.groupName)
|
| + self.assertEquals(
|
| + setting.who_can_view_members, result.who_can_view_members)
|
| + self.assertEquals(setting.ext_group_type, result.ext_group_type)
|
| + self.assertEquals(setting.last_sync_time, result.last_sync_time)
|
|
|