diff --git a/.github/workflows/validate-description.yml b/.github/workflows/validate-description.yml index 826c93d..a60b554 100644 --- a/.github/workflows/validate-description.yml +++ b/.github/workflows/validate-description.yml @@ -6,7 +6,10 @@ jobs: validate_description: runs-on: ubuntu-latest steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Check PR description for work item link run: | echo "Checking PR description for work item link" - python .global-checks-tooling/checks/check_pr_description.py "${{ github.event.pull_request.body }}" + python checks/check_pr_description.py "${{ github.event.pull_request.body }}" diff --git a/checks/check_pr_description.py b/checks/check_pr_description.py index e82e86c..1f2b04c 100644 --- a/checks/check_pr_description.py +++ b/checks/check_pr_description.py @@ -4,9 +4,16 @@ def check_description(description): """ Checks if the PR description contains a work item link. + Returns True if valid, False otherwise. """ regex = r"(^|\s)(https:\/\/app\.devrev\.ai\/devrev\/works\/)?(ISS|TKT|TASK)-\d+\b" - if not re.search(regex, description): + return bool(re.search(regex, description)) + +def check_description_cli(description): + """ + CLI version that prints messages and exits. + """ + if not check_description(description): print("PR description must include a link to the work item (e.g., ISS-123, TKT-456, TASK-789, or a full https://app.devrev.ai/devrev/works/ISS-123 link).") sys.exit(1) print("PR description contains a valid work item link.") @@ -18,4 +25,4 @@ def check_description(description): sys.exit(1) pr_description = sys.argv[1] - check_description(pr_description) + check_description_cli(pr_description) diff --git a/checks/fixtures/pr_description/invalid/no_link.txt b/checks/fixtures/pr_description/invalid/no_link.txt new file mode 100644 index 0000000..1e2dede --- /dev/null +++ b/checks/fixtures/pr_description/invalid/no_link.txt @@ -0,0 +1,6 @@ +This PR adds a new feature to the application. + +## Changes +- Added new functionality +- Updated tests +- Fixed styling issues \ No newline at end of file diff --git a/checks/fixtures/pr_description/invalid/wrong_format.txt b/checks/fixtures/pr_description/invalid/wrong_format.txt new file mode 100644 index 0000000..631e02c --- /dev/null +++ b/checks/fixtures/pr_description/invalid/wrong_format.txt @@ -0,0 +1,3 @@ +This PR addresses issue ISSUE-123 and ticket TICKET-456. + +The work items don't follow the correct format. \ No newline at end of file diff --git a/checks/fixtures/pr_description/valid/full_url.txt b/checks/fixtures/pr_description/valid/full_url.txt new file mode 100644 index 0000000..0002319 --- /dev/null +++ b/checks/fixtures/pr_description/valid/full_url.txt @@ -0,0 +1,7 @@ +Fixes bug reported in https://app.devrev.ai/devrev/works/ISS-999. + +## Bug Description +The application was crashing when handling large datasets. + +## Solution +Implemented pagination to handle large data efficiently. \ No newline at end of file diff --git a/checks/fixtures/pr_description/valid/iss_link.txt b/checks/fixtures/pr_description/valid/iss_link.txt new file mode 100644 index 0000000..d52f6e9 --- /dev/null +++ b/checks/fixtures/pr_description/valid/iss_link.txt @@ -0,0 +1,5 @@ +This PR fixes the login issue described in ISS-123. + +## Changes +- Updated authentication flow +- Fixed token validation \ No newline at end of file diff --git a/checks/fixtures/pr_description/valid/task_link.txt b/checks/fixtures/pr_description/valid/task_link.txt new file mode 100644 index 0000000..cb4400f --- /dev/null +++ b/checks/fixtures/pr_description/valid/task_link.txt @@ -0,0 +1,3 @@ +Refactoring code structure for TASK-789. + +This refactoring improves maintainability and performance. \ No newline at end of file diff --git a/checks/fixtures/pr_description/valid/tkt_link.txt b/checks/fixtures/pr_description/valid/tkt_link.txt new file mode 100644 index 0000000..7bcf227 --- /dev/null +++ b/checks/fixtures/pr_description/valid/tkt_link.txt @@ -0,0 +1,4 @@ +Implements new feature as requested in TKT-456. + +- Added new API endpoint +- Updated documentation \ No newline at end of file diff --git a/checks/test_checks.py b/checks/test_checks.py index 2026391..6a3283b 100644 --- a/checks/test_checks.py +++ b/checks/test_checks.py @@ -2,6 +2,7 @@ import checks.check_commit_emails import checks.check_repo_yml import checks.check_trufflehog +import checks.check_pr_description import unittest import os @@ -71,7 +72,36 @@ def test_bad(self): with change_dir("checks/fixtures/emails/bad"): self.assertFalse(checks.check_commit_emails.check_commit_emails()) - +class TestPRDescription(unittest.TestCase): + def test_valid_iss_link(self): + with open("checks/fixtures/pr_description/valid/iss_link.txt", "r") as f: + description = f.read() + self.assertTrue(checks.check_pr_description.check_description(description)) + + def test_valid_tkt_link(self): + with open("checks/fixtures/pr_description/valid/tkt_link.txt", "r") as f: + description = f.read() + self.assertTrue(checks.check_pr_description.check_description(description)) + + def test_valid_task_link(self): + with open("checks/fixtures/pr_description/valid/task_link.txt", "r") as f: + description = f.read() + self.assertTrue(checks.check_pr_description.check_description(description)) + + def test_valid_full_url(self): + with open("checks/fixtures/pr_description/valid/full_url.txt", "r") as f: + description = f.read() + self.assertTrue(checks.check_pr_description.check_description(description)) + + def test_invalid_no_link(self): + with open("checks/fixtures/pr_description/invalid/no_link.txt", "r") as f: + description = f.read() + self.assertFalse(checks.check_pr_description.check_description(description)) + + def test_invalid_wrong_format(self): + with open("checks/fixtures/pr_description/invalid/wrong_format.txt", "r") as f: + description = f.read() + self.assertFalse(checks.check_pr_description.check_description(description)) if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main()