Added Track model
This commit is contained in:
96
tests/videodinges/models/test_track.py
Normal file
96
tests/videodinges/models/test_track.py
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
from django.db.utils import IntegrityError
|
||||||
|
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
from tests.videodinges import factories, UploadMixin
|
||||||
|
from videodinges.models import Track, Video, Upload
|
||||||
|
|
||||||
|
|
||||||
|
class TrackTestCase(UploadMixin, TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
self.video = Video.objects.create(title='Title', slug='slug', description='Description')
|
||||||
|
|
||||||
|
def test_model_is_created_with_required_fields(self):
|
||||||
|
Track.objects.create(video=self.video, lang='en', upload=factories.create(Upload))
|
||||||
|
track = Track.objects.all()[0]
|
||||||
|
self.assertEqual(track.video.slug, 'slug')
|
||||||
|
self.assertEqual(track.default, False)
|
||||||
|
self.assertEqual(track.kind, 'subtitles')
|
||||||
|
self.assertEqual(track.lang, 'en')
|
||||||
|
self.assertEqual(track.label, None)
|
||||||
|
self.assertEqual(track.upload.file.name, 'some_file.txt')
|
||||||
|
|
||||||
|
def test_model_is_created_with_nonrequired_fields(self):
|
||||||
|
Track.objects.create(
|
||||||
|
video=self.video,
|
||||||
|
lang='en',
|
||||||
|
upload=factories.create(Upload),
|
||||||
|
default=True,
|
||||||
|
label='Something',
|
||||||
|
kind='chapters',
|
||||||
|
)
|
||||||
|
track = Track.objects.all()[0]
|
||||||
|
self.assertEqual(track.video.slug, 'slug')
|
||||||
|
self.assertEqual(track.default, True)
|
||||||
|
self.assertEqual(track.kind, 'chapters')
|
||||||
|
self.assertEqual(track.lang, 'en')
|
||||||
|
self.assertEqual(track.label, 'Something')
|
||||||
|
self.assertEqual(track.upload.file.name, 'some_file.txt')
|
||||||
|
|
||||||
|
def test_can_create_two_models(self):
|
||||||
|
model1 = Track.objects.create(video=self.video, lang='en', upload=factories.create(Upload))
|
||||||
|
model2 = Track.objects.create(video=self.video, lang='nl', upload=factories.create(Upload))
|
||||||
|
self.assertEqual({model1, model2}, set((m for m in Track.objects.all())))
|
||||||
|
|
||||||
|
self.assertEqual(model1.video, self.video)
|
||||||
|
self.assertEqual(model1.default, False)
|
||||||
|
self.assertEqual(model1.kind, 'subtitles')
|
||||||
|
self.assertEqual(model1.lang, 'en')
|
||||||
|
|
||||||
|
self.assertEqual(model2.video, self.video)
|
||||||
|
self.assertEqual(model2.default, False)
|
||||||
|
self.assertEqual(model2.kind, 'subtitles')
|
||||||
|
self.assertEqual(model2.lang, 'nl')
|
||||||
|
|
||||||
|
def test_can_create_two_models_with_one_default(self):
|
||||||
|
model1 = Track.objects.create(video=self.video, default=True, lang='en', upload=factories.create(Upload))
|
||||||
|
model2 = Track.objects.create(video=self.video, lang='nl', upload=factories.create(Upload))
|
||||||
|
self.assertEqual({model1, model2}, set((m for m in Track.objects.all())))
|
||||||
|
|
||||||
|
self.assertEqual(model1.video, self.video)
|
||||||
|
self.assertEqual(model1.default, True)
|
||||||
|
self.assertEqual(model1.kind, 'subtitles')
|
||||||
|
self.assertEqual(model1.lang, 'en')
|
||||||
|
|
||||||
|
self.assertEqual(model2.video, self.video)
|
||||||
|
self.assertEqual(model2.default, False)
|
||||||
|
self.assertEqual(model2.kind, 'subtitles')
|
||||||
|
self.assertEqual(model2.lang, 'nl')
|
||||||
|
|
||||||
|
def test_cannot_set_default_twice(self):
|
||||||
|
video = factories.create(Video)
|
||||||
|
Track.objects.create(video=video, default=True, lang='en', upload=factories.create(Upload))
|
||||||
|
with self.assertRaisesMessage(IntegrityError, 'UNIQUE constraint failed: tracks.video_id'):
|
||||||
|
Track.objects.create(video=video, default=True, lang='nl', upload=factories.create(Upload))
|
||||||
|
|
||||||
|
def test_cannot_set_two_subtitles_with_same_lang(self):
|
||||||
|
video = factories.create(Video)
|
||||||
|
Track.objects.create(video=video, lang='en', upload=factories.create(Upload))
|
||||||
|
with self.assertRaisesMessage(IntegrityError, 'UNIQUE constraint failed: tracks.video_id'):
|
||||||
|
Track.objects.create(video=video, lang='en', upload=factories.create(Upload))
|
||||||
|
|
||||||
|
def test_can_create_two_models_with_same_lang_but_different_kind(self):
|
||||||
|
model1 = Track.objects.create(video=self.video, lang='en', upload=factories.create(Upload))
|
||||||
|
model2 = Track.objects.create(video=self.video, lang='en', kind='chapters', upload=factories.create(Upload))
|
||||||
|
self.assertEqual({model1, model2}, set((m for m in Track.objects.all())))
|
||||||
|
|
||||||
|
self.assertEqual(model1.video, self.video)
|
||||||
|
self.assertEqual(model1.default, False)
|
||||||
|
self.assertEqual(model1.kind, 'subtitles')
|
||||||
|
self.assertEqual(model1.lang, 'en')
|
||||||
|
|
||||||
|
self.assertEqual(model2.video, self.video)
|
||||||
|
self.assertEqual(model2.default, False)
|
||||||
|
self.assertEqual(model2.kind, 'chapters')
|
||||||
|
self.assertEqual(model2.lang, 'en')
|
||||||
@@ -8,6 +8,7 @@ from videodinges.models import Transcoding, Video, qualities, transcoding_types,
|
|||||||
|
|
||||||
class TranscodingTestCase(TestCase):
|
class TranscodingTestCase(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
video = Video.objects.create(title='Title', slug='slug', description='Description')
|
video = Video.objects.create(title='Title', slug='slug', description='Description')
|
||||||
Transcoding.objects.create(video=video, quality=qualities[0].name, type=str(transcoding_types[0]), url='https://some_url')
|
Transcoding.objects.create(video=video, quality=qualities[0].name, type=str(transcoding_types[0]), url='https://some_url')
|
||||||
|
|
||||||
|
|||||||
@@ -108,6 +108,33 @@ class Transcoding(models.Model):
|
|||||||
]
|
]
|
||||||
db_table = 'transcodings'
|
db_table = 'transcodings'
|
||||||
|
|
||||||
|
class Track(models.Model):
|
||||||
|
KINDS = (
|
||||||
|
'subtitles',
|
||||||
|
'captions',
|
||||||
|
'descriptions',
|
||||||
|
'chapters',
|
||||||
|
'metadata',
|
||||||
|
)
|
||||||
|
id = models.AutoField(primary_key=True)
|
||||||
|
video = models.ForeignKey(Video, on_delete=models.CASCADE, related_name='tracks')
|
||||||
|
default = models.BooleanField(default=False)
|
||||||
|
kind = models.CharField(choices=((kind, kind) for kind in KINDS), max_length=128, default=KINDS[0])
|
||||||
|
lang = models.CharField(max_length=128)
|
||||||
|
label = models.CharField(max_length=128, blank=True, null=True)
|
||||||
|
upload = models.OneToOneField(Upload, on_delete=models.PROTECT)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return '%s_%s' % (self.kind, self.lang)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = ('video', 'kind', 'lang')
|
||||||
|
constraints = (
|
||||||
|
constraints.UniqueConstraint(
|
||||||
|
fields=('video',), condition=Q(default=True), name='only_one_default_per_video'),
|
||||||
|
)
|
||||||
|
db_table = 'tracks'
|
||||||
|
|
||||||
def get_quality_by_name(name: str) -> Optional[Quality]:
|
def get_quality_by_name(name: str) -> Optional[Quality]:
|
||||||
for quality in qualities:
|
for quality in qualities:
|
||||||
if quality.name == name:
|
if quality.name == name:
|
||||||
|
|||||||
Reference in New Issue
Block a user