import os import sys import tempfile import unittest import json REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.join(REPO_ROOT, "bin")) import importlib.util spec = importlib.util.spec_from_file_location("box_gitea_bridge", os.path.join(REPO_ROOT, "bin", "box-gitea-bridge.py")) bgb = importlib.util.module_from_spec(spec) spec.loader.exec_module(bgb) class TestBoxGiteaBridge(unittest.TestCase): def setUp(self): self.tmpdir = tempfile.TemporaryDirectory() bgb.TASKS_DIR = os.path.join(self.tmpdir.name, "fleet", "tasks") os.makedirs(os.path.join(bgb.TASKS_DIR, "pending"), exist_ok=True) os.makedirs(os.path.join(bgb.TASKS_DIR, "claimed"), exist_ok=True) os.makedirs(os.path.join(bgb.TASKS_DIR, "done"), exist_ok=True) def tearDown(self): self.tmpdir.cleanup() def test_slugify(self): self.assertEqual(bgb.slugify("Hello World! 123"), "hello-world-123") self.assertEqual(bgb.slugify("Fix: Gitea & Box Integration"), "fix-gitea-box-integration") def test_label_gating(self): # Unlabeled issue -> skipped issue_unlabeled = {"number": 208, "title": "Untagged discussion", "labels": []} path, status = bgb.create_task_from_issue(issue_unlabeled) self.assertIsNone(path) self.assertEqual(status, "skipped_label_gate") # Irrelevant label -> skipped issue_wontfix = {"number": 208, "title": "Wontfix bug", "labels": [{"name": "wontfix"}]} path, status = bgb.create_task_from_issue(issue_wontfix) self.assertIsNone(path) self.assertEqual(status, "skipped_label_gate") # Labeled 'task' -> created issue_task = {"number": 208, "title": "Build Gitea Bridge", "labels": [{"name": "task"}], "body": "Implement bridge"} path, status = bgb.create_task_from_issue(issue_task) self.assertIsNotNone(path) self.assertEqual(status, "created") self.assertTrue(os.path.exists(path)) self.assertIn("208-build-gitea-bridge.md", path) def test_assigned_issue_claims_directly(self): issue_assigned = { "number": 209, "title": "OPM Recovery Task", "labels": [{"name": "ready"}], "body": "Run recovery", "assignee": {"username": "opm"} } path, status = bgb.create_task_from_issue(issue_assigned) self.assertIsNotNone(path) self.assertEqual(status, "created") self.assertIn("claimed", path) self.assertTrue(path.endswith(".opm")) def test_label_based_routing(self): issue_label_assigned = { "number": 211, "title": "Direct Labeled Task", "labels": [{"name": "task"}, {"name": "assign:opm"}], "body": "Direct routing via label" } path, status = bgb.create_task_from_issue(issue_label_assigned) self.assertIsNotNone(path) self.assertEqual(status, "created") self.assertIn("claimed", path) self.assertTrue(path.endswith(".opm")) def test_close_task_moves_to_done(self): issue = {"number": 210, "title": "Close test", "labels": [{"name": "ready"}]} created_path, _ = bgb.create_task_from_issue(issue) self.assertTrue(os.path.exists(created_path)) done_path = bgb.close_task_for_issue(210, "Verified fixed") self.assertIsNotNone(done_path) self.assertFalse(os.path.exists(created_path)) self.assertTrue(os.path.exists(done_path)) self.assertIn("done", done_path) with open(done_path) as f: content = f.read() self.assertIn("Verified fixed", content) if __name__ == "__main__": unittest.main()