Skip to content
Snippets Groups Projects
Select Git revision
  • 629-cookie-auth
  • develop default protected
  • master
  • 735-table-truncate
  • webdav
  • domain-policies
  • live-streaming
  • 303-json-ld
  • 0.18.2
  • 0.18.1
  • 0.18
  • 0.17
  • 0.16.3
  • 0.16.2
  • 0.16.1
  • 0.16
  • 0.15
  • 0.14.2
  • 0.14.1
  • 0.14
  • 0.13
  • 0.12
  • 0.11
  • 0.10
  • 0.9.1
  • 0.9
  • 0.8
  • 0.7
28 results

factories.py

Blame
  • Forked from funkwhale / funkwhale
    7418 commits behind the upstream repository.
    factories.py 5.03 KiB
    import factory
    import requests
    import requests_http_signature
    import uuid
    
    from django.utils import timezone
    from django.conf import settings
    
    from funkwhale_api.factories import registry
    
    from . import keys
    from . import models
    
    
    registry.register(keys.get_key_pair, name='federation.KeyPair')
    
    
    @registry.register(name='federation.SignatureAuth')
    class SignatureAuthFactory(factory.Factory):
        algorithm = 'rsa-sha256'
        key = factory.LazyFunction(lambda: keys.get_key_pair()[0])
        key_id = factory.Faker('url')
        use_auth_header = False
        headers = [
            '(request-target)',
            'user-agent',
            'host',
            'date',
            'content-type',]
        class Meta:
            model = requests_http_signature.HTTPSignatureAuth
    
    
    @registry.register(name='federation.SignedRequest')
    class SignedRequestFactory(factory.Factory):
        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 = {
                'User-Agent': 'Test',
                'Host': 'test.host',
                'Date': 'Right now',
                'Content-Type': 'application/activity+json'
            }
            if extracted:
                default_headers.update(extracted)
            self.headers.update(default_headers)
    
    
    @registry.register(name='federation.Link')
    class LinkFactory(factory.Factory):
        type = 'Link'
        href = factory.Faker('url')
        mediaType = 'text/html'
    
        class Meta:
            model = dict
    
        class Params:
            audio = factory.Trait(
                mediaType=factory.Iterator(['audio/mp3', 'audio/ogg'])
            )
    
    
    @registry.register
    class ActorFactory(factory.DjangoModelFactory):
        public_key = None
        private_key = None
        preferred_username = factory.Faker('user_name')
        summary = factory.Faker('paragraph')
        domain = factory.Faker('domain_name')
        url = factory.LazyAttribute(lambda o: 'https://{}/users/{}'.format(o.domain, o.preferred_username))
        inbox_url = factory.LazyAttribute(lambda o: 'https://{}/users/{}/inbox'.format(o.domain, o.preferred_username))
        outbox_url = factory.LazyAttribute(lambda o: 'https://{}/users/{}/outbox'.format(o.domain, o.preferred_username))
    
        class Meta:
            model = models.Actor
    
        class Params:
            local = factory.Trait(
                domain=factory.LazyAttribute(
                    lambda o: settings.FEDERATION_HOSTNAME)
            )
    
        @classmethod
        def _generate(cls, create, attrs):
            has_public = attrs.get('public_key') is not None
            has_private = attrs.get('private_key') is not None
            if not has_public and not has_private:
                private, public = keys.get_key_pair()
                attrs['private_key'] = private.decode('utf-8')
                attrs['public_key'] = public.decode('utf-8')
            return super()._generate(create, attrs)
    
    
    @registry.register
    class FollowFactory(factory.DjangoModelFactory):
        target = factory.SubFactory(ActorFactory)
        actor = factory.SubFactory(ActorFactory)
    
        class Meta:
            model = models.Follow
    
        class Params:
            local = factory.Trait(
                actor=factory.SubFactory(ActorFactory, local=True)
            )
    
    
    @registry.register
    class FollowRequestFactory(factory.DjangoModelFactory):
        target = factory.SubFactory(ActorFactory)
        actor = factory.SubFactory(ActorFactory)
    
        class Meta:
            model = models.FollowRequest
    
    
    @registry.register(name='federation.Note')
    class NoteFactory(factory.Factory):
        type = 'Note'
        id = factory.Faker('url')
        published = factory.LazyFunction(
            lambda: timezone.now().isoformat()
        )
        inReplyTo = None
        content = factory.Faker('sentence')
    
        class Meta:
            model = dict
    
    
    @registry.register(name='federation.Activity')
    class ActivityFactory(factory.Factory):
        type = 'Create'
        id = factory.Faker('url')
        published = factory.LazyFunction(
            lambda: timezone.now().isoformat()
        )
        actor = factory.Faker('url')
        object = factory.SubFactory(
            NoteFactory,
            actor=factory.SelfAttribute('..actor'),
            published=factory.SelfAttribute('..published'))
    
        class Meta:
            model = dict
    
    
    @registry.register(name='federation.AudioMetadata')
    class AudioMetadataFactory(factory.Factory):
        recording = factory.LazyAttribute(
            lambda o: 'https://musicbrainz.org/recording/{}'.format(uuid.uuid4())
        )
        artist = factory.LazyAttribute(
            lambda o: 'https://musicbrainz.org/artist/{}'.format(uuid.uuid4())
        )
        release = factory.LazyAttribute(
            lambda o: 'https://musicbrainz.org/release/{}'.format(uuid.uuid4())
        )
    
        class Meta:
            model = dict
    
    
    @registry.register(name='federation.Audio')
    class AudioFactory(factory.Factory):
        type = 'Audio'
        id = factory.Faker('url')
        published = factory.LazyFunction(
            lambda: timezone.now().isoformat()
        )
        actor = factory.Faker('url')
        url = factory.SubFactory(LinkFactory, audio=True)
        metadata = factory.SubFactory(AudioMetadataFactory)
    
        class Meta:
            model = dict