-
-
Notifications
You must be signed in to change notification settings - Fork 264
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #3360 from hughrun/move-fix
refactor Move for more redundancy
- Loading branch information
Showing
6 changed files
with
226 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
{ | ||
"@context": [ | ||
"https://www.w3.org/ns/activitystreams", | ||
"https://w3id.org/security/v1", | ||
{ | ||
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers", | ||
"schema": "http://schema.org#", | ||
"PropertyValue": "schema:PropertyValue", | ||
"value": "schema:value" | ||
} | ||
], | ||
"id": "https://example.com/user/mouse", | ||
"type": "Person", | ||
"preferredUsername": "mouse", | ||
"name": "MOUSE?? MOUSE!!", | ||
"inbox": "https://example.com/user/mouse/inbox", | ||
"outbox": "https://example.com/user/mouse/outbox", | ||
"followers": "https://example.com/user/mouse/followers", | ||
"following": "https://example.com/user/mouse/following", | ||
"summary": "", | ||
"publicKey": { | ||
"id": "https://example.com/user/mouse/#main-key", | ||
"owner": "https://example.com/user/mouse", | ||
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6QisDrjOQvkRo/MqNmSYPwqtt\nCxg/8rCW+9jKbFUKvqjTeKVotEE85122v/DCvobCCdfQuYIFdVMk+dB1xJ0iPGPg\nyU79QHY22NdV9mFKA2qtXVVxb5cxpA4PlwOHM6PM/k8B+H09OUrop2aPUAYwy+vg\n+MXyz8bAXrIS1kq6fQIDAQAB\n-----END PUBLIC KEY-----" | ||
}, | ||
"endpoints": { | ||
"sharedInbox": "https://example.com/inbox" | ||
}, | ||
"bookwyrmUser": true, | ||
"manuallyApprovesFollowers": false, | ||
"discoverable": false, | ||
"alsoKnownAs": ["https://your.domain.here/user/rat"], | ||
"devices": "https://friend.camp/users/tripofmice/collections/devices", | ||
"tag": [], | ||
"icon": { | ||
"type": "Image", | ||
"mediaType": "image/png", | ||
"url": "https://example.com/images/avatars/AL-2-crop-50.png" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
""" testing move models """ | ||
from unittest.mock import patch | ||
from django.core.exceptions import PermissionDenied | ||
from django.test import TestCase | ||
|
||
from bookwyrm import models | ||
|
||
|
||
class MoveUser(TestCase): | ||
"""move your account to another identity""" | ||
|
||
@classmethod | ||
def setUpTestData(cls): | ||
"""we need some users for this""" | ||
with patch("bookwyrm.models.user.set_remote_server.delay"): | ||
cls.target_user = models.User.objects.create_user( | ||
"rat", | ||
"[email protected]", | ||
"ratword", | ||
local=False, | ||
remote_id="https://example.com/users/rat", | ||
inbox="https://example.com/users/rat/inbox", | ||
outbox="https://example.com/users/rat/outbox", | ||
) | ||
|
||
with ( | ||
patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), | ||
patch("bookwyrm.activitystreams.populate_stream_task.delay"), | ||
patch("bookwyrm.lists_stream.populate_lists_task.delay"), | ||
): | ||
cls.origin_user = models.User.objects.create_user( | ||
"mouse", "[email protected]", "mouseword", local=True, localname="mouse" | ||
) | ||
cls.origin_user.remote_id = "http://local.com/user/mouse" | ||
cls.origin_user.save(broadcast=False, update_fields=["remote_id"]) | ||
|
||
def test_user_move_unauthorized(self): | ||
"""attempt a user move without alsoKnownAs set""" | ||
|
||
with self.assertRaises(PermissionDenied): | ||
models.MoveUser.objects.create( | ||
user=self.origin_user, | ||
object=self.origin_user.remote_id, | ||
target=self.target_user, | ||
) | ||
|
||
@patch("bookwyrm.suggested_users.remove_user_task.delay") | ||
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") | ||
def test_user_move(self, *_): | ||
"""move user""" | ||
|
||
self.target_user.also_known_as.add(self.origin_user.id) | ||
self.target_user.save(broadcast=False) | ||
|
||
models.MoveUser.objects.create( | ||
user=self.origin_user, | ||
object=self.origin_user.remote_id, | ||
target=self.target_user, | ||
) | ||
self.assertEqual(self.origin_user.moved_to, self.target_user.remote_id) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
""" test move functionality """ | ||
import json | ||
from unittest.mock import patch | ||
import pathlib | ||
from django.contrib.sessions.middleware import SessionMiddleware | ||
from django.test import TestCase | ||
from django.test.client import RequestFactory | ||
import responses | ||
|
||
from bookwyrm import forms, models, views | ||
|
||
|
||
@patch("bookwyrm.activitystreams.add_status_task.delay") | ||
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") | ||
@patch("bookwyrm.activitystreams.populate_stream_task.delay") | ||
@patch("bookwyrm.suggested_users.rerank_user_task.delay") | ||
class ViewsHelpers(TestCase): | ||
"""viewing and creating statuses""" | ||
|
||
@classmethod | ||
def setUpTestData(cls): | ||
"""we need basic test data and mocks""" | ||
|
||
with ( | ||
patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), | ||
patch("bookwyrm.activitystreams.populate_stream_task.delay"), | ||
patch("bookwyrm.lists_stream.populate_lists_task.delay"), | ||
patch("bookwyrm.suggested_users.rerank_user_task.delay"), | ||
): | ||
|
||
cls.local_user = models.User.objects.create_user( | ||
"rat", | ||
"[email protected]", | ||
"ratword", | ||
local=True, | ||
discoverable=True, | ||
localname="rat", | ||
remote_id="https://your.domain.here/user/rat", | ||
) | ||
|
||
with ( | ||
patch("bookwyrm.models.user.set_remote_server.delay"), | ||
patch("bookwyrm.suggested_users.rerank_user_task.delay"), | ||
): | ||
cls.remote_user = models.User.objects.create_user( | ||
"[email protected]", | ||
"[email protected]", | ||
"mouseword", | ||
local=False, | ||
remote_id="https://example.com/user/mouse", | ||
) | ||
|
||
def setUp(self): | ||
"""individual test setup""" | ||
self.factory = RequestFactory() | ||
datafile = pathlib.Path(__file__).parent.joinpath( | ||
"../../data/ap_user_move.json" | ||
) | ||
self.userdata = json.loads(datafile.read_bytes()) | ||
del self.userdata["icon"] | ||
|
||
@responses.activate | ||
@patch("bookwyrm.models.user.set_remote_server.delay") | ||
@patch("bookwyrm.suggested_users.remove_user_task.delay") | ||
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") | ||
def test_move_user_view(self, *_): | ||
"""move user""" | ||
|
||
self.assertEqual(self.remote_user.remote_id, "https://example.com/user/mouse") | ||
self.assertIsNone(self.local_user.moved_to) | ||
self.assertIsNone(self.remote_user.moved_to) | ||
self.assertIsNone(self.local_user.also_known_as.first()) | ||
self.assertIsNone(self.remote_user.also_known_as.first()) | ||
|
||
username = "[email protected]" | ||
wellknown = { | ||
"subject": "acct:[email protected]", | ||
"links": [ | ||
{ | ||
"rel": "self", | ||
"type": "application/activity+json", | ||
"href": "https://example.com/user/mouse", | ||
} | ||
], | ||
} | ||
responses.add( | ||
responses.GET, | ||
f"https://example.com/.well-known/webfinger?resource=acct:{username}", | ||
json=wellknown, | ||
status=200, | ||
) | ||
responses.add( | ||
responses.GET, | ||
"https://example.com/user/mouse", | ||
json=self.userdata, | ||
status=200, | ||
) | ||
|
||
view = views.MoveUser.as_view() | ||
form = forms.MoveUserForm() | ||
form.data["target"] = "[email protected]" | ||
form.data["password"] = "ratword" | ||
|
||
request = self.factory.post("", form.data) | ||
request.user = self.local_user | ||
middleware = SessionMiddleware() | ||
middleware.process_request(request) | ||
request.session.save() | ||
|
||
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): | ||
view(request) | ||
self.local_user.refresh_from_db() | ||
|
||
self.assertEqual(self.local_user.also_known_as.first(), self.remote_user) | ||
self.assertEqual(self.remote_user.also_known_as.first(), self.local_user) | ||
self.assertEqual(self.local_user.moved_to, "https://example.com/user/mouse") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters