1
+ import ctypes
1
2
import os
2
3
import stat
3
4
import unittest
12
13
FILENAME = Path ('one' )
13
14
14
15
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
+
15
32
@helpers .temps (safer .open )
16
33
@tdir
17
34
class TestSafer (unittest .TestCase ):
@@ -129,8 +146,14 @@ def test_file_perms(self, safer_open):
129
146
fp .write ('hello' )
130
147
assert FILENAME .read_text () == 'hello'
131
148
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 } '
134
157
135
158
os .chmod (FILENAME , new_mode )
136
159
with safer_open (FILENAME , 'w' ) as fp :
@@ -183,6 +206,7 @@ def test_mode_t(self, safer_open):
183
206
fp .write ('hello' )
184
207
assert FILENAME .read_text () == 'hello'
185
208
209
+ @skip_if_symlink_creation_forbidden
186
210
def test_symlink_file (self , safer_open ):
187
211
with safer_open (FILENAME , 'w' ) as fp :
188
212
fp .write ('hello' )
@@ -194,6 +218,7 @@ def test_symlink_file(self, safer_open):
194
218
fp .write ('overwritten' )
195
219
assert FILENAME .read_text () == 'overwritten'
196
220
221
+ @skip_if_symlink_creation_forbidden
197
222
def test_symlink_directory (self , safer_open ):
198
223
FILENAME = Path ('sub/test.txt' )
199
224
with safer_open (FILENAME , 'w' , make_parents = True ) as fp :
@@ -227,4 +252,7 @@ def test_tempfile_perms(self, safer_open):
227
252
perms .append (os .stat (filename ).st_mode )
228
253
229
254
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