Skip to content

feat: move BigQuery to clientless validation - #144

Open
cofin wants to merge 2 commits into
feat/provider-aware-cifrom
feat/clientless-bigquery
Open

feat: move BigQuery to clientless validation#144
cofin wants to merge 2 commits into
feat/provider-aware-cifrom
feat/clientless-bigquery

Conversation

@cofin

@cofin cofin commented May 24, 2026

Copy link
Copy Markdown
Member

Drop google-cloud-bigquery from the bigquery extra. Readiness now uses a stdlib urllib.request POST against /bigquery/v2/projects/<project>/queries with SELECT 1, and BigQueryService no longer carries credentials or client_options.

The default dataset is still created automatically — the emulator's --dataset=test-dataset startup flag handles it, so the dataset exists when the fixture yields.

The bundled bigquery_client fixture is removed. Users construct their own bigquery.Client(project=service.project, client_options=ClientOptions(api_endpoint=service.endpoint), credentials=AnonymousCredentials()).

@cofin
cofin force-pushed the feat/clientless-bigquery branch from b3cb156 to d94fcbc Compare May 25, 2026 16:23
@cofin
cofin force-pushed the feat/clientless-bigquery branch 2 times, most recently from b8719e0 to e54b889 Compare July 21, 2026 17:07
@cofin
cofin changed the base branch from main to feat/provider-aware-ci July 21, 2026 18:51
@cofin
cofin force-pushed the feat/clientless-bigquery branch 2 times, most recently from f6fa712 to 476b523 Compare July 22, 2026 05:08
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 0% with 17 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (feat/provider-aware-ci@f0b2684). Learn more about missing BASE report.

Files with missing lines Patch % Lines
src/pytest_databases/docker/bigquery.py 0.00% 17 Missing ⚠️
Additional details and impacted files
@@                   Coverage Diff                    @@
##             feat/provider-aware-ci    #144   +/-   ##
========================================================
  Coverage                          ?   6.16%           
========================================================
  Files                             ?      22           
  Lines                             ?    1801           
  Branches                          ?     134           
========================================================
  Hits                              ?     111           
  Misses                            ?    1667           
  Partials                          ?      23           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

cofin added 2 commits July 22, 2026 15:56
Replace the `google.cloud.bigquery` / `google.api_core.client_options` /
`google.auth.credentials` imports with a stdlib `urllib.request` REST
probe against the emulator's `/bigquery/v2/projects/<project>/queries`
endpoint, mirroring the Elasticsearch (#139), Valkey (#138), and Redis
family (#136) clientless conversions.

- src/pytest_databases/docker/bigquery.py: drop the three `google.*`
  imports; remove `credentials` and `client_options` from
  `BigQueryService` (keep `host`, `port`, `container`, `project`,
  `dataset`, and the `endpoint` property); add a
  `_query_bigquery_emulator(host, port, project, sql, *, timeout=2.0)`
  helper that POSTs `{"query": sql, "useLegacySql": false}` and parses
  the response; rewrite `check()` to call the helper with `SELECT 1 as
  one` and assert `jobComplete and rows[0].f[0].v == "1"`, swallowing
  `URLError`/`HTTPError`/`JSONDecodeError`/`TimeoutError`/`OSError`;
  delete the `bigquery_client` fixture. The emulator `--dataset=` start
  flag and `DATASET_NAME` env var are preserved so the default dataset
  is still auto-created by the emulator binary itself.
- tests/test_bigquery.py: rewrite to drive the emulator through stdlib
  `urllib.request` only; preserve `test_service_fixture` (SELECT 1 via
  REST); drop `test_client_fixture`; rewrite `test_xdist` to issue
  `CREATE TABLE` against `bigquery_service.dataset` via the REST
  endpoint; add `test_plugin_imports_without_google_cloud_bigquery`
  regression guard that intercepts `google.cloud.bigquery`,
  `google.api_core.client_options`, and `google.auth.credentials` via
  `builtins.__import__`.
- pyproject.toml: empty the `bigquery` compatibility extra so
  `pytest-databases[bigquery]` no longer pulls in
  `google-cloud-bigquery`; drop the `pytest_databases.docker.bigquery`
  `attr-defined` mypy override now that the module no longer touches
  Google client attribute surface.
- docs/supported-databases/bigquery.rst: rewrite the example in the
  user-owned-client style; users now build their own `bigquery.Client`
  from `bigquery_service.endpoint`, `bigquery_service.project`, and
  `AnonymousCredentials()`.
- uv.lock: drop `google-cloud-bigquery`, `google-crc32c`, and
  `google-resumable-media`.
@cofin
cofin force-pushed the feat/clientless-bigquery branch from 476b523 to 77950a0 Compare July 22, 2026 15:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants