| @ -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()) | |||||