@@ -1147,6 +1147,28 @@ def test_copy_return_value(self):
11471147 rv = fn (src , os .path .join (dst_dir , 'bar' ))
11481148 self .assertEqual (rv , os .path .join (dst_dir , 'bar' ))
11491149
1150+ def test_copy_dir (self ):
1151+ self ._test_copy_dir (shutil .copy )
1152+
1153+ def test_copy2_dir (self ):
1154+ self ._test_copy_dir (shutil .copy2 )
1155+
1156+ def _test_copy_dir (self , copy_func ):
1157+ src_dir = self .mkdtemp ()
1158+ src_file = os .path .join (src_dir , 'foo' )
1159+ dir2 = self .mkdtemp ()
1160+ dst = os .path .join (src_dir , 'does_not_exist/' )
1161+ write_file (src_file , 'foo' )
1162+ if sys .platform == "win32" :
1163+ err = PermissionError
1164+ else :
1165+ err = IsADirectoryError
1166+ self .assertRaises (err , copy_func , dir2 , src_dir )
1167+
1168+ # raise *err* because of src rather than FileNotFoundError because of dst
1169+ self .assertRaises (err , copy_func , dir2 , dst )
1170+ copy_func (src_file , dir2 ) # should not raise exceptions
1171+
11501172 ### shutil.copyfile
11511173
11521174 @support .skip_unless_symlink
@@ -1253,6 +1275,24 @@ def test_copyfile_nonexistent_dir(self):
12531275 write_file (src_file , 'foo' )
12541276 self .assertRaises (FileNotFoundError , shutil .copyfile , src_file , dst )
12551277
1278+ def test_copyfile_copy_dir (self ):
1279+ # Issue 45234
1280+ # test copy() and copyfile() raising proper exceptions when src and/or
1281+ # dst are directories
1282+ src_dir = self .mkdtemp ()
1283+ src_file = os .path .join (src_dir , 'foo' )
1284+ dir2 = self .mkdtemp ()
1285+ dst = os .path .join (src_dir , 'does_not_exist/' )
1286+ write_file (src_file , 'foo' )
1287+ if sys .platform == "win32" :
1288+ err = PermissionError
1289+ else :
1290+ err = IsADirectoryError
1291+
1292+ self .assertRaises (err , shutil .copyfile , src_dir , dst )
1293+ self .assertRaises (err , shutil .copyfile , src_file , src_dir )
1294+ self .assertRaises (err , shutil .copyfile , dir2 , src_dir )
1295+
12561296
12571297class TestArchives (BaseTest , unittest .TestCase ):
12581298
0 commit comments