mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 18:07:37 +00:00 
			
		
		
		
	 d716ea34cb
			
		
	
	
		d716ea34cb
		
			
		
	
	
	
	
		
			
			When `pathlib._os.magic_open()` is called to open a path in binary mode, raise `ValueError` if any of the *encoding*, *errors* or *newline* arguments are given. This matches the `open()` built-in.
		
			
				
	
	
		
			119 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| Tests for pathlib.types._WritablePath
 | |
| """
 | |
| 
 | |
| import io
 | |
| import os
 | |
| import unittest
 | |
| 
 | |
| from .support import is_pypi
 | |
| from .support.local_path import WritableLocalPath, LocalPathGround
 | |
| from .support.zip_path import WritableZipPath, ZipPathGround
 | |
| 
 | |
| if is_pypi:
 | |
|     from pathlib_abc import _WritablePath
 | |
|     from pathlib_abc._os import magic_open
 | |
| else:
 | |
|     from pathlib.types import _WritablePath
 | |
|     from pathlib._os import magic_open
 | |
| 
 | |
| 
 | |
| class WriteTestBase:
 | |
|     def setUp(self):
 | |
|         self.root = self.ground.setup()
 | |
| 
 | |
|     def tearDown(self):
 | |
|         self.ground.teardown(self.root)
 | |
| 
 | |
|     def test_is_writable(self):
 | |
|         self.assertIsInstance(self.root, _WritablePath)
 | |
| 
 | |
|     def test_open_w(self):
 | |
|         p = self.root / 'fileA'
 | |
|         with magic_open(p, 'w') as f:
 | |
|             self.assertIsInstance(f, io.TextIOBase)
 | |
|             f.write('this is file A\n')
 | |
|         self.assertEqual(self.ground.readtext(p), 'this is file A\n')
 | |
| 
 | |
|     def test_open_wb(self):
 | |
|         p = self.root / 'fileA'
 | |
|         with magic_open(p, 'wb') as f:
 | |
|             #self.assertIsInstance(f, io.BufferedWriter)
 | |
|             f.write(b'this is file A\n')
 | |
|         self.assertEqual(self.ground.readbytes(p), b'this is file A\n')
 | |
|         self.assertRaises(ValueError, magic_open, p, 'wb', encoding='utf8')
 | |
|         self.assertRaises(ValueError, magic_open, p, 'wb', errors='strict')
 | |
|         self.assertRaises(ValueError, magic_open, p, 'wb', newline='')
 | |
| 
 | |
|     def test_write_bytes(self):
 | |
|         p = self.root / 'fileA'
 | |
|         p.write_bytes(b'abcdefg')
 | |
|         self.assertEqual(self.ground.readbytes(p), b'abcdefg')
 | |
|         # Check that trying to write str does not truncate the file.
 | |
|         self.assertRaises(TypeError, p.write_bytes, 'somestr')
 | |
|         self.assertEqual(self.ground.readbytes(p), b'abcdefg')
 | |
| 
 | |
|     def test_write_text(self):
 | |
|         p = self.root / 'fileA'
 | |
|         p.write_text('äbcdefg', encoding='latin-1')
 | |
|         self.assertEqual(self.ground.readbytes(p), b'\xe4bcdefg')
 | |
|         # Check that trying to write bytes does not truncate the file.
 | |
|         self.assertRaises(TypeError, p.write_text, b'somebytes')
 | |
|         self.assertEqual(self.ground.readbytes(p), b'\xe4bcdefg')
 | |
| 
 | |
|     def test_write_text_with_newlines(self):
 | |
|         # Check that `\n` character change nothing
 | |
|         p = self.root / 'fileA'
 | |
|         p.write_text('abcde\r\nfghlk\n\rmnopq', newline='\n')
 | |
|         self.assertEqual(self.ground.readbytes(p), b'abcde\r\nfghlk\n\rmnopq')
 | |
| 
 | |
|         # Check that `\r` character replaces `\n`
 | |
|         p = self.root / 'fileB'
 | |
|         p.write_text('abcde\r\nfghlk\n\rmnopq', newline='\r')
 | |
|         self.assertEqual(self.ground.readbytes(p), b'abcde\r\rfghlk\r\rmnopq')
 | |
| 
 | |
|         # Check that `\r\n` character replaces `\n`
 | |
|         p = self.root / 'fileC'
 | |
|         p.write_text('abcde\r\nfghlk\n\rmnopq', newline='\r\n')
 | |
|         self.assertEqual(self.ground.readbytes(p), b'abcde\r\r\nfghlk\r\n\rmnopq')
 | |
| 
 | |
|         # Check that no argument passed will change `\n` to `os.linesep`
 | |
|         os_linesep_byte = bytes(os.linesep, encoding='ascii')
 | |
|         p = self.root / 'fileD'
 | |
|         p.write_text('abcde\nfghlk\n\rmnopq')
 | |
|         self.assertEqual(self.ground.readbytes(p),
 | |
|                          b'abcde' + os_linesep_byte +
 | |
|                          b'fghlk' + os_linesep_byte + b'\rmnopq')
 | |
| 
 | |
|     def test_mkdir(self):
 | |
|         p = self.root / 'newdirA'
 | |
|         self.assertFalse(self.ground.isdir(p))
 | |
|         p.mkdir()
 | |
|         self.assertTrue(self.ground.isdir(p))
 | |
| 
 | |
|     def test_symlink_to(self):
 | |
|         if not self.ground.can_symlink:
 | |
|             self.skipTest('needs symlinks')
 | |
|         link = self.root.joinpath('linkA')
 | |
|         link.symlink_to('fileA')
 | |
|         self.assertTrue(self.ground.islink(link))
 | |
|         self.assertEqual(self.ground.readlink(link), 'fileA')
 | |
| 
 | |
| 
 | |
| class ZipPathWriteTest(WriteTestBase, unittest.TestCase):
 | |
|     ground = ZipPathGround(WritableZipPath)
 | |
| 
 | |
| 
 | |
| class LocalPathWriteTest(WriteTestBase, unittest.TestCase):
 | |
|     ground = LocalPathGround(WritableLocalPath)
 | |
| 
 | |
| 
 | |
| if not is_pypi:
 | |
|     from pathlib import Path
 | |
| 
 | |
|     class PathWriteTest(WriteTestBase, unittest.TestCase):
 | |
|         ground = LocalPathGround(Path)
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     unittest.main()
 |