|
23 | 23 | from google.cloud.bigquery.external_config import ExternalCatalogDatasetOptions, ExternalCatalogTableOptions |
24 | 24 | from pytest_mock import MockFixture |
25 | 25 |
|
26 | | -from pyiceberg.catalog.bigquery_metastore import ICEBERG_TABLE_TYPE_VALUE, TABLE_TYPE_PROP, BigQueryMetastoreCatalog |
| 26 | +from pyiceberg.catalog.bigquery_metastore import ( |
| 27 | + ICEBERG_TABLE_TYPE_VALUE, |
| 28 | + TABLE_TYPE_PROP, |
| 29 | + BigqueryCommitStatus, |
| 30 | + BigQueryMetastoreCatalog, |
| 31 | +) |
27 | 32 | from pyiceberg.exceptions import CommitStateUnknownException, NoSuchTableError |
28 | 33 | from pyiceberg.schema import Schema |
29 | 34 |
|
@@ -309,3 +314,37 @@ def test_check_bigquery_commit_status_returns_success_when_metadata_in_history(m |
309 | 314 | ) |
310 | 315 |
|
311 | 316 | assert status == "SUCCESS" |
| 317 | + |
| 318 | + |
| 319 | +def test_commit_table_deletes_written_metadata_when_commit_status_is_failure(mocker: MockFixture) -> None: |
| 320 | + client_mock = MagicMock() |
| 321 | + current_bq_table = MagicMock() |
| 322 | + client_mock.get_table.return_value = current_bq_table |
| 323 | + client_mock.update_table.side_effect = RuntimeError("boom") |
| 324 | + mocker.patch("pyiceberg.catalog.bigquery_metastore.Client", return_value=client_mock) |
| 325 | + mocker.patch.dict(os.environ, values={"PYICEBERG_LEGACY_CURRENT_SNAPSHOT_ID": "True"}) |
| 326 | + |
| 327 | + catalog = BigQueryMetastoreCatalog("test_catalog", **{"gcp.bigquery.project-id": "my-project"}) |
| 328 | + table = MagicMock() |
| 329 | + table.name.return_value = ("my-dataset", "my-table") |
| 330 | + |
| 331 | + current_table = MagicMock() |
| 332 | + current_table.metadata = MagicMock() |
| 333 | + current_table.metadata_location = "gs://bucket/db/table/metadata/00000.metadata.json" |
| 334 | + mocker.patch.object(catalog, "_convert_bigquery_table_to_iceberg_table", return_value=current_table) |
| 335 | + |
| 336 | + staged = MagicMock() |
| 337 | + staged.metadata = MagicMock() |
| 338 | + staged.metadata.location = "gs://bucket/db/table" |
| 339 | + staged.metadata_location = "gs://bucket/db/table/metadata/00001.metadata.json" |
| 340 | + staged.io = MagicMock() |
| 341 | + mocker.patch.object(catalog, "_update_and_stage_table", return_value=staged) |
| 342 | + mocker.patch.object(catalog, "_write_metadata") |
| 343 | + mocker.patch.object(catalog, "_create_table_parameters", return_value={"metadata_location": staged.metadata_location}) |
| 344 | + mocker.patch.object(catalog, "_create_external_catalog_table_options", return_value=MagicMock()) |
| 345 | + mocker.patch.object(catalog, "_check_bigquery_commit_status", return_value=BigqueryCommitStatus.FAILURE) |
| 346 | + |
| 347 | + with pytest.raises(RuntimeError, match="boom"): |
| 348 | + catalog.commit_table(table, requirements=(), updates=()) |
| 349 | + |
| 350 | + staged.io.delete.assert_called_once_with(staged.metadata_location) |
0 commit comments