| # 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. |
| |
| """Classes and functions that implement command-line-like issue updates.""" |
| from __future__ import print_function |
| from __future__ import division |
| from __future__ import absolute_import |
| |
| import logging |
| import unittest |
| |
| from features import commands |
| from framework import framework_constants |
| from mrproto import tracker_pb2 |
| from services import service_manager |
| from testing import fake |
| from tracker import tracker_bizobj |
| from tracker import tracker_constants |
| |
| |
| class CommandsTest(unittest.TestCase): |
| |
| def VerifyParseQuickEditCommmand( |
| self, cmd, exp_summary='sum', exp_status='New', exp_owner_id=111, |
| exp_cc_ids=None, exp_labels=None): |
| |
| issue = tracker_pb2.Issue() |
| issue.project_name = 'proj' |
| issue.local_id = 1 |
| issue.summary = 'sum' |
| issue.status = 'New' |
| issue.owner_id = 111 |
| issue.cc_ids.extend([222, 333]) |
| issue.labels.extend(['Type-Defect', 'Priority-Medium', 'Hot']) |
| |
| if exp_cc_ids is None: |
| exp_cc_ids = [222, 333] |
| if exp_labels is None: |
| exp_labels = ['Type-Defect', 'Priority-Medium', 'Hot'] |
| |
| config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| logged_in_user_id = 999 |
| services = service_manager.Services( |
| config=fake.ConfigService(), |
| issue=fake.IssueService(), |
| user=fake.UserService()) |
| services.user.TestAddUser('jrobbins', 333) |
| services.user.TestAddUser('jrobbins@jrobbins.org', 888) |
| |
| cnxn = 'fake cnxn' |
| (summary, status, owner_id, cc_ids, |
| labels) = commands.ParseQuickEditCommand( |
| cnxn, cmd, issue, config, logged_in_user_id, services) |
| self.assertEqual(exp_summary, summary) |
| self.assertEqual(exp_status, status) |
| self.assertEqual(exp_owner_id, owner_id) |
| self.assertListEqual(exp_cc_ids, cc_ids) |
| self.assertListEqual(exp_labels, labels) |
| |
| def testParseQuickEditCommmand_Empty(self): |
| self.VerifyParseQuickEditCommmand('') # Nothing should change. |
| |
| def testParseQuickEditCommmand_BuiltInFields(self): |
| self.VerifyParseQuickEditCommmand( |
| 'status=Fixed', exp_status='Fixed') |
| self.VerifyParseQuickEditCommmand( # Normalized capitalization. |
| 'status=fixed', exp_status='Fixed') |
| self.VerifyParseQuickEditCommmand( |
| 'status=limbo', exp_status='limbo') |
| |
| self.VerifyParseQuickEditCommmand( |
| 'owner=me', exp_owner_id=999) |
| self.VerifyParseQuickEditCommmand( |
| 'owner=jrobbins@jrobbins.org', exp_owner_id=888) |
| self.VerifyParseQuickEditCommmand( |
| 'owner=----', exp_owner_id=framework_constants.NO_USER_SPECIFIED) |
| |
| self.VerifyParseQuickEditCommmand( |
| 'summary=JustOneWord', exp_summary='JustOneWord') |
| self.VerifyParseQuickEditCommmand( |
| 'summary="quoted sentence"', exp_summary='quoted sentence') |
| self.VerifyParseQuickEditCommmand( |
| "summary='quoted sentence'", exp_summary='quoted sentence') |
| |
| self.VerifyParseQuickEditCommmand( |
| 'cc=me', exp_cc_ids=[222, 333, 999]) |
| self.VerifyParseQuickEditCommmand( |
| 'cc=jrobbins@jrobbins.org', exp_cc_ids=[222, 333, 888]) |
| self.VerifyParseQuickEditCommmand( |
| 'cc=me,jrobbins@jrobbins.org', |
| exp_cc_ids=[222, 333, 999, 888]) |
| self.VerifyParseQuickEditCommmand( |
| 'cc=-jrobbins,jrobbins@jrobbins.org', |
| exp_cc_ids=[222, 888]) |
| |
| def testParseQuickEditCommmand_Labels(self): |
| self.VerifyParseQuickEditCommmand( |
| 'Priority=Low', exp_labels=['Type-Defect', 'Hot', 'Priority-Low']) |
| self.VerifyParseQuickEditCommmand( |
| 'priority=low', exp_labels=['Type-Defect', 'Hot', 'Priority-Low']) |
| self.VerifyParseQuickEditCommmand( |
| 'priority-low', exp_labels=['Type-Defect', 'Hot', 'Priority-Low']) |
| self.VerifyParseQuickEditCommmand( |
| '-priority-low', exp_labels=['Type-Defect', 'Priority-Medium', 'Hot']) |
| self.VerifyParseQuickEditCommmand( |
| '-priority-medium', exp_labels=['Type-Defect', 'Hot']) |
| |
| self.VerifyParseQuickEditCommmand( |
| 'Cold', exp_labels=['Type-Defect', 'Priority-Medium', 'Hot', 'Cold']) |
| self.VerifyParseQuickEditCommmand( |
| '+Cold', exp_labels=['Type-Defect', 'Priority-Medium', 'Hot', 'Cold']) |
| self.VerifyParseQuickEditCommmand( |
| '-Hot Cold', exp_labels=['Type-Defect', 'Priority-Medium', 'Cold']) |
| self.VerifyParseQuickEditCommmand( |
| '-Hot', exp_labels=['Type-Defect', 'Priority-Medium']) |
| |
| def testParseQuickEditCommmand_Multiple(self): |
| self.VerifyParseQuickEditCommmand( |
| 'Priority=Low -hot owner:me cc:-jrobbins summary="other summary"', |
| exp_summary='other summary', exp_owner_id=999, |
| exp_cc_ids=[222], exp_labels=['Type-Defect', 'Priority-Low']) |
| |
| def testBreakCommandIntoParts_Empty(self): |
| self.assertListEqual( |
| [], |
| commands._BreakCommandIntoParts('')) |
| |
| def testBreakCommandIntoParts_Single(self): |
| self.assertListEqual( |
| [('summary', 'new summary')], |
| commands._BreakCommandIntoParts('summary="new summary"')) |
| self.assertListEqual( |
| [('summary', 'OneWordSummary')], |
| commands._BreakCommandIntoParts('summary=OneWordSummary')) |
| self.assertListEqual( |
| [('key', 'value')], |
| commands._BreakCommandIntoParts('key=value')) |
| self.assertListEqual( |
| [('key', 'value-with-dashes')], |
| commands._BreakCommandIntoParts('key=value-with-dashes')) |
| self.assertListEqual( |
| [('key', 'value')], |
| commands._BreakCommandIntoParts('key:value')) |
| self.assertListEqual( |
| [('key', 'value')], |
| commands._BreakCommandIntoParts(' key:value ')) |
| self.assertListEqual( |
| [('key', 'value')], |
| commands._BreakCommandIntoParts('key:"value"')) |
| self.assertListEqual( |
| [('key', 'user@dom.com')], |
| commands._BreakCommandIntoParts('key:user@dom.com')) |
| self.assertListEqual( |
| [('key', 'a@dom.com,-b@dom.com')], |
| commands._BreakCommandIntoParts('key:a@dom.com,-b@dom.com')) |
| self.assertListEqual( |
| [(None, 'label')], |
| commands._BreakCommandIntoParts('label')) |
| self.assertListEqual( |
| [(None, '-label')], |
| commands._BreakCommandIntoParts('-label')) |
| self.assertListEqual( |
| [(None, '+label')], |
| commands._BreakCommandIntoParts('+label')) |
| |
| def testBreakCommandIntoParts_Multiple(self): |
| self.assertListEqual( |
| [('summary', 'new summary'), (None, 'Hot'), (None, '-Cold'), |
| ('owner', 'me'), ('cc', '+a,-b')], |
| commands._BreakCommandIntoParts( |
| 'summary="new summary" Hot -Cold owner:me cc:+a,-b')) |
| |
| |
| class CommandSyntaxParsingTest(unittest.TestCase): |
| |
| def setUp(self): |
| self.services = service_manager.Services( |
| project=fake.ProjectService(), |
| config=fake.ConfigService(), |
| user=fake.UserService()) |
| |
| self.services.project.TestAddProject('proj', owner_ids=[111]) |
| self.services.user.TestAddUser('a@example.com', 222) |
| |
| cnxn = 'fake connection' |
| config = self.services.config.GetProjectConfig(cnxn, 789) |
| |
| for status in ['New', 'ReadyForReview']: |
| config.well_known_statuses.append(tracker_pb2.StatusDef( |
| status=status)) |
| |
| for label in ['Prioity-Low', 'Priority-High']: |
| config.well_known_labels.append(tracker_pb2.LabelDef( |
| label=label)) |
| |
| config.exclusive_label_prefixes.extend( |
| tracker_constants.DEFAULT_EXCL_LABEL_PREFIXES) |
| |
| self.services.config.StoreConfig(cnxn, config) |
| |
| def testStandardizeStatus(self): |
| config = self.services.config.GetProjectConfig('fake cnxn', 789) |
| self.assertEqual('New', |
| commands._StandardizeStatus('NEW', config)) |
| self.assertEqual('New', |
| commands._StandardizeStatus('n$Ew ', config)) |
| self.assertEqual( |
| 'custom-label', |
| commands._StandardizeLabel('custom=label ', config)) |
| |
| def testStandardizeLabel(self): |
| config = self.services.config.GetProjectConfig('fake cnxn', 789) |
| self.assertEqual( |
| 'Priority-High', |
| commands._StandardizeLabel('priority-high', config)) |
| self.assertEqual( |
| 'Priority-High', |
| commands._StandardizeLabel('PRIORITY=HIGH', config)) |
| |
| def testLookupMeOrUsername(self): |
| self.assertEqual( |
| 123, |
| commands._LookupMeOrUsername('fake cnxn', 'me', self.services, 123)) |
| |
| self.assertEqual( |
| 222, |
| commands._LookupMeOrUsername( |
| 'fake cnxn', 'a@example.com', self.services, 0)) |