diff --git a/backend/tests/test_jira_sync_job.py b/backend/tests/test_jira_sync_job.py new file mode 100644 index 0000000..e9c4aff --- /dev/null +++ b/backend/tests/test_jira_sync_job.py @@ -0,0 +1,69 @@ +"""Jira sync scheduled job tests (FASE-1.7).""" + +from unittest.mock import patch +from uuid import uuid4 + +import pytest + +from app.jobs.jira_sync_job import sync_all_jira_links +from app.models.jira_link import JiraLink, JiraLinkEntityType +from tests.conftest import TestingSessionLocal + + +@pytest.fixture(autouse=True) +def _job_uses_test_db(monkeypatch): + """Route the job's SessionLocal to the in-memory SQLite test engine.""" + import app.database as database_module + + monkeypatch.setattr(database_module, "_SessionLocal", TestingSessionLocal) + monkeypatch.setattr( + "app.jobs.jira_sync_job.SessionLocal", + TestingSessionLocal, + ) + + +def test_sync_all_jira_links_skips_when_disabled(monkeypatch, db): + monkeypatch.setattr("app.jobs.jira_sync_job.settings.JIRA_ENABLED", False) + with patch("app.jobs.jira_sync_job.jira_service.sync_jira_to_aegis") as mock_sync: + sync_all_jira_links() + mock_sync.assert_not_called() + + +@patch("app.jobs.jira_sync_job.jira_service.sync_jira_to_aegis") +def test_sync_all_jira_links_updates_links(mock_sync, monkeypatch, db, admin_user): + monkeypatch.setattr("app.jobs.jira_sync_job.settings.JIRA_ENABLED", True) + + link = JiraLink( + entity_type=JiraLinkEntityType.test, + entity_id=uuid4(), + jira_issue_key="SEC-1", + created_by=admin_user.id, + ) + db.add(link) + db.commit() + + sync_all_jira_links() + + assert mock_sync.call_count == 1 + + +@patch("app.jobs.jira_sync_job.jira_service.sync_jira_to_aegis") +def test_sync_all_jira_links_continues_on_single_failure(mock_sync, monkeypatch, db, admin_user): + monkeypatch.setattr("app.jobs.jira_sync_job.settings.JIRA_ENABLED", True) + + for key in ("SEC-A", "SEC-B"): + db.add( + JiraLink( + entity_type=JiraLinkEntityType.test, + entity_id=uuid4(), + jira_issue_key=key, + created_by=admin_user.id, + ), + ) + db.commit() + + mock_sync.side_effect = [Exception("issue deleted"), None] + + sync_all_jira_links() + + assert mock_sync.call_count == 2