mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-06-03 05:49:35 +00:00
50a81bdfdd
The idea behind a streaming CSV export was to reduce the amount of memory used, by avoiding building the entire CSV file in memory before sending it to the client. However, it didn't work out this way in practice: the query objects that were created to represent each line caused Postgres to generate a very large (~200MB on bookwyrm.social) temp file, not to mention the memory being used by the Query object likely being similar to, if not larger than that used by the finalized CSV row. While we should in the long term run our CSV exports as a Celery task, this change should allow CSV exports to work on large servers without causing disk-space problems. Fixes: #2157
69 lines
2.6 KiB
Python
69 lines
2.6 KiB
Python
""" test for app action functionality """
|
|
from unittest.mock import patch
|
|
|
|
from django.http import HttpResponse
|
|
from django.test import TestCase
|
|
from django.test.client import RequestFactory
|
|
|
|
from bookwyrm import models, views
|
|
from bookwyrm.tests.validate_html import validate_html
|
|
|
|
|
|
@patch("bookwyrm.activitystreams.add_book_statuses_task.delay")
|
|
@patch("bookwyrm.activitystreams.add_status_task.delay")
|
|
@patch("bookwyrm.activitystreams.populate_stream_task.delay")
|
|
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
|
|
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
|
|
class ExportViews(TestCase):
|
|
"""viewing and creating statuses"""
|
|
|
|
def setUp(self):
|
|
"""we need basic test data and mocks"""
|
|
self.factory = RequestFactory()
|
|
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
|
|
"bookwyrm.activitystreams.populate_stream_task.delay"
|
|
):
|
|
self.local_user = models.User.objects.create_user(
|
|
"mouse@local.com",
|
|
"mouse@mouse.com",
|
|
"mouseword",
|
|
local=True,
|
|
localname="mouse",
|
|
remote_id="https://example.com/users/mouse",
|
|
)
|
|
self.work = models.Work.objects.create(title="Test Work")
|
|
self.book = models.Edition.objects.create(
|
|
title="Test Book",
|
|
remote_id="https://example.com/book/1",
|
|
parent_work=self.work,
|
|
isbn_13="9781234567890",
|
|
bnf_id="beep",
|
|
)
|
|
|
|
def tst_export_get(self, *_):
|
|
"""request export"""
|
|
request = self.factory.get("")
|
|
request.user = self.local_user
|
|
result = views.Export.as_view()(request)
|
|
validate_html(result.render())
|
|
|
|
def test_export_file(self, *_):
|
|
"""simple export"""
|
|
models.ShelfBook.objects.create(
|
|
shelf=self.local_user.shelf_set.first(),
|
|
user=self.local_user,
|
|
book=self.book,
|
|
)
|
|
request = self.factory.post("")
|
|
request.user = self.local_user
|
|
export = views.Export.as_view()(request)
|
|
self.assertIsInstance(export, HttpResponse)
|
|
self.assertEqual(export.status_code, 200)
|
|
# pylint: disable=line-too-long
|
|
self.assertEqual(
|
|
export.content,
|
|
b"title,author_text,remote_id,openlibrary_key,inventaire_id,librarything_key,goodreads_key,bnf_id,viaf,wikidata,asin,aasin,isfdb,isbn_10,isbn_13,oclc_number,rating,review_name,review_cw,review_content\r\nTest Book,,"
|
|
+ self.book.remote_id.encode("utf-8")
|
|
+ b",,,,,beep,,,,,,123456789X,9781234567890,,,,,\r\n",
|
|
)
|