funkwhale/api/funkwhale_api/federation/factories.py

241 wiersze
6.7 KiB
Python
Czysty Zwykły widok Historia

2018-06-10 08:55:16 +00:00
import uuid
import factory
import requests
import requests_http_signature
2018-04-03 21:25:44 +00:00
from django.conf import settings
2018-06-10 08:55:16 +00:00
from django.utils import timezone
from django.utils.http import http_date
from funkwhale_api.factories import registry
2018-06-10 08:55:16 +00:00
from . import keys, models
2018-06-09 13:36:16 +00:00
registry.register(keys.get_key_pair, name="federation.KeyPair")
2018-06-09 13:36:16 +00:00
@registry.register(name="federation.SignatureAuth")
class SignatureAuthFactory(factory.Factory):
2018-06-09 13:36:16 +00:00
algorithm = "rsa-sha256"
key = factory.LazyFunction(lambda: keys.get_key_pair()[0])
2018-06-09 13:36:16 +00:00
key_id = factory.Faker("url")
use_auth_header = False
2018-06-09 13:36:16 +00:00
headers = ["(request-target)", "user-agent", "host", "date", "content-type"]
class Meta:
model = requests_http_signature.HTTPSignatureAuth
2018-06-09 13:36:16 +00:00
@registry.register(name="federation.SignedRequest")
class SignedRequestFactory(factory.Factory):
2018-06-09 13:36:16 +00:00
url = factory.Faker("url")
method = "get"
auth = factory.SubFactory(SignatureAuthFactory)
class Meta:
model = requests.Request
2018-03-31 16:41:03 +00:00
@factory.post_generation
def headers(self, create, extracted, **kwargs):
default_headers = {
2018-06-09 13:36:16 +00:00
"User-Agent": "Test",
"Host": "test.host",
"Date": http_date(timezone.now().timestamp()),
2018-06-09 13:36:16 +00:00
"Content-Type": "application/activity+json",
2018-03-31 16:41:03 +00:00
}
if extracted:
default_headers.update(extracted)
self.headers.update(default_headers)
2018-06-09 13:36:16 +00:00
@registry.register(name="federation.Link")
2018-04-05 21:27:19 +00:00
class LinkFactory(factory.Factory):
2018-06-09 13:36:16 +00:00
type = "Link"
href = factory.Faker("url")
mediaType = "text/html"
2018-04-05 21:27:19 +00:00
class Meta:
model = dict
class Params:
2018-06-09 13:36:16 +00:00
audio = factory.Trait(mediaType=factory.Iterator(["audio/mp3", "audio/ogg"]))
2018-04-05 21:27:19 +00:00
2018-04-01 08:17:06 +00:00
@registry.register
class ActorFactory(factory.DjangoModelFactory):
public_key = None
private_key = None
2018-06-09 13:36:16 +00:00
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)
)
2018-04-01 08:17:06 +00:00
class Meta:
model = models.Actor
2018-04-03 21:25:44 +00:00
class Params:
local = factory.Trait(
2018-06-09 13:36:16 +00:00
domain=factory.LazyAttribute(lambda o: settings.FEDERATION_HOSTNAME)
2018-04-03 21:25:44 +00:00
)
2018-04-01 08:17:06 +00:00
@classmethod
def _generate(cls, create, attrs):
2018-06-09 13:36:16 +00:00
has_public = attrs.get("public_key") is not None
has_private = attrs.get("private_key") is not None
2018-04-01 08:17:06 +00:00
if not has_public and not has_private:
private, public = keys.get_key_pair()
2018-06-09 13:36:16 +00:00
attrs["private_key"] = private.decode("utf-8")
attrs["public_key"] = public.decode("utf-8")
2018-04-01 08:17:06 +00:00
return super()._generate(create, attrs)
2018-04-03 19:30:15 +00:00
@registry.register
class FollowFactory(factory.DjangoModelFactory):
target = factory.SubFactory(ActorFactory)
actor = factory.SubFactory(ActorFactory)
class Meta:
model = models.Follow
2018-04-03 21:25:44 +00:00
class Params:
2018-06-09 13:36:16 +00:00
local = factory.Trait(actor=factory.SubFactory(ActorFactory, local=True))
2018-04-03 21:25:44 +00:00
2018-04-03 19:30:15 +00:00
@registry.register
class LibraryFactory(factory.DjangoModelFactory):
actor = factory.SubFactory(ActorFactory)
2018-06-09 13:36:16 +00:00
url = factory.Faker("url")
federation_enabled = True
download_files = False
autoimport = False
class Meta:
model = models.Library
class ArtistMetadataFactory(factory.Factory):
2018-06-09 13:36:16 +00:00
name = factory.Faker("name")
class Meta:
model = dict
class Params:
2018-06-09 13:36:16 +00:00
musicbrainz = factory.Trait(musicbrainz_id=factory.Faker("uuid4"))
class ReleaseMetadataFactory(factory.Factory):
2018-06-09 13:36:16 +00:00
title = factory.Faker("sentence")
class Meta:
model = dict
class Params:
2018-06-09 13:36:16 +00:00
musicbrainz = factory.Trait(musicbrainz_id=factory.Faker("uuid4"))
class RecordingMetadataFactory(factory.Factory):
2018-06-09 13:36:16 +00:00
title = factory.Faker("sentence")
class Meta:
model = dict
class Params:
2018-06-09 13:36:16 +00:00
musicbrainz = factory.Trait(musicbrainz_id=factory.Faker("uuid4"))
2018-06-09 13:36:16 +00:00
@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
@registry.register
class LibraryTrackFactory(factory.DjangoModelFactory):
library = factory.SubFactory(LibraryFactory)
2018-06-09 13:36:16 +00:00
url = factory.Faker("url")
title = factory.Faker("sentence")
artist_name = factory.Faker("sentence")
album_title = factory.Faker("sentence")
audio_url = factory.Faker("url")
audio_mimetype = "audio/ogg"
metadata = factory.SubFactory(LibraryTrackMetadataFactory)
published_date = factory.LazyFunction(timezone.now)
class Meta:
model = models.LibraryTrack
class Params:
2018-06-09 13:36:16 +00:00
with_audio_file = factory.Trait(audio_file=factory.django.FileField())
2018-06-09 13:36:16 +00:00
@registry.register(name="federation.Note")
class NoteFactory(factory.Factory):
2018-06-09 13:36:16 +00:00
type = "Note"
id = factory.Faker("url")
published = factory.LazyFunction(lambda: timezone.now().isoformat())
inReplyTo = None
2018-06-09 13:36:16 +00:00
content = factory.Faker("sentence")
class Meta:
model = dict
2018-04-03 17:48:50 +00:00
2018-06-09 13:36:16 +00:00
@registry.register(name="federation.Activity")
2018-04-03 17:48:50 +00:00
class ActivityFactory(factory.Factory):
2018-06-09 13:36:16 +00:00
type = "Create"
id = factory.Faker("url")
published = factory.LazyFunction(lambda: timezone.now().isoformat())
actor = factory.Faker("url")
2018-04-03 17:48:50 +00:00
object = factory.SubFactory(
NoteFactory,
2018-06-09 13:36:16 +00:00
actor=factory.SelfAttribute("..actor"),
published=factory.SelfAttribute("..published"),
)
2018-04-03 17:48:50 +00:00
class Meta:
model = dict
2018-04-05 21:27:19 +00:00
2018-06-09 13:36:16 +00:00
@registry.register(name="federation.AudioMetadata")
2018-04-05 21:27:19 +00:00
class AudioMetadataFactory(factory.Factory):
recording = factory.LazyAttribute(
2018-06-09 13:36:16 +00:00
lambda o: "https://musicbrainz.org/recording/{}".format(uuid.uuid4())
2018-04-05 21:27:19 +00:00
)
artist = factory.LazyAttribute(
2018-06-09 13:36:16 +00:00
lambda o: "https://musicbrainz.org/artist/{}".format(uuid.uuid4())
2018-04-05 21:27:19 +00:00
)
release = factory.LazyAttribute(
2018-06-09 13:36:16 +00:00
lambda o: "https://musicbrainz.org/release/{}".format(uuid.uuid4())
2018-04-05 21:27:19 +00:00
)
bitrate = 42
length = 43
size = 44
2018-04-05 21:27:19 +00:00
class Meta:
model = dict
2018-06-09 13:36:16 +00:00
@registry.register(name="federation.Audio")
2018-04-05 21:27:19 +00:00
class AudioFactory(factory.Factory):
2018-06-09 13:36:16 +00:00
type = "Audio"
id = factory.Faker("url")
published = factory.LazyFunction(lambda: timezone.now().isoformat())
actor = factory.Faker("url")
2018-04-05 21:27:19 +00:00
url = factory.SubFactory(LinkFactory, audio=True)
metadata = factory.SubFactory(LibraryTrackMetadataFactory)
2018-04-05 21:27:19 +00:00
class Meta:
model = dict