From b1b59e66e064b69ed4661ec33e1e8e3e9a387afc Mon Sep 17 00:00:00 2001 From: Alessandro Molina Date: Wed, 21 Feb 2024 23:29:39 +0100 Subject: [PATCH] Avoid leaking files in tests --- tests/test_fields_basic.py | 20 ++++++--- tests/test_fields_ming.py | 79 +++++++++++++++++++-------------- tests/test_fields_sqlalchemy.py | 71 +++++++++++++++-------------- tests/test_local_storage.py | 3 +- tests/utils.py | 19 ++++++++ 5 files changed, 117 insertions(+), 75 deletions(-) diff --git a/tests/test_fields_basic.py b/tests/test_fields_basic.py index d76626b..b7161f3 100644 --- a/tests/test_fields_basic.py +++ b/tests/test_fields_basic.py @@ -5,6 +5,7 @@ from sqlalchemy.schema import Column from sqlalchemy.types import Unicode, Integer from .base_sqla import setup_database, clear_database, DeclarativeBase, DBSession +from .utils import OpenFiles from depot.fields.sqlalchemy import UploadedFileField from depot.fields.upload import UploadedFile from depot.manager import DepotManager @@ -12,6 +13,8 @@ from depot._compat import u_, bytes_ +of = OpenFiles() + def setUpModule(): setup_database() @@ -62,9 +65,12 @@ def tearDownClass(cls): def setUp(self): clear_database() + def tearDown(self): + of.close_all() + def test_column_is_dictlike(self): doc = SimpleDocument(name=u_('Foo')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) DBSession.flush() DBSession.commit() @@ -78,7 +84,7 @@ def test_column_is_dictlike(self): def test_column_cannot_edit_after_save(self): doc = SimpleDocument(name=u_('Foo')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) DBSession.flush() DBSession.commit() @@ -89,7 +95,7 @@ def test_column_cannot_edit_after_save(self): def test_column_cannot_delete_after_save(self): doc = SimpleDocument(name=u_('Foo')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) DBSession.flush() DBSession.commit() @@ -100,7 +106,7 @@ def test_column_cannot_delete_after_save(self): def test_column_cannot_edit_attr_after_save(self): doc = SimpleDocument(name=u_('Foo')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) DBSession.flush() DBSession.commit() @@ -111,7 +117,7 @@ def test_column_cannot_edit_attr_after_save(self): def test_column_cannot_delete_attr_after_save(self): doc = SimpleDocument(name=u_('Foo')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) DBSession.flush() DBSession.commit() @@ -123,8 +129,8 @@ def test_column_cannot_delete_attr_after_save(self): def test_storage_does_not_exists(self): doc = SimpleDocument(name=u_('Foo')) with self.assertRaises(ValueError): - doc.content = UploadedFile(open(self.fake_file.name, 'rb'), - 'missing_storage') + doc.content = UploadedFile(of.open(self.fake_file.name, 'rb'), + 'missing_storage') DBSession.add(doc) DBSession.flush() DBSession.commit() diff --git a/tests/test_fields_ming.py b/tests/test_fields_ming.py index ef3e79d..be35f4b 100644 --- a/tests/test_fields_ming.py +++ b/tests/test_fields_ming.py @@ -10,10 +10,12 @@ from ming.odm.declarative import MappedClass from ming.odm import FieldProperty from ming import schema as s, Field -from .utils import create_cgifs +from .utils import create_cgifs, OpenFiles from depot.fields.specialized.image import UploadedImageWithThumb from depot._compat import u_ +of = OpenFiles() + def setUpModule(): setup_database() @@ -45,14 +47,14 @@ class __mongometa__: class TestMingAttachments(unittest.TestCase): def setUp(self): self.file_content = b'this is the file content' - self.fake_file = tempfile.NamedTemporaryFile() + self.fake_file = of.add(tempfile.NamedTemporaryFile()) self.fake_file.write(self.file_content) self.fake_file.flush() self.fake_file.seek(0) clear_database() def tearDown(self): - self.fake_file.close() + of.close_all() def test_accessing_class_property(self): # This is to check for regression in a bug in property descriptor @@ -60,7 +62,7 @@ def test_accessing_class_property(self): assert isinstance(prop, FieldProperty), prop def test_create_fromfile(self): - doc = Document(name='Foo', content = open(self.fake_file.name, 'rb')) + doc = Document(name='Foo', content = of.open(self.fake_file.name, 'rb')) DBSession.flush() DBSession.clear() @@ -69,7 +71,7 @@ def test_create_fromfile(self): assert d.content.file.filename == os.path.basename(self.fake_file.name) def test_create_fromfile_flush_single_document(self): - doc = Document(name='Foo', content = open(self.fake_file.name, 'rb')) + doc = Document(name='Foo', content = of.open(self.fake_file.name, 'rb')) DBSession.flush(doc) DBSession.clear() @@ -79,8 +81,9 @@ def test_create_fromfile_flush_single_document(self): def test_edit_existing(self): doc = Document(name=u_('Foo2')) - doc.content = open(self.fake_file.name, 'rb') - DBSession.flush() + with open(self.fake_file.name, 'rb') as f: + doc.content = f + DBSession.flush() DBSession.clear() d = Document.query.find(dict(name='Foo2')).first() @@ -102,8 +105,9 @@ def test_edit_existing(self): def test_edit_existing_rollback(self): doc = Document(name=u_('Foo3')) - doc.content = open(self.fake_file.name, 'rb') - DBSession.flush() + with open(self.fake_file.name, 'rb') as f: + doc.content = f + DBSession.flush() DBSession.clear() @@ -125,6 +129,7 @@ def test_edit_existing_rollback(self): def test_create_fromfield(self): field = create_cgifs('image/jpeg', self.fake_file, 'test.jpg') + of.add(field.file) doc = Document(name=u_('Foo'), content=field) DBSession.flush() @@ -146,8 +151,9 @@ def test_create_empty(self): def test_delete_existing(self): doc = Document(name=u_('Foo2')) - doc.content = open(self.fake_file.name, 'rb') - DBSession.flush() + with open(self.fake_file.name, 'rb') as f: + doc.content = f + DBSession.flush() DBSession.clear() @@ -163,8 +169,9 @@ def test_delete_existing(self): def test_delete_existing_rollback(self): doc = Document(name=u_('Foo3')) - doc.content = open(self.fake_file.name, 'rb') - DBSession.flush() + with open(self.fake_file.name, 'rb') as f: + doc.content = f + DBSession.flush() DBSession.clear() @@ -176,8 +183,9 @@ def test_delete_existing_rollback(self): assert get_file(old_file).read() == self.file_content def test_create_with_alias(self): - doc = Document(name='Foo', targeted_content=open(self.fake_file.name, 'rb')) - DBSession.flush() + with open(self.fake_file.name, 'rb') as f: + doc = Document(name='Foo', targeted_content=f) + DBSession.flush() DBSession.clear() d = Document.query.find(dict(name='Foo')).first() @@ -190,19 +198,20 @@ class TestMingImageAttachments(unittest.TestCase): def setUp(self): self.file_content = b'''R0lGODlhEQAUAPcAAC4uLjAwMDIyMjMzMjQ0NDU1NDY2Njk2Mzg4ODo6Oj49Ozw8PD4+PkE+OEA/PkhAN0tCNk5JPFFGNV1KMFhNNVFHOFJJPVVLPVhOPXZfKXVcK2ZQNGZXNGtZMnNcNHZeNnldMHJfOn1hKXVjOH9oO0BAQEJCQkREREVFREZGRklGQ05KQ0hISEpKSkxMTE5OTlZRSlFQT19XSFBQUFJSUlRUVGFUQmFVQ2ZZQGtdQnNiQqJ/HI1uIYBnLIllKoZrK4FqLoVqL4luLIpsLpt7J515JJ50KZhzLYFnMIFlM4ZlMIFkNI1uNoJoOoVrPIlvO49yMolwPpB2O5p4Op98PaB3IKN4JqN8J6h7I6J5LaZ+LLF+ILGGG7+JG72OGLKEI7aHIrOEJL2JI7mMN76YNcGJG8SOG8WLHMONH86eEs+aFsGSG8eQHMySG9uVFduXFdeeE9eaFdScF96YE9yaFOKcEuOdEtWgFNiiEduhE96pEuqlD+qmD+KpD+yoDu6rDuysDvCuDfCvDeuwD/SzC/a2CvGwDfKxDPi5Cfi5Cvq8CeCjEuehEOagEeijEOKoEOStFMOOK8+TLM6YNNChItGgLtylKt6gMNqgON6jPOChLfi/JOSrNeGvN9KhRtykRNWkSOCnQOCpSOawQue1T+a6Su67SOGsUO/AVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAARABQAAAj+AAEIHEiwoMAACBMqXIhQgMOHDwdAfEigYsUCT6KQScNjxwGLBAyINPBhCilUmxIV6uMlw0gEMJeMGWWqFCU8hA4JEgETQYIEDcRw6qRlwgMIGvJwkfAzwYIFXQBB8qHg6VMKFawuYNBBjaIqDhhI+cGgrNmyJXooGrShBJBKcIpwiFCibl0TehDdsWBCiBxLZuIwolMGiwcTJ4gUenThBAokSVRgGFJnzhYQJ1KsyRkkhWfPK87McWPEM4sRhgItCsGitQ5PmtxYUdK6BY4rf/zwYRNmUihRpyQdaUHchQsoX/Y4amTnUqZPoG7YMO7ihfUcYNC0eRMJExMqMKweW59BfkYMEk2ykHAio3x5GvDjy58Pv4b9+/jz2w8IADs=''' self.file_content = base64.b64decode(self.file_content) - self.fake_file = tempfile.NamedTemporaryFile() + self.fake_file = of.add(tempfile.NamedTemporaryFile()) self.fake_file.write(self.file_content) self.fake_file.flush() self.fake_file.seek(0) clear_database() def tearDown(self): - self.fake_file.close() + of.close_all() def test_create_fromfile(self): doc = Document(name=u_('Foo')) - doc.photo = open(self.fake_file.name, 'rb') - DBSession.flush() + with open(self.fake_file.name, 'rb') as f: + doc.photo = f + DBSession.flush() DBSession.clear() d = Document.query.find(dict(name='Foo')).first() @@ -212,10 +221,10 @@ def test_create_fromfile(self): def test_create_fromfield(self): field = cgi.FieldStorage() field.filename = u_('àèìòù.gif') - field.file = open(self.fake_file.name, 'rb') - - doc = Document(name=u_('Foo'), photo=field) - DBSession.flush() + with open(self.fake_file.name, 'rb') as f: + field.file = f + doc = Document(name=u_('Foo'), photo=field) + DBSession.flush() DBSession.clear() d = Document.query.find(dict(name='Foo')).first() @@ -227,6 +236,7 @@ def test_create_fromfield(self): def test_thumbnail(self): field = create_cgifs('image/gif', self.fake_file, 'test.gif') + of.add(field.file) doc = Document(name=u_('Foo'), photo=field) DBSession.flush() @@ -241,8 +251,8 @@ def test_thumbnail(self): def test_public_url(self): doc = Document(name=u_('Foo')) - doc.photo = open(self.fake_file.name, 'rb') - doc.content = open(self.fake_file.name, 'rb') + doc.photo = of.open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.flush() DBSession.clear() @@ -261,7 +271,7 @@ def test_rollback(self): self.skipTest("Currently Ming Doesn't provide a way to handle discarded documents") doc = Document(name=u_('Foo3')) - doc.photo = open(self.fake_file.name, 'rb') + doc.photo = of.open(self.fake_file.name, 'rb') uploaded_file = doc.photo.path uploaded_thumb = doc.photo.thumb_path @@ -285,18 +295,18 @@ class TestMingThumbnailFilter(unittest.TestCase): def setUp(self): self.file_content = b'''R0lGODlhEQAUAPcAAC4uLjAwMDIyMjMzMjQ0NDU1NDY2Njk2Mzg4ODo6Oj49Ozw8PD4+PkE+OEA/PkhAN0tCNk5JPFFGNV1KMFhNNVFHOFJJPVVLPVhOPXZfKXVcK2ZQNGZXNGtZMnNcNHZeNnldMHJfOn1hKXVjOH9oO0BAQEJCQkREREVFREZGRklGQ05KQ0hISEpKSkxMTE5OTlZRSlFQT19XSFBQUFJSUlRUVGFUQmFVQ2ZZQGtdQnNiQqJ/HI1uIYBnLIllKoZrK4FqLoVqL4luLIpsLpt7J515JJ50KZhzLYFnMIFlM4ZlMIFkNI1uNoJoOoVrPIlvO49yMolwPpB2O5p4Op98PaB3IKN4JqN8J6h7I6J5LaZ+LLF+ILGGG7+JG72OGLKEI7aHIrOEJL2JI7mMN76YNcGJG8SOG8WLHMONH86eEs+aFsGSG8eQHMySG9uVFduXFdeeE9eaFdScF96YE9yaFOKcEuOdEtWgFNiiEduhE96pEuqlD+qmD+KpD+yoDu6rDuysDvCuDfCvDeuwD/SzC/a2CvGwDfKxDPi5Cfi5Cvq8CeCjEuehEOagEeijEOKoEOStFMOOK8+TLM6YNNChItGgLtylKt6gMNqgON6jPOChLfi/JOSrNeGvN9KhRtykRNWkSOCnQOCpSOawQue1T+a6Su67SOGsUO/AVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAARABQAAAj+AAEIHEiwoMAACBMqXIhQgMOHDwdAfEigYsUCT6KQScNjxwGLBAyINPBhCilUmxIV6uMlw0gEMJeMGWWqFCU8hA4JEgETQYIEDcRw6qRlwgMIGvJwkfAzwYIFXQBB8qHg6VMKFawuYNBBjaIqDhhI+cGgrNmyJXooGrShBJBKcIpwiFCibl0TehDdsWBCiBxLZuIwolMGiwcTJ4gUenThBAokSVRgGFJnzhYQJ1KsyRkkhWfPK87McWPEM4sRhgItCsGitQ5PmtxYUdK6BY4rf/zwYRNmUihRpyQdaUHchQsoX/Y4amTnUqZPoG7YMO7ihfUcYNC0eRMJExMqMKweW59BfkYMEk2ykHAio3x5GvDjy58Pv4b9+/jz2w8IADs=''' self.file_content = base64.b64decode(self.file_content) - self.fake_file = tempfile.NamedTemporaryFile() + self.fake_file = of.add(tempfile.NamedTemporaryFile()) self.fake_file.write(self.file_content) self.fake_file.flush() self.fake_file.seek(0) clear_database() def tearDown(self): - self.fake_file.close() + of.close_all() def test_create_fromfile(self): doc = Document(name=u_('Foo')) - doc.second_photo = open(self.fake_file.name, 'rb') + doc.second_photo = of.open(self.fake_file.name, 'rb') DBSession.flush() DBSession.clear() @@ -307,7 +317,7 @@ def test_create_fromfile(self): def test_create_fromfield(self): field = cgi.FieldStorage() field.filename = u_('àèìòù.gif') - field.file = open(self.fake_file.name, 'rb') + field.file = of.open(self.fake_file.name, 'rb') doc = Document(name=u_('Foo'), second_photo=field) DBSession.flush() @@ -322,6 +332,7 @@ def test_create_fromfield(self): def test_thumbnail(self): field = create_cgifs('image/gif', self.fake_file, 'test.gif') + of.add(field.file) doc = Document(name=u_('Foo'), second_photo=field) DBSession.flush() @@ -339,8 +350,8 @@ def test_thumbnail(self): def test_public_url(self): doc = Document(name=u_('Foo')) - doc.second_photo = open(self.fake_file.name, 'rb') - doc.content = open(self.fake_file.name, 'rb') + doc.second_photo = of.open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.flush() DBSession.clear() @@ -358,7 +369,7 @@ def test_rollback(self): self.skipTest("Currently Ming Doesn't provide a way to handle discarded documents") doc = Document(name=u_('Foo3')) - doc.second_photo = open(self.fake_file.name, 'rb') + doc.second_photo = of.open(self.fake_file.name, 'rb') uploaded_file = doc.second_photo.path uploaded_thumb = doc.second_photo.thumb_12x12_path @@ -375,4 +386,4 @@ def test_rollback(self): fold = get_file(uploaded_thumb) assert False, 'Should have raised IOError here' except IOError: - pass \ No newline at end of file + pass diff --git a/tests/test_fields_sqlalchemy.py b/tests/test_fields_sqlalchemy.py index 7e5a7df..f44f137 100644 --- a/tests/test_fields_sqlalchemy.py +++ b/tests/test_fields_sqlalchemy.py @@ -12,11 +12,13 @@ from depot.fields.upload import UploadedFile from depot.io.utils import FileIntent from depot.manager import DepotManager, get_file -from .utils import create_cgifs +from .utils import create_cgifs, OpenFiles from depot.fields.specialized.image import UploadedImageWithThumb from depot.fields.filters.thumbnails import WithThumbnailFilter from depot._compat import u_, bytes_ +of = OpenFiles() + def setUpModule(): setup_database() @@ -83,17 +85,17 @@ def file_exists(self, file_id): class TestSQLAAttachments(SQLATestCase): def setUp(self): self.file_content = b'this is the file content' - self.fake_file = tempfile.NamedTemporaryFile() + self.fake_file = of.add(tempfile.NamedTemporaryFile()) self.fake_file.write(self.file_content) self.fake_file.flush() clear_database() def tearDown(self): - self.fake_file.close() + of.close_all() def test_create_fromfile(self): doc = Document(name=u_('Foo')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -105,7 +107,7 @@ def test_create_fromfile(self): def test_create_polymorphic_from_file(self): doc = Confidential(name=u_('Secret')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -117,7 +119,7 @@ def test_create_polymorphic_from_file(self): def test_edit_existing(self): doc = Document(name=u_('Foo2')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -143,7 +145,7 @@ def test_edit_existing(self): def test_edit_existing_rollback(self): doc = Document(name=u_('Foo3')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -164,6 +166,7 @@ def test_edit_existing_rollback(self): def test_create_fromfield(self): field = create_cgifs('image/jpeg', self.fake_file, 'test.jpg') + of.add(field.file) doc = Document(name=u_('Foo'), content=field) DBSession.add(doc) @@ -187,7 +190,7 @@ def test_create_empty(self): def test_delete_existing(self): doc = Document(name=u_('Foo2')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -205,7 +208,7 @@ def test_delete_existing(self): def test_delete_existing_from_query(self): doc = Document(name=u_('Foo2')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -224,7 +227,7 @@ def test_delete_existing_from_query(self): def test_delete_existing_rollback(self): doc = Document(name=u_('Foo3')) - doc.content = open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -242,7 +245,7 @@ def test_delete_existing_rollback(self): def test_create_with_alias(self): doc = Document(name=u_('Foo')) - doc.targeted_content = open(self.fake_file.name, 'rb') + doc.targeted_content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -255,7 +258,7 @@ def test_create_with_alias(self): def test_relationship(self): directory = Directory(name='Parent') DBSession.add(directory) - directory.documents.append(Document(name=u_('Foo'), content=open(self.fake_file.name, 'rb'))) + directory.documents.append(Document(name=u_('Foo'), content=of.open(self.fake_file.name, 'rb'))) self._session_flush() DBSession.commit() @@ -273,7 +276,7 @@ def test_relationship(self): def test_relationship_rollback(self): directory = Directory(name='Parent') DBSession.add(directory) - directory.documents.append(Document(name=u_('Foo'), content=open(self.fake_file.name, 'rb'))) + directory.documents.append(Document(name=u_('Foo'), content=of.open(self.fake_file.name, 'rb'))) self._session_flush() DBSession.commit() @@ -291,7 +294,7 @@ def test_relationship_rollback(self): def test_relationship_cascade_delete(self): directory = Directory(name='Parent') DBSession.add(directory) - directory.documents.append(Document(name=u_('Foo'), content=open(self.fake_file.name, 'rb'))) + directory.documents.append(Document(name=u_('Foo'), content=of.open(self.fake_file.name, 'rb'))) self._session_flush() DBSession.commit() @@ -309,7 +312,7 @@ def test_relationship_cascade_delete(self): def test_relationship_cascade_delete_rollback(self): directory = Directory(name='Parent') DBSession.add(directory) - directory.documents.append(Document(name=u_('Foo'), content=open(self.fake_file.name, 'rb'))) + directory.documents.append(Document(name=u_('Foo'), content=of.open(self.fake_file.name, 'rb'))) self._session_flush() DBSession.commit() @@ -334,12 +337,12 @@ class TestSQLAImageAttachments(SQLATestCase): def setUp(self): self.file_content = b'''R0lGODlhEQAUAPcAAC4uLjAwMDIyMjMzMjQ0NDU1NDY2Njk2Mzg4ODo6Oj49Ozw8PD4+PkE+OEA/PkhAN0tCNk5JPFFGNV1KMFhNNVFHOFJJPVVLPVhOPXZfKXVcK2ZQNGZXNGtZMnNcNHZeNnldMHJfOn1hKXVjOH9oO0BAQEJCQkREREVFREZGRklGQ05KQ0hISEpKSkxMTE5OTlZRSlFQT19XSFBQUFJSUlRUVGFUQmFVQ2ZZQGtdQnNiQqJ/HI1uIYBnLIllKoZrK4FqLoVqL4luLIpsLpt7J515JJ50KZhzLYFnMIFlM4ZlMIFkNI1uNoJoOoVrPIlvO49yMolwPpB2O5p4Op98PaB3IKN4JqN8J6h7I6J5LaZ+LLF+ILGGG7+JG72OGLKEI7aHIrOEJL2JI7mMN76YNcGJG8SOG8WLHMONH86eEs+aFsGSG8eQHMySG9uVFduXFdeeE9eaFdScF96YE9yaFOKcEuOdEtWgFNiiEduhE96pEuqlD+qmD+KpD+yoDu6rDuysDvCuDfCvDeuwD/SzC/a2CvGwDfKxDPi5Cfi5Cvq8CeCjEuehEOagEeijEOKoEOStFMOOK8+TLM6YNNChItGgLtylKt6gMNqgON6jPOChLfi/JOSrNeGvN9KhRtykRNWkSOCnQOCpSOawQue1T+a6Su67SOGsUO/AVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAARABQAAAj+AAEIHEiwoMAACBMqXIhQgMOHDwdAfEigYsUCT6KQScNjxwGLBAyINPBhCilUmxIV6uMlw0gEMJeMGWWqFCU8hA4JEgETQYIEDcRw6qRlwgMIGvJwkfAzwYIFXQBB8qHg6VMKFawuYNBBjaIqDhhI+cGgrNmyJXooGrShBJBKcIpwiFCibl0TehDdsWBCiBxLZuIwolMGiwcTJ4gUenThBAokSVRgGFJnzhYQJ1KsyRkkhWfPK87McWPEM4sRhgItCsGitQ5PmtxYUdK6BY4rf/zwYRNmUihRpyQdaUHchQsoX/Y4amTnUqZPoG7YMO7ihfUcYNC0eRMJExMqMKweW59BfkYMEk2ykHAio3x5GvDjy58Pv4b9+/jz2w8IADs=''' self.file_content = base64.b64decode(self.file_content) - self.fake_file = tempfile.NamedTemporaryFile() + self.fake_file = of.add(tempfile.NamedTemporaryFile()) self.fake_file.write(self.file_content) self.fake_file.flush() self.fake_file.seek(0) - self.bigimage = tempfile.NamedTemporaryFile() + self.bigimage = of.add(tempfile.NamedTemporaryFile()) blackimage = Image.frombytes('L', (1280, 1280), b"\x00" * 1280 * 1280) blackimage.save(self.bigimage, 'PNG') self.bigimage.flush() @@ -348,12 +351,11 @@ def setUp(self): clear_database() def tearDown(self): - self.fake_file.close() - self.bigimage.close() + of.close_all() def test_create_fromfile(self): doc = Document(name=u_('Foo')) - doc.photo = open(self.fake_file.name, 'rb') + doc.photo = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -364,7 +366,7 @@ def test_create_fromfile(self): def test_check_assigned_type(self): doc = Document(name=u_('Foo')) - doc.photo = UploadedFile(open(self.fake_file.name, 'rb')) + doc.photo = UploadedFile(of.open(self.fake_file.name, 'rb')) DBSession.add(doc) try: @@ -378,7 +380,7 @@ def test_check_assigned_type(self): def test_create_fromfield(self): field = cgi.FieldStorage() field.filename = u_('àèìòù.gif') - field.file = open(self.fake_file.name, 'rb') + field.file = of.open(self.fake_file.name, 'rb') doc = Document(name=u_('Foo'), photo=field) DBSession.add(doc) @@ -394,6 +396,7 @@ def test_create_fromfield(self): def test_thumbnail(self): field = create_cgifs('image/gif', self.fake_file, 'test.gif') + of.add(field.file) doc = Document(name=u_('Foo'), photo=field) DBSession.add(doc) @@ -409,6 +412,7 @@ def test_thumbnail(self): def test_maximum_size(self): field = create_cgifs('image/png', self.bigimage, 'test.png') + of.add(field.file) doc = Document(name=u_('Foo'), photo=field) DBSession.add(doc) @@ -426,8 +430,8 @@ def test_maximum_size(self): def test_public_url(self): doc = Document(name=u_('Foo')) - doc.photo = open(self.fake_file.name, 'rb') - doc.content = open(self.fake_file.name, 'rb') + doc.photo = of.open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -445,7 +449,7 @@ def test_public_url(self): def test_rollback(self): doc = Document(name=u_('Foo3')) - doc.photo = open(self.fake_file.name, 'rb') + doc.photo = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() @@ -467,18 +471,18 @@ class TestSQLAThumbnailFilter(SQLATestCase): def setUp(self): self.file_content = b'''R0lGODlhEQAUAPcAAC4uLjAwMDIyMjMzMjQ0NDU1NDY2Njk2Mzg4ODo6Oj49Ozw8PD4+PkE+OEA/PkhAN0tCNk5JPFFGNV1KMFhNNVFHOFJJPVVLPVhOPXZfKXVcK2ZQNGZXNGtZMnNcNHZeNnldMHJfOn1hKXVjOH9oO0BAQEJCQkREREVFREZGRklGQ05KQ0hISEpKSkxMTE5OTlZRSlFQT19XSFBQUFJSUlRUVGFUQmFVQ2ZZQGtdQnNiQqJ/HI1uIYBnLIllKoZrK4FqLoVqL4luLIpsLpt7J515JJ50KZhzLYFnMIFlM4ZlMIFkNI1uNoJoOoVrPIlvO49yMolwPpB2O5p4Op98PaB3IKN4JqN8J6h7I6J5LaZ+LLF+ILGGG7+JG72OGLKEI7aHIrOEJL2JI7mMN76YNcGJG8SOG8WLHMONH86eEs+aFsGSG8eQHMySG9uVFduXFdeeE9eaFdScF96YE9yaFOKcEuOdEtWgFNiiEduhE96pEuqlD+qmD+KpD+yoDu6rDuysDvCuDfCvDeuwD/SzC/a2CvGwDfKxDPi5Cfi5Cvq8CeCjEuehEOagEeijEOKoEOStFMOOK8+TLM6YNNChItGgLtylKt6gMNqgON6jPOChLfi/JOSrNeGvN9KhRtykRNWkSOCnQOCpSOawQue1T+a6Su67SOGsUO/AVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAARABQAAAj+AAEIHEiwoMAACBMqXIhQgMOHDwdAfEigYsUCT6KQScNjxwGLBAyINPBhCilUmxIV6uMlw0gEMJeMGWWqFCU8hA4JEgETQYIEDcRw6qRlwgMIGvJwkfAzwYIFXQBB8qHg6VMKFawuYNBBjaIqDhhI+cGgrNmyJXooGrShBJBKcIpwiFCibl0TehDdsWBCiBxLZuIwolMGiwcTJ4gUenThBAokSVRgGFJnzhYQJ1KsyRkkhWfPK87McWPEM4sRhgItCsGitQ5PmtxYUdK6BY4rf/zwYRNmUihRpyQdaUHchQsoX/Y4amTnUqZPoG7YMO7ihfUcYNC0eRMJExMqMKweW59BfkYMEk2ykHAio3x5GvDjy58Pv4b9+/jz2w8IADs=''' self.file_content = base64.b64decode(self.file_content) - self.fake_file = tempfile.NamedTemporaryFile() + self.fake_file = of.add(tempfile.NamedTemporaryFile()) self.fake_file.write(self.file_content) self.fake_file.flush() self.fake_file.seek(0) clear_database() def tearDown(self): - self.fake_file.close() + of.close_all() def test_create_fromfile(self): doc = Document(name=u_('Foo')) - doc.second_photo = open(self.fake_file.name, 'rb') + doc.second_photo = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -501,7 +505,7 @@ def test_create_from_bytes(self): def test_create_fromfield(self): field = cgi.FieldStorage() field.filename = u_('àèìòù.gif') - field.file = open(self.fake_file.name, 'rb') + field.file = of.open(self.fake_file.name, 'rb') doc = Document(name=u_('Foo'), second_photo=field) DBSession.add(doc) @@ -516,7 +520,7 @@ def test_create_fromfield(self): assert d.second_photo.url != d.second_photo.thumb_12x12_url def test_create_fileintent(self): - field = FileIntent(open(self.fake_file.name, 'rb'), u_('àèìòù.gif'), 'image/gif') + field = FileIntent(of.open(self.fake_file.name, 'rb'), u_('àèìòù.gif'), 'image/gif') doc = Document(name=u_('Foo'), second_photo=field) DBSession.add(doc) @@ -533,6 +537,7 @@ def test_create_fileintent(self): def test_thumbnail(self): field = create_cgifs('image/gif', self.fake_file, 'test.gif') + of.add(field.file) doc = Document(name=u_('Foo'), second_photo=field) DBSession.add(doc) @@ -551,8 +556,8 @@ def test_thumbnail(self): def test_public_url(self): doc = Document(name=u_('Foo')) - doc.second_photo = open(self.fake_file.name, 'rb') - doc.content = open(self.fake_file.name, 'rb') + doc.second_photo = of.open(self.fake_file.name, 'rb') + doc.content = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() DBSession.commit() @@ -569,7 +574,7 @@ def test_public_url(self): def test_rollback(self): doc = Document(name=u_('Foo3')) - doc.second_photo = open(self.fake_file.name, 'rb') + doc.second_photo = of.open(self.fake_file.name, 'rb') DBSession.add(doc) self._session_flush() diff --git a/tests/test_local_storage.py b/tests/test_local_storage.py index c0fb946..2d01d42 100644 --- a/tests/test_local_storage.py +++ b/tests/test_local_storage.py @@ -15,7 +15,8 @@ def tearDown(self): def test_creation(self): file_id = self.fs.create(FILE_CONTENT, 'file.txt') - assert FILE_CONTENT == open(os.path.join('./lfs', file_id, 'file'), 'rb').read() + with open(os.path.join('./lfs', file_id, 'file'), 'rb') as f: + assert FILE_CONTENT == f.read() def test_corrupted_metadata(self): file_id = self.fs.create(FILE_CONTENT, 'file.txt') diff --git a/tests/utils.py b/tests/utils.py index ee68ed5..887a762 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -2,6 +2,25 @@ import tempfile +class OpenFiles: + def __init__(self): + self._files = [] + + def open(self, *args, **kwargs): + f = open(*args, **kwargs) + self._files.append(f) + return f + + def add(self, f): + self._files.append(f) + return f + + def close_all(self): + for f in self._files: + f.close() + self._files = [] + + def create_cgifs(mimetype, content, filename): fs = cgi.FieldStorage() fs.filename = filename