diff --git a/.github/tests/test_auto_add_to_project.py b/.github/tests/test_auto_add_to_project.py new file mode 100644 index 0000000..a3bc9a0 --- /dev/null +++ b/.github/tests/test_auto_add_to_project.py @@ -0,0 +1,45 @@ +from pathlib import Path +import re +import unittest + + +WORKFLOW = Path(".github/workflows/auto-add-to-project.yml") +SANITY_WORKFLOW = Path(".github/workflows/workflow-sanity.yml") + + +class RepositoryModuleMappingTest(unittest.TestCase): + def test_octo_docs_html_maps_to_server(self) -> None: + workflow = WORKFLOW.read_text(encoding="utf-8") + mapping_block = re.search( + r"const REPO_MODULE = \{(?P.*?)^\s*\};", + workflow, + flags=re.MULTILINE | re.DOTALL, + ) + + self.assertIsNotNone(mapping_block, "REPO_MODULE mapping block is missing") + mappings = dict( + re.findall( + r"^\s*'([^']+)':\s*'([^']+)',\s*$", + mapping_block.group("body"), + flags=re.MULTILINE, + ) + ) + self.assertEqual(mappings.get("octo-docs-html"), "server") + + def test_contract_job_only_runs_in_central_repository(self) -> None: + workflow = SANITY_WORKFLOW.read_text(encoding="utf-8") + contracts_job = re.search( + r"^ contracts:\n(?P.*?)(?=^ [a-z][a-z0-9-]*:\n)", + workflow, + flags=re.MULTILINE | re.DOTALL, + ) + + self.assertIsNotNone(contracts_job, "contracts job is missing") + self.assertIn( + "if: github.repository == 'Mininglamp-OSS/.github'", + contracts_job.group("body"), + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/.github/workflows/auto-add-to-project.yml b/.github/workflows/auto-add-to-project.yml index 639a67f..087d315 100644 --- a/.github/workflows/auto-add-to-project.yml +++ b/.github/workflows/auto-add-to-project.yml @@ -86,6 +86,7 @@ jobs: 'octo-cli': 'cli', 'octo-daemon-cli': 'cli', 'octo-deployment': 'deployment', + 'octo-docs-html': 'server', 'octo-fleet': 'server', 'octo-im': 'server', 'octo-ios': 'ios', @@ -317,4 +318,3 @@ jobs: }); core.info(`Inherited Sprint "${sprintTitle}" from linked issue onto PR item ${itemId}.`); - diff --git a/.github/workflows/workflow-sanity.yml b/.github/workflows/workflow-sanity.yml index 22874cf..e099143 100644 --- a/.github/workflows/workflow-sanity.yml +++ b/.github/workflows/workflow-sanity.yml @@ -8,11 +8,13 @@ on: paths: - '.github/workflows/**' - '.github/actions/**' + - '.github/tests/**' push: branches: [main] paths: - '.github/workflows/**' - '.github/actions/**' + - '.github/tests/**' workflow_dispatch: permissions: {} @@ -22,6 +24,23 @@ concurrency: cancel-in-progress: true jobs: + contracts: + name: Workflow contracts + # Reusable callers check out their own repository, which has no central tests. + if: github.repository == 'Mininglamp-OSS/.github' + runs-on: ubuntu-24.04 + timeout-minutes: 5 + permissions: + contents: read + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Test workflow contracts + run: python3 -m unittest discover -s .github/tests -p 'test_*.py' + no-tabs: name: No tabs in workflow files runs-on: ubuntu-24.04