Skip to content
Snippets Groups Projects
factories.py 8.71 KiB
Newer Older
  • Learn to ignore specific revisions
  • Eliot Berriot's avatar
    Eliot Berriot committed
    import uuid
    
    
    import factory
    import requests
    import requests_http_signature
    
    from django.conf import settings
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    from django.utils import timezone
    
    from django.utils.http import http_date
    
    from funkwhale_api.factories import registry, NoUpdateOnCreate
    
    from funkwhale_api.users import factories as user_factories
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    from . import keys, models
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    registry.register(keys.get_key_pair, name="federation.KeyPair")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    @registry.register(name="federation.SignatureAuth")
    
    class SignatureAuthFactory(factory.Factory):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        algorithm = "rsa-sha256"
    
        key = factory.LazyFunction(lambda: keys.get_key_pair()[0])
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        key_id = factory.Faker("url")
    
        headers = ["(request-target)", "user-agent", "host", "date", "accept"]
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
    
        class Meta:
            model = requests_http_signature.HTTPSignatureAuth
    
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    @registry.register(name="federation.SignedRequest")
    
    class SignedRequestFactory(factory.Factory):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        url = factory.Faker("url")
        method = "get"
    
        auth = factory.SubFactory(SignatureAuthFactory)
    
        class Meta:
            model = requests.Request
    
    
        @factory.post_generation
        def headers(self, create, extracted, **kwargs):
            default_headers = {
    
    Eliot Berriot's avatar
    Eliot Berriot committed
                "User-Agent": "Test",
                "Host": "test.host",
    
                "Date": http_date(timezone.now().timestamp()),
    
                "Accept": "application/activity+json",
    
            }
            if extracted:
                default_headers.update(extracted)
            self.headers.update(default_headers)
    
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    @registry.register(name="federation.Link")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    class LinkFactory(factory.Factory):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        type = "Link"
        href = factory.Faker("url")
        mediaType = "text/html"
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
        class Meta:
            model = dict
    
        class Params:
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            audio = factory.Trait(mediaType=factory.Iterator(["audio/mp3", "audio/ogg"]))
    
    def create_user(actor):
        return user_factories.UserFactory(actor=actor)
    
    
    
    @registry.register
    
    class DomainFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
    
        name = factory.Faker("domain_name")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        nodeinfo_fetch_date = factory.LazyFunction(lambda: timezone.now())
    
    
        class Meta:
            model = "federation.Domain"
            django_get_or_create = ("name",)
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        @factory.post_generation
        def with_service_actor(self, create, extracted, **kwargs):
            if not create or not extracted:
                return
    
            self.service_actor = ActorFactory(domain=self)
            self.save(update_fields=["service_actor"])
            return self.service_actor
    
    
    @registry.register
    
    class ActorFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
    
        public_key = None
        private_key = None
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        preferred_username = factory.Faker("user_name")
        summary = factory.Faker("paragraph")
    
        domain = factory.SubFactory(DomainFactory)
    
        fid = factory.LazyAttribute(
    
            lambda o: "https://{}/users/{}".format(o.domain.name, o.preferred_username)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        )
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        followers_url = factory.LazyAttribute(
    
            lambda o: "https://{}/users/{}followers".format(
                o.domain.name, o.preferred_username
            )
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        )
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        inbox_url = factory.LazyAttribute(
    
            lambda o: "https://{}/users/{}/inbox".format(
                o.domain.name, o.preferred_username
            )
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        )
        outbox_url = factory.LazyAttribute(
    
            lambda o: "https://{}/users/{}/outbox".format(
                o.domain.name, o.preferred_username
            )
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        )
    
        keys = factory.LazyFunction(keys.get_key_pair)
    
    
        class Meta:
            model = models.Actor
    
    
        @factory.post_generation
        def local(self, create, extracted, **kwargs):
            if not extracted and not kwargs:
                return
            from funkwhale_api.users.factories import UserFactory
    
    
            self.domain = models.Domain.objects.get_or_create(
                name=settings.FEDERATION_HOSTNAME
            )[0]
    
            self.save(update_fields=["domain"])
            if not create:
                if extracted and hasattr(extracted, "pk"):
                    extracted.actor = self
                else:
                    UserFactory.build(actor=self, **kwargs)
            if extracted and hasattr(extracted, "pk"):
                extracted.actor = self
                extracted.save(update_fields=["user"])
            else:
                self.user = UserFactory(actor=self, **kwargs)
    
    
    @registry.register
    
    class FollowFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
    
        target = factory.SubFactory(ActorFactory)
        actor = factory.SubFactory(ActorFactory)
    
        class Meta:
            model = models.Follow
    
    
        class Params:
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            local = factory.Trait(actor=factory.SubFactory(ActorFactory, local=True))
    
    class MusicLibraryFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
    
        actor = factory.SubFactory(ActorFactory)
        privacy_level = "me"
        name = factory.Faker("sentence")
        description = factory.Faker("sentence")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        uploads_count = 0
        fid = factory.Faker("federation_url")
    
        followers_url = factory.LazyAttribute(
            lambda o: o.fid + "/followers" if o.fid else None
        )
    
    
        class Meta:
            model = "music.Library"
    
    
        class Params:
            local = factory.Trait(actor=factory.SubFactory(ActorFactory, local=True))
    
    
    class LibraryScanFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
    
        library = factory.SubFactory(MusicLibraryFactory)
        actor = factory.SubFactory(ActorFactory)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        total_files = factory.LazyAttribute(lambda o: o.library.uploads_count)
    
    
        class Meta:
            model = "music.LibraryScan"
    
    
    
    @registry.register
    class FetchFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
        actor = factory.SubFactory(ActorFactory)
    
        class Meta:
            model = "federation.Fetch"
    
    
    
    class ActivityFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
    
        actor = factory.SubFactory(ActorFactory)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        url = factory.Faker("federation_url")
    
        payload = factory.LazyFunction(lambda: {"type": "Create"})
    
            model = "federation.Activity"
    
    
    @registry.register
    
    class InboxItemFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        actor = factory.SubFactory(ActorFactory, local=True)
    
        activity = factory.SubFactory(ActivityFactory)
        type = "to"
    
        class Meta:
            model = "federation.InboxItem"
    
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    @registry.register
    
    class DeliveryFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        activity = factory.SubFactory(ActivityFactory)
        inbox_url = factory.Faker("url")
    
        class Meta:
            model = "federation.Delivery"
    
    
    
    class LibraryFollowFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
    
        target = factory.SubFactory(MusicLibraryFactory)
        actor = factory.SubFactory(ActorFactory)
    
        class Meta:
            model = "federation.LibraryFollow"
    
    class ArtistMetadataFactory(factory.Factory):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        name = factory.Faker("name")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            musicbrainz = factory.Trait(musicbrainz_id=factory.Faker("uuid4"))
    
    
    
    class ReleaseMetadataFactory(factory.Factory):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        title = factory.Faker("sentence")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            musicbrainz = factory.Trait(musicbrainz_id=factory.Faker("uuid4"))
    
    
    
    class RecordingMetadataFactory(factory.Factory):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        title = factory.Faker("sentence")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            musicbrainz = factory.Trait(musicbrainz_id=factory.Faker("uuid4"))
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    @registry.register(name="federation.LibraryTrackMetadata")
    
    class LibraryTrackMetadataFactory(factory.Factory):
        artist = factory.SubFactory(ArtistMetadataFactory)
        recording = factory.SubFactory(RecordingMetadataFactory)
        release = factory.SubFactory(ReleaseMetadataFactory)
    
        class Meta:
            model = dict
    
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    @registry.register(name="federation.Note")
    
    class NoteFactory(factory.Factory):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        type = "Note"
        id = factory.Faker("url")
        published = factory.LazyFunction(lambda: timezone.now().isoformat())
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        content = factory.Faker("sentence")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    @registry.register(name="federation.AudioMetadata")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    class AudioMetadataFactory(factory.Factory):
        recording = factory.LazyAttribute(
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            lambda o: "https://musicbrainz.org/recording/{}".format(uuid.uuid4())
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        )
        artist = factory.LazyAttribute(
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            lambda o: "https://musicbrainz.org/artist/{}".format(uuid.uuid4())
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        )
        release = factory.LazyAttribute(
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            lambda o: "https://musicbrainz.org/release/{}".format(uuid.uuid4())
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        )
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
        class Meta:
            model = dict
    
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    @registry.register(name="federation.Audio")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    class AudioFactory(factory.Factory):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        type = "Audio"
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        id = factory.Faker("federation_url")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        published = factory.LazyFunction(lambda: timezone.now().isoformat())
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        actor = factory.Faker("federation_url")
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        url = factory.SubFactory(LinkFactory, audio=True)
    
        metadata = factory.SubFactory(LibraryTrackMetadataFactory)
    
    Eliot Berriot's avatar
    Eliot Berriot committed
    
        class Meta:
            model = dict