def test_foreign_key_from_activity_dict(self): """test recieving activity json""" instance = fields.ForeignKey(User, on_delete=models.CASCADE) datafile = pathlib.Path(__file__).parent.joinpath( "../data/ap_user.json") userdata = json.loads(datafile.read_bytes()) # don't try to load the user icon del userdata["icon"] # it shouldn't match with this unrelated user: with patch( "bookwyrm.preview_images.generate_user_preview_image_task.delay" ): unrelated_user = User.objects.create_user("rat", "*****@*****.**", "ratword", local=True, localname="rat") with patch("bookwyrm.models.user.set_remote_server.delay"): value = instance.field_from_activity( activitypub.Person(**userdata)) self.assertIsInstance(value, User) self.assertNotEqual(value, unrelated_user) self.assertEqual(value.remote_id, "https://example.com/user/mouse") self.assertEqual(value.name, "MOUSE?? MOUSE!!")
def test_foreign_key_from_activity_dict_existing(self): """test receiving a dict of an existing object in the db""" instance = fields.ForeignKey(User, on_delete=models.CASCADE) datafile = pathlib.Path(__file__).parent.joinpath( "../data/ap_user.json") userdata = json.loads(datafile.read_bytes()) with patch( "bookwyrm.preview_images.generate_user_preview_image_task.delay" ): user = User.objects.create_user("mouse", "*****@*****.**", "mouseword", local=True, localname="mouse") user.remote_id = "https://example.com/user/mouse" user.save(broadcast=False) User.objects.create_user("rat", "*****@*****.**", "ratword", local=True, localname="rat") with patch( "bookwyrm.models.activitypub_mixin.ObjectMixin.broadcast"): value = instance.field_from_activity( activitypub.Person(**userdata)) self.assertEqual(value, user)
def test_to_model_image(self, _): """ update an image field """ activity = activitypub.Person( id=self.user.remote_id, name="New Name", preferredUsername="******", inbox="http://www.com/", outbox="http://www.com/", followers="", summary="", publicKey={"id": "hi", "owner": self.user.remote_id, "publicKeyPem": "hi"}, endpoints={}, icon={"type": "Document", "url": "http://www.example.com/image.jpg"}, ) responses.add( responses.GET, "http://www.example.com/image.jpg", body=self.image_data, status=200, ) self.assertIsNone(self.user.avatar.name) with self.assertRaises(ValueError): self.user.avatar.file # pylint: disable=pointless-statement # this would trigger a broadcast because it's a local user with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): activity.to_model(model=models.User, instance=self.user) self.assertIsNotNone(self.user.avatar.file) self.assertEqual(self.user.name, "New Name") self.assertEqual(self.user.key_pair.public_key, "hi")
def test_to_model_image(self): ''' update an image field ''' activity = activitypub.Person( id=self.user.remote_id, name='New Name', preferredUsername='******', inbox='http://www.com/', outbox='http://www.com/', followers='', summary='', publicKey=None, endpoints={}, icon={'url': 'http://www.example.com/image.jpg'}) responses.add(responses.GET, 'http://www.example.com/image.jpg', body=self.image_data, status=200) self.assertIsNone(self.user.avatar.name) with self.assertRaises(ValueError): self.user.avatar.file #pylint: disable=pointless-statement # this would trigger a broadcast because it's a local user with patch('bookwyrm.models.activitypub_mixin.broadcast_task.delay'): activity.to_model(models.User, self.user) self.assertIsNotNone(self.user.avatar.name) self.assertIsNotNone(self.user.avatar.file)
def test_user_to_model(self): activity = activitypub.Person(**self.user_data) with patch('bookwyrm.models.user.set_remote_server.delay'): user = activity.to_model(models.User) self.assertEqual(user.username, '*****@*****.**') self.assertEqual(user.remote_id, 'https://example.com/user/mouse') self.assertFalse(user.local)
def test_user_to_model(self): activity = activitypub.Person(**self.user_data) with patch("bookwyrm.models.user.set_remote_server.delay"): user = activity.to_model(model=models.User) self.assertEqual(user.username, "*****@*****.**") self.assertEqual(user.remote_id, "https://example.com/user/mouse") self.assertFalse(user.local) self.assertEqual(user.followers_url, "https://example.com/user/mouse/followers")
def test_user_to_model(self): activity = activitypub.Person(**self.user_data) with patch("bookwyrm.preview_images.generate_user_preview_image_task.delay"): with patch("bookwyrm.models.user.set_remote_server.delay"): user = activity.to_model(model=models.User) self.assertEqual(user.username, "*****@*****.**") self.assertEqual(user.remote_id, "https://example.com/user/mouse") self.assertFalse(user.local)
def handle_update_user(activity): ''' receive an updated user Person activity object ''' try: user = models.User.objects.get(remote_id=activity['object']['id']) except models.User.DoesNotExist: # who is this person? who cares return activitypub.Person(**activity['object']).to_model(models.User, instance=user)
def test_to_model(self): ''' the big boy of this module. it feels janky to test this with actual models rather than a test model, but I don't know how to make a test model so here we are. ''' instance = ActivityObject(id='a', type='b') with self.assertRaises(ActivitySerializerError): instance.to_model(models.User) # test setting simple fields self.assertEqual(self.user.name, '') update_data = activitypub.Person(**self.user.to_activity()) update_data.name = 'New Name' update_data.to_model(models.User, self.user) self.assertEqual(self.user.name, 'New Name')
def test_to_model_image(self): ''' update an image field ''' update_data = activitypub.Person(**self.user.to_activity()) update_data.icon = {'url': 'http://www.example.com/image.jpg'} responses.add(responses.GET, 'http://www.example.com/image.jpg', body=self.image_data, status=200) self.assertIsNone(self.user.avatar.name) with self.assertRaises(ValueError): self.user.avatar.file #pylint: disable=pointless-statement update_data.to_model(models.User, self.user) self.assertIsNotNone(self.user.avatar.name) self.assertIsNotNone(self.user.avatar.file)
def test_to_model_foreign_key(self): ''' test setting one to one/foreign key ''' activity = activitypub.Person( id=self.user.remote_id, name='New Name', preferredUsername='******', inbox='http://www.com/', outbox='http://www.com/', followers='', summary='', publicKey=self.user.key_pair.to_activity(), endpoints={}, ) activity.publicKey['publicKeyPem'] = 'hi im secure' activity.to_model(models.User, self.user) self.assertEqual(self.user.key_pair.public_key, 'hi im secure')
def test_to_model_simple_fields(self): ''' test setting simple fields ''' self.assertIsNone(self.user.name) activity = activitypub.Person( id=self.user.remote_id, name='New Name', preferredUsername='******', inbox='http://www.com/', outbox='http://www.com/', followers='', summary='', publicKey=None, endpoints={}, ) activity.to_model(models.User, self.user) self.assertEqual(self.user.name, 'New Name')
def test_load_user_data(self): activity = activitypub.Person(**self.user_data) self.assertEqual(activity.id, 'https://example.com/user/mouse') self.assertEqual(activity.preferredUsername, 'mouse') self.assertEqual(activity.type, 'Person')
def refresh_remote_user(user): ''' get updated user data from its home instance ''' data = fetch_user_data(user.remote_id) activity = activitypub.Person(**data) activity.to_model(models.User, instance=user)
def create_remote_user(data): ''' parse the activitypub actor data into a user ''' actor = activitypub.Person(**data) return actor.to_model(models.User)
def test_to_model_foreign_key(self): ''' test setting one to one/foreign key ''' update_data = activitypub.Person(**self.user.to_activity()) update_data.publicKey['publicKeyPem'] = 'hi im secure' update_data.to_model(models.User, self.user) self.assertEqual(self.user.key_pair.public_key, 'hi im secure')