1+ import ctypes
12import os
23import stat
34import unittest
1213FILENAME = Path ('one' )
1314
1415
16+ def is_windows_admin ():
17+ """Check if the script is running in a terminal with admin privileges on Windows"""
18+ if os .name == 'nt' :
19+ try :
20+ return ctypes .windll .shell32 .IsUserAnAdmin ()
21+ except Exception :
22+ return False
23+
24+
25+ IS_WINDOWS_USER = os .name == 'nt' and not is_windows_admin ()
26+ skip_if_symlink_creation_forbidden = unittest .skipIf (
27+ IS_WINDOWS_USER ,
28+ 'This test requires admin privileges to create symlink files on Windows' ,
29+ )
30+
31+
1532@helpers .temps (safer .open )
1633@tdir
1734class TestSafer (unittest .TestCase ):
@@ -129,8 +146,14 @@ def test_file_perms(self, safer_open):
129146 fp .write ('hello' )
130147 assert FILENAME .read_text () == 'hello'
131148 mode = os .stat (FILENAME ).st_mode
132- assert mode in (0o100664 , 0o100644 ), stat .filemode (mode )
133- new_mode = mode & 0o100770
149+
150+ if os .name == 'posix' :
151+ assert mode in (0o100664 , 0o100644 ), stat .filemode (mode )
152+ new_mode = mode & 0o100770
153+ elif os .name == 'nt' :
154+ new_mode = mode
155+ else :
156+ assert False , f'Do not understand os.name = { os .name } '
134157
135158 os .chmod (FILENAME , new_mode )
136159 with safer_open (FILENAME , 'w' ) as fp :
@@ -183,6 +206,7 @@ def test_mode_t(self, safer_open):
183206 fp .write ('hello' )
184207 assert FILENAME .read_text () == 'hello'
185208
209+ @skip_if_symlink_creation_forbidden
186210 def test_symlink_file (self , safer_open ):
187211 with safer_open (FILENAME , 'w' ) as fp :
188212 fp .write ('hello' )
@@ -194,6 +218,7 @@ def test_symlink_file(self, safer_open):
194218 fp .write ('overwritten' )
195219 assert FILENAME .read_text () == 'overwritten'
196220
221+ @skip_if_symlink_creation_forbidden
197222 def test_symlink_directory (self , safer_open ):
198223 FILENAME = Path ('sub/test.txt' )
199224 with safer_open (FILENAME , 'w' , make_parents = True ) as fp :
@@ -227,4 +252,7 @@ def test_tempfile_perms(self, safer_open):
227252 perms .append (os .stat (filename ).st_mode )
228253
229254 assert perms == [perms [0 ]] * len (perms )
230- assert perms [0 ] in (0o100644 , 0o100664 )
255+ if os .name == 'nt' :
256+ assert perms [0 ] == 0o100666
257+ else :
258+ assert perms [0 ] in (0o100644 , 0o100664 )
0 commit comments