issue-facade integration

This commit is contained in:
tegwick 2026-05-14 11:30:30 +02:00
parent c2b7cc64d6
commit a907ed6f74
16 changed files with 642 additions and 95 deletions

View file

@ -168,26 +168,28 @@ def test_aufgaben_verknuepfung_loeschen(client):
# ─── ExternalIssue ────────────────────────────────────────────────────────────
@pytest.fixture
def tmp_issue_db(tmp_path, settings):
settings.ISSUE_FACADE_LOCAL_DB = tmp_path / 'test_issues.db'
settings.ISSUE_FACADE_GITEA = None
return settings.ISSUE_FACADE_LOCAL_DB
@pytest.mark.django_db
def test_external_issue_erstellen(client):
def test_external_issue_erstellen(client, tmp_issue_db):
aufgabe = AufgabeFactory()
url = reverse('ausschreibungen:aufgaben:external_issue',
kwargs={'ausschreibung_id': aufgabe.ausschreibung_id, 'pk': aufgabe.pk})
response = client.post(url, {
'system': 'github',
'issue_url': 'https://github.com/org/repo/issues/42',
'issue_key': 'GH-42',
'notizen': '',
}, HTTP_HX_REQUEST='true')
response = client.post(url, {'notizen': ''}, HTTP_HX_REQUEST='true')
assert response.status_code == 200
assert ExternalIssue.objects.filter(aufgabe=aufgabe, system='github').exists()
assert ExternalIssue.objects.filter(aufgabe=aufgabe, issue_facade_backend='local').exists()
@pytest.mark.django_db
def test_external_issue_loeschen(client):
aufgabe = AufgabeFactory()
ei = ExternalIssue.objects.create(
aufgabe=aufgabe, system='jira', issue_key='PROJ-1'
aufgabe=aufgabe, issue_facade_backend='local', issue_key='#1'
)
url = reverse('ausschreibungen:aufgaben:external_issue_loeschen',
kwargs={'ausschreibung_id': aufgabe.ausschreibung_id, 'pk': aufgabe.pk})
@ -201,3 +203,87 @@ def test_issue_adapter_interface():
from .issue_facade import get_adapter
assert get_adapter('github') is None
assert get_adapter('nichtexistent') is None
# ─── Issue-Facade Integration ─────────────────────────────────────────────────
@pytest.mark.django_db
def test_aufgabe_zu_issue_mapping(tmp_issue_db):
from .issue_facade import aufgabe_zu_issue
aufgabe = AufgabeFactory(titel='Test-Aufgabe', beschreibung='Beschreibung', prioritaet=1)
issue = aufgabe_zu_issue(aufgabe)
assert issue.title == 'Test-Aufgabe'
assert issue.description == 'Beschreibung'
label_names = [l.name for l in issue.labels]
assert 'task' in label_names
assert 'priority:high' in label_names
@pytest.mark.django_db
def test_lokales_issue_erstellen(tmp_issue_db):
from .issue_facade import lokales_issue_erstellen
aufgabe = AufgabeFactory()
daten = lokales_issue_erstellen(aufgabe)
assert daten['issue_facade_id']
assert daten['issue_key'].startswith('#')
assert daten['sync_status'] == 'open'
@pytest.mark.django_db
def test_status_synchronisieren(tmp_issue_db):
from .issue_facade import lokales_issue_erstellen, status_synchronisieren
aufgabe = AufgabeFactory()
daten = lokales_issue_erstellen(aufgabe)
ei = ExternalIssue.objects.create(
aufgabe=aufgabe,
issue_facade_backend='local',
issue_facade_id=daten['issue_facade_id'],
issue_key=daten['issue_key'],
sync_status=daten['sync_status'],
)
neuer_status = status_synchronisieren(ei)
assert neuer_status == 'open'
ei.refresh_from_db()
assert ei.sync_status == 'open'
assert ei.letzter_sync is not None
@pytest.mark.django_db
def test_external_issue_bearbeiten_view_erstellt_issue(client, tmp_issue_db):
aufgabe = AufgabeFactory()
url = reverse('ausschreibungen:aufgaben:external_issue',
kwargs={'ausschreibung_id': aufgabe.ausschreibung_id, 'pk': aufgabe.pk})
response = client.post(url, {'notizen': 'Test-Notiz'}, HTTP_HX_REQUEST='true')
assert response.status_code == 200
ei = ExternalIssue.objects.get(aufgabe=aufgabe)
assert ei.issue_facade_backend == 'local'
assert ei.issue_facade_id
assert ei.notizen == 'Test-Notiz'
@pytest.mark.django_db
def test_external_issue_sync_view(client, tmp_issue_db):
from .issue_facade import lokales_issue_erstellen
aufgabe = AufgabeFactory()
daten = lokales_issue_erstellen(aufgabe)
ei = ExternalIssue.objects.create(
aufgabe=aufgabe,
issue_facade_backend='local',
issue_facade_id=daten['issue_facade_id'],
issue_key=daten['issue_key'],
sync_status=daten['sync_status'],
)
url = reverse('ausschreibungen:aufgaben:external_issue_sync',
kwargs={'ausschreibung_id': aufgabe.ausschreibung_id, 'pk': aufgabe.pk})
response = client.post(url, {}, HTTP_HX_REQUEST='true')
assert response.status_code == 200
ei.refresh_from_db()
assert ei.sync_status == 'open'
@pytest.mark.django_db
def test_get_adapter_stub():
from .issue_facade import get_adapter
assert get_adapter('github') is None
assert get_adapter('gitea') is None