From 40490d6086dc4543d197c30f1b6acc622147d5d3 Mon Sep 17 00:00:00 2001 From: Bastiaan Welmers Date: Sat, 9 May 2020 11:21:47 +0200 Subject: [PATCH] Better upload handling in temporary dirs --- tests/videodinges/__init__.py | 1 + tests/videodinges/base.py | 22 +++++++++++++++++++ tests/videodinges/factories.py | 12 +++------- tests/videodinges/models/test_transcoding.py | 4 ++-- tests/videodinges/models/test_upload.py | 8 +++---- .../videodinges/test_factories/test_upload.py | 4 ++-- tests/videodinges/views/test_video.py | 5 +++-- 7 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 tests/videodinges/base.py diff --git a/tests/videodinges/__init__.py b/tests/videodinges/__init__.py index e69de29..8a0591d 100644 --- a/tests/videodinges/__init__.py +++ b/tests/videodinges/__init__.py @@ -0,0 +1 @@ +from .base import UploadMixin diff --git a/tests/videodinges/base.py b/tests/videodinges/base.py new file mode 100644 index 0000000..9962367 --- /dev/null +++ b/tests/videodinges/base.py @@ -0,0 +1,22 @@ +import tempfile +from unittest import TestCase + +from django.test import override_settings + + +class UploadMixin(TestCase): + base_upload_dir: str + @classmethod + def setUpClass(cls) -> None: + super().setUpClass() + cls.base_upload_dir = tempfile.mkdtemp(suffix='-videodinges-tests') + + def setUp(self) -> None: + super().setUp() + media_root = tempfile.mkdtemp(suffix='-' + self.__class__.__name__, dir=self.base_upload_dir) + self.media_root_override_settings = override_settings(MEDIA_ROOT=media_root) + self.media_root_override_settings.enable() + + def tearDown(self) -> None: + self.media_root_override_settings.disable() + super().tearDown() diff --git a/tests/videodinges/factories.py b/tests/videodinges/factories.py index 32c441b..a87cafb 100644 --- a/tests/videodinges/factories.py +++ b/tests/videodinges/factories.py @@ -1,10 +1,8 @@ """ Module generating useful models in 1 place """ -import tempfile from typing import Type, TypeVar from django.core.files.uploadedfile import SimpleUploadedFile import django.db.models -from django.test import override_settings from videodinges import models @@ -30,13 +28,9 @@ def create(model: Type[T], **kwargs) -> T: return models.Transcoding.objects.create(**{**defaults, **kwargs}) if model is models.Upload: - return _upload(**kwargs) - -@override_settings(MEDIA_ROOT=tempfile.mkdtemp()) -def _upload(**kwargs): - file = SimpleUploadedFile('some_file.txt', b'some contents') \ - if 'file' not in kwargs else None - return models.Upload.objects.create(**{**dict(file=file), **kwargs}) + file = SimpleUploadedFile('some_file.txt', b'some contents') \ + if 'file' not in kwargs else None + return models.Upload.objects.create(**{**dict(file=file), **kwargs}) # TODO fix annoying dict notation to something more gentle. diff --git a/tests/videodinges/models/test_transcoding.py b/tests/videodinges/models/test_transcoding.py index fed63fe..9e0fcbc 100644 --- a/tests/videodinges/models/test_transcoding.py +++ b/tests/videodinges/models/test_transcoding.py @@ -2,7 +2,7 @@ from django.db.utils import IntegrityError from django.test import TestCase -from tests.videodinges import factories +from tests.videodinges import factories, UploadMixin from videodinges.models import Transcoding, Video, qualities, transcoding_types, Upload @@ -19,7 +19,7 @@ class TranscodingTestCase(TestCase): self.assertEqual(transcoding.url, 'https://some_url') -class CreateTranscodingTestCase(TestCase): +class CreateTranscodingTestCase(UploadMixin, TestCase): def test_upload_and_url_cannot_both_be_filled(self): video = factories.create(Video) diff --git a/tests/videodinges/models/test_upload.py b/tests/videodinges/models/test_upload.py index 314cce0..400a384 100644 --- a/tests/videodinges/models/test_upload.py +++ b/tests/videodinges/models/test_upload.py @@ -1,13 +1,13 @@ from django.test import TestCase + +from tests.videodinges import UploadMixin from videodinges.models import Upload from django.core.files.uploadedfile import SimpleUploadedFile -from django.test import override_settings -import tempfile -@override_settings(MEDIA_ROOT=tempfile.mkdtemp()) -class UploadTestCase(TestCase): +class UploadTestCase(UploadMixin, TestCase): def setUp(self): + super().setUp() Upload.objects.create(file=SimpleUploadedFile('some_file.txt', b'some contents')) def test_model_is_created(self): diff --git a/tests/videodinges/test_factories/test_upload.py b/tests/videodinges/test_factories/test_upload.py index 0714b90..a53603f 100644 --- a/tests/videodinges/test_factories/test_upload.py +++ b/tests/videodinges/test_factories/test_upload.py @@ -1,9 +1,9 @@ from django.test import TestCase -from tests.videodinges import factories +from tests.videodinges import factories, UploadMixin from videodinges.models import Upload -class UploadTestCase(TestCase): +class UploadTestCase(UploadMixin, TestCase): def test_model_is_created(self): upload = factories.create(Upload) self.assertEqual(upload.file.name, 'some_file.txt') diff --git a/tests/videodinges/views/test_video.py b/tests/videodinges/views/test_video.py index 173ff5d..684b60a 100644 --- a/tests/videodinges/views/test_video.py +++ b/tests/videodinges/views/test_video.py @@ -3,12 +3,13 @@ from django.http import HttpResponse from django.test import TestCase, Client from django.urls import reverse -from tests.videodinges import factories +from tests.videodinges import factories, UploadMixin from videodinges import models -class VideoTestCase(TestCase): +class VideoTestCase(UploadMixin, TestCase): def setUp(self): + super().setUp() self.client = Client() def test_video_view_renders_properly(self):