diff options
author | Laurent Peuch <cortex@worlddomination.be> | 2020-03-20 14:18:08 +0100 |
---|---|---|
committer | Laurent Peuch <cortex@worlddomination.be> | 2020-03-20 14:18:08 +0100 |
commit | 2f92ba46d9801839063d940dfcf1f0d46c576b9d (patch) | |
tree | 171f7e33b04c3a60392d5279de175db3ef6243e4 /test/test_fileutils.py | |
parent | db91eae86a35dabbfd5986a1b1a10696ae3749ed (diff) | |
download | logilab-common-2f92ba46d9801839063d940dfcf1f0d46c576b9d.tar.gz |
[tox] move to pytest
Diffstat (limited to 'test/test_fileutils.py')
-rw-r--r-- | test/test_fileutils.py | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/test/test_fileutils.py b/test/test_fileutils.py new file mode 100644 index 0000000..555e73f --- /dev/null +++ b/test/test_fileutils.py @@ -0,0 +1,146 @@ +# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of logilab-common. +# +# logilab-common is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) any +# later version. +# +# logilab-common is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with logilab-common. If not, see <http://www.gnu.org/licenses/>. +"""unit tests for logilab.common.fileutils""" + +import doctest +import io +import sys, os, tempfile, shutil +from stat import S_IWRITE +from os.path import join + +from logilab.common.testlib import TestCase, unittest_main, unittest + +from logilab.common.fileutils import * + +DATA_DIR = join(os.path.abspath(os.path.dirname(__file__)), 'data') +NEWLINES_TXT = join(DATA_DIR, 'newlines.txt') + + +class FirstleveldirectoryTC(TestCase): + + def test_known_values_first_level_directory(self): + """return the first level directory of a path""" + self.assertEqual(first_level_directory('truc/bidule/chouette'), 'truc', None) + self.assertEqual(first_level_directory('/truc/bidule/chouette'), '/', None) + +class IsBinaryTC(TestCase): + def test(self): + self.assertEqual(is_binary('toto.txt'), 0) + #self.assertEqual(is_binary('toto.xml'), 0) + self.assertEqual(is_binary('toto.bin'), 1) + self.assertEqual(is_binary('toto.sxi'), 1) + self.assertEqual(is_binary('toto.whatever'), 1) + +class GetModeTC(TestCase): + def test(self): + self.assertEqual(write_open_mode('toto.txt'), 'w') + #self.assertEqual(write_open_mode('toto.xml'), 'w') + self.assertEqual(write_open_mode('toto.bin'), 'wb') + self.assertEqual(write_open_mode('toto.sxi'), 'wb') + +class NormReadTC(TestCase): + def test_known_values_norm_read(self): + with io.open(NEWLINES_TXT) as f: + data = f.read() + self.assertEqual(data.strip(), '\n'.join(['# mixed new lines', '1', '2', '3'])) + + +class LinesTC(TestCase): + def test_known_values_lines(self): + self.assertEqual(lines(NEWLINES_TXT), + ['# mixed new lines', '1', '2', '3']) + + def test_known_values_lines_comment(self): + self.assertEqual(lines(NEWLINES_TXT, comments='#'), + ['1', '2', '3']) + +class ExportTC(TestCase): + def setUp(self): + self.tempdir = tempfile.mktemp() + os.mkdir(self.tempdir) + + def test(self): + export(DATA_DIR, self.tempdir, verbose=0) + self.assertTrue(exists(join(self.tempdir, '__init__.py'))) + self.assertTrue(exists(join(self.tempdir, 'sub'))) + self.assertTrue(not exists(join(self.tempdir, '__init__.pyc'))) + self.assertTrue(not exists(join(self.tempdir, 'CVS'))) + + def tearDown(self): + shutil.rmtree(self.tempdir) + +class ProtectedFileTC(TestCase): + def setUp(self): + self.rpath = join(DATA_DIR, 'write_protected_file.txt') + self.rwpath = join(DATA_DIR, 'normal_file.txt') + # Make sure rpath is not writable ! + os.chmod(self.rpath, 33060) + # Make sure rwpath is writable ! + os.chmod(self.rwpath, 33188) + + def test_mode_change(self): + """tests that mode is changed when needed""" + # test on non-writable file + #self.assertTrue(not os.access(self.rpath, os.W_OK)) + self.assertTrue(not os.stat(self.rpath).st_mode & S_IWRITE) + wp_file = ProtectedFile(self.rpath, 'w') + self.assertTrue(os.stat(self.rpath).st_mode & S_IWRITE) + self.assertTrue(os.access(self.rpath, os.W_OK)) + # test on writable-file + self.assertTrue(os.stat(self.rwpath).st_mode & S_IWRITE) + self.assertTrue(os.access(self.rwpath, os.W_OK)) + wp_file = ProtectedFile(self.rwpath, 'w') + self.assertTrue(os.stat(self.rwpath).st_mode & S_IWRITE) + self.assertTrue(os.access(self.rwpath, os.W_OK)) + + def test_restore_on_close(self): + """tests original mode is restored on close""" + # test on non-writable file + #self.assertTrue(not os.access(self.rpath, os.W_OK)) + self.assertTrue(not os.stat(self.rpath).st_mode & S_IWRITE) + ProtectedFile(self.rpath, 'w').close() + #self.assertTrue(not os.access(self.rpath, os.W_OK)) + self.assertTrue(not os.stat(self.rpath).st_mode & S_IWRITE) + # test on writable-file + self.assertTrue(os.access(self.rwpath, os.W_OK)) + self.assertTrue(os.stat(self.rwpath).st_mode & S_IWRITE) + ProtectedFile(self.rwpath, 'w').close() + self.assertTrue(os.access(self.rwpath, os.W_OK)) + self.assertTrue(os.stat(self.rwpath).st_mode & S_IWRITE) + + def test_mode_change_on_append(self): + """tests that mode is changed when file is opened in 'a' mode""" + #self.assertTrue(not os.access(self.rpath, os.W_OK)) + self.assertTrue(not os.stat(self.rpath).st_mode & S_IWRITE) + wp_file = ProtectedFile(self.rpath, 'a') + self.assertTrue(os.access(self.rpath, os.W_OK)) + self.assertTrue(os.stat(self.rpath).st_mode & S_IWRITE) + wp_file.close() + #self.assertTrue(not os.access(self.rpath, os.W_OK)) + self.assertTrue(not os.stat(self.rpath).st_mode & S_IWRITE) + + +if sys.version_info < (3, 0): + def load_tests(loader, tests, ignore): + from logilab.common import fileutils + tests.addTests(doctest.DocTestSuite(fileutils)) + return tests + + +if __name__ == '__main__': + unittest_main() |