vergabe-teilnahme/vergabe_teilnahme/apps/dokumente/tests.py
tegwick b7d7828f30 Require invited login and private downloads for the company pilot
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a07ff8-19d0-7820-b4d0-1353833cb7fc
2026-09-11 16:35:13 +02:00

85 lines
3.3 KiB
Python

import io
import factory
import pytest
from django.core.files.uploadedfile import SimpleUploadedFile
from django.urls import reverse
from vergabe_teilnahme.apps.ausschreibungen.tests import AusschreibungFactory
from .models import Dokument
class DokumentFactory(factory.django.DjangoModelFactory):
class Meta:
model = Dokument
ausschreibung = factory.SubFactory(AusschreibungFactory)
dateiname = factory.Sequence(lambda n: f'dokument_{n}.pdf')
kategorie = 'intern'
status = 'entwurf'
version = '1.0'
def _pdf_file(name='test.pdf'):
return SimpleUploadedFile(name, b'%PDF-1.4 fake content', content_type='application/pdf')
@pytest.mark.django_db
def test_dokument_upload_valid(admitted_client, tmp_path, settings):
settings.MEDIA_ROOT = tmp_path
a = AusschreibungFactory()
url = reverse('ausschreibungen:dokumente:upload', kwargs={'ausschreibung_id': a.pk})
response = admitted_client.post(url, {'datei': _pdf_file(), 'kategorie': 'intern', 'version': '1.0'})
assert response.status_code == 302
assert Dokument.objects.filter(ausschreibung=a).exists()
@pytest.mark.django_db
def test_dokument_upload_invalid_extension(admitted_client, tmp_path, settings):
settings.MEDIA_ROOT = tmp_path
a = AusschreibungFactory()
url = reverse('ausschreibungen:dokumente:upload', kwargs={'ausschreibung_id': a.pk})
bad_file = SimpleUploadedFile('malware.exe', b'MZ bad', content_type='application/octet-stream')
response = admitted_client.post(url, {'datei': bad_file, 'kategorie': 'intern', 'version': '1.0'})
assert response.status_code == 200
assert not Dokument.objects.filter(ausschreibung=a).exists()
@pytest.mark.django_db
def test_dokument_upload_too_large(admitted_client, tmp_path, settings):
settings.MEDIA_ROOT = tmp_path
settings.MAX_UPLOAD_SIZE = 10
a = AusschreibungFactory()
url = reverse('ausschreibungen:dokumente:upload', kwargs={'ausschreibung_id': a.pk})
big_file = SimpleUploadedFile('big.pdf', b'%PDF' + b'x' * 100, content_type='application/pdf')
response = admitted_client.post(url, {'datei': big_file, 'kategorie': 'intern', 'version': '1.0'})
assert response.status_code == 200
assert not Dokument.objects.filter(ausschreibung=a).exists()
@pytest.mark.django_db
def test_dokument_neue_version(admitted_client, tmp_path, settings):
settings.MEDIA_ROOT = tmp_path
altes_dok = DokumentFactory(version='1.0')
a = altes_dok.ausschreibung
url = reverse('ausschreibungen:dokumente:neue_version',
kwargs={'ausschreibung_id': a.pk, 'pk': altes_dok.pk})
response = admitted_client.post(url, {'datei': _pdf_file('v2.pdf'), 'version': '2.0'})
assert response.status_code == 302
altes_dok.refresh_from_db()
assert altes_dok.status == 'ersetzt'
assert Dokument.objects.filter(ausschreibung=a, version='2.0').exists()
@pytest.mark.django_db
def test_dokument_finale_version(admitted_client):
dok = DokumentFactory(status='freigegeben')
a = dok.ausschreibung
url = reverse('ausschreibungen:dokumente:finale_version',
kwargs={'ausschreibung_id': a.pk, 'pk': dok.pk})
response = admitted_client.post(url)
assert response.status_code == 200
dok.refresh_from_db()
assert dok.finale_abgabeversion is True
assert dok.status == 'final_abgegeben'