Ejemplo n.º 1
0
    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!!")
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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")
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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")
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
    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')
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
    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')
Ejemplo n.º 12
0
    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')
Ejemplo n.º 13
0
 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')
Ejemplo n.º 14
0
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)
Ejemplo n.º 15
0
def create_remote_user(data):
    ''' parse the activitypub actor data into a user '''
    actor = activitypub.Person(**data)
    return actor.to_model(models.User)
Ejemplo n.º 16
0
 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')