@@ -1704,6 +1704,145 @@ async def test_{{ service.name|snake_case }}_{{ method.name|snake_case }}_rest_a
17041704 assert isinstance(result, {{ method.output.ident }})
17051705 assert result == expected_result
17061706{% endif %}
1707+
1708+
1709+ def test_{{ service.name|snake_case }}_{{ method.name|snake_case }}_rest_body_and_query_params():
1710+ client = {{ service.client_name }}(
1711+ credentials=ga_credentials.AnonymousCredentials(),
1712+ transport="rest",
1713+ )
1714+ with mock.patch.object(type(client.transport._session), "request") as req, mock.patch.object(
1715+ path_template, "transcode"
1716+ ) as transcode:
1717+ request = {{ method.input.ident }}(
1718+ {% for field in method .input .fields .values () | rejectattr ('message' ) %}
1719+ {% if not field .oneof or field .proto 3_optional %}
1720+ {{ field.name }}={{ field.mock_value }},
1721+ {% endif %}
1722+ {% endfor %}
1723+ )
1724+ {% if method .input .ident .is_proto_plus_type %}
1725+ pb_request = {{ method.input.ident }}.pb(request)
1726+ {% else %}
1727+ pb_request = request
1728+ {% endif %}
1729+ transcode.return_value = {
1730+ "uri": "v1/sample_method",
1731+ "method": "{{ method.http_options[0] .method }}",
1732+ "body": pb_request,
1733+ "query_params": pb_request,
1734+ }
1735+
1736+ start_response = mock.MagicMock()
1737+ start_response.ok = True
1738+ start_response.status_code = 200
1739+ start_response.headers = {"x-goog-upload-status": "active", "x-goog-upload-url": "http://localhost/upload"}
1740+ start_response.content = b""
1741+
1742+ expected_result = {{ method.output.ident }}()
1743+ {% if method .output .ident .is_proto_plus_type %}
1744+ json_return_value = {{ method.output.ident }}.to_json(expected_result)
1745+ {% else %}
1746+ json_return_value = json_format.MessageToJson(expected_result)
1747+ {% endif %}
1748+ upload_response = mock.MagicMock()
1749+ upload_response.ok = True
1750+ upload_response.status_code = 200
1751+ upload_response.headers = {"x-goog-upload-status": "final"}
1752+ upload_response.content = json_return_value.encode("UTF-8")
1753+
1754+ req.side_effect = [start_response, upload_response]
1755+ response = client.{{ method.client_method_name|snake_case }}(request)
1756+ result = response.upload(b"test data")
1757+ assert result == expected_result
1758+
1759+ start_call = req.call_args_list[0]
1760+ {% for field in method .input .fields .values () | rejectattr ('message' ) %}
1761+ {% if not field .oneof or field .proto 3_optional %}
1762+ assert "{{ field.name | camel_case }}=" in start_call.args[1]
1763+ {% endif %}
1764+ {% endfor %}
1765+ {% if method .http_options [0].body %}
1766+ expected_body = json_format.MessageToJson(
1767+ pb_request,
1768+ use_integers_for_enums={{ opts.rest_numeric_enums }},
1769+ )
1770+ assert start_call.kwargs["data"] == expected_body.encode("UTF-8")
1771+ {% endif %}
1772+
1773+
1774+ {% if rest_async_io_enabled %}
1775+ @pytest.mark.asyncio
1776+ async def test_{{ service.name|snake_case }}_{{ method.name|snake_case }}_rest_asyncio_body_and_query_params():
1777+ if not HAS_ASYNC_REST_EXTRA:
1778+ pytest.skip()
1779+ client = {{ service.async_client_name }}(
1780+ credentials=async_anonymous_credentials(),
1781+ transport="rest_asyncio",
1782+ )
1783+ with mock.patch.object(
1784+ type(client.transport._session), "request", new_callable=mock.MagicMock
1785+ ) as req, mock.patch.object(path_template, "transcode") as transcode:
1786+ request = {{ method.input.ident }}(
1787+ {% for field in method .input .fields .values () | rejectattr ('message' ) %}
1788+ {% if not field .oneof or field .proto 3_optional %}
1789+ {{ field.name }}={{ field.mock_value }},
1790+ {% endif %}
1791+ {% endfor %}
1792+ )
1793+ {% if method .input .ident .is_proto_plus_type %}
1794+ pb_request = {{ method.input.ident }}.pb(request)
1795+ {% else %}
1796+ pb_request = request
1797+ {% endif %}
1798+ transcode.return_value = {
1799+ "uri": "v1/sample_method",
1800+ "method": "{{ method.http_options[0] .method }}",
1801+ "body": pb_request,
1802+ "query_params": pb_request,
1803+ }
1804+
1805+ start_response = mock.MagicMock()
1806+ start_response.status = 200
1807+ start_response.headers = {"x-goog-upload-status": "active", "x-goog-upload-url": "http://localhost/upload"}
1808+ start_response.read = mock.AsyncMock(return_value=b"")
1809+ start_ctx = mock.MagicMock()
1810+ start_ctx.__aenter__ = mock.AsyncMock(return_value=start_response)
1811+ start_ctx.__aexit__ = mock.AsyncMock(return_value=None)
1812+
1813+ expected_result = {{ method.output.ident }}()
1814+ {% if method .output .ident .is_proto_plus_type %}
1815+ json_return_value = {{ method.output.ident }}.to_json(expected_result)
1816+ {% else %}
1817+ json_return_value = json_format.MessageToJson(expected_result)
1818+ {% endif %}
1819+ upload_response = mock.MagicMock()
1820+ upload_response.status = 200
1821+ upload_response.headers = {"x-goog-upload-status": "final"}
1822+ upload_response.read = mock.AsyncMock(return_value=json_return_value.encode("UTF-8"))
1823+ upload_ctx = mock.MagicMock()
1824+ upload_ctx.__aenter__ = mock.AsyncMock(return_value=upload_response)
1825+ upload_ctx.__aexit__ = mock.AsyncMock(return_value=None)
1826+
1827+ req.side_effect = [start_ctx, upload_ctx]
1828+ response = await client.{{ method.client_method_name|snake_case }}(request)
1829+ result = await response.upload(b"test data")
1830+ assert result == expected_result
1831+
1832+ start_call = req.call_args_list[0]
1833+ {% for field in method .input .fields .values () | rejectattr ('message' ) %}
1834+ {% if not field .oneof or field .proto 3_optional %}
1835+ assert "{{ field.name | camel_case }}=" in start_call.args[1]
1836+ {% endif %}
1837+ {% endfor %}
1838+ {% if method .http_options [0].body %}
1839+ expected_body = json_format.MessageToJson(
1840+ pb_request,
1841+ use_integers_for_enums={{ opts.rest_numeric_enums }},
1842+ )
1843+ assert start_call.kwargs["data"] == expected_body.encode("UTF-8")
1844+ {% endif %}
1845+ {% endif %}
17071846{% endfor %}
17081847{% endif %}
17091848
0 commit comments