Added follow model and factory
This commit is contained in:
parent
6aa6f1d8f8
commit
f19418d2c2
|
@ -52,7 +52,7 @@ OBJECT_TYPES = [
|
||||||
'Relationship',
|
'Relationship',
|
||||||
'Tombstone',
|
'Tombstone',
|
||||||
'Video',
|
'Video',
|
||||||
]
|
] + ACTIVITY_TYPES
|
||||||
|
|
||||||
def deliver(activity, on_behalf_of, to=[]):
|
def deliver(activity, on_behalf_of, to=[]):
|
||||||
from . import actors
|
from . import actors
|
||||||
|
|
|
@ -243,6 +243,7 @@ class TestActor(SystemActor):
|
||||||
# on a follow we:
|
# on a follow we:
|
||||||
# 1. send the accept answer
|
# 1. send the accept answer
|
||||||
# 2. follow back
|
# 2. follow back
|
||||||
|
#
|
||||||
test_actor = self.get_actor_instance()
|
test_actor = self.get_actor_instance()
|
||||||
accept_uuid = uuid.uuid4()
|
accept_uuid = uuid.uuid4()
|
||||||
accept = activity.get_accept_follow(
|
accept = activity.get_accept_follow(
|
||||||
|
@ -254,6 +255,12 @@ class TestActor(SystemActor):
|
||||||
accept,
|
accept,
|
||||||
to=[ac['actor']],
|
to=[ac['actor']],
|
||||||
on_behalf_of=test_actor)
|
on_behalf_of=test_actor)
|
||||||
|
# we persist the sender in database
|
||||||
|
sender.save()
|
||||||
|
models.Follow.objects.get_or_create(
|
||||||
|
actor=sender,
|
||||||
|
target=test_actor,
|
||||||
|
)
|
||||||
follow_uuid = uuid.uuid4()
|
follow_uuid = uuid.uuid4()
|
||||||
follow = activity.get_follow(
|
follow = activity.get_follow(
|
||||||
follow_id=follow_uuid,
|
follow_id=follow_uuid,
|
||||||
|
|
|
@ -53,7 +53,6 @@ class SignedRequestFactory(factory.Factory):
|
||||||
|
|
||||||
@registry.register
|
@registry.register
|
||||||
class ActorFactory(factory.DjangoModelFactory):
|
class ActorFactory(factory.DjangoModelFactory):
|
||||||
|
|
||||||
public_key = None
|
public_key = None
|
||||||
private_key = None
|
private_key = None
|
||||||
preferred_username = factory.Faker('user_name')
|
preferred_username = factory.Faker('user_name')
|
||||||
|
@ -77,6 +76,15 @@ class ActorFactory(factory.DjangoModelFactory):
|
||||||
return super()._generate(create, attrs)
|
return super()._generate(create, attrs)
|
||||||
|
|
||||||
|
|
||||||
|
@registry.register
|
||||||
|
class FollowFactory(factory.DjangoModelFactory):
|
||||||
|
target = factory.SubFactory(ActorFactory)
|
||||||
|
actor = factory.SubFactory(ActorFactory)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.Follow
|
||||||
|
|
||||||
|
|
||||||
@registry.register(name='federation.Note')
|
@registry.register(name='federation.Note')
|
||||||
class NoteFactory(factory.Factory):
|
class NoteFactory(factory.Factory):
|
||||||
type = 'Note'
|
type = 'Note'
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
# Generated by Django 2.0.3 on 2018-04-03 19:21
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('federation', '0002_auto_20180403_1620'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Follow',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('uuid', models.UUIDField(default=uuid.uuid4, unique=True)),
|
||||||
|
('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
|
('last_modification_date', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
|
('actor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='emitted_follows', to='federation.Actor')),
|
||||||
|
('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='received_follows', to='federation.Actor')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name='follow',
|
||||||
|
unique_together={('actor', 'target')},
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,3 +1,5 @@
|
||||||
|
import uuid
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
@ -74,3 +76,23 @@ class Actor(models.Model):
|
||||||
from . import actors
|
from . import actors
|
||||||
if self.is_system:
|
if self.is_system:
|
||||||
return actors.SYSTEM_ACTORS[self.preferred_username]
|
return actors.SYSTEM_ACTORS[self.preferred_username]
|
||||||
|
|
||||||
|
|
||||||
|
class Follow(models.Model):
|
||||||
|
uuid = models.UUIDField(default=uuid.uuid4, unique=True)
|
||||||
|
actor = models.ForeignKey(
|
||||||
|
Actor,
|
||||||
|
related_name='emitted_follows',
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
)
|
||||||
|
target = models.ForeignKey(
|
||||||
|
Actor,
|
||||||
|
related_name='received_follows',
|
||||||
|
on_delete=models.CASCADE,
|
||||||
|
)
|
||||||
|
creation_date = models.DateTimeField(default=timezone.now)
|
||||||
|
last_modification_date = models.DateTimeField(
|
||||||
|
default=timezone.now)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = ['actor', 'target']
|
||||||
|
|
|
@ -313,3 +313,7 @@ def test_test_actor_handles_follow(
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
deliver.assert_has_calls(expected_calls)
|
deliver.assert_has_calls(expected_calls)
|
||||||
|
|
||||||
|
follow = test_actor.received_follows.first()
|
||||||
|
assert follow.actor == actor
|
||||||
|
assert follow.target == test_actor
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from django import db
|
||||||
|
|
||||||
|
from funkwhale_api.federation import models
|
||||||
|
|
||||||
|
|
||||||
|
def test_cannot_duplicate_actor(factories):
|
||||||
|
actor = factories['federation.Actor']()
|
||||||
|
|
||||||
|
with pytest.raises(db.IntegrityError):
|
||||||
|
factories['federation.Actor'](
|
||||||
|
domain=actor.domain,
|
||||||
|
preferred_username=actor.preferred_username,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_cannot_duplicate_follow(factories):
|
||||||
|
follow = factories['federation.Follow']()
|
||||||
|
|
||||||
|
with pytest.raises(db.IntegrityError):
|
||||||
|
factories['federation.Follow'](
|
||||||
|
target=follow.target,
|
||||||
|
actor=follow.actor,
|
||||||
|
)
|
Loading…
Reference in New Issue