from __future__ import annotations import uuid import pytest from app.domains.data_access import bootstrap as b from app.domains.data_access.constants import ( FIELD_OWNER_PERSON_ID, FIELD_OWNER_SOURCE, FIELD_SOURCE_ETAG, FIELD_SOURCE_VERSION, PROVIDER_BIGQUERY, RESOURCE_TYPE_DATASET, ) def _base_entry(**overrides): entry = { "provider": PROVIDER_BIGQUERY, "resource_type": RESOURCE_TYPE_DATASET, "locator": { "project_id": "analytics-prod", "dataset_id": "finance_reporting", }, FIELD_OWNER_PERSON_ID: str(uuid.UUID("11111111-1111-1111-1111-111111111111")), FIELD_OWNER_SOURCE: b.BOOTSTRAP_OWNER_SOURCE, FIELD_SOURCE_VERSION: "bootstrap-2026-06-10", FIELD_SOURCE_ETAG: "sha256:abc123", "display_name": "Finance Reporting", } entry.update(overrides) return entry def test_accepts_catalog_shaped_bigquery_dataset_locator_with_resolved_owner(): resource = b.parse_bootstrap_resource(_base_entry(catalog_id="catalog-finance")) assert resource.provider == PROVIDER_BIGQUERY assert resource.resource_type == RESOURCE_TYPE_DATASET assert resource.locator.project_id == "analytics-prod" assert resource.locator.dataset_id == "finance_reporting" assert resource.catalog_id == "catalog-finance" assert resource.owner_resolution_status == b.OWNER_RESOLUTION_RESOLVED assert resource.resource_owner_authority_enabled is True assert resource.as_resource_projection()[FIELD_OWNER_PERSON_ID] == ( "11111111-1111-1111-1111-111111111111" ) assert resource.as_resource_projection()["catalog_resource_id"] == ( "catalog-finance" ) def test_accepts_bigquery_dataset_id_that_starts_with_digit() -> None: resource = b.parse_bootstrap_resource( _base_entry(locator={ "project_id": "analytics-prod", "dataset_id": "2026_sales", }) ) assert resource.locator.dataset_id == "2026_sales" @pytest.mark.parametrize("status", [ b.OWNER_RESOLUTION_UNRESOLVED, b.OWNER_RESOLUTION_FALLBACK, ]) def test_accepts_explicit_unresolved_owner_status_and_disables_owner_authority( status: str, ) -> None: resource = b.parse_bootstrap_resource( _base_entry(**{ FIELD_OWNER_PERSON_ID: None, b.OWNER_RESOLUTION_STATUS_FIELD: status, }) ) assert resource.owner_person_id is None assert resource.owner_resolution_status == status assert resource.resource_owner_authority_enabled is False assert resource.as_resource_projection()["resource_owner_authority_enabled"] is False @pytest.mark.parametrize("entry", [ _base_entry(resource_type="table"), _base_entry(locator={ "project_id": "analytics-prod", "dataset_id": "finance_reporting", "table_id": "daily_costs", }), _base_entry(table_id="daily_costs"), _base_entry(locator={ "project_id": "analytics-prod", "dataset_id": "finance_reporting.daily_costs", }), ]) def test_rejects_table_scoped_bootstrap_entries(entry) -> None: with pytest.raises(ValueError, match="table|dataset-scoped|dataset only"): b.parse_bootstrap_resource(entry) @pytest.mark.parametrize("entry", [ _base_entry(resource_type="project"), _base_entry(locator={"project_id": "analytics-prod"}), _base_entry(locator={ "project_id": "analytics-prod", "dataset_id": "finance_reporting", "project_number": "123456789", }), _base_entry(project_id="analytics-prod"), ]) def test_rejects_project_scoped_bootstrap_entries(entry) -> None: with pytest.raises(ValueError, match="project|dataset_id|forbidden"): b.parse_bootstrap_resource(entry) @pytest.mark.parametrize("entry", [ _base_entry(locator="analytics-prod.finance_reporting"), { "provider": PROVIDER_BIGQUERY, "resource_type": RESOURCE_TYPE_DATASET, "project_id": "analytics-prod", "dataset_id": "finance_reporting", FIELD_OWNER_PERSON_ID: str(uuid.uuid4()), FIELD_OWNER_SOURCE: b.BOOTSTRAP_OWNER_SOURCE, FIELD_SOURCE_VERSION: "bootstrap-2026-06-10", FIELD_SOURCE_ETAG: "sha256:abc123", }, _base_entry(fully_qualified_name="analytics-prod.finance_reporting"), ]) def test_rejects_freeform_or_flat_locator_entries(entry) -> None: with pytest.raises(ValueError, match="locator|freeform|forbidden"): b.parse_bootstrap_resource(entry) @pytest.mark.parametrize("entry", [ _base_entry(provider="gcp"), _base_entry(locator={ "project_id": "AnalyticsProd", "dataset_id": "finance_reporting", }), _base_entry(locator={ "project_id": "analytics-prod", "dataset_id": "finance-reporting", }), ]) def test_rejects_non_canonical_provider_or_locator_parts(entry) -> None: with pytest.raises(ValueError): b.parse_bootstrap_resource(entry) def test_requires_resolved_owner_or_explicit_unresolved_status() -> None: with pytest.raises(ValueError, match=b.OWNER_RESOLUTION_STATUS_FIELD): b.parse_bootstrap_resource(_base_entry(**{FIELD_OWNER_PERSON_ID: None})) def test_rejects_unresolved_status_when_owner_person_id_is_present() -> None: with pytest.raises(ValueError, match="cannot be"): b.parse_bootstrap_resource( _base_entry(**{ b.OWNER_RESOLUTION_STATUS_FIELD: b.OWNER_RESOLUTION_UNRESOLVED, }) ) def test_rejects_non_bootstrap_owner_source() -> None: with pytest.raises(ValueError, match=FIELD_OWNER_SOURCE): b.parse_bootstrap_resource(_base_entry(**{FIELD_OWNER_SOURCE: "catalog"})) def test_batch_parser_rejects_duplicate_dataset_locators() -> None: with pytest.raises(ValueError, match="duplicate"): b.parse_bootstrap_resources([ _base_entry(), _base_entry(display_name="Duplicate display label"), ]) def test_batch_parser_rejects_duplicate_catalog_ids() -> None: with pytest.raises(ValueError, match="duplicate.*catalog id"): b.parse_bootstrap_resources([ _base_entry(catalog_id="catalog-finance"), _base_entry( catalog_id="catalog-finance", locator={ "project_id": "analytics-prod", "dataset_id": "people_reporting", }, ), ])