From 1c9b1eeccd22385ec635fb561b8637fd75b8d147 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 14:07:28 -0700 Subject: [PATCH 01/21] chore: re-enable coverage --- .github/workflows/unittest.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index 83a8280132e9..18fef1472bae 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -46,7 +46,7 @@ jobs: - name: Upload coverage results uses: actions/upload-artifact@v4 with: - name: coverage-artifact-${{ '{{' }} matrix.python {{ '}}' }} + name: coverage-artifact-${{ matrix.python }} path: .coverage-${{ matrix.python }} cover: @@ -67,19 +67,22 @@ jobs: python-version: "3.10" - name: Set number of files changes in packages directory id: packages - run: echo "::set-output name=num_files_changed::$(git diff HEAD~1 -- packages | wc -l)" + run: | + git diff HEAD~1 -- packages > /dev/null + num_files_changed=$(git diff HEAD~1 -- packages | wc -l | tr -d ' ') + echo "num_files_changed=${num_files_changed}" >> "$GITHUB_OUTPUT" - name: Install coverage - if: steps.packages.num_files_changed > 0 + if: ${{ steps.packages.outputs.num_files_changed > 0 }} run: | python -m pip install --upgrade setuptools pip wheel python -m pip install coverage - name: Download coverage results - if: ${{ steps.date.packages.num_files_changed > 0 }} + if: ${{ steps.packages.outputs.num_files_changed > 0 }} uses: actions/download-artifact@v4 with: path: .coverage-results/ - name: Report coverage results - if: ${{ steps.date.packages.num_files_changed > 0 }} + if: ${{ steps.packages.outputs.num_files_changed > 0 }} run: | find .coverage-results -type f -name '*.zip' -exec unzip {} \; coverage combine .coverage-results/**/.coverage* From b2e474693e91a6b130e836166eb6b4ae349eefc7 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 14:08:07 -0700 Subject: [PATCH 02/21] touch bigtable --- packages/google-cloud-bigtable/EDIT | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/google-cloud-bigtable/EDIT diff --git a/packages/google-cloud-bigtable/EDIT b/packages/google-cloud-bigtable/EDIT new file mode 100644 index 000000000000..e69de29bb2d1 From e1b103d038994dc1f23fdca15b3983e05f6ab3bd Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 14:17:58 -0700 Subject: [PATCH 03/21] include hidden files --- .github/workflows/unittest.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index 18fef1472bae..847712bdd6a2 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -48,6 +48,7 @@ jobs: with: name: coverage-artifact-${{ matrix.python }} path: .coverage-${{ matrix.python }} + include-hidden-files: true cover: runs-on: ubuntu-latest From ae3411d7ba306e99e416a671611eb89861d755b2 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 14:18:17 -0700 Subject: [PATCH 04/21] change tested package --- .../EDIT => google-devicesandservices-health/touch.txt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/{google-cloud-bigtable/EDIT => google-devicesandservices-health/touch.txt} (100%) diff --git a/packages/google-cloud-bigtable/EDIT b/packages/google-devicesandservices-health/touch.txt similarity index 100% rename from packages/google-cloud-bigtable/EDIT rename to packages/google-devicesandservices-health/touch.txt From 32bc7b67fff270cdaef97b6ccefea9b544a87940 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 14:27:04 -0700 Subject: [PATCH 05/21] attempt cover fix --- .github/workflows/unittest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index 847712bdd6a2..c01f5ba5e73c 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -36,7 +36,7 @@ jobs: python -m pip install nox - name: Run unit tests env: - COVERAGE_FILE: .coverage-${{ matrix.python }} + COVERAGE_FILE: ${{ github.workspace }}/.coverage-${{ matrix.python }} BUILD_TYPE: presubmit TARGET_BRANCH: ${{ github.base_ref || github.event.merge_group.base_ref }} TEST_TYPE: unit From c242686427d2a0ff274b7b742bb571d8ae59eb45 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 14:46:19 -0700 Subject: [PATCH 06/21] update tests to resolve coverage issue --- .../unit/gapic/%name_%version/%sub/test_%service.py.j2 | 6 ++++++ .../tests/unit/gapic/%name_%version/%sub/test_macros.j2 | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/packages/gapic-generator/gapic/ads-templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 b/packages/gapic-generator/gapic/ads-templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 index e8953eb0742e..e6ffe31a47ae 100644 --- a/packages/gapic-generator/gapic/ads-templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 +++ b/packages/gapic-generator/gapic/ads-templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 @@ -965,6 +965,9 @@ def test_{{ method_name }}_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, {{ method.paged_result_field.type.ident }}) @@ -1738,6 +1741,9 @@ def test_{{ method_name }}_rest_pager(transport: str = 'rest'): pager = client.{{ method_name }}(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + {% if method.paged_result_field.map %} assert isinstance(pager.get('a'), {{ method.paged_result_field.type.fields.get('value').ident }}) assert pager.get('h') is None diff --git a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_macros.j2 b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_macros.j2 index a612b9397f65..bccc38afe2a1 100644 --- a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_macros.j2 +++ b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_macros.j2 @@ -746,6 +746,9 @@ def test_{{ method_name }}_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 {% if method.paged_result_field.type.ident|string == 'struct_pb2.ListValue' %} @@ -902,6 +905,8 @@ async def test_{{ method_name }}_async_pager(): ) async_pager = await client.{{ method_name }}(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -1425,6 +1430,9 @@ def test_{{ method_name }}_rest_pager(transport: str = 'rest'): pager = client.{{ method_name }}(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + {% if method.paged_result_field.map %} assert isinstance(pager.get('a'), {{ method.paged_result_field.type.fields.get('value').ident }}) assert pager.get('h') is None From ad4f014078376b8be825c0202ed53e4a41c1948d Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 16:09:00 -0700 Subject: [PATCH 07/21] attempted golden update --- .../unit/gapic/asset_v1/test_asset_service.py | 57 +++++++++++++++ .../unit/gapic/eventarc_v1/test_eventarc.py | 72 +++++++++++++++++++ .../logging_v2/test_config_service_v2.py | 25 +++++++ .../logging_v2/test_logging_service_v2.py | 15 ++++ .../logging_v2/test_metrics_service_v2.py | 5 ++ .../logging_v2/test_config_service_v2.py | 25 +++++++ .../logging_v2/test_logging_service_v2.py | 15 ++++ .../logging_v2/test_metrics_service_v2.py | 5 ++ .../unit/gapic/redis_v1/test_cloud_redis.py | 8 +++ .../unit/gapic/redis_v1/test_cloud_redis.py | 8 +++ .../test_storage_batch_operations.py | 16 +++++ 11 files changed, 251 insertions(+) diff --git a/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py b/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py index b6bbf1cdc830..c8f836ccc49e 100755 --- a/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py +++ b/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py @@ -1577,6 +1577,9 @@ def test_list_assets_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, assets.Asset) @@ -1663,7 +1666,10 @@ async def test_list_assets_async_pager(): ) async_pager = await client.list_assets(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] + async for response in async_pager: # pragma: no branch responses.append(response) @@ -3912,6 +3918,9 @@ def test_search_all_resources_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, assets.ResourceSearchResult) @@ -3998,6 +4007,8 @@ async def test_search_all_resources_async_pager(): ) async_pager = await client.search_all_resources(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -4431,6 +4442,9 @@ def test_search_all_iam_policies_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, assets.IamPolicySearchResult) @@ -4517,6 +4531,8 @@ async def test_search_all_iam_policies_async_pager(): ) async_pager = await client.search_all_iam_policies(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -6524,6 +6540,9 @@ def test_list_saved_queries_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, asset_service.SavedQuery) @@ -6610,6 +6629,8 @@ async def test_list_saved_queries_async_pager(): ) async_pager = await client.list_saved_queries(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -7908,6 +7929,9 @@ def test_analyze_org_policies_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, asset_service.AnalyzeOrgPoliciesResponse.OrgPolicyResult) @@ -7994,6 +8018,8 @@ async def test_analyze_org_policies_async_pager(): ) async_pager = await client.analyze_org_policies(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -8437,6 +8463,9 @@ def test_analyze_org_policy_governed_containers_pager(transport_name: str = "grp assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedContainersResponse.GovernedContainer) @@ -8523,6 +8552,8 @@ async def test_analyze_org_policy_governed_containers_async_pager(): ) async_pager = await client.analyze_org_policy_governed_containers(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -8966,6 +8997,9 @@ def test_analyze_org_policy_governed_assets_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedAssetsResponse.GovernedAsset) @@ -9052,6 +9086,8 @@ async def test_analyze_org_policy_governed_assets_async_pager(): ) async_pager = await client.analyze_org_policy_governed_assets(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -9442,6 +9478,9 @@ def test_list_assets_rest_pager(transport: str = 'rest'): pager = client.list_assets(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, assets.Asset) @@ -10616,6 +10655,9 @@ def test_search_all_resources_rest_pager(transport: str = 'rest'): pager = client.search_all_resources(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, assets.ResourceSearchResult) @@ -10848,6 +10890,9 @@ def test_search_all_iam_policies_rest_pager(transport: str = 'rest'): pager = client.search_all_iam_policies(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, assets.IamPolicySearchResult) @@ -11884,6 +11929,9 @@ def test_list_saved_queries_rest_pager(transport: str = 'rest'): pager = client.list_saved_queries(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, asset_service.SavedQuery) @@ -12581,6 +12629,9 @@ def test_analyze_org_policies_rest_pager(transport: str = 'rest'): pager = client.analyze_org_policies(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, asset_service.AnalyzeOrgPoliciesResponse.OrgPolicyResult) @@ -12826,6 +12877,9 @@ def test_analyze_org_policy_governed_containers_rest_pager(transport: str = 'res pager = client.analyze_org_policy_governed_containers(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedContainersResponse.GovernedContainer) @@ -13071,6 +13125,9 @@ def test_analyze_org_policy_governed_assets_rest_pager(transport: str = 'rest'): pager = client.analyze_org_policy_governed_assets(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedAssetsResponse.GovernedAsset) diff --git a/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py b/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py index 538dd2b2bac4..533e401eb1e7 100755 --- a/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py +++ b/packages/gapic-generator/tests/integration/goldens/eventarc/tests/unit/gapic/eventarc_v1/test_eventarc.py @@ -1706,6 +1706,9 @@ def test_list_triggers_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, trigger.Trigger) @@ -1792,6 +1795,8 @@ async def test_list_triggers_async_pager(): ) async_pager = await client.list_triggers(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -3554,6 +3559,9 @@ def test_list_channels_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, channel.Channel) @@ -3640,6 +3648,8 @@ async def test_list_channels_async_pager(): ) async_pager = await client.list_channels(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -5361,6 +5371,9 @@ def test_list_providers_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, discovery.Provider) @@ -5447,6 +5460,8 @@ async def test_list_providers_async_pager(): ) async_pager = await client.list_providers(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -6191,6 +6206,9 @@ def test_list_channel_connections_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, channel_connection.ChannelConnection) @@ -6277,6 +6295,8 @@ async def test_list_channel_connections_async_pager(): ) async_pager = await client.list_channel_connections(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -8319,6 +8339,9 @@ def test_list_message_buses_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, message_bus.MessageBus) @@ -8405,6 +8428,8 @@ async def test_list_message_buses_async_pager(): ) async_pager = await client.list_message_buses(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -8832,6 +8857,9 @@ def test_list_message_bus_enrollments_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, str) @@ -8918,6 +8946,8 @@ async def test_list_message_bus_enrollments_async_pager(): ) async_pager = await client.list_message_bus_enrollments(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -10671,6 +10701,9 @@ def test_list_enrollments_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, enrollment.Enrollment) @@ -10757,6 +10790,8 @@ async def test_list_enrollments_async_pager(): ) async_pager = await client.list_enrollments(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -12506,6 +12541,9 @@ def test_list_pipelines_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, pipeline.Pipeline) @@ -12592,6 +12630,8 @@ async def test_list_pipelines_async_pager(): ) async_pager = await client.list_pipelines(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -14341,6 +14381,9 @@ def test_list_google_api_sources_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, google_api_source.GoogleApiSource) @@ -14427,6 +14470,8 @@ async def test_list_google_api_sources_async_pager(): ) async_pager = await client.list_google_api_sources(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -15861,6 +15906,9 @@ def test_list_triggers_rest_pager(transport: str = 'rest'): pager = client.list_triggers(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, trigger.Trigger) @@ -16703,6 +16751,9 @@ def test_list_channels_rest_pager(transport: str = 'rest'): pager = client.list_channels(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, channel.Channel) @@ -17541,6 +17592,9 @@ def test_list_providers_rest_pager(transport: str = 'rest'): pager = client.list_providers(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, discovery.Provider) @@ -17937,6 +17991,9 @@ def test_list_channel_connections_rest_pager(transport: str = 'rest'): pager = client.list_channel_connections(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, channel_connection.ChannelConnection) @@ -19013,6 +19070,9 @@ def test_list_message_buses_rest_pager(transport: str = 'rest'): pager = client.list_message_buses(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, message_bus.MessageBus) @@ -19243,6 +19303,9 @@ def test_list_message_bus_enrollments_rest_pager(transport: str = 'rest'): pager = client.list_message_bus_enrollments(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, str) @@ -20156,6 +20219,9 @@ def test_list_enrollments_rest_pager(transport: str = 'rest'): pager = client.list_enrollments(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, enrollment.Enrollment) @@ -21069,6 +21135,9 @@ def test_list_pipelines_rest_pager(transport: str = 'rest'): pager = client.list_pipelines(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, pipeline.Pipeline) @@ -21982,6 +22051,9 @@ def test_list_google_api_sources_rest_pager(transport: str = 'rest'): pager = client.list_google_api_sources(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, google_api_source.GoogleApiSource) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py index 57522704960d..eada5b433c55 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_config_service_v2.py @@ -1323,6 +1323,9 @@ def test_list_buckets_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_config.LogBucket) @@ -1409,6 +1412,8 @@ async def test_list_buckets_async_pager(): ) async_pager = await client.list_buckets(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -3493,6 +3498,9 @@ def test_list_views_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_config.LogView) @@ -3579,6 +3587,8 @@ async def test_list_views_async_pager(): ) async_pager = await client.list_views(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -4926,6 +4936,9 @@ def test_list_sinks_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_config.LogSink) @@ -5012,6 +5025,8 @@ async def test_list_sinks_async_pager(): ) async_pager = await client.list_sinks(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -7431,6 +7446,9 @@ def test_list_links_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_config.Link) @@ -7517,6 +7535,8 @@ async def test_list_links_async_pager(): ) async_pager = await client.list_links(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -8253,6 +8273,9 @@ def test_list_exclusions_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_config.LogExclusion) @@ -8339,6 +8362,8 @@ async def test_list_exclusions_async_pager(): ) async_pager = await client.list_exclusions(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py index 544b2fd557db..65559a5d1073 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_logging_service_v2.py @@ -1856,6 +1856,9 @@ def test_list_log_entries_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, log_entry.LogEntry) @@ -1942,6 +1945,8 @@ async def test_list_log_entries_async_pager(): ) async_pager = await client.list_log_entries(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -2210,6 +2215,9 @@ def test_list_monitored_resource_descriptors_pager(transport_name: str = "grpc") assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, monitored_resource_pb2.MonitoredResourceDescriptor) @@ -2296,6 +2304,8 @@ async def test_list_monitored_resource_descriptors_async_pager(): ) async_pager = await client.list_monitored_resource_descriptors(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -2719,6 +2729,9 @@ def test_list_logs_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, str) @@ -2805,6 +2818,8 @@ async def test_list_logs_async_pager(): ) async_pager = await client.list_logs(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) diff --git a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py index 9f598dbcf95e..90cdab2be2b2 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging/tests/unit/gapic/logging_v2/test_metrics_service_v2.py @@ -1323,6 +1323,9 @@ def test_list_log_metrics_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_metrics.LogMetric) @@ -1409,6 +1412,8 @@ async def test_list_log_metrics_async_pager(): ) async_pager = await client.list_log_metrics(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py index 9152aa72c6a1..9eec837e6f58 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_config_service_v2.py @@ -1323,6 +1323,9 @@ def test_list_buckets_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_config.LogBucket) @@ -1409,6 +1412,8 @@ async def test_list_buckets_async_pager(): ) async_pager = await client.list_buckets(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -3493,6 +3498,9 @@ def test__list_views_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_config.LogView) @@ -3579,6 +3587,8 @@ async def test__list_views_async_pager(): ) async_pager = await client._list_views(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -4926,6 +4936,9 @@ def test__list_sinks_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_config.LogSink) @@ -5012,6 +5025,8 @@ async def test__list_sinks_async_pager(): ) async_pager = await client._list_sinks(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -7431,6 +7446,9 @@ def test__list_links_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_config.Link) @@ -7517,6 +7535,8 @@ async def test__list_links_async_pager(): ) async_pager = await client._list_links(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -8253,6 +8273,9 @@ def test__list_exclusions_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_config.LogExclusion) @@ -8339,6 +8362,8 @@ async def test__list_exclusions_async_pager(): ) async_pager = await client._list_exclusions(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py index 544b2fd557db..65559a5d1073 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_logging_service_v2.py @@ -1856,6 +1856,9 @@ def test_list_log_entries_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, log_entry.LogEntry) @@ -1942,6 +1945,8 @@ async def test_list_log_entries_async_pager(): ) async_pager = await client.list_log_entries(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -2210,6 +2215,9 @@ def test_list_monitored_resource_descriptors_pager(transport_name: str = "grpc") assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, monitored_resource_pb2.MonitoredResourceDescriptor) @@ -2296,6 +2304,8 @@ async def test_list_monitored_resource_descriptors_async_pager(): ) async_pager = await client.list_monitored_resource_descriptors(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -2719,6 +2729,9 @@ def test_list_logs_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, str) @@ -2805,6 +2818,8 @@ async def test_list_logs_async_pager(): ) async_pager = await client.list_logs(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) diff --git a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py index 0fc62ce795c0..310677b64bc6 100755 --- a/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py +++ b/packages/gapic-generator/tests/integration/goldens/logging_internal/tests/unit/gapic/logging_v2/test_metrics_service_v2.py @@ -1323,6 +1323,9 @@ def test__list_log_metrics_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, logging_metrics.LogMetric) @@ -1409,6 +1412,8 @@ async def test__list_log_metrics_async_pager(): ) async_pager = await client._list_log_metrics(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) diff --git a/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py b/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py index 7d14d15849c9..8ca1fb5194a6 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py +++ b/packages/gapic-generator/tests/integration/goldens/redis/tests/unit/gapic/redis_v1/test_cloud_redis.py @@ -1356,6 +1356,9 @@ def test_list_instances_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, cloud_redis.Instance) @@ -1442,6 +1445,8 @@ async def test_list_instances_async_pager(): ) async_pager = await client.list_instances(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -5063,6 +5068,9 @@ def test_list_instances_rest_pager(transport: str = 'rest'): pager = client.list_instances(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, cloud_redis.Instance) diff --git a/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py b/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py index 1076ace45ba6..3f6b7aa521f3 100755 --- a/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py +++ b/packages/gapic-generator/tests/integration/goldens/redis_selective/tests/unit/gapic/redis_v1/test_cloud_redis.py @@ -1356,6 +1356,9 @@ def test_list_instances_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, cloud_redis.Instance) @@ -1442,6 +1445,8 @@ async def test_list_instances_async_pager(): ) async_pager = await client.list_instances(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -3111,6 +3116,9 @@ def test_list_instances_rest_pager(transport: str = 'rest'): pager = client.list_instances(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, cloud_redis.Instance) diff --git a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py index 66367a27be49..5c53e97f8d12 100755 --- a/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py +++ b/packages/gapic-generator/tests/integration/goldens/storagebatchoperations/tests/unit/gapic/storagebatchoperations_v1/test_storage_batch_operations.py @@ -1428,6 +1428,9 @@ def test_list_jobs_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, storage_batch_operations_types.Job) @@ -1514,6 +1517,8 @@ async def test_list_jobs_async_pager(): ) async_pager = await client.list_jobs(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -3246,6 +3251,9 @@ def test_list_bucket_operations_pager(transport_name: str = "grpc"): assert pager._retry == retry assert pager._timeout == timeout + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, storage_batch_operations_types.BucketOperation) @@ -3332,6 +3340,8 @@ async def test_list_bucket_operations_async_pager(): ) async_pager = await client.list_bucket_operations(request={},) assert async_pager.next_page_token == 'abc' + assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') + responses = [] async for response in async_pager: # pragma: no branch responses.append(response) @@ -3924,6 +3934,9 @@ def test_list_jobs_rest_pager(transport: str = 'rest'): pager = client.list_jobs(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, storage_batch_operations_types.Job) @@ -4866,6 +4879,9 @@ def test_list_bucket_operations_rest_pager(transport: str = 'rest'): pager = client.list_bucket_operations(request=sample_request) + assert pager.next_page_token == 'abc' + assert str(pager).startswith(f'{pager.__class__.__name__}<') + results = list(pager) assert len(results) == 6 assert all(isinstance(i, storage_batch_operations_types.BucketOperation) From 8c7f4fbca1cb6e3ace33bcefa0fd25d60389b706 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 16:20:30 -0700 Subject: [PATCH 08/21] removed blank line --- .../asset/tests/unit/gapic/asset_v1/test_asset_service.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py b/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py index c8f836ccc49e..ea110a38acc3 100755 --- a/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py +++ b/packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py @@ -1669,7 +1669,6 @@ async def test_list_assets_async_pager(): assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<') responses = [] - async for response in async_pager: # pragma: no branch responses.append(response) From b6416f7d30c4925990f6c8edb9d57deed729f1cb Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 16:25:15 -0700 Subject: [PATCH 09/21] allow 99% coverage --- .github/workflows/unittest.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index c01f5ba5e73c..6758b5fe2748 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -87,4 +87,6 @@ jobs: run: | find .coverage-results -type f -name '*.zip' -exec unzip {} \; coverage combine .coverage-results/**/.coverage* - coverage report --show-missing --fail-under=100 + # TODO: default to 100% coverage after gapic-generator release + # https://github.com/googleapis/google-cloud-python/issues/17459 + coverage report --show-missing --fail-under=99 From eb20a66a397a37da04b89e5060523c3dbeaf04eb Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 16:36:59 -0700 Subject: [PATCH 10/21] Delete packages/google-devicesandservices-health/touch.txt --- packages/google-devicesandservices-health/touch.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/google-devicesandservices-health/touch.txt diff --git a/packages/google-devicesandservices-health/touch.txt b/packages/google-devicesandservices-health/touch.txt deleted file mode 100644 index e69de29bb2d1..000000000000 From d8bce8159cc813e6bb1c0385546699a7c82dd10f Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Fri, 12 Jun 2026 16:42:14 -0700 Subject: [PATCH 11/21] touched firestore --- .../tests/unit/v1/test_pipeline_expressions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/google-cloud-firestore/tests/unit/v1/test_pipeline_expressions.py b/packages/google-cloud-firestore/tests/unit/v1/test_pipeline_expressions.py index f76016805729..0c0f29df54b3 100644 --- a/packages/google-cloud-firestore/tests/unit/v1/test_pipeline_expressions.py +++ b/packages/google-cloud-firestore/tests/unit/v1/test_pipeline_expressions.py @@ -284,7 +284,8 @@ def test__from_query_filter_pb_composite_filter_or(self, mock_client): """ test composite OR filters - should create an or statement, made up of ands checking of existance of relevant fields + should create an or statement, made up of ands checking of existance + of relevant fields """ filter1_pb = query_pb.StructuredQuery.FieldFilter( field=query_pb.StructuredQuery.FieldReference(field_path="field1"), From ec6eeba0be002e87898b9e7a33847fdb1b8e16e5 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 15 Jun 2026 11:55:33 -0700 Subject: [PATCH 12/21] touch sqlalchemy-spanner --- packages/sqlalchemy-spanner/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sqlalchemy-spanner/README.rst b/packages/sqlalchemy-spanner/README.rst index fc9e5b6c0f75..1d54aa4a1215 100644 --- a/packages/sqlalchemy-spanner/README.rst +++ b/packages/sqlalchemy-spanner/README.rst @@ -59,7 +59,7 @@ Next install the package from the package ``setup.py`` file: During setup the dialect will be registered with entry points. Samples -------------- +------- The `samples directory `__ contains multiple examples for how to configure and use common Spanner features. From f2ec468ee3ab64f019f15ce5d25876ac08fb4cd1 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 15 Jun 2026 12:03:02 -0700 Subject: [PATCH 13/21] check coverage for individual packages separately --- .github/workflows/unittest.yml | 72 +++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index 6758b5fe2748..ac1614f3d65b 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -84,9 +84,71 @@ jobs: path: .coverage-results/ - name: Report coverage results if: ${{ steps.packages.outputs.num_files_changed > 0 }} - run: | - find .coverage-results -type f -name '*.zip' -exec unzip {} \; - coverage combine .coverage-results/**/.coverage* - # TODO: default to 100% coverage after gapic-generator release + env: + # TODO: default to 100% coverage after next gapic-generator release # https://github.com/googleapis/google-cloud-python/issues/17459 - coverage report --show-missing --fail-under=99 + DEFAULT_FAIL_UNDER: 99 + run: | + if [ -d .coverage-results ]; then + find .coverage-results -type f -name '.coverage*' -exec mv {} . \; + coverage combine + + # Find all modified packages + modified_packages=$(git diff --name-only HEAD~1 -- packages | cut -d/ -f1,2 | sort -u) + + failed_packages=() + passed_packages=() + + for pkg in ${modified_packages}; do + if [ -d "${pkg}" ]; then + echo "============================================================" + echo "Evaluating coverage for package: ${pkg}" + echo "============================================================" + + set +e + if [ -f "${pkg}/.coveragerc" ]; then + echo "Using package-specific configuration: ${pkg}/.coveragerc" + # If fail_under is specified in the package-specific .coveragerc, coverage report + # will automatically enforce it. Otherwise, we enforce the default. + if grep -q "fail_under" "${pkg}/.coveragerc"; then + coverage report --rcfile="${pkg}/.coveragerc" --include="${pkg}/**" + else + echo "No fail_under specified in ${pkg}/.coveragerc, enforcing default" + coverage report --rcfile="${pkg}/.coveragerc" --include="${pkg}/**" --fail-under="${DEFAULT_FAIL_UNDER}" + fi + else + echo "No .coveragerc found for ${pkg}, enforcing default" + coverage report --include="${pkg}/**" --fail-under="${DEFAULT_FAIL_UNDER}" + fi + status=$? + set -e + + if [ ${status} -ne 0 ]; then + failed_packages+=("${pkg}") + else + passed_packages+=("${pkg}") + fi + fi + done + + echo "============================================================" + echo "Coverage Evaluation Summary" + echo "============================================================" + if [ ${#passed_packages[@]} -gt 0 ]; then + echo "Passed packages:" + for pkg in "${passed_packages[@]}"; do + echo " - ${pkg}" + done + fi + if [ ${#failed_packages[@]} -gt 0 ]; then + echo "Failed packages:" + for pkg in "${failed_packages[@]}"; do + echo " - ${pkg}" + done + exit 1 + fi + else + echo "Error: No coverage results were downloaded from the unit test jobs." + echo "This usually means the unit tests did not run or failed to upload their coverage files." + exit 1 + fi From b53e25f014a48ddab2c2eb1b076f4138f4cd70ad Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 15 Jun 2026 12:38:51 -0700 Subject: [PATCH 14/21] fix coverage combination --- .github/workflows/unittest.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index ac1614f3d65b..493874baf19c 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -90,8 +90,18 @@ jobs: DEFAULT_FAIL_UNDER: 99 run: | if [ -d .coverage-results ]; then - find .coverage-results -type f -name '.coverage*' -exec mv {} . \; - coverage combine + # Unzip any zipped coverage results + find .coverage-results -type f -name '*.zip' -exec unzip -o {} \; + + # Find all coverage files and combine them. + # We find files starting with .coverage (excluding .coveragerc) + coverage_files=$(find .coverage-results . -type f -name '.coverage*' ! -name '.coveragerc') + if [ -n "${coverage_files}" ]; then + coverage combine ${coverage_files} + else + echo "Error: No coverage files found to combine." + exit 1 + fi # Find all modified packages modified_packages=$(git diff --name-only HEAD~1 -- packages | cut -d/ -f1,2 | sort -u) From d4e72526063a21b0e2d95efe64d71b49d48ea5f3 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 15 Jun 2026 12:45:17 -0700 Subject: [PATCH 15/21] added empty coveragerc for sqlalchemy-spanner --- packages/sqlalchemy-spanner/.coveragerc | 36 +++++++++++++++++++++++++ packages/sqlalchemy-spanner/noxfile.py | 13 ++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 packages/sqlalchemy-spanner/.coveragerc diff --git a/packages/sqlalchemy-spanner/.coveragerc b/packages/sqlalchemy-spanner/.coveragerc new file mode 100644 index 000000000000..d09941ce0eb9 --- /dev/null +++ b/packages/sqlalchemy-spanner/.coveragerc @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[run] +branch = True +omit = + google/__init__.py + google/cloud/sqlalchemy_spanner/requirements.py + +[report] +fail_under = 0 +show_missing = True +exclude_lines = + # Re-enable the standard pragma + pragma: NO COVER + # Ignore debug-only repr + def __repr__ + # Ignore abstract methods + raise NotImplementedError +omit = + */site-packages/*.py + google/__init__.py + google/cloud/sqlalchemy_spanner/requirements.py diff --git a/packages/sqlalchemy-spanner/noxfile.py b/packages/sqlalchemy-spanner/noxfile.py index 187d4e7e8924..b38bc1353d8d 100644 --- a/packages/sqlalchemy-spanner/noxfile.py +++ b/packages/sqlalchemy-spanner/noxfile.py @@ -368,7 +368,18 @@ def unit(session, test_type): *UNIT_TEST_DEPENDENCIES, ) session.install(".") - session.run("py.test", "--quiet", os.path.join("tests/unit"), *session.posargs) + session.run( + "py.test", + "--quiet", + "--cov=google.cloud.sqlalchemy_spanner", + "--cov=tests/unit", + "--cov-append", + "--cov-config=.coveragerc", + "--cov-report=", + "--cov-fail-under=0", + os.path.join("tests/unit"), + *session.posargs, + ) return From 457d5f4d1f61c7953c5c0cef04fa7aa09efb793f Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 15 Jun 2026 12:58:59 -0700 Subject: [PATCH 16/21] added dependency to sqlalchemy-spanner --- packages/sqlalchemy-spanner/noxfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/sqlalchemy-spanner/noxfile.py b/packages/sqlalchemy-spanner/noxfile.py index b38bc1353d8d..8adeb9388354 100644 --- a/packages/sqlalchemy-spanner/noxfile.py +++ b/packages/sqlalchemy-spanner/noxfile.py @@ -85,6 +85,7 @@ class = StreamHandler UNIT_TEST_STANDARD_DEPENDENCIES = [ "mock", "pytest", + "pytest-cov", ] UNIT_TEST_EXTERNAL_DEPENDENCIES = [ From 7595ddfd0a75332c56b4f1fc040d892926073bfd Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 15 Jun 2026 13:00:26 -0700 Subject: [PATCH 17/21] added .coveragerc files to missing packages --- packages/gcp-sphinx-docfx-yaml/.coveragerc | 31 +++++++++++++++++ packages/gcp-sphinx-docfx-yaml/noxfile.py | 13 +++++-- .../.coveragerc | 34 +++++++++++++++++++ packages/google-cloud-audit-log/.coveragerc | 34 +++++++++++++++++++ packages/google-cloud-testutils/.coveragerc | 31 +++++++++++++++++ packages/googleapis-common-protos/.coveragerc | 34 +++++++++++++++++++ packages/grpc-google-iam-v1/.coveragerc | 34 +++++++++++++++++++ 7 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 packages/gcp-sphinx-docfx-yaml/.coveragerc create mode 100644 packages/google-cloud-access-context-manager/.coveragerc create mode 100644 packages/google-cloud-audit-log/.coveragerc create mode 100644 packages/google-cloud-testutils/.coveragerc create mode 100644 packages/googleapis-common-protos/.coveragerc create mode 100644 packages/grpc-google-iam-v1/.coveragerc diff --git a/packages/gcp-sphinx-docfx-yaml/.coveragerc b/packages/gcp-sphinx-docfx-yaml/.coveragerc new file mode 100644 index 000000000000..d430064f04f2 --- /dev/null +++ b/packages/gcp-sphinx-docfx-yaml/.coveragerc @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[run] +branch = True + +[report] +fail_under = 0 +show_missing = True +exclude_lines = + # Re-enable the standard pragma + pragma: NO COVER + # Ignore debug-only repr + def __repr__ + # Ignore abstract methods + raise NotImplementedError +omit = + */site-packages/*.py diff --git a/packages/gcp-sphinx-docfx-yaml/noxfile.py b/packages/gcp-sphinx-docfx-yaml/noxfile.py index 7e17f37c8ffa..ba5658c0e24f 100644 --- a/packages/gcp-sphinx-docfx-yaml/noxfile.py +++ b/packages/gcp-sphinx-docfx-yaml/noxfile.py @@ -140,8 +140,17 @@ def unit(session): # Track 3.14 compatibility as upstream dependencies stabilize. _skip_python_session(session, ["3.7", "3.8", "3.9", "3.11", "3.12", "3.13", "3.14"]) session.install("-r", "requirements.txt") - session.install("pytest") - session.run("pytest", "tests") + session.install("pytest", "pytest-cov") + session.run( + "pytest", + "--cov=docfx_yaml", + "--cov=tests", + "--cov-append", + "--cov-config=.coveragerc", + "--cov-report=", + "--cov-fail-under=0", + "tests", + ) @nox.session(python="3.10") diff --git a/packages/google-cloud-access-context-manager/.coveragerc b/packages/google-cloud-access-context-manager/.coveragerc new file mode 100644 index 000000000000..c5fe1ba7e058 --- /dev/null +++ b/packages/google-cloud-access-context-manager/.coveragerc @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[run] +branch = True +omit = + google/__init__.py + +[report] +fail_under = 0 +show_missing = True +exclude_lines = + # Re-enable the standard pragma + pragma: NO COVER + # Ignore debug-only repr + def __repr__ + # Ignore abstract methods + raise NotImplementedError +omit = + */site-packages/*.py + google/__init__.py diff --git a/packages/google-cloud-audit-log/.coveragerc b/packages/google-cloud-audit-log/.coveragerc new file mode 100644 index 000000000000..c5fe1ba7e058 --- /dev/null +++ b/packages/google-cloud-audit-log/.coveragerc @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[run] +branch = True +omit = + google/__init__.py + +[report] +fail_under = 0 +show_missing = True +exclude_lines = + # Re-enable the standard pragma + pragma: NO COVER + # Ignore debug-only repr + def __repr__ + # Ignore abstract methods + raise NotImplementedError +omit = + */site-packages/*.py + google/__init__.py diff --git a/packages/google-cloud-testutils/.coveragerc b/packages/google-cloud-testutils/.coveragerc new file mode 100644 index 000000000000..d430064f04f2 --- /dev/null +++ b/packages/google-cloud-testutils/.coveragerc @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[run] +branch = True + +[report] +fail_under = 0 +show_missing = True +exclude_lines = + # Re-enable the standard pragma + pragma: NO COVER + # Ignore debug-only repr + def __repr__ + # Ignore abstract methods + raise NotImplementedError +omit = + */site-packages/*.py diff --git a/packages/googleapis-common-protos/.coveragerc b/packages/googleapis-common-protos/.coveragerc new file mode 100644 index 000000000000..c5fe1ba7e058 --- /dev/null +++ b/packages/googleapis-common-protos/.coveragerc @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[run] +branch = True +omit = + google/__init__.py + +[report] +fail_under = 0 +show_missing = True +exclude_lines = + # Re-enable the standard pragma + pragma: NO COVER + # Ignore debug-only repr + def __repr__ + # Ignore abstract methods + raise NotImplementedError +omit = + */site-packages/*.py + google/__init__.py diff --git a/packages/grpc-google-iam-v1/.coveragerc b/packages/grpc-google-iam-v1/.coveragerc new file mode 100644 index 000000000000..c5fe1ba7e058 --- /dev/null +++ b/packages/grpc-google-iam-v1/.coveragerc @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +[run] +branch = True +omit = + google/__init__.py + +[report] +fail_under = 0 +show_missing = True +exclude_lines = + # Re-enable the standard pragma + pragma: NO COVER + # Ignore debug-only repr + def __repr__ + # Ignore abstract methods + raise NotImplementedError +omit = + */site-packages/*.py + google/__init__.py From 715e0a77afcb2ae2952371c2cfde3f59c6631180 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 15 Jun 2026 13:14:35 -0700 Subject: [PATCH 18/21] updated coverage requirements --- packages/gcp-sphinx-docfx-yaml/.coveragerc | 2 +- packages/google-cloud-access-context-manager/.coveragerc | 2 +- packages/google-cloud-audit-log/.coveragerc | 2 +- packages/google-cloud-testutils/.coveragerc | 2 +- packages/googleapis-common-protos/.coveragerc | 2 +- packages/grpc-google-iam-v1/.coveragerc | 2 +- packages/sqlalchemy-spanner/.coveragerc | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/gcp-sphinx-docfx-yaml/.coveragerc b/packages/gcp-sphinx-docfx-yaml/.coveragerc index d430064f04f2..18b2efb98608 100644 --- a/packages/gcp-sphinx-docfx-yaml/.coveragerc +++ b/packages/gcp-sphinx-docfx-yaml/.coveragerc @@ -18,7 +18,7 @@ branch = True [report] -fail_under = 0 +fail_under = 40 show_missing = True exclude_lines = # Re-enable the standard pragma diff --git a/packages/google-cloud-access-context-manager/.coveragerc b/packages/google-cloud-access-context-manager/.coveragerc index c5fe1ba7e058..b609b649b442 100644 --- a/packages/google-cloud-access-context-manager/.coveragerc +++ b/packages/google-cloud-access-context-manager/.coveragerc @@ -20,7 +20,7 @@ omit = google/__init__.py [report] -fail_under = 0 +fail_under = 99 show_missing = True exclude_lines = # Re-enable the standard pragma diff --git a/packages/google-cloud-audit-log/.coveragerc b/packages/google-cloud-audit-log/.coveragerc index c5fe1ba7e058..d012e8e5a905 100644 --- a/packages/google-cloud-audit-log/.coveragerc +++ b/packages/google-cloud-audit-log/.coveragerc @@ -20,7 +20,7 @@ omit = google/__init__.py [report] -fail_under = 0 +fail_under = 100 show_missing = True exclude_lines = # Re-enable the standard pragma diff --git a/packages/google-cloud-testutils/.coveragerc b/packages/google-cloud-testutils/.coveragerc index d430064f04f2..f348db46d309 100644 --- a/packages/google-cloud-testutils/.coveragerc +++ b/packages/google-cloud-testutils/.coveragerc @@ -18,7 +18,7 @@ branch = True [report] -fail_under = 0 +fail_under = 80 show_missing = True exclude_lines = # Re-enable the standard pragma diff --git a/packages/googleapis-common-protos/.coveragerc b/packages/googleapis-common-protos/.coveragerc index c5fe1ba7e058..d012e8e5a905 100644 --- a/packages/googleapis-common-protos/.coveragerc +++ b/packages/googleapis-common-protos/.coveragerc @@ -20,7 +20,7 @@ omit = google/__init__.py [report] -fail_under = 0 +fail_under = 100 show_missing = True exclude_lines = # Re-enable the standard pragma diff --git a/packages/grpc-google-iam-v1/.coveragerc b/packages/grpc-google-iam-v1/.coveragerc index c5fe1ba7e058..d012e8e5a905 100644 --- a/packages/grpc-google-iam-v1/.coveragerc +++ b/packages/grpc-google-iam-v1/.coveragerc @@ -20,7 +20,7 @@ omit = google/__init__.py [report] -fail_under = 0 +fail_under = 100 show_missing = True exclude_lines = # Re-enable the standard pragma diff --git a/packages/sqlalchemy-spanner/.coveragerc b/packages/sqlalchemy-spanner/.coveragerc index d09941ce0eb9..b3610ca6b18f 100644 --- a/packages/sqlalchemy-spanner/.coveragerc +++ b/packages/sqlalchemy-spanner/.coveragerc @@ -21,7 +21,7 @@ omit = google/cloud/sqlalchemy_spanner/requirements.py [report] -fail_under = 0 +fail_under = 35 show_missing = True exclude_lines = # Re-enable the standard pragma From c0e8b1f2ba810ff62ab2d721516eb74833f08392 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 15 Jun 2026 13:17:46 -0700 Subject: [PATCH 19/21] exclude .coveragerc templates when combining --- .github/workflows/unittest.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index 493874baf19c..e231533e0ee1 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -94,8 +94,8 @@ jobs: find .coverage-results -type f -name '*.zip' -exec unzip -o {} \; # Find all coverage files and combine them. - # We find files starting with .coverage (excluding .coveragerc) - coverage_files=$(find .coverage-results . -type f -name '.coverage*' ! -name '.coveragerc') + # We find files starting with .coverage (excluding .coveragerc files and templates) + coverage_files=$(find .coverage-results . -type f -name '.coverage*' ! -name '.coveragerc*') if [ -n "${coverage_files}" ]; then coverage combine ${coverage_files} else From 33de135fc89f928b956024540d8f492580f401c2 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 15 Jun 2026 13:24:58 -0700 Subject: [PATCH 20/21] lowered testutils requirement --- packages/google-cloud-testutils/.coveragerc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/google-cloud-testutils/.coveragerc b/packages/google-cloud-testutils/.coveragerc index f348db46d309..c1f05d46e455 100644 --- a/packages/google-cloud-testutils/.coveragerc +++ b/packages/google-cloud-testutils/.coveragerc @@ -18,7 +18,7 @@ branch = True [report] -fail_under = 80 +fail_under = 75 show_missing = True exclude_lines = # Re-enable the standard pragma From 163077c7c9dcd6db19546978eb1211d613a29d92 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 15 Jun 2026 14:08:24 -0700 Subject: [PATCH 21/21] reverted sqlalchemy-spanner changes --- packages/sqlalchemy-spanner/.coveragerc | 36 ------------------------- packages/sqlalchemy-spanner/README.rst | 2 +- packages/sqlalchemy-spanner/noxfile.py | 14 +--------- 3 files changed, 2 insertions(+), 50 deletions(-) delete mode 100644 packages/sqlalchemy-spanner/.coveragerc diff --git a/packages/sqlalchemy-spanner/.coveragerc b/packages/sqlalchemy-spanner/.coveragerc deleted file mode 100644 index b3610ca6b18f..000000000000 --- a/packages/sqlalchemy-spanner/.coveragerc +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -[run] -branch = True -omit = - google/__init__.py - google/cloud/sqlalchemy_spanner/requirements.py - -[report] -fail_under = 35 -show_missing = True -exclude_lines = - # Re-enable the standard pragma - pragma: NO COVER - # Ignore debug-only repr - def __repr__ - # Ignore abstract methods - raise NotImplementedError -omit = - */site-packages/*.py - google/__init__.py - google/cloud/sqlalchemy_spanner/requirements.py diff --git a/packages/sqlalchemy-spanner/README.rst b/packages/sqlalchemy-spanner/README.rst index 1d54aa4a1215..fc9e5b6c0f75 100644 --- a/packages/sqlalchemy-spanner/README.rst +++ b/packages/sqlalchemy-spanner/README.rst @@ -59,7 +59,7 @@ Next install the package from the package ``setup.py`` file: During setup the dialect will be registered with entry points. Samples -------- +------------- The `samples directory `__ contains multiple examples for how to configure and use common Spanner features. diff --git a/packages/sqlalchemy-spanner/noxfile.py b/packages/sqlalchemy-spanner/noxfile.py index 8adeb9388354..187d4e7e8924 100644 --- a/packages/sqlalchemy-spanner/noxfile.py +++ b/packages/sqlalchemy-spanner/noxfile.py @@ -85,7 +85,6 @@ class = StreamHandler UNIT_TEST_STANDARD_DEPENDENCIES = [ "mock", "pytest", - "pytest-cov", ] UNIT_TEST_EXTERNAL_DEPENDENCIES = [ @@ -369,18 +368,7 @@ def unit(session, test_type): *UNIT_TEST_DEPENDENCIES, ) session.install(".") - session.run( - "py.test", - "--quiet", - "--cov=google.cloud.sqlalchemy_spanner", - "--cov=tests/unit", - "--cov-append", - "--cov-config=.coveragerc", - "--cov-report=", - "--cov-fail-under=0", - os.path.join("tests/unit"), - *session.posargs, - ) + session.run("py.test", "--quiet", os.path.join("tests/unit"), *session.posargs) return