diff --git a/github_ops_manager/configuration/cli.py b/github_ops_manager/configuration/cli.py index b65d43a..46ff124 100644 --- a/github_ops_manager/configuration/cli.py +++ b/github_ops_manager/configuration/cli.py @@ -266,10 +266,14 @@ def process_test_requirements_cli( - Writing metadata back to test_cases.yaml files For each test case: - - If project_issue_number is missing, creates an issue + - If metadata.project_tracking.issue_number is missing, creates an issue - If generated_script_path exists and PR metadata is missing: - - Non-catalog: creates PR in project repo - - Catalog-destined: creates PR in catalog repo + - Non-catalog (metadata.catalog.destined != true): creates PR in project repo + - Catalog-destined (metadata.catalog.destined == true): creates PR in catalog repo + + Metadata structure written: + - metadata.project_tracking.{issue_number, issue_url, pr_number, pr_url, pr_branch, git_url} + - metadata.catalog_tracking.{pr_number, pr_url, pr_branch, git_url} MIGRATION: If --issues-yaml is provided, existing metadata from issues.yaml will be migrated to test_cases.yaml before normal processing begins. diff --git a/github_ops_manager/processing/test_cases_processor.py b/github_ops_manager/processing/test_cases_processor.py index c28e300..b667bdf 100644 --- a/github_ops_manager/processing/test_cases_processor.py +++ b/github_ops_manager/processing/test_cases_processor.py @@ -14,6 +14,7 @@ logger: structlog.stdlib.BoundLogger = structlog.get_logger(__name__) + # Initialize YAML handler with format preservation yaml = YAML() yaml.preserve_quotes = True @@ -254,7 +255,10 @@ def find_test_case_by_filename(test_cases: list[dict[str, Any]], generated_scrip def update_test_case_with_pr_metadata(test_case: dict[str, Any], pr: PullRequest, catalog_repo_url: str) -> dict[str, Any]: - """Add PR metadata fields to test case. + """Add catalog PR metadata fields to test case. + + Writes metadata to the nested structure: + metadata.catalog_tracking.{pr_number, pr_url, pr_branch, git_url} Args: test_case: Test case dictionary to update @@ -264,13 +268,14 @@ def update_test_case_with_pr_metadata(test_case: dict[str, Any], pr: PullRequest Returns: Updated test case dictionary """ - test_case["catalog_pr_git_url"] = catalog_repo_url - test_case["catalog_pr_number"] = pr.number - test_case["catalog_pr_url"] = pr.html_url - test_case["catalog_pr_branch"] = pr.head.ref + catalog_tracking = test_case.setdefault("metadata", {}).setdefault("catalog_tracking", {}) + catalog_tracking["git_url"] = catalog_repo_url + catalog_tracking["pr_number"] = pr.number + catalog_tracking["pr_url"] = pr.html_url + catalog_tracking["pr_branch"] = pr.head.ref logger.info( - "Updated test case with PR metadata", + "Updated test case with catalog PR metadata", catalog_pr_number=pr.number, catalog_pr_url=pr.html_url, catalog_pr_branch=pr.head.ref, @@ -282,6 +287,9 @@ def update_test_case_with_pr_metadata(test_case: dict[str, Any], pr: PullRequest def update_test_case_with_issue_metadata(test_case: dict[str, Any], issue_number: int, issue_url: str) -> dict[str, Any]: """Add project issue metadata fields to test case. + Writes metadata to the nested structure: + metadata.project_tracking.{issue_number, issue_url} + Args: test_case: Test case dictionary to update issue_number: GitHub Issue number @@ -290,8 +298,9 @@ def update_test_case_with_issue_metadata(test_case: dict[str, Any], issue_number Returns: Updated test case dictionary """ - test_case["project_issue_number"] = issue_number - test_case["project_issue_url"] = issue_url + project_tracking = test_case.setdefault("metadata", {}).setdefault("project_tracking", {}) + project_tracking["issue_number"] = issue_number + project_tracking["issue_url"] = issue_url logger.info( "Updated test case with project issue metadata", @@ -311,6 +320,9 @@ def update_test_case_with_project_pr_metadata( ) -> dict[str, Any]: """Add project PR metadata fields to test case. + Writes metadata to the nested structure: + metadata.project_tracking.{pr_number, pr_url, pr_branch, git_url} + Args: test_case: Test case dictionary to update pr_number: GitHub Pull Request number @@ -321,10 +333,11 @@ def update_test_case_with_project_pr_metadata( Returns: Updated test case dictionary """ - test_case["project_pr_git_url"] = repo_url - test_case["project_pr_number"] = pr_number - test_case["project_pr_url"] = pr_url - test_case["project_pr_branch"] = pr_branch + project_tracking = test_case.setdefault("metadata", {}).setdefault("project_tracking", {}) + project_tracking["git_url"] = repo_url + project_tracking["pr_number"] = pr_number + project_tracking["pr_url"] = pr_url + project_tracking["pr_branch"] = pr_branch logger.info( "Updated test case with project PR metadata", @@ -340,6 +353,7 @@ def requires_issue_creation(test_case: dict[str, Any]) -> bool: """Check if a test case needs an issue to be created. An issue is needed if the test case doesn't already have issue metadata. + Checks nested structure: metadata.project_tracking.{issue_number, issue_url} Args: test_case: Test case dictionary to check @@ -347,8 +361,9 @@ def requires_issue_creation(test_case: dict[str, Any]) -> bool: Returns: True if issue needs to be created, False otherwise """ - has_issue_number = test_case.get("project_issue_number") is not None - has_issue_url = test_case.get("project_issue_url") is not None + project_tracking = test_case.get("metadata", {}).get("project_tracking", {}) + has_issue_number = project_tracking.get("issue_number") is not None + has_issue_url = project_tracking.get("issue_url") is not None return not (has_issue_number and has_issue_url) @@ -358,8 +373,9 @@ def requires_project_pr_creation(test_case: dict[str, Any]) -> bool: A project PR is needed if: - The test case has a generated_script_path (script exists) - - The test case is NOT catalog-destined + - The test case is NOT catalog-destined (metadata.catalog.destined) - The test case doesn't already have project PR metadata + (metadata.project_tracking.{pr_number, pr_url}) Args: test_case: Test case dictionary to check @@ -367,10 +383,12 @@ def requires_project_pr_creation(test_case: dict[str, Any]) -> bool: Returns: True if project PR needs to be created, False otherwise """ + metadata = test_case.get("metadata", {}) has_script = test_case.get("generated_script_path") is not None - is_catalog = test_case.get("catalog_destined", False) - has_pr_number = test_case.get("project_pr_number") is not None - has_pr_url = test_case.get("project_pr_url") is not None + is_catalog = metadata.get("catalog", {}).get("destined", False) + project_tracking = metadata.get("project_tracking", {}) + has_pr_number = project_tracking.get("pr_number") is not None + has_pr_url = project_tracking.get("pr_url") is not None return has_script and not is_catalog and not (has_pr_number and has_pr_url) @@ -380,8 +398,9 @@ def requires_catalog_pr_creation(test_case: dict[str, Any]) -> bool: A catalog PR is needed if: - The test case has a generated_script_path (script exists) - - The test case IS catalog-destined + - The test case IS catalog-destined (metadata.catalog.destined) - The test case doesn't already have catalog PR metadata + (metadata.catalog_tracking.{pr_number, pr_url}) Args: test_case: Test case dictionary to check @@ -389,10 +408,12 @@ def requires_catalog_pr_creation(test_case: dict[str, Any]) -> bool: Returns: True if catalog PR needs to be created, False otherwise """ + metadata = test_case.get("metadata", {}) has_script = test_case.get("generated_script_path") is not None - is_catalog = test_case.get("catalog_destined", False) - has_pr_number = test_case.get("catalog_pr_number") is not None - has_pr_url = test_case.get("catalog_pr_url") is not None + is_catalog = metadata.get("catalog", {}).get("destined", False) + catalog_tracking = metadata.get("catalog_tracking", {}) + has_pr_number = catalog_tracking.get("pr_number") is not None + has_pr_url = catalog_tracking.get("pr_url") is not None return has_script and is_catalog and not (has_pr_number and has_pr_url) @@ -400,11 +421,13 @@ def requires_catalog_pr_creation(test_case: dict[str, Any]) -> bool: def load_catalog_destined_test_cases(test_cases_dir: Path) -> list[dict[str, Any]]: """Load test cases that are catalog-destined from test_cases.yaml files. + Checks nested structure: metadata.catalog.destined + Args: test_cases_dir: Directory containing test_cases.yaml files Returns: - List of test case dictionaries with catalog_destined=true + List of test case dictionaries with metadata.catalog.destined=true """ catalog_test_cases = [] test_case_files = find_test_cases_files(test_cases_dir) @@ -421,7 +444,7 @@ def load_catalog_destined_test_cases(test_cases_dir: Path) -> list[dict[str, Any # Filter for catalog-destined test cases with generated scripts for test_case in test_cases: - is_catalog = test_case.get("catalog_destined", False) + is_catalog = test_case.get("metadata", {}).get("catalog", {}).get("destined", False) has_script = test_case.get("generated_script_path") if is_catalog and has_script: @@ -470,7 +493,7 @@ def load_all_test_cases(test_cases_dir: Path) -> list[dict[str, Any]]: logger.debug( "Loaded test case", title=test_case.get("title"), - catalog_destined=test_case.get("catalog_destined", False), + catalog_destined=test_case.get("metadata", {}).get("catalog", {}).get("destined", False), has_script=test_case.get("generated_script_path") is not None, source_file=str(test_case_file), ) diff --git a/github_ops_manager/synchronize/pull_requests.py b/github_ops_manager/synchronize/pull_requests.py index a141038..f88dd70 100644 --- a/github_ops_manager/synchronize/pull_requests.py +++ b/github_ops_manager/synchronize/pull_requests.py @@ -462,8 +462,9 @@ async def create_catalog_pull_requests( logger.info("Processing catalog test case", title=title, script_path=script_path) # Check if PR already exists - existing_pr_number = test_case.get("catalog_pr_number") - existing_pr_url = test_case.get("catalog_pr_url") + catalog_tracking = test_case.get("metadata", {}).get("catalog_tracking", {}) + existing_pr_number = catalog_tracking.get("pr_number") + existing_pr_url = catalog_tracking.get("pr_url") if existing_pr_number and existing_pr_url: logger.info("PR already exists for test case, skipping", title=title, pr_number=existing_pr_number, pr_url=existing_pr_url) diff --git a/github_ops_manager/synchronize/test_requirements.py b/github_ops_manager/synchronize/test_requirements.py index 0bdcd53..11370b7 100644 --- a/github_ops_manager/synchronize/test_requirements.py +++ b/github_ops_manager/synchronize/test_requirements.py @@ -143,8 +143,9 @@ async def create_project_pr_for_test_case( pr_title = f"GenAI, Review: {title}" # Build PR body with issue reference if available - issue_number = test_case.get("project_issue_number") - issue_url = test_case.get("project_issue_url") + project_tracking = test_case.get("metadata", {}).get("project_tracking", {}) + issue_number = project_tracking.get("issue_number") + issue_url = project_tracking.get("issue_url") if issue_number: pr_body = f"""**Quicksilver**: Automatically generated Pull Request for issue #{issue_number}. diff --git a/tests/unit/test_processing_test_cases_processor.py b/tests/unit/test_processing_test_cases_processor.py index 2617055..e02dba1 100644 --- a/tests/unit/test_processing_test_cases_processor.py +++ b/tests/unit/test_processing_test_cases_processor.py @@ -62,24 +62,28 @@ class TestUpdateTestCaseWithIssueMetadata: """Tests for update_test_case_with_issue_metadata function.""" def test_adds_issue_metadata(self) -> None: - """Should add issue number and URL to test case.""" + """Should add issue number and URL to test case in nested structure.""" test_case: dict[str, Any] = {"title": "Test Case 1"} result = update_test_case_with_issue_metadata(test_case, 123, "https://github.com/org/repo/issues/123") - assert result["project_issue_number"] == 123 - assert result["project_issue_url"] == "https://github.com/org/repo/issues/123" + assert result["metadata"]["project_tracking"]["issue_number"] == 123 + assert result["metadata"]["project_tracking"]["issue_url"] == "https://github.com/org/repo/issues/123" def test_overwrites_existing_metadata(self) -> None: """Should overwrite existing issue metadata.""" test_case: dict[str, Any] = { "title": "Test Case 1", - "project_issue_number": 100, - "project_issue_url": "https://old-url", + "metadata": { + "project_tracking": { + "issue_number": 100, + "issue_url": "https://old-url", + } + }, } result = update_test_case_with_issue_metadata(test_case, 200, "https://new-url") - assert result["project_issue_number"] == 200 - assert result["project_issue_url"] == "https://new-url" + assert result["metadata"]["project_tracking"]["issue_number"] == 200 + assert result["metadata"]["project_tracking"]["issue_url"] == "https://new-url" def test_returns_same_dict(self) -> None: """Should return the same dictionary object (mutated in place).""" @@ -93,7 +97,7 @@ class TestUpdateTestCaseWithProjectPrMetadata: """Tests for update_test_case_with_project_pr_metadata function.""" def test_adds_project_pr_metadata(self) -> None: - """Should add all project PR metadata fields.""" + """Should add all project PR metadata fields in nested structure.""" test_case: dict[str, Any] = {"title": "Test Case 1"} result = update_test_case_with_project_pr_metadata( test_case, @@ -103,17 +107,21 @@ def test_adds_project_pr_metadata(self) -> None: repo_url="https://github.com/org/repo", ) - assert result["project_pr_number"] == 456 - assert result["project_pr_url"] == "https://github.com/org/repo/pull/456" - assert result["project_pr_branch"] == "feature/test-case-1" - assert result["project_pr_git_url"] == "https://github.com/org/repo" + assert result["metadata"]["project_tracking"]["pr_number"] == 456 + assert result["metadata"]["project_tracking"]["pr_url"] == "https://github.com/org/repo/pull/456" + assert result["metadata"]["project_tracking"]["pr_branch"] == "feature/test-case-1" + assert result["metadata"]["project_tracking"]["git_url"] == "https://github.com/org/repo" def test_overwrites_existing_metadata(self) -> None: """Should overwrite existing project PR metadata.""" test_case: dict[str, Any] = { "title": "Test Case 1", - "project_pr_number": 100, - "project_pr_url": "https://old-url", + "metadata": { + "project_tracking": { + "pr_number": 100, + "pr_url": "https://old-url", + } + }, } result = update_test_case_with_project_pr_metadata( test_case, @@ -123,15 +131,15 @@ def test_overwrites_existing_metadata(self) -> None: repo_url="https://repo", ) - assert result["project_pr_number"] == 200 - assert result["project_pr_url"] == "https://new-url" + assert result["metadata"]["project_tracking"]["pr_number"] == 200 + assert result["metadata"]["project_tracking"]["pr_url"] == "https://new-url" class TestUpdateTestCaseWithPrMetadata: """Tests for update_test_case_with_pr_metadata function (catalog PRs).""" def test_adds_catalog_pr_metadata(self) -> None: - """Should add all catalog PR metadata fields.""" + """Should add all catalog PR metadata fields in nested structure.""" # Create a mock PR object mock_pr = MagicMock() mock_pr.number = 789 @@ -141,10 +149,10 @@ def test_adds_catalog_pr_metadata(self) -> None: test_case: dict[str, Any] = {"title": "Test Case 1"} result = update_test_case_with_pr_metadata(test_case, mock_pr, "https://github.com/catalog/repo") - assert result["catalog_pr_number"] == 789 - assert result["catalog_pr_url"] == "https://github.com/catalog/repo/pull/789" - assert result["catalog_pr_branch"] == "feat/nxos/add-test" - assert result["catalog_pr_git_url"] == "https://github.com/catalog/repo" + assert result["metadata"]["catalog_tracking"]["pr_number"] == 789 + assert result["metadata"]["catalog_tracking"]["pr_url"] == "https://github.com/catalog/repo/pull/789" + assert result["metadata"]["catalog_tracking"]["pr_branch"] == "feat/nxos/add-test" + assert result["metadata"]["catalog_tracking"]["git_url"] == "https://github.com/catalog/repo" class TestRequiresIssueCreation: @@ -157,20 +165,30 @@ def test_needs_issue_when_no_metadata(self) -> None: def test_needs_issue_when_only_number(self) -> None: """Should return True when only issue number exists.""" - test_case: dict[str, Any] = {"title": "Test Case 1", "project_issue_number": 123} + test_case: dict[str, Any] = { + "title": "Test Case 1", + "metadata": {"project_tracking": {"issue_number": 123}}, + } assert requires_issue_creation(test_case) is True def test_needs_issue_when_only_url(self) -> None: """Should return True when only issue URL exists.""" - test_case: dict[str, Any] = {"title": "Test Case 1", "project_issue_url": "https://url"} + test_case: dict[str, Any] = { + "title": "Test Case 1", + "metadata": {"project_tracking": {"issue_url": "https://url"}}, + } assert requires_issue_creation(test_case) is True def test_no_issue_needed_when_both_exist(self) -> None: """Should return False when both issue number and URL exist.""" test_case: dict[str, Any] = { "title": "Test Case 1", - "project_issue_number": 123, - "project_issue_url": "https://url", + "metadata": { + "project_tracking": { + "issue_number": 123, + "issue_url": "https://url", + } + }, } assert requires_issue_creation(test_case) is False @@ -192,11 +210,11 @@ def test_no_pr_needed_when_no_script(self) -> None: assert requires_project_pr_creation(test_case) is False def test_no_pr_needed_when_catalog_destined(self) -> None: - """Should return False when catalog_destined is True.""" + """Should return False when metadata.catalog.destined is True.""" test_case: dict[str, Any] = { "title": "Test Case 1", "generated_script_path": "path/to/script.robot", - "catalog_destined": True, + "metadata": {"catalog": {"destined": True}}, } assert requires_project_pr_creation(test_case) is False @@ -205,8 +223,12 @@ def test_no_pr_needed_when_pr_metadata_exists(self) -> None: test_case: dict[str, Any] = { "title": "Test Case 1", "generated_script_path": "path/to/script.robot", - "project_pr_number": 123, - "project_pr_url": "https://url", + "metadata": { + "project_tracking": { + "pr_number": 123, + "pr_url": "https://url", + } + }, } assert requires_project_pr_creation(test_case) is False @@ -215,7 +237,7 @@ def test_needs_pr_when_only_number_exists(self) -> None: test_case: dict[str, Any] = { "title": "Test Case 1", "generated_script_path": "path/to/script.robot", - "project_pr_number": 123, + "metadata": {"project_tracking": {"pr_number": 123}}, } assert requires_project_pr_creation(test_case) is True @@ -224,11 +246,11 @@ class TestRequiresCatalogPrCreation: """Tests for requires_catalog_pr_creation function.""" def test_needs_catalog_pr_when_catalog_destined(self) -> None: - """Should return True when catalog_destined and script exists.""" + """Should return True when metadata.catalog.destined and script exists.""" test_case: dict[str, Any] = { "title": "Test Case 1", "generated_script_path": "path/to/script.robot", - "catalog_destined": True, + "metadata": {"catalog": {"destined": True}}, } assert requires_catalog_pr_creation(test_case) is True @@ -237,7 +259,7 @@ def test_no_catalog_pr_needed_when_not_catalog_destined(self) -> None: test_case: dict[str, Any] = { "title": "Test Case 1", "generated_script_path": "path/to/script.robot", - "catalog_destined": False, + "metadata": {"catalog": {"destined": False}}, } assert requires_catalog_pr_creation(test_case) is False @@ -245,7 +267,7 @@ def test_no_catalog_pr_needed_when_no_script(self) -> None: """Should return False when no generated script.""" test_case: dict[str, Any] = { "title": "Test Case 1", - "catalog_destined": True, + "metadata": {"catalog": {"destined": True}}, } assert requires_catalog_pr_creation(test_case) is False @@ -254,9 +276,13 @@ def test_no_catalog_pr_needed_when_metadata_exists(self) -> None: test_case: dict[str, Any] = { "title": "Test Case 1", "generated_script_path": "path/to/script.robot", - "catalog_destined": True, - "catalog_pr_number": 123, - "catalog_pr_url": "https://url", + "metadata": { + "catalog": {"destined": True}, + "catalog_tracking": { + "pr_number": 123, + "pr_url": "https://url", + }, + }, } assert requires_catalog_pr_creation(test_case) is False @@ -425,12 +451,11 @@ def test_saves_to_correct_file(self) -> None: filepath = tmppath / "my_test_cases.yaml" filepath.write_text("test_cases:\n - title: Test 1\n") - # Load and modify + # Load and modify using nested structure test_cases = load_all_test_cases(tmppath) if test_cases: # Only if file was found test_case = test_cases[0] - test_case["project_issue_number"] = 999 - test_case["project_issue_url"] = "https://test-url" + update_test_case_with_issue_metadata(test_case, 999, "https://test-url") result = save_test_case_metadata(test_case) @@ -438,4 +463,4 @@ def test_saves_to_correct_file(self) -> None: if result: reloaded = load_test_cases_yaml(filepath) assert reloaded is not None - assert reloaded["test_cases"][0]["project_issue_number"] == 999 + assert reloaded["test_cases"][0]["metadata"]["project_tracking"]["issue_number"] == 999 diff --git a/tests/unit/test_synchronize_issues_yaml_migration.py b/tests/unit/test_synchronize_issues_yaml_migration.py index 9105af8..61cc5aa 100644 --- a/tests/unit/test_synchronize_issues_yaml_migration.py +++ b/tests/unit/test_synchronize_issues_yaml_migration.py @@ -209,7 +209,7 @@ class TestMigrateIssueFromGithub: @pytest.mark.asyncio async def test_migrates_issue_metadata(self) -> None: - """Should migrate issue metadata from GitHub to test case.""" + """Should migrate issue metadata from GitHub to test case in nested structure.""" with tempfile.TemporaryDirectory() as tmpdir: tmppath = Path(tmpdir) test_case_file = tmppath / "my_test_cases.yaml" @@ -235,12 +235,12 @@ async def test_migrates_issue_metadata(self) -> None: ) assert result is True - assert test_case["project_issue_number"] == 123 - assert test_case["project_issue_url"] == "https://github.com/org/repo/issues/123" + assert test_case["metadata"]["project_tracking"]["issue_number"] == 123 + assert test_case["metadata"]["project_tracking"]["issue_url"] == "https://github.com/org/repo/issues/123" @pytest.mark.asyncio async def test_migrates_pr_metadata(self) -> None: - """Should migrate PR metadata from GitHub to test case.""" + """Should migrate PR metadata from GitHub to test case in nested structure.""" with tempfile.TemporaryDirectory() as tmpdir: tmppath = Path(tmpdir) test_case_file = tmppath / "my_test_cases.yaml" @@ -267,9 +267,9 @@ async def test_migrates_pr_metadata(self) -> None: ) assert result is True - assert test_case["project_pr_number"] == 456 - assert test_case["project_pr_url"] == "https://github.com/org/repo/pull/456" - assert test_case["project_pr_branch"] == "feature/test" + assert test_case["metadata"]["project_tracking"]["pr_number"] == 456 + assert test_case["metadata"]["project_tracking"]["pr_url"] == "https://github.com/org/repo/pull/456" + assert test_case["metadata"]["project_tracking"]["pr_branch"] == "feature/test" @pytest.mark.asyncio async def test_returns_false_when_not_found_in_github(self) -> None: diff --git a/tests/unit/test_synchronize_test_requirements.py b/tests/unit/test_synchronize_test_requirements.py index 850dcb4..21bd871 100644 --- a/tests/unit/test_synchronize_test_requirements.py +++ b/tests/unit/test_synchronize_test_requirements.py @@ -100,7 +100,7 @@ async def test_creates_issue_successfully(self) -> None: @pytest.mark.asyncio async def test_updates_test_case_with_metadata(self) -> None: - """Should update test case dict with issue metadata.""" + """Should update test case dict with issue metadata in nested structure.""" mock_adapter = AsyncMock() mock_issue = MagicMock() mock_issue.number = 456 @@ -111,8 +111,8 @@ async def test_updates_test_case_with_metadata(self) -> None: await create_issue_for_test_case(test_case, mock_adapter, "Body") - assert test_case["project_issue_number"] == 456 - assert test_case["project_issue_url"] == "https://github.com/org/repo/issues/456" + assert test_case["metadata"]["project_tracking"]["issue_number"] == 456 + assert test_case["metadata"]["project_tracking"]["issue_url"] == "https://github.com/org/repo/issues/456" @pytest.mark.asyncio async def test_returns_none_on_missing_title(self) -> None: @@ -195,8 +195,12 @@ async def test_pr_body_includes_issue_reference(self) -> None: test_case: dict[str, Any] = { "title": "Test Case 1", "generated_script_path": script_path, - "project_issue_number": 42, - "project_issue_url": "https://github.com/org/repo/issues/42", + "metadata": { + "project_tracking": { + "issue_number": 42, + "issue_url": "https://github.com/org/repo/issues/42", + } + }, } await create_project_pr_for_test_case( @@ -477,13 +481,15 @@ async def test_skips_test_cases_with_existing_metadata(self) -> None: """Should skip test cases that already have issue metadata.""" with tempfile.TemporaryDirectory() as tmpdir: test_cases_dir = Path(tmpdir) - # Create test case file with existing metadata + # Create test case file with existing nested metadata (test_cases_dir / "my_test_cases.yaml").write_text( """test_cases: - title: Test Case 1 purpose: Test purpose - project_issue_number: 123 - project_issue_url: https://existing-url + metadata: + project_tracking: + issue_number: 123 + issue_url: https://existing-url commands: - command: show version """ @@ -516,9 +522,11 @@ async def test_creates_project_prs_for_non_catalog(self) -> None: f"""test_cases: - title: Test Case 1 purpose: Test purpose - project_issue_number: 1 - project_issue_url: https://url generated_script_path: {script_path} + metadata: + project_tracking: + issue_number: 1 + issue_url: https://url commands: - command: show version """ @@ -564,10 +572,13 @@ async def test_creates_catalog_prs_for_catalog_destined(self) -> None: f"""test_cases: - title: Test Case 1 purpose: Test purpose - project_issue_number: 1 - project_issue_url: https://url generated_script_path: {script_path} - catalog_destined: true + metadata: + project_tracking: + issue_number: 1 + issue_url: https://url + catalog: + destined: true commands: - command: show version """ @@ -619,10 +630,13 @@ async def test_reports_error_when_catalog_not_configured(self) -> None: f"""test_cases: - title: Test Case 1 purpose: Test purpose - project_issue_number: 1 - project_issue_url: https://url generated_script_path: {script_path} - catalog_destined: true + metadata: + project_tracking: + issue_number: 1 + issue_url: https://url + catalog: + destined: true commands: - command: show version """