Skip to content
Snippets Groups Projects
Forked from funkwhale / funkwhale
6769 commits behind the upstream repository.
factories.py 4.10 KiB
import os

import factory

from funkwhale_api.factories import ManyToManyFromList, registry
from funkwhale_api.federation.factories import LibraryTrackFactory
from funkwhale_api.users.factories import UserFactory

SAMPLES_PATH = os.path.join(
    os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),
    "tests",
    "music",
)


@registry.register
class ArtistFactory(factory.django.DjangoModelFactory):
    name = factory.Faker("name")
    mbid = factory.Faker("uuid4")

    class Meta:
        model = "music.Artist"


@registry.register
class AlbumFactory(factory.django.DjangoModelFactory):
    title = factory.Faker("sentence", nb_words=3)
    mbid = factory.Faker("uuid4")
    release_date = factory.Faker("date_object")
    cover = factory.django.ImageField()
    artist = factory.SubFactory(ArtistFactory)
    release_group_id = factory.Faker("uuid4")

    class Meta:
        model = "music.Album"


@registry.register
class TrackFactory(factory.django.DjangoModelFactory):
    title = factory.Faker("sentence", nb_words=3)
    mbid = factory.Faker("uuid4")
    album = factory.SubFactory(AlbumFactory)
    artist = factory.SelfAttribute("album.artist")
    position = 1
    tags = ManyToManyFromList("tags")

    class Meta:
        model = "music.Track"


@registry.register
class TrackFileFactory(factory.django.DjangoModelFactory):
    track = factory.SubFactory(TrackFactory)
    audio_file = factory.django.FileField(
        from_path=os.path.join(SAMPLES_PATH, "test.ogg")
    )

    bitrate = None
    size = None
    duration = None

    class Meta:
        model = "music.TrackFile"

    class Params:
        in_place = factory.Trait(audio_file=None)
        federation = factory.Trait(
            audio_file=None,
            library_track=factory.SubFactory(LibraryTrackFactory),
            mimetype=factory.LazyAttribute(lambda o: o.library_track.audio_mimetype),
            source=factory.LazyAttribute(lambda o: o.library_track.audio_url),
        )


@registry.register
class ImportBatchFactory(factory.django.DjangoModelFactory):
    submitted_by = factory.SubFactory(UserFactory)

    class Meta:
        model = "music.ImportBatch"

    class Params:
        federation = factory.Trait(submitted_by=None, source="federation")
        finished = factory.Trait(status="finished")


@registry.register
class ImportJobFactory(factory.django.DjangoModelFactory):
    batch = factory.SubFactory(ImportBatchFactory)
    source = factory.Faker("url")
    mbid = factory.Faker("uuid4")
    replace_if_duplicate = factory.Faker("boolean")

    class Meta:
        model = "music.ImportJob"

    class Params:
        federation = factory.Trait(
            mbid=None,
            library_track=factory.SubFactory(LibraryTrackFactory),
            batch=factory.SubFactory(ImportBatchFactory, federation=True),
        )
        finished = factory.Trait(
            status="finished", track_file=factory.SubFactory(TrackFileFactory)
        )
        in_place = factory.Trait(status="finished", audio_file=None)
        with_audio_file = factory.Trait(
            status="finished",
            audio_file=factory.django.FileField(
                from_path=os.path.join(SAMPLES_PATH, "test.ogg")
            ),
        )


@registry.register(name="music.FileImportJob")
class FileImportJobFactory(ImportJobFactory):
    source = "file://"
    mbid = None
    audio_file = factory.django.FileField(
        from_path=os.path.join(SAMPLES_PATH, "test.ogg")
    )


@registry.register
class WorkFactory(factory.django.DjangoModelFactory):
    mbid = factory.Faker("uuid4")
    language = "eng"
    nature = "song"
    title = factory.Faker("sentence", nb_words=3)

    class Meta:
        model = "music.Work"


@registry.register
class LyricsFactory(factory.django.DjangoModelFactory):
    work = factory.SubFactory(WorkFactory)
    url = factory.Faker("url")
    content = factory.Faker("paragraphs", nb=4)

    class Meta:
        model = "music.Lyrics"


@registry.register
class TagFactory(factory.django.DjangoModelFactory):
    name = factory.SelfAttribute("slug")
    slug = factory.Faker("slug")

    class Meta:
        model = "taggit.Tag"