Source code for aiida.backends.tests.common.test_folders

# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved.                     #
# This file is part of the AiiDA code.                                    #
#                                                                         #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida_core #
# For further information on the license, see the LICENSE.txt file        #
# For further information please visit http://www.aiida.net               #
###########################################################################
"""
Tests for the folder class
"""
from __future__ import division
from __future__ import print_function
from __future__ import absolute_import

import io
import os
import sys
import shutil
import tempfile
import unittest

import six

from aiida.common.folders import Folder


[docs]def fs_encoding_is_utf8(): """ :return: True if the current filesystem encoding is set to UTF-8 """ return sys.getfilesystemencoding() == 'utf-8'
[docs]class FoldersTest(unittest.TestCase): """ Tests for the Folder class. """
[docs] @classmethod @unittest.skipUnless(fs_encoding_is_utf8(), ("Testing for unicode folders " "requires UTF-8 to be set for filesystem encoding")) def test_unicode(cls): """ Check that there are no exceptions raised when using unicode folders. """ tmpsource = tempfile.mkdtemp() tmpdest = tempfile.mkdtemp() with io.open(os.path.join(tmpsource, "sąžininga"), 'w', encoding='utf8') as fhandle: fhandle.write(u"test") with io.open(os.path.join(tmpsource, "žąsis"), 'w', encoding='utf8') as fhandle: fhandle.write(u"test") folder = Folder(tmpdest) folder.insert_path(tmpsource, "destination") folder.insert_path(tmpsource, u"šaltinis") folder = Folder(os.path.join(tmpsource, u"šaltinis")) folder.insert_path(tmpsource, "destination") folder.insert_path(tmpdest, u"kitas-šaltinis")
[docs] def test_get_abs_path_without_limit(self): """ Check that the absolute path function can get an absolute path """ folder = Folder('/tmp') # Should not raise any exception self.assertEqual(folder.get_abs_path('test_file.txt'), '/tmp/test_file.txt')
[docs] @staticmethod @unittest.skipUnless(six.PY2, 'test is only for python2') def test_create_file_from_filelike_py2(): """Test `aiida.common.folders.Folder.create_file_from_filelike` for python 2.""" unicode_string = u'unicode_string' byte_string = 'byte_string' try: tempdir = tempfile.mkdtemp() folder = Folder(tempdir) # Passing a stream with matching file mode should work ofcourse folder.create_file_from_filelike(six.StringIO(unicode_string), 'random.dat', mode='w', encoding='utf-8') folder.create_file_from_filelike(six.StringIO(byte_string), 'random.dat', mode='wb', encoding=None) # For python 2 the `create_file_from_filelike` should be able to deal with incoherent arguments, such as # the examples below where a unicode string is passed with a binary mode, or a byte stream in unicode mode. folder.create_file_from_filelike(six.StringIO(unicode_string), 'random.dat', mode='wb', encoding=None) folder.create_file_from_filelike(six.StringIO(byte_string), 'random.dat', mode='w', encoding='utf-8') finally: shutil.rmtree(tempdir)
[docs] @unittest.skipUnless(six.PY3, 'test is only for python3') def test_create_file_from_filelike_py3(self): """Test `aiida.common.folders.Folder.create_file_from_filelike` for python 3.""" unicode_string = 'unicode_string' byte_string = b'byte_string' try: tempdir = tempfile.mkdtemp() folder = Folder(tempdir) folder.create_file_from_filelike(six.StringIO(unicode_string), 'random.dat', mode='w', encoding='utf-8') folder.create_file_from_filelike(six.BytesIO(byte_string), 'random.dat', mode='wb', encoding=None) # For python three we make no exceptions, if you pass a unicode stream with binary mode, one should expect # a TypeError. Same for the inverse case of wanting to write in unicode mode but passing a byte stream with self.assertRaises(TypeError): folder.create_file_from_filelike(six.StringIO(unicode_string), 'random.dat', mode='wb') with self.assertRaises(TypeError): folder.create_file_from_filelike(six.BytesIO(byte_string), 'random.dat', mode='w') finally: shutil.rmtree(tempdir)