Django Ninja Unit-тестирование конечной точки с помощью File Upload
У меня есть простая модель django:
class Invoices(TKSModel):
invoice = models.FileField(upload_to="invoices/", null=False, blank=False, validators=[document_file_validator])
institution = models.CharField(max_length=64, null=False, blank=False)
invoice_date = models.DateField(null=False, blank=False)
description = models.TextField(null=True, blank=True)
Затем я создал конечную точку с помощью django ninja:
@router.post('/add', response={201: InvoiceShema}, tags=["Invoice"])
def add_invoice(request, invoice: InvoiceAddShema):
instance = Invoices.objects.create(
created_by=request.auth,
**invoice.dict(),
)
return 201, instance
Не: InvoiceAddShema
это:
class InvoiceAddShema(Schema):
invoice_file: UploadedFile
institution: str
invoice_date: date
description: Optional[str] = None
Последнее, но не менее важное: я пытаюсь протестировать конечную точку, используя:
def test_add(self):
fake = Faker()
file_stream = BytesIO()
c = canvas.Canvas(file_stream)
c.drawString(100, 750, "Invoice")
c.save()
file_stream.seek(0)
file_stream.name = "invoice.pdf"
# uploaded_pdf = SimpleUploadedFile("invoice.pdf", file_stream.read(), content_type="application/pdf") # <- You see I event tried this...
data = {
"institution": "".join(choices(ascii_letters, k=20)),
"invoice_date": str(fake.date_between(start_date='today', end_date='+30y')),
"description": "".join(choices(ascii_letters, k=120)),
"invoice_file": open(r"C:\Users\mshem\PycharmProjects\tks\media\consume\coloombia.pdf", "rb")
}
self.superuser_header["Content-Type"] = "multipart/form-data"
respond = self.client.post(
f"{self.url}/add",
**self.superuser_header,
data=data
)
Но я получаю:
TypeError: Object of type BufferedReader is not JSON serializable
Я помню и вижу, что в своих старых проектах я делал это таким образом. Но теперь данные не сериализуемы.