Skip to content

Commit dba27a9

Browse files
authored
Generated test and impl for client factory function (#246)
1 parent 4cd8f5b commit dba27a9

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

packages/gapic-generator/gapic/templates/$namespace/$name_$version/$sub/services/$service/client.py.j2

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ from google.api_core import exceptions # type: ignore
99
from google.api_core import gapic_v1 # type: ignore
1010
from google.api_core import retry as retries # type: ignore
1111
from google.auth import credentials # type: ignore
12-
12+
from google.oauth2 import service_account # type: ignore
13+
1314
{% filter sort_lines -%}
1415
{% for method in service.methods.values() -%}
1516
{% for ref_type in method.ref_types_legacy -%}
@@ -54,6 +55,29 @@ class {{ service.client_name }}Meta(type):
5455

5556
class {{ service.client_name }}(metaclass={{ service.client_name }}Meta):
5657
"""{{ service.meta.doc|rst(width=72, indent=4) }}"""
58+
59+
@classmethod
60+
def from_service_account_file(cls, filename: str, *args, **kwargs):
61+
"""Creates an instance of this client using the provided credentials
62+
file.
63+
64+
Args:
65+
filename (str): The path to the service account private key json
66+
file.
67+
args: Additional arguments to pass to the constructor.
68+
kwargs: Additional arguments to pass to the constructor.
69+
70+
Returns:
71+
{@api.name}: The constructed client.
72+
"""
73+
credentials = service_account.Credentials.from_service_account_file(
74+
filename)
75+
kwargs['credentials'] = credentials
76+
return cls(*args, **kwargs)
77+
78+
from_service_account_json = from_service_account_file
79+
80+
5781
def __init__(self, *,
5882
host: str{% if service.host %} = '{{ service.host }}'{% endif %},
5983
credentials: credentials.Credentials = None,

packages/gapic-generator/gapic/templates/tests/unit/$name_$version/$sub/test_$service.py.j2

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import pytest
1111
{% filter sort_lines -%}
1212
from google import auth
1313
from google.auth import credentials
14+
from google.oauth2 import service_account
1415
from {{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }} import {{ service.client_name }}
1516
from {{ (api.naming.module_namespace + (api.naming.versioned_module_name,) + service.meta.address.subpackage)|join(".") }}.services.{{ service.name|snake_case }} import transports
1617
{% if service.has_lro -%}
@@ -26,6 +27,17 @@ from google.longrunning import operations_pb2
2627
{% endfilter %}
2728

2829

30+
def test_{{ service.client_name|snake_case }}_from_service_account_file():
31+
creds = credentials.AnonymousCredentials()
32+
with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory:
33+
factory.return_value = creds
34+
client = {{ service.client_name }}.from_service_account_file("dummy/file/path.json")
35+
assert client._transport._credentials == creds
36+
37+
client = {{ service.client_name }}.from_service_account_json("dummy/file/path.json")
38+
assert client._transport._credentials == creds
39+
40+
2941
{% for method in service.methods.values() -%}
3042
def test_{{ method.name|snake_case }}(transport: str = 'grpc'):
3143
client = {{ service.client_name }}(

0 commit comments

Comments
 (0)