summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorjfriedli2020-03-27 10:59:16 -0700
committerjvoisin2020-03-27 10:59:16 -0700
commit7104b2107db592756f4090ba772869eb86d6a44f (patch)
tree4864a5c07d3f47f5952ef7164507881918ce77e5 /test
parentd50f68ae446df413fc6459be9933f373e9f7cdda (diff)
file removal background jobv0.2.0
Diffstat (limited to '')
-rw-r--r--test/test.py53
-rw-r--r--test/test_api.py49
-rw-r--r--test/test_file_removal_scheduler.py48
3 files changed, 148 insertions, 2 deletions
diff --git a/test/test.py b/test/test.py
index 34245d9..a7e6627 100644
--- a/test/test.py
+++ b/test/test.py
@@ -1,9 +1,12 @@
1import base64
1import unittest 2import unittest
2import tempfile 3import tempfile
3import shutil 4import shutil
4import io 5import io
5import os 6import os
6 7
8from unittest.mock import patch
9
7import main 10import main
8 11
9 12
@@ -62,6 +65,33 @@ class Mat2WebTestCase(unittest.TestCase):
62 rv.data) 65 rv.data)
63 self.assertEqual(rv.status_code, 200) 66 self.assertEqual(rv.status_code, 200)
64 67
68 def test_get_upload_no_selected_file(self):
69 rv = self.app.post('/',
70 data=dict(
71 file=(io.BytesIO(b""), ''),
72 ), follow_redirects=True)
73 self.assertIn(b'No selected file',
74 rv.data)
75 self.assertEqual(rv.status_code, 200)
76
77 def test_failed_cleaning(self):
78 zip_file_bytes = base64.b64decode(
79 'UEsDBBQACAAIAPicPE8AAAAAAAAAAAAAAAAXACAAZmFpbGluZy5ub3Qtd29ya2luZy1le'
80 'HRVVA0AB+Saj13kmo9d5JqPXXV4CwABBOkDAAAE6QMAAAMAUEsHCAAAAAACAAAAAAAAAFBL'
81 'AwQUAAgACAD6nDxPAAAAAAAAAAAAAAAACQAgAHRlc3QuanNvblVUDQAH6JqPXeiaj13omo9d'
82 'dXgLAAEE6QMAAATpAwAAAwBQSwcIAAAAAAIAAAAAAAAAUEsBAhQDFAAIAAgA+Jw8TwAAAAACA'
83 'AAAAAAAABcAIAAAAAAAAAAAAKSBAAAAAGZhaWxpbmcubm90LXdvcmtpbmctZXh0VVQNAAfkmo9'
84 'd5JqPXeSaj111eAsAAQTpAwAABOkDAABQSwECFAMUAAgACAD6nDxPAAAAAAIAAAAAAAAACQAgA'
85 'AAAAAAAAAAApIFnAAAAdGVzdC5qc29uVVQNAAfomo9d6JqPXeiaj111eAsAAQTpAwAABOkDAAB'
86 'QSwUGAAAAAAIAAgC8AAAAwAAAAAAA'
87 )
88 rv = self.app.post('/',
89 data=dict(
90 file=(io.BytesIO(zip_file_bytes), 'test.zip'),
91 ), follow_redirects=True)
92 self.assertIn(b'Unable to clean',rv.data)
93 self.assertEqual(rv.status_code, 200)
94
65 def test_get_upload_no_file_name(self): 95 def test_get_upload_no_file_name(self):
66 rv = self.app.post('/', 96 rv = self.app.post('/',
67 data=dict( 97 data=dict(
@@ -97,6 +127,29 @@ class Mat2WebTestCase(unittest.TestCase):
97 rv = self.app.get('/download/70623619c449a040968cdbea85945bf384fa30ed2d5d24fa3/test.cleaned.txt') 127 rv = self.app.get('/download/70623619c449a040968cdbea85945bf384fa30ed2d5d24fa3/test.cleaned.txt')
98 self.assertEqual(rv.status_code, 302) 128 self.assertEqual(rv.status_code, 302)
99 129
130 @patch('file_removal_scheduler.random.randint')
131 def test_upload_leftover(self, randint_mock):
132 randint_mock.return_value = 0
133 os.environ['MAT2_MAX_FILE_AGE_FOR_REMOVAL'] = '0'
134 app = main.create_app()
135 self.upload_folder = tempfile.mkdtemp()
136 app.config.update(
137 TESTING=True,
138 UPLOAD_FOLDER=self.upload_folder
139 )
140 app = app.test_client()
141
142 request = self.app.post('/',
143 data=dict(
144 file=(io.BytesIO(b"Some text"), 'test.txt'),
145 ), follow_redirects=True)
146 self.assertEqual(request.status_code, 200)
147 request = app.get(
148 b'/download/4c2e9e6da31a64c70623619c449a040968cdbea85945bf384fa30ed2d5d24fa3/test.cleaned.txt'
149 )
150 self.assertEqual(302, request.status_code)
151 os.environ['MAT2_MAX_FILE_AGE_FOR_REMOVAL'] = '9999'
152
100 153
101if __name__ == '__main__': 154if __name__ == '__main__':
102 unittest.main() 155 unittest.main()
diff --git a/test/test_api.py b/test/test_api.py
index de297c4..3074bd5 100644
--- a/test/test_api.py
+++ b/test/test_api.py
@@ -4,9 +4,10 @@ import json
4import os 4import os
5import shutil 5import shutil
6import zipfile 6import zipfile
7
8from six import BytesIO 7from six import BytesIO
9 8
9from unittest.mock import patch
10
10import main 11import main
11 12
12 13
@@ -122,6 +123,23 @@ class Mat2APITestCase(unittest.TestCase):
122 rv = self.app.get('/api/extension', headers={'Origin': 'origin1.gnu'}) 123 rv = self.app.get('/api/extension', headers={'Origin': 'origin1.gnu'})
123 self.assertEqual(rv.headers['Access-Control-Allow-Origin'], 'origin1.gnu') 124 self.assertEqual(rv.headers['Access-Control-Allow-Origin'], 'origin1.gnu')
124 125
126 def test_api_cleaning_failed(self):
127 request = self.app.post('/api/upload',
128 data='{"file_name": "test_name.zip", '
129 '"file": "UEsDBBQACAAIAPicPE8AAAAAAAAAAAAAAAAXACAAZmFpbGluZy5ub3Qt'
130 'd29ya2luZy1leHRVVA0AB+Saj13kmo9d5JqPXXV4CwABBOkDAAAE6QMAAAMAUEsHCAAA'
131 'AAACAAAAAAAAAFBLAwQUAAgACAD6nDxPAAAAAAAAAAAAAAAACQAgAHRlc3QuanNvblVUD'
132 'QAH6JqPXeiaj13omo9ddXgLAAEE6QMAAATpAwAAAwBQSwcIAAAAAAIAAAAAAAAAUEsBAhQD'
133 'FAAIAAgA+Jw8TwAAAAACAAAAAAAAABcAIAAAAAAAAAAAAKSBAAAAAGZhaWxpbmcubm90LXd'
134 'vcmtpbmctZXh0VVQNAAfkmo9d5JqPXeSaj111eAsAAQTpAwAABOkDAABQSwECFAMUAAgACAD6'
135 'nDxPAAAAAAIAAAAAAAAACQAgAAAAAAAAAAAApIFnAAAAdGVzdC5qc29uVVQNAAfomo9d6JqPXe'
136 'iaj111eAsAAQTpAwAABOkDAABQSwUGAAAAAAIAAgC8AAAAwAAAAAAA"}',
137 headers={'content-type': 'application/json'}
138 )
139 error = json.loads(request.data.decode('utf-8'))['message']
140 self.assertEqual(error, 'Unable to clean application/zip')
141
142
125 def test_api_download(self): 143 def test_api_download(self):
126 request = self.app.post('/api/upload', 144 request = self.app.post('/api/upload',
127 data='{"file_name": "test_name.jpg", ' 145 data='{"file_name": "test_name.jpg", '
@@ -263,7 +281,6 @@ class Mat2APITestCase(unittest.TestCase):
263 ) 281 )
264 282
265 response = json.loads(request.data.decode('utf-8')) 283 response = json.loads(request.data.decode('utf-8'))
266 print(response)
267 self.assertEqual(response['message']['download_list'][0]['0'][0]['file_name'][0], 'required field') 284 self.assertEqual(response['message']['download_list'][0]['0'][0]['file_name'][0], 'required field')
268 self.assertEqual(response['message']['download_list'][0]['0'][0]['key'][0], 'required field') 285 self.assertEqual(response['message']['download_list'][0]['0'][0]['key'][0], 'required field')
269 self.assertEqual(request.status_code, 400) 286 self.assertEqual(request.status_code, 400)
@@ -344,6 +361,34 @@ class Mat2APITestCase(unittest.TestCase):
344 response = json.loads(request.data.decode('utf-8')) 361 response = json.loads(request.data.decode('utf-8'))
345 self.assertEqual('File not found', response['message']) 362 self.assertEqual('File not found', response['message'])
346 363
364 @patch('file_removal_scheduler.random.randint')
365 def test_api_upload_leftover(self, randint_mock):
366 os.environ['MAT2_MAX_FILE_AGE_FOR_REMOVAL'] = '0'
367 app = main.create_app()
368 self.upload_folder = tempfile.mkdtemp()
369 app.config.update(
370 TESTING=True,
371 UPLOAD_FOLDER=self.upload_folder
372 )
373 app = app.test_client()
374 randint_mock.return_value = 1
375 self.upload_download_test_jpg_and_assert_response_code(app, 200)
376 randint_mock.return_value = 0
377 self.upload_download_test_jpg_and_assert_response_code(app, 404)
378
379 os.environ['MAT2_MAX_FILE_AGE_FOR_REMOVAL'] = '9999'
380
381 def upload_download_test_jpg_and_assert_response_code(self, app, code):
382 request = app.post('/api/upload',
383 data='{"file_name": "test_name.jpg", '
384 '"file": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAf'
385 'FcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="}',
386 headers={'content-type': 'application/json'}
387 )
388 download_link = json.loads(request.data.decode('utf-8'))['download_link']
389 request = app.get(download_link)
390 self.assertEqual(code, request.status_code)
391
347 392
348if __name__ == '__main__': 393if __name__ == '__main__':
349 unittest.main() 394 unittest.main()
diff --git a/test/test_file_removal_scheduler.py b/test/test_file_removal_scheduler.py
new file mode 100644
index 0000000..7f6771a
--- /dev/null
+++ b/test/test_file_removal_scheduler.py
@@ -0,0 +1,48 @@
1import unittest
2import tempfile
3from os import path, environ
4import shutil
5
6import file_removal_scheduler
7import main
8
9
10class Mat2WebTestCase(unittest.TestCase):
11 def setUp(self):
12 self.upload_folder = tempfile.mkdtemp()
13 app = main.create_app()
14 app.config.update(
15 TESTING=True,
16 UPLOAD_FOLDER=self.upload_folder
17 )
18 self.app = app
19
20 def test_removal(self):
21 filename = 'test_name.cleaned.jpg'
22 environ['MAT2_MAX_FILE_AGE_FOR_REMOVAL'] = '0'
23 open(path.join(self.upload_folder, filename), 'a').close()
24 self.assertTrue(path.exists(path.join(self.upload_folder, )))
25 for i in range(0, 11):
26 file_removal_scheduler.run_file_removal_job(self.app.config['UPLOAD_FOLDER'])
27 self.assertFalse(path.exists(path.join(self.upload_folder, filename)))
28
29 open(path.join(self.upload_folder, filename), 'a').close()
30 file_removal_scheduler.run_file_removal_job(self.app.config['UPLOAD_FOLDER'])
31 self.assertTrue(path.exists(path.join(self.upload_folder, )))
32
33 def test_non_removal(self):
34 filename = u'i_should_no_be_removed.txt'
35 environ['MAT2_MAX_FILE_AGE_FOR_REMOVAL'] = '9999999'
36 open(path.join(self.upload_folder, filename), 'a').close()
37 self.assertTrue(path.exists(path.join(self.upload_folder, filename)))
38 for i in range(0, 11):
39 file_removal_scheduler.run_file_removal_job(self.app.config['UPLOAD_FOLDER'])
40 self.assertTrue(path.exists(path.join(self.upload_folder, filename)))
41
42 def tearDown(self):
43 shutil.rmtree(self.upload_folder)
44
45
46if __name__ == '__main__':
47 unittest.main()
48