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

Я помню и вижу, что в своих старых проектах я делал это таким образом. Но теперь данные не сериализуемы.

Вернуться на верх