From 47b6a8c0cbb10915b2e70b1918cbd5c1f99190b0 Mon Sep 17 00:00:00 2001 From: Raphael Marvie Date: Fri, 5 Oct 2018 12:18:16 +0200 Subject: [PATCH] Testing utils.filesystem.mkdir - creating single folder - creating folder with parent - creating folder with specific owner - no permission prevent creating folder Update filesyste.mkdir to not raise FileExistsError when force=True is used as parameter. --- moulinette/utils/filesystem.py | 6 +- tests/moulinette/utils/test_filesystem.py | 82 ++++++++++++++++++++++- 2 files changed, 85 insertions(+), 3 deletions(-) diff --git a/moulinette/utils/filesystem.py b/moulinette/utils/filesystem.py index d0174b71..084cd38d 100644 --- a/moulinette/utils/filesystem.py +++ b/moulinette/utils/filesystem.py @@ -202,7 +202,11 @@ def mkdir(path, mode=0o777, parents=False, uid=None, gid=None, force=False): return # Create directory and set permissions - os.mkdir(path, mode) + try: + os.mkdir(path, mode) + except FileExistsError as e: + if not force: + raise if uid is not None or gid is not None: chown(path, uid, gid) diff --git a/tests/moulinette/utils/test_filesystem.py b/tests/moulinette/utils/test_filesystem.py index db5ed221..08519ddd 100644 --- a/tests/moulinette/utils/test_filesystem.py +++ b/tests/moulinette/utils/test_filesystem.py @@ -562,8 +562,7 @@ def test_chown_cannot_change_owner_of_non_existant_file(chown): @mock.patch('os.chown') def test_chown_recursive_update_folder_owner(chown, isdir, walk): foldername = 'folder' - uid = 1000 - gid = 1000 + uid = gid = 1000 isdir.return_value = True # foldername is a folder walk.return_value = [(foldername, ['subfolder'], ['file.txt'])] @@ -575,4 +574,83 @@ def test_chown_recursive_update_folder_owner(chown, isdir, walk): chown.assert_has_calls(calls) +######################################################################## +# Testing creation of folder +######################################################################## + +@mock.patch('os.path.exists') +def test_mkdir_cannot_create_folder_if_it_exist(exists): + folder = 'folder' + exists.return_value = True + + with pytest.raises(OSError): + filesystem.mkdir(folder) + + +@mock.patch('os.path.exists') +@mock.patch('os.mkdir') +def test_mkdir_create_folder_if_does_not_exist(mkdir, exists): + foldername = 'folder' + exists.return_value = False + + filesystem.mkdir(foldername) + + mkdir.assert_called_with(foldername, 0o777) + + +@mock.patch('os.path.exists') +@mock.patch('os.mkdir') +@mock.patch('moulinette.utils.filesystem.chown') +def test_mkdir_create_folder_for_owner_if_provided(chown, mkdir, exists): + foldername = 'folder' + uid = gid = 1000 + exists.return_value = False + + filesystem.mkdir(foldername, uid=uid, gid=gid) + + mkdir.assert_called_with(foldername, 0o777) + chown.assert_called_with(foldername, uid, gid) + + +@mock.patch('os.path.exists') +@mock.patch('os.mkdir') +@mock.patch('os.chown') +def test_mkdir_update_folder_if_it_exists(chown, mkdir, exists): + foldername = 'folder' + uid = gid = 1000 + exists.return_value = True + mkdir.side_effect = FileExistsError + + filesystem.mkdir(foldername, uid=uid, gid=gid, force=True) + + chown.assert_called_with(foldername, uid, gid) + + +@mock.patch('os.path.exists') +@mock.patch('os.path.split') +@mock.patch('os.mkdir') +def test_mkdir_create_folder_with_parents_if_necessary(mkdir, split, exists): + foldername = 'parent/folder' + exists.side_effect = [False, False, False, False] # folder and parent do not exist + split.side_effect = [('parent', 'folder'), ('', 'parent')] + + filesystem.mkdir(foldername, parents=True) + + calls = [mock.call('parent', 0o777), + mock.call('parent/folder', 0o777)] + mkdir.assert_has_calls(calls) + + +@mock.patch('os.path.exists') +@mock.patch('os.path.split') +@mock.patch('os.mkdir') +def test_mkdir_cannot_create_folder_with_parents_if_no_permission(mkdir, split, exists): + foldername = 'parent/folder' + mkdir.side_effect = PermissionError + exists.side_effect = [False, False, False, False] # folder and parent do not exist + split.side_effect = [('parent', 'folder'), ('', 'parent')] + + with pytest.raises(PermissionError): + filesystem.mkdir(foldername, parents=True) + # eof