Implement self-contained archives to import and export entire users between instances (#38)
Co-authored-by: Daniel Burgess <developerdannymate@gmail.com> Co-authored-by: Hugh Rundle <hugh@hughrundle.net> Co-authored-by: dannymate <dannymate@noreply.codeberg.org> Co-authored-by: hughrun <hughrun@noreply.codeberg.org> Reviewed-on: https://codeberg.org/GuildAlpha/bookwyrm/pulls/38 Co-authored-by: CSDUMMI <csdummi.misquality@simplelogin.co> Co-committed-by: CSDUMMI <csdummi.misquality@simplelogin.co>
This commit is contained in:
parent
bc870a305f
commit
688978369f
25 changed files with 2819 additions and 7 deletions
68
bookwyrm/tests/views/imports/test_user_import.py
Normal file
68
bookwyrm/tests/views/imports/test_user_import.py
Normal file
|
@ -0,0 +1,68 @@
|
|||
""" test for app action functionality """
|
||||
import pathlib
|
||||
from unittest.mock import patch
|
||||
|
||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
from django.template.response import TemplateResponse
|
||||
from django.test import TestCase
|
||||
from django.test.client import RequestFactory
|
||||
|
||||
from bookwyrm import forms, models, views
|
||||
from bookwyrm.tests.validate_html import validate_html
|
||||
|
||||
|
||||
class ImportUserViews(TestCase):
|
||||
"""user import views"""
|
||||
|
||||
# pylint: disable=invalid-name
|
||||
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"
|
||||
), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
|
||||
self.local_user = models.User.objects.create_user(
|
||||
"mouse@local.com",
|
||||
"mouse@mouse.mouse",
|
||||
"password",
|
||||
local=True,
|
||||
localname="mouse",
|
||||
)
|
||||
models.SiteSettings.objects.create()
|
||||
|
||||
def test_get_user_import_page(self):
|
||||
"""there are so many views, this just makes sure it LOADS"""
|
||||
view = views.UserImport.as_view()
|
||||
request = self.factory.get("")
|
||||
request.user = self.local_user
|
||||
result = view(request)
|
||||
self.assertIsInstance(result, TemplateResponse)
|
||||
validate_html(result.render())
|
||||
self.assertEqual(result.status_code, 200)
|
||||
|
||||
def test_user_import_post(self):
|
||||
"""does the import job start?"""
|
||||
|
||||
view = views.UserImport.as_view()
|
||||
form = forms.ImportUserForm()
|
||||
archive_file = pathlib.Path(__file__).parent.joinpath(
|
||||
"../../data/bookwyrm_account_export.tar.gz"
|
||||
)
|
||||
|
||||
form.data["archive_file"] = SimpleUploadedFile(
|
||||
# pylint: disable=consider-using-with
|
||||
archive_file,
|
||||
open(archive_file, "rb").read(),
|
||||
content_type="application/gzip",
|
||||
)
|
||||
|
||||
form.data["include_user_settings"] = ""
|
||||
form.data["include_goals"] = "on"
|
||||
|
||||
request = self.factory.post("", form.data)
|
||||
request.user = self.local_user
|
||||
|
||||
with patch("bookwyrm.models.bookwyrm_import_job.BookwyrmImportJob.start_job"):
|
||||
view(request)
|
||||
job = models.BookwyrmImportJob.objects.get()
|
||||
self.assertEqual(job.required, ["include_goals"])
|
74
bookwyrm/tests/views/preferences/test_export_user.py
Normal file
74
bookwyrm/tests/views/preferences/test_export_user.py
Normal file
|
@ -0,0 +1,74 @@
|
|||
""" test for app action functionality """
|
||||
from collections import namedtuple
|
||||
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
|
||||
|
||||
|
||||
class ExportUserViews(TestCase):
|
||||
"""exporting user data"""
|
||||
|
||||
def setUp(self):
|
||||
self.factory = RequestFactory()
|
||||
models.SiteSettings.objects.create()
|
||||
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
|
||||
"bookwyrm.activitystreams.populate_stream_task.delay"
|
||||
):
|
||||
self.local_user = models.User.objects.create_user(
|
||||
"hugh@example.com",
|
||||
"hugh@example.com",
|
||||
"password",
|
||||
local=True,
|
||||
localname="Hugh",
|
||||
summary="just a test account",
|
||||
remote_id="https://example.com/users/hugh",
|
||||
preferred_timezone="Australia/Broken_Hill",
|
||||
)
|
||||
|
||||
def test_export_user_get(self, *_):
|
||||
"""request export"""
|
||||
request = self.factory.get("")
|
||||
request.user = self.local_user
|
||||
result = views.ExportUser.as_view()(request)
|
||||
validate_html(result.render())
|
||||
|
||||
def test_trigger_export_user_file(self, *_):
|
||||
"""simple user export"""
|
||||
|
||||
request = self.factory.post("")
|
||||
request.user = self.local_user
|
||||
with patch("bookwyrm.models.bookwyrm_export_job.start_export_task.delay"):
|
||||
export = views.ExportUser.as_view()(request)
|
||||
self.assertIsInstance(export, HttpResponse)
|
||||
self.assertEqual(export.status_code, 302)
|
||||
|
||||
jobs = models.bookwyrm_export_job.BookwyrmExportJob.objects.count()
|
||||
self.assertEqual(jobs, 1)
|
||||
|
||||
def test_download_export_user_file(self, *_):
|
||||
"""simple user export"""
|
||||
|
||||
# TODO: need some help with this one
|
||||
job = models.bookwyrm_export_job.BookwyrmExportJob.objects.create(
|
||||
user=self.local_user
|
||||
)
|
||||
MockTask = namedtuple("Task", ("id"))
|
||||
with patch(
|
||||
"bookwyrm.models.bookwyrm_export_job.start_export_task.delay"
|
||||
) as mock:
|
||||
mock.return_value = MockTask(b'{"name": "mouse"}')
|
||||
job.start_job()
|
||||
|
||||
request = self.factory.get("")
|
||||
request.user = self.local_user
|
||||
job.refresh_from_db()
|
||||
export = views.ExportArchive.as_view()(request, job.id)
|
||||
self.assertIsInstance(export, HttpResponse)
|
||||
self.assertEqual(export.status_code, 200)
|
||||
# pylint: disable=line-too-long
|
||||
self.assertEqual(export.content, b'{"name": "mouse"}')
|
Loading…
Add table
Add a link
Reference in a new issue