diff --git a/edivorce/apps/core/tests/__init__.py b/edivorce/apps/core/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/edivorce/apps/core/tests/test_upload.py b/edivorce/apps/core/tests/test_upload.py new file mode 100644 index 00000000..0334dc57 --- /dev/null +++ b/edivorce/apps/core/tests/test_upload.py @@ -0,0 +1,61 @@ +import clamd +from clamd import BufferTooLongError +from unittest import mock + +from django import forms +from django.test import TestCase +from django.core.files.uploadedfile import SimpleUploadedFile + +from ..validators import file_scan_validation + + +class TestUploadForm(forms.Form): + upload = forms.FileField(validators=[file_scan_validation]) + + +class UploadScanTests(TestCase): + + def test_validation_disabled(self): + with self.settings(CLAMAV_ENABLED=False): + infected = SimpleUploadedFile('infected.txt', clamd.EICAR) + form = TestUploadForm(files={'upload': infected}) + + self.assertTrue(form.is_valid(), form.errors) + + def test_validation_invalid_network_connection(self): + with self.settings(CLAMAV_TCP_PORT=9999): + infected = SimpleUploadedFile('infected.txt', clamd.EICAR) + form = TestUploadForm(files={'upload': infected}) + + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['upload'][0], 'Unable to scan file.') + + @mock.patch('clamd.ClamdNetworkSocket.instream') + def test_validation_buffer_overflow(self, mock_clam): + mock_clam.side_effect = BufferTooLongError() + + # by default clamav has a 10mb limit for instream + clean = SimpleUploadedFile('clean.txt', b'clean file') + form = TestUploadForm(files={'upload': clean}) + + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['upload'][0], 'Unable to scan file.') + + @mock.patch('clamd.ClamdNetworkSocket.instream') + def test_validation_virus_found(self, mock_clam): + mock_clam.return_value = {'stream': ('FOUND', 'Eicar-Test-Signature')} + + infected = SimpleUploadedFile('infected.txt', clamd.EICAR) + form = TestUploadForm(files={'upload': infected}) + + self.assertFalse(form.is_valid()) + self.assertEqual(form.errors['upload'][0], 'Infected file found.') + + @mock.patch('clamd.ClamdNetworkSocket.instream') + def test_validation_no_virus_found(self, mock_clam): + mock_clam.return_value = {'stream': ('OK', None)} + + clean = SimpleUploadedFile('clean.txt', b'clean file') + form = TestUploadForm(files={'upload': clean}) + + self.assertTrue(form.is_valid()) diff --git a/edivorce/apps/core/tests.py b/edivorce/apps/core/tests/test_users.py similarity index 100% rename from edivorce/apps/core/tests.py rename to edivorce/apps/core/tests/test_users.py