import pytest from django.contrib.contenttypes.models import ContentType from vergabe_teilnahme.apps.accounts.models import Mitarbeiter from vergabe_teilnahme.apps.ausschreibungen.models import Ausschreibung from vergabe_teilnahme.apps.core.models import CustomAttribute, EntityFieldConfig, Freigabe from vergabe_teilnahme.apps.lose.models import Los from vergabe_teilnahme.apps.partner.models import Subunternehmer @pytest.fixture def mitarbeiter(db): return Mitarbeiter.objects.create_user(username='testuser', password='x') @pytest.mark.django_db class TestVollstaendigerBieterprozess: def test_ausschreibung_anlegen_bis_freigabe(self, client, mitarbeiter): client.force_login(mitarbeiter) # 1. Ausschreibung anlegen r = client.post('/ausschreibungen/neu/', { 'titel': 'E2E Test Ausschreibung', 'ausschreiber': 'Testamt', }) assert r.status_code == 302 a = Ausschreibung.objects.get(titel='E2E Test Ausschreibung') # 2. Los anlegen r = client.post(f'/ausschreibungen/{a.pk}/lose/neu/', { 'losnummer': '1', 'lostitel': 'Hauptlos', }) assert r.status_code == 302 assert Los.objects.filter(ausschreibung=a).count() == 1 # 3. Freigabe erteilen via API ct = ContentType.objects.get_for_model(a) r = client.post('/freigaben/erteilen/', { 'content_type_id': ct.pk, 'object_id': a.pk, 'freigabe_typ': 'teilnahme', }) assert r.status_code == 200 assert Freigabe.objects.filter( content_type=ct, object_id=a.pk, freigabe_typ='teilnahme' ).exists() # 4. Freigaben-Übersicht abrufbar r = client.get(f'/ausschreibungen/{a.pk}/freigaben/') assert r.status_code == 200 assert 'teilnahme' in r.content.decode().lower() def test_freigabe_modal_liefert_fragment(self, client, mitarbeiter): client.force_login(mitarbeiter) a = Ausschreibung.objects.create(titel='Modal Test', ausschreiber='X', status=1) ct = ContentType.objects.get_for_model(a) r = client.get(f'/freigaben/modal/?ct={ct.pk}&oid={a.pk}&typ=preis') assert r.status_code == 200 content = r.content.decode() assert 'freigabe_typ' in content.lower() or 'freigabe' in content.lower() def test_abgabe_dokumentieren(self, client, mitarbeiter): client.force_login(mitarbeiter) a = Ausschreibung.objects.create(titel='Abgabe Test', ausschreiber='X', status=6) r = client.post(f'/ausschreibungen/{a.pk}/abgabe/dokumentieren/', { 'abgabe_zeitpunkt': '2026-05-11T12:00', 'abgabe_plattform': 'Vergabeplattform', }) assert r.status_code == 302 a.refresh_from_db() assert a.status == 9 @pytest.mark.django_db class TestFlexibleFelder: def test_feld_ausblenden_wirkt_im_template(self, client, mitarbeiter): sub = Subunternehmer.objects.create(name='Test GmbH') EntityFieldConfig.objects.create( entity_type='subunternehmer', field_name='webseite', is_hidden=True ) client.force_login(mitarbeiter) hidden_fields = sub.get_hidden_fields() assert 'webseite' in hidden_fields def test_custom_attribute_hinzufuegen(self, client, mitarbeiter): sub = Subunternehmer.objects.create(name='Test GmbH') ct = ContentType.objects.get_for_model(sub) client.force_login(mitarbeiter) r = client.post(f'/core/attrs/{ct.pk}/{sub.pk}/neu/', { 'label': 'Vertragsnummer', 'value': 'VN-2026-001', 'data_type': 'text', }) assert r.status_code == 200 assert CustomAttribute.objects.filter( content_type=ct, object_id=sub.pk, label='Vertragsnummer' ).exists() def test_custom_attribute_panel_zeigt_attribute(self, client, mitarbeiter): sub = Subunternehmer.objects.create(name='Panel Test GmbH') ct = ContentType.objects.get_for_model(sub) CustomAttribute.objects.create( content_type=ct, object_id=sub.pk, key='kundennr', label='Kundennummer', value='KD-999', data_type='text' ) client.force_login(mitarbeiter) r = client.get(f'/core/attrs/{ct.pk}/{sub.pk}/') assert r.status_code == 200 assert b'Kundennummer' in r.content def test_feld_konfiguration_seite_erreichbar(self, client, mitarbeiter): client.force_login(mitarbeiter) r = client.get('/felder/ausschreibung/') assert r.status_code == 200 assert b'titel' in r.content def test_feedback_backlog_erreichbar(self, client, mitarbeiter): client.force_login(mitarbeiter) r = client.get('/feedback/backlog/') assert r.status_code == 200