From 2f2ebde2208136238c9310b948be867394745669 Mon Sep 17 00:00:00 2001 From: Steven Ly <6807939+orcsly@users.noreply.github.com> Date: Sat, 22 Aug 2020 12:49:19 -0700 Subject: [PATCH] DIV-986: Add unit tests. --- edivorce/apps/core/tests/__init__.py | 0 edivorce/apps/core/tests/test_upload.py | 61 +++++++++++++++++++ .../core/{tests.py => tests/test_users.py} | 0 3 files changed, 61 insertions(+) create mode 100644 edivorce/apps/core/tests/__init__.py create mode 100644 edivorce/apps/core/tests/test_upload.py rename edivorce/apps/core/{tests.py => tests/test_users.py} (100%) 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