blob: eed69576fc65988085c85cc5446f1bfa89154875 [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.
"""Tests for converting between resource names and external ids."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
from mock import Mock, patch
import unittest
import re
from api import resource_name_converters as rnc
from framework import exceptions
from testing import fake
from services import service_manager
from mrproto import tracker_pb2
class ResourceNameConverterTest(unittest.TestCase):
def setUp(self):
self.services = service_manager.Services(
issue=fake.IssueService(),
project=fake.ProjectService(),
user=fake.UserService(),
features=fake.FeaturesService(),
template=fake.TemplateService(),
config=fake.ConfigService())
self.cnxn = fake.MonorailConnection()
self.PAST_TIME = 12345
self.project_1 = self.services.project.TestAddProject(
'proj', project_id=789)
self.project_2 = self.services.project.TestAddProject(
'goose', project_id=788)
self.dne_project_id = 1999
self.issue_1 = fake.MakeTestIssue(
self.project_1.project_id, 1, 'sum', 'New', 111,
project_name=self.project_1.project_name)
self.issue_2 = fake.MakeTestIssue(
self.project_2.project_id, 2, 'sum', 'New', 111,
project_name=self.project_2.project_name)
self.services.issue.TestAddIssue(self.issue_1)
self.services.issue.TestAddIssue(self.issue_2)
self.user_1 = self.services.user.TestAddUser('user_111@example.com', 111)
self.user_2 = self.services.user.TestAddUser('user_222@example.com', 222)
self.user_3 = self.services.user.TestAddUser('user_333@example.com', 333)
hotlist_items = [
(self.issue_1.issue_id, 9, self.user_2.user_id, self.PAST_TIME, 'note'),
(self.issue_2.issue_id, 1, self.user_1.user_id, self.PAST_TIME, 'note')]
self.hotlist_1 = self.services.features.TestAddHotlist(
'HotlistName', owner_ids=[], editor_ids=[],
hotlist_item_fields=hotlist_items)
self.template_1 = self.services.template.TestAddIssueTemplateDef(
1, self.project_1.project_id, 'template_1_name')
self.template_2 = self.services.template.TestAddIssueTemplateDef(
2, self.project_2.project_id, 'template_2_name')
self.dne_template_id = 3
self.field_def_1_name = 'test_field'
self.field_def_1 = self.services.config.CreateFieldDef(
self.cnxn, self.project_1.project_id, self.field_def_1_name, 'STR_TYPE',
None, None, None, None, None, None, None, None, None, None, None, None,
None, None, [], [])
self.approval_def_1_name = 'approval_field_1'
self.approval_def_1_id = self.services.config.CreateFieldDef(
self.cnxn, self.project_1.project_id, self.approval_def_1_name,
'APPROVAL_TYPE', None, None, None, None, None, None, None, None, None,
None, None, None, None, None, [], [])
self.component_def_1_path = 'Foo'
self.component_def_1_id = self.services.config.CreateComponentDef(
self.cnxn, self.project_1.project_id, self.component_def_1_path, '',
False, [], [], None, 111, [])
self.component_def_2_path = 'Foo>Bar>Hey123_I-am-valid'
self.component_def_2_id = self.services.config.CreateComponentDef(
self.cnxn, self.project_1.project_id, self.component_def_2_path, '',
False, [], [], None, 111, [])
self.component_def_3_path = 'Fizz'
self.component_def_3_id = self.services.config.CreateComponentDef(
self.cnxn, self.project_2.project_id, self.component_def_3_path, '',
False, [], [], None, 111, [])
self.dne_component_def_id = 999
self.dne_field_def_id = 999999
self.psq_1 = tracker_pb2.SavedQuery(
query_id=2, name='psq1 name', base_query_id=1, query='foo=bar')
self.psq_2 = tracker_pb2.SavedQuery(
query_id=3, name='psq2 name', base_query_id=1, query='fizz=buzz')
self.dne_psq_id = 987
self.services.features.UpdateCannedQueries(
self.cnxn, self.project_1.project_id, [self.psq_1, self.psq_2])
def testGetResourceNameMatch(self):
"""We can get a resource name match."""
regex = re.compile(r'name\/(?P<group_name>[a-z]+)$')
match = rnc._GetResourceNameMatch('name/honque', regex)
self.assertEqual(match.group('group_name'), 'honque')
def testGetResouceNameMatch_InvalidName(self):
"""An exception is raised if there is not match."""
regex = re.compile(r'name\/(?P<group_name>[a-z]+)$')
with self.assertRaises(exceptions.InputException):
rnc._GetResourceNameMatch('honque/honque', regex)
def testIngestApprovalDefName(self):
approval_id = rnc.IngestApprovalDefName(
self.cnxn, 'projects/proj/approvalDefs/123', self.services)
self.assertEqual(approval_id, 123)
def testIngestApprovalDefName_InvalidName(self):
with self.assertRaises(exceptions.InputException):
rnc.IngestApprovalDefName(
self.cnxn, 'projects/proj/approvalDefs/123d', self.services)
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.IngestApprovalDefName(
self.cnxn, 'projects/garbage/approvalDefs/123', self.services)
def testIngestFieldDefName(self):
"""We can get a FieldDef's resource name match."""
self.assertEqual(
rnc.IngestFieldDefName(
self.cnxn, 'projects/proj/fieldDefs/123', self.services),
(789, 123))
def testIngestFieldDefName_InvalidName(self):
"""An exception is raised if the FieldDef's resource name is invalid"""
with self.assertRaises(exceptions.InputException):
rnc.IngestFieldDefName(
self.cnxn, 'projects/proj/fieldDefs/7Dog', self.services)
with self.assertRaises(exceptions.InputException):
rnc.IngestFieldDefName(
self.cnxn, 'garbage/proj/fieldDefs/123', self.services)
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.IngestFieldDefName(
self.cnxn, 'projects/garbage/fieldDefs/123', self.services)
def testIngestHotlistName(self):
"""We can get a Hotlist's resource name match."""
self.assertEqual(rnc.IngestHotlistName('hotlists/78909'), 78909)
def testIngestHotlistName_InvalidName(self):
"""An exception is raised if the Hotlist's resource name is invalid"""
with self.assertRaises(exceptions.InputException):
rnc.IngestHotlistName('hotlists/789honk789')
def testIngestHotlistItemNames(self):
"""We can get Issue IDs from HotlistItems resource names."""
names = [
'hotlists/78909/items/proj.1',
'hotlists/78909/items/goose.2']
self.assertEqual(
rnc.IngestHotlistItemNames(self.cnxn, names, self.services),
[self.issue_1.issue_id, self.issue_2.issue_id])
def testIngestHotlistItemNames_ProjectNotFound(self):
"""Exception is raised if a project is not found."""
names = [
'hotlists/78909/items/proj.1',
'hotlists/78909/items/chicken.2']
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.IngestHotlistItemNames(self.cnxn, names, self.services)
def testIngestHotlistItemNames_MultipleProjectsNotFound(self):
"""Aggregated exceptions raised if projects are not found."""
names = [
'hotlists/78909/items/proj.1', 'hotlists/78909/items/chicken.2',
'hotlists/78909/items/cow.3'
]
with self.assertRaisesRegex(exceptions.NoSuchProjectException,
'Project chicken not found.\n' +
'Project cow not found.'):
rnc.IngestHotlistItemNames(self.cnxn, names, self.services)
def testIngestHotlistItems_IssueNotFound(self):
"""Exception is raised if an Issue is not found."""
names = [
'hotlists/78909/items/proj.1',
'hotlists/78909/items/goose.5']
with self.assertRaisesRegex(exceptions.NoSuchIssueException, '%r' % names):
rnc.IngestHotlistItemNames(self.cnxn, names, self.services)
def testConvertHotlistName(self):
"""We can get a Hotlist's resource name."""
self.assertEqual(rnc.ConvertHotlistName(10), 'hotlists/10')
def testConvertHotlistItemNames(self):
"""We can get Hotlist items' resource names."""
expected_dict = {
self.hotlist_1.items[0].issue_id:
'hotlists/%d/items/proj.1' % self.hotlist_1.hotlist_id,
self.hotlist_1.items[1].issue_id:
'hotlists/%d/items/goose.2' % self.hotlist_1.hotlist_id,
}
self.assertEqual(
rnc.ConvertHotlistItemNames(
self.cnxn, self.hotlist_1.hotlist_id, expected_dict.keys(),
self.services), expected_dict)
def testIngestApprovalValueName(self):
project_id, issue_id, approval_def_id = rnc.IngestApprovalValueName(
self.cnxn, 'projects/proj/issues/1/approvalValues/404', self.services)
self.assertEqual(project_id, self.project_1.project_id)
self.assertEqual(issue_id, self.issue_1.issue_id)
self.assertEqual(404, approval_def_id) # We don't verify it exists.
def testIngestApprovalValueName_ProjectDoesNotExist(self):
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.IngestApprovalValueName(
self.cnxn, 'projects/noproj/issues/1/approvalValues/1', self.services)
def testIngestApprovalValueName_IssueDoesNotExist(self):
with self.assertRaisesRegex(exceptions.NoSuchIssueException,
'projects/proj/issues/404'):
rnc.IngestApprovalValueName(
self.cnxn, 'projects/proj/issues/404/approvalValues/1', self.services)
def testIngestApprovalValueName_InvalidStart(self):
with self.assertRaises(exceptions.InputException):
rnc.IngestApprovalValueName(
self.cnxn, 'zprojects/proj/issues/1/approvalValues/1', self.services)
def testIngestApprovalValueName_InvalidEnd(self):
with self.assertRaises(exceptions.InputException):
rnc.IngestApprovalValueName(
self.cnxn, 'projects/proj/issues/1/approvalValues/1z', self.services)
def testIngestApprovalValueName_InvalidCollection(self):
with self.assertRaises(exceptions.InputException):
rnc.IngestApprovalValueName(
self.cnxn, 'projects/proj/issues/1/approvalValue/1', self.services)
def testIngestIssueName(self):
"""We can get an Issue global id from its resource name."""
self.assertEqual(
rnc.IngestIssueName(self.cnxn, 'projects/proj/issues/1', self.services),
self.issue_1.issue_id)
def testIngestIssueName_ProjectDoesNotExist(self):
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.IngestIssueName(self.cnxn, 'projects/noproj/issues/1', self.services)
def testIngestIssueName_IssueDoesNotExist(self):
with self.assertRaises(exceptions.NoSuchIssueException):
rnc.IngestIssueName(self.cnxn, 'projects/proj/issues/2', self.services)
def testIngestIssueName_InvalidLocalId(self):
"""Issue resource name Local IDs are digits."""
with self.assertRaises(exceptions.InputException):
rnc.IngestIssueName(self.cnxn, 'projects/proj/issues/x', self.services)
def testIngestIssueName_InvalidProjectId(self):
"""Project names are more than 1 character."""
with self.assertRaises(exceptions.InputException):
rnc.IngestIssueName(self.cnxn, 'projects/p/issues/1', self.services)
def testIngestIssueName_InvalidFormat(self):
"""Issue resource names must begin with the project resource name."""
with self.assertRaises(exceptions.InputException):
rnc.IngestIssueName(self.cnxn, 'issues/1', self.services)
def testIngestIssueName_Moved(self):
"""We can get a moved issue."""
moved_to_project_id = 987
self.services.project.TestAddProject(
'other', project_id=moved_to_project_id)
new_issue_id = 1010
issue = fake.MakeTestIssue(
moved_to_project_id, 200, 'sum', 'New', 111, issue_id=new_issue_id)
self.services.issue.TestAddIssue(issue)
self.services.issue.TestAddMovedIssueRef(
self.project_1.project_id, 404, moved_to_project_id, 200)
self.assertEqual(
rnc.IngestIssueName(
self.cnxn, 'projects/proj/issues/404', self.services), new_issue_id)
def testIngestIssueNames(self):
"""We can get an Issue global ids from resource names."""
self.assertEqual(
rnc.IngestIssueNames(
self.cnxn, ['projects/proj/issues/1', 'projects/goose/issues/2'],
self.services), [self.issue_1.issue_id, self.issue_2.issue_id])
def testIngestIssueNames_EmptyList(self):
"""We get an empty list when providing an empty list of issue names."""
self.assertEqual(rnc.IngestIssueNames(self.cnxn, [], self.services), [])
def testIngestIssueNames_WithBadInputs(self):
"""We aggregate input exceptions."""
with self.assertRaisesRegex(
exceptions.InputException,
'Invalid resource name: projects/proj/badformat/1.\n' +
'Invalid resource name: badformat/proj/issues/1.'):
rnc.IngestIssueNames(
self.cnxn, [
'projects/proj/badformat/1', 'badformat/proj/issues/1',
'projects/proj/issues/1'
], self.services)
def testIngestIssueNames_OneDoesNotExist(self):
"""We get an exception if one issue name provided does not exist."""
with self.assertRaises(exceptions.NoSuchIssueException):
rnc.IngestIssueNames(
self.cnxn, ['projects/proj/issues/1', 'projects/proj/issues/2'],
self.services)
def testIngestIssueNames_ManyDoNotExist(self):
"""We get an exception if one issue name provided does not exist."""
dne_issues = ['projects/proj/issues/2', 'projects/proj/issues/3']
with self.assertRaisesRegex(exceptions.NoSuchIssueException,
'%r' % dne_issues):
rnc.IngestIssueNames(self.cnxn, dne_issues, self.services)
def testIngestIssueNames_ProjectsNotExist(self):
"""Aggregated exceptions raised if projects are not found."""
with self.assertRaisesRegex(exceptions.NoSuchProjectException,
'Project chicken not found.\n' +
'Project cow not found.'):
rnc.IngestIssueNames(
self.cnxn, [
'projects/chicken/issues/2', 'projects/cow/issues/3',
'projects/proj/issues/1'
], self.services)
def testIngestProjectFromIssue(self):
self.assertEqual(rnc.IngestProjectFromIssue('projects/xyz/issues/1'), 'xyz')
def testIngestProjectFromIssue_InvalidName(self):
with self.assertRaises(exceptions.InputException):
rnc.IngestProjectFromIssue('projects/xyz')
with self.assertRaises(exceptions.InputException):
rnc.IngestProjectFromIssue('garbage')
with self.assertRaises(exceptions.InputException):
rnc.IngestProjectFromIssue('projects/xyz/issues/garbage')
def testIngestCommentName(self):
name = 'projects/proj/issues/1/comments/0'
actual = rnc.IngestCommentName(self.cnxn, name, self.services)
self.assertEqual(
actual, (self.project_1.project_id, self.issue_1.issue_id, 0))
def testIngestCommentName_InputException(self):
with self.assertRaises(exceptions.InputException):
rnc.IngestCommentName(self.cnxn, 'misspelled name', self.services)
def testIngestCommentName_NoSuchProject(self):
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.IngestCommentName(
self.cnxn, 'projects/doesnotexist/issues/1/comments/0', self.services)
def testIngestCommentName_NoSuchIssue(self):
with self.assertRaisesRegex(exceptions.NoSuchIssueException,
"['projects/proj/issues/404']"):
rnc.IngestCommentName(
self.cnxn, 'projects/proj/issues/404/comments/0', self.services)
def testConvertCommentNames(self):
"""We can create comment names."""
expected = {
0: 'projects/proj/issues/1/comments/0',
1: 'projects/proj/issues/1/comments/1'
}
self.assertEqual(rnc.CreateCommentNames(1, 'proj', [0, 1]), expected)
def testConvertCommentNames_Empty(self):
"""Converting an empty list of comments returns an empty dict."""
self.assertEqual(rnc.CreateCommentNames(1, 'proj', []), {})
def testConvertIssueName(self):
"""We can create an Issue resource name from an issue_id."""
self.assertEqual(
rnc.ConvertIssueName(self.cnxn, self.issue_1.issue_id, self.services),
'projects/proj/issues/1')
def testConvertIssueName_NotFound(self):
"""Exception is raised if the issue is not found."""
with self.assertRaises(exceptions.NoSuchIssueException):
rnc.ConvertIssueName(self.cnxn, 3279, self.services)
def testConvertIssueNames(self):
"""We can create Issue resource names from issue_ids."""
self.assertEqual(
rnc.ConvertIssueNames(
self.cnxn, [self.issue_1.issue_id, 3279], self.services),
{self.issue_1.issue_id: 'projects/proj/issues/1'})
def testConvertApprovalValueNames(self):
"""We can create ApprovalValue resource names."""
self.issue_1.approval_values = [tracker_pb2.ApprovalValue(
approval_id=self.approval_def_1_id)]
expected_name = (
'projects/proj/issues/1/approvalValues/%d' % self.approval_def_1_id)
self.assertEqual(
{self.approval_def_1_id: expected_name},
rnc.ConvertApprovalValueNames(
self.cnxn, self.issue_1.issue_id, self.services))
def testIngestUserName(self):
"""We can get a User ID from User resource name."""
name = 'users/111'
self.assertEqual(rnc.IngestUserName(self.cnxn, name, self.services), 111)
def testIngestUserName_DisplayName(self):
"""We can get a User ID from User resource name with a display name set."""
name = 'users/%s' % self.user_3.email
self.assertEqual(rnc.IngestUserName(self.cnxn, name, self.services), 333)
def testIngestUserName_NoSuchUser(self):
"""When autocreate=False, we raise an exception if a user is not found."""
name = 'users/chicken@test.com'
with self.assertRaises(exceptions.NoSuchUserException):
rnc.IngestUserName(self.cnxn, name, self.services)
def testIngestUserName_InvalidEmail(self):
"""We raise an exception if a given resource name's email is invalid."""
name = 'users/chickentest.com'
with self.assertRaises(exceptions.InputException):
rnc.IngestUserName(self.cnxn, name, self.services)
def testIngestUserName_Autocreate(self):
"""When autocreate=True create a new User if they don't already exist."""
new_email = 'chicken@test.com'
name = 'users/%s' % new_email
user_id = rnc.IngestUserName(
self.cnxn, name, self.services, autocreate=True)
new_id = self.services.user.LookupUserID(
self.cnxn, new_email, autocreate=False)
self.assertEqual(new_id, user_id)
def testIngestUserNames(self):
"""We can get User IDs from User resource names."""
names = ['users/111', 'users/222', 'users/%s' % self.user_3.email]
expected_ids = [111, 222, 333]
self.assertEqual(
rnc.IngestUserNames(self.cnxn, names, self.services), expected_ids)
def testIngestUserNames_NoSuchUser(self):
"""When autocreate=False, we raise an exception if a user is not found."""
names = [
'users/111', 'users/chicken@test.com',
'users/%s' % self.user_3.email
]
with self.assertRaises(exceptions.NoSuchUserException):
rnc.IngestUserNames(self.cnxn, names, self.services)
def testIngestUserNames_InvalidEmail(self):
"""We raise an exception if a given resource name's email is invalid."""
names = [
'users/111', 'users/chickentest.com',
'users/%s' % self.user_3.email
]
with self.assertRaises(exceptions.InputException):
rnc.IngestUserNames(self.cnxn, names, self.services)
def testIngestUserNames_Autocreate(self):
"""When autocreate=True we create new Users if they don't already exist."""
new_email = 'user_444@example.com'
names = [
'users/111',
'users/%s' % new_email,
'users/%s' % self.user_3.email
]
ids = rnc.IngestUserNames(self.cnxn, names, self.services, autocreate=True)
new_id = self.services.user.LookupUserID(
self.cnxn, new_email, autocreate=False)
expected_ids = [111, new_id, 333]
self.assertEqual(expected_ids, ids)
def testConvertUserName(self):
"""We can convert a single User ID to resource name."""
self.assertEqual(rnc.ConvertUserName(111), 'users/111')
def testConvertUserNames(self):
"""We can get User resource names."""
expected_dict = {111: 'users/111', 222: 'users/222', 333: 'users/333'}
self.assertEqual(rnc.ConvertUserNames(expected_dict.keys()), expected_dict)
def testConvertUserNames_Empty(self):
"""We can process an empty Users list."""
self.assertEqual(rnc.ConvertUserNames([]), {})
def testConvertProjectStarName(self):
"""We can convert a User ID and Project ID to resource name."""
name = rnc.ConvertProjectStarName(
self.cnxn, 111, self.project_1.project_id, self.services)
expected = 'users/111/projectStars/{}'.format(self.project_1.project_name)
self.assertEqual(name, expected)
def testConvertProjectStarName_NoSuchProjectException(self):
"""Throws an exception when Project ID is invalid."""
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertProjectStarName(self.cnxn, 111, 123455, self.services)
def testIngestProjectName(self):
"""We can get project name from Project resource names."""
name = 'projects/{}'.format(self.project_1.project_name)
expected = self.project_1.project_id
self.assertEqual(
rnc.IngestProjectName(self.cnxn, name, self.services), expected)
def testIngestProjectName_InvalidName(self):
"""An exception is raised if the Hotlist's resource name is invalid"""
with self.assertRaises(exceptions.InputException):
rnc.IngestProjectName(self.cnxn, 'projects/', self.services)
def testConvertTemplateNames(self):
"""We can get IssueTemplate resource names."""
expected_resource_name = 'projects/{}/templates/{}'.format(
self.project_1.project_name, self.template_1.template_id)
expected = {self.template_1.template_id: expected_resource_name}
self.assertEqual(
rnc.ConvertTemplateNames(
self.cnxn, self.project_1.project_id, [self.template_1.template_id],
self.services), expected)
def testConvertTemplateNames_NoSuchProjectException(self):
"""We get an exception if project with id does not exist."""
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertTemplateNames(
self.cnxn, self.dne_project_id, [self.template_1.template_id],
self.services)
def testConvertTemplateNames_NonExistentTemplate(self):
"""We only return templates that exist."""
self.assertEqual(
rnc.ConvertTemplateNames(
self.cnxn, self.project_1.project_id, [self.dne_template_id],
self.services), {})
def testConvertTemplateNames_TemplateInProject(self):
"""We only return templates in the project."""
expected_resource_name = 'projects/{}/templates/{}'.format(
self.project_2.project_name, self.template_2.template_id)
expected = {self.template_2.template_id: expected_resource_name}
self.assertEqual(
rnc.ConvertTemplateNames(
self.cnxn, self.project_2.project_id,
[self.template_1.template_id, self.template_2.template_id],
self.services), expected)
def testIngestTemplateName(self):
name = 'projects/{}/templates/{}'.format(
self.project_1.project_name, self.template_1.template_id)
actual = rnc.IngestTemplateName(self.cnxn, name, self.services)
expected = (self.template_1.template_id, self.project_1.project_id)
self.assertEqual(actual, expected)
def testIngestTemplateName_DoesNotExist(self):
"""We will ingest templates that don't exist."""
name = 'projects/{}/templates/{}'.format(
self.project_1.project_name, self.dne_template_id)
actual = rnc.IngestTemplateName(self.cnxn, name, self.services)
expected = (self.dne_template_id, self.project_1.project_id)
self.assertEqual(actual, expected)
def testIngestTemplateName_InvalidName(self):
with self.assertRaises(exceptions.InputException):
rnc.IngestTemplateName(
self.cnxn, 'projects/asdf/misspelled_template/123', self.services)
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.IngestTemplateName(
self.cnxn, 'projects/asdf/templates/123', self.services)
def testConvertStatusDefNames(self):
"""We can get Status resource name."""
expected_resource_name = 'projects/{}/statusDefs/{}'.format(
self.project_1.project_name, self.issue_1.status)
actual = rnc.ConvertStatusDefNames(
self.cnxn, [self.issue_1.status], self.project_1.project_id,
self.services)
self.assertEqual(actual[self.issue_1.status], expected_resource_name)
def testConvertStatusDefNames_NoSuchProjectException(self):
"""We can get an exception if project with id does not exist."""
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertStatusDefNames(
self.cnxn, [self.issue_1.status], self.dne_project_id, self.services)
def testConvertLabelDefNames(self):
"""We can get Label resource names."""
expected_label = 'some label'
expected_resource_name = 'projects/{}/labelDefs/{}'.format(
self.project_1.project_name, expected_label)
self.assertEqual(
rnc.ConvertLabelDefNames(
self.cnxn, [expected_label], self.project_1.project_id,
self.services), {expected_label: expected_resource_name})
def testConvertLabelDefNames_NoSuchProjectException(self):
"""We can get an exception if project with id does not exist."""
some_label = 'some label'
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertLabelDefNames(
self.cnxn, [some_label], self.dne_project_id, self.services)
def testConvertComponentDefNames(self):
"""We can get Component resource names."""
expected_id = 123456
expected_resource_name = 'projects/{}/componentDefs/{}'.format(
self.project_1.project_name, expected_id)
self.assertEqual(
rnc.ConvertComponentDefNames(
self.cnxn, [expected_id], self.project_1.project_id, self.services),
{expected_id: expected_resource_name})
def testConvertComponentDefNames_NoSuchProjectException(self):
"""We can get an exception if project with id does not exist."""
component_id = 123456
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertComponentDefNames(
self.cnxn, [component_id], self.dne_project_id, self.services)
def testIngestComponentDefNames(self):
names = [
'projects/proj/componentDefs/%d' % self.component_def_1_id,
'projects/proj/componentDefs/%s' % self.component_def_2_path
]
actual = rnc.IngestComponentDefNames(self.cnxn, names, self.services)
self.assertEqual(actual, [
(self.project_1.project_id, self.component_def_1_id),
(self.project_1.project_id, self.component_def_2_id)])
def testIngestComponentDefNames_NoSuchProjectException(self):
names = ['projects/xyz/componentDefs/%d' % self.component_def_1_id]
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.IngestComponentDefNames(self.cnxn, names, self.services)
names = ['projects/xyz/componentDefs/1', 'projects/zyz/componentDefs/1']
expected_error = 'Project not found: xyz.\nProject not found: zyz.'
with self.assertRaisesRegex(exceptions.NoSuchProjectException,
expected_error):
rnc.IngestComponentDefNames(self.cnxn, names, self.services)
def testIngestComponentDefNames_NoSuchComponentException(self):
names = ['projects/proj/componentDefs/%d' % self.dne_component_def_id]
with self.assertRaises(exceptions.NoSuchComponentException):
rnc.IngestComponentDefNames(self.cnxn, names, self.services)
names = [
'projects/proj/componentDefs/999', 'projects/proj/componentDefs/cow'
]
expected_error = 'Component not found: 999.\nComponent not found: \'cow\'.'
with self.assertRaisesRegex(exceptions.NoSuchComponentException,
expected_error):
rnc.IngestComponentDefNames(self.cnxn, names, self.services)
def testIngestComponentDefNames_InvalidNames(self):
with self.assertRaises(exceptions.InputException):
rnc.IngestComponentDefNames(
self.cnxn, ['projects/proj/componentDefs/not.path.or.id'],
self.services)
with self.assertRaises(exceptions.InputException):
rnc.IngestComponentDefNames(
self.cnxn, ['projects/proj/componentDefs/Foo>'], self.services)
with self.assertRaises(exceptions.InputException):
rnc.IngestComponentDefNames(
self.cnxn, ['projects/proj/componentDefs/>Bar'], self.services)
with self.assertRaises(exceptions.InputException):
rnc.IngestComponentDefNames(
self.cnxn, ['projects/proj/componentDefs/Foo>123Bar'], self.services)
def testIngestComponentDefNames_CrossProject(self):
names = [
'projects/proj/componentDefs/%d' % self.component_def_1_id,
'projects/goose/componentDefs/%s' % self.component_def_3_path
]
actual = rnc.IngestComponentDefNames(self.cnxn, names, self.services)
self.assertEqual(actual, [
(self.project_1.project_id, self.component_def_1_id),
(self.project_2.project_id, self.component_def_3_id)])
def testConvertFieldDefNames(self):
"""Returns resource names for fields that exist and ignores others."""
expected_key = self.field_def_1
expected_value = 'projects/{}/fieldDefs/{}'.format(
self.project_1.project_name, self.field_def_1)
field_ids = [self.field_def_1, self.dne_field_def_id]
self.assertEqual(
rnc.ConvertFieldDefNames(
self.cnxn, field_ids, self.project_1.project_id, self.services),
{expected_key: expected_value})
def testConvertFieldDefNames_NoSuchProjectException(self):
field_ids = [self.field_def_1, self.dne_field_def_id]
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertFieldDefNames(
self.cnxn, field_ids, self.dne_project_id, self.services)
def testConvertApprovalDefNames(self):
outcome = rnc.ConvertApprovalDefNames(
self.cnxn, [self.approval_def_1_id], self.project_1.project_id,
self.services)
expected_key = self.approval_def_1_id
expected_value = 'projects/{}/approvalDefs/{}'.format(
self.project_1.project_name, self.approval_def_1_id)
self.assertEqual(outcome, {expected_key: expected_value})
def testConvertApprovalDefNames_NoSuchProjectException(self):
approval_ids = [self.approval_def_1_id]
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertApprovalDefNames(
self.cnxn, approval_ids, self.dne_project_id, self.services)
def testConvertProjectName(self):
self.assertEqual(
rnc.ConvertProjectName(
self.cnxn, self.project_1.project_id, self.services),
'projects/{}'.format(self.project_1.project_name))
def testConvertProjectName_NoSuchProjectException(self):
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertProjectName(self.cnxn, self.dne_project_id, self.services)
def testConvertProjectConfigName(self):
self.assertEqual(
rnc.ConvertProjectConfigName(
self.cnxn, self.project_1.project_id, self.services),
'projects/{}/config'.format(self.project_1.project_name))
def testConvertProjectConfigName_NoSuchProjectException(self):
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertProjectConfigName(
self.cnxn, self.dne_project_id, self.services)
def testConvertProjectMemberName(self):
self.assertEqual(
rnc.ConvertProjectMemberName(
self.cnxn, self.project_1.project_id, 111, self.services),
'projects/{}/members/{}'.format(self.project_1.project_name, 111))
def testConvertProjectMemberName_NoSuchProjectException(self):
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertProjectMemberName(
self.cnxn, self.dne_project_id, 111, self.services)
def testConvertProjectSavedQueryNames(self):
query_ids = [self.psq_1.query_id, self.psq_2.query_id, self.dne_psq_id]
outcome = rnc.ConvertProjectSavedQueryNames(
self.cnxn, query_ids, self.project_1.project_id, self.services)
expected_value_1 = 'projects/{}/savedQueries/{}'.format(
self.project_1.project_name, self.psq_1.name)
expected_value_2 = 'projects/{}/savedQueries/{}'.format(
self.project_1.project_name, self.psq_2.name)
self.assertEqual(
outcome, {
self.psq_1.query_id: expected_value_1,
self.psq_2.query_id: expected_value_2
})
def testConvertProjectSavedQueryNames_NoSuchProjectException(self):
with self.assertRaises(exceptions.NoSuchProjectException):
rnc.ConvertProjectSavedQueryNames(
self.cnxn, [self.psq_1.query_id], self.dne_project_id, self.services)