12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import errno
- import os
- from atomicwrites import atomic_write
- import pytest
- def test_atomic_write(tmpdir):
- fname = tmpdir.join('ha')
- for i in range(2):
- with atomic_write(str(fname), overwrite=True) as f:
- f.write('hoho')
- with pytest.raises(OSError) as excinfo:
- with atomic_write(str(fname), overwrite=False) as f:
- f.write('haha')
- assert excinfo.value.errno == errno.EEXIST
- assert fname.read() == 'hoho'
- assert len(tmpdir.listdir()) == 1
- def test_teardown(tmpdir):
- fname = tmpdir.join('ha')
- with pytest.raises(AssertionError):
- with atomic_write(str(fname), overwrite=True):
- assert False
- assert not tmpdir.listdir()
- def test_replace_simultaneously_created_file(tmpdir):
- fname = tmpdir.join('ha')
- with atomic_write(str(fname), overwrite=True) as f:
- f.write('hoho')
- fname.write('harhar')
- assert fname.read() == 'harhar'
- assert fname.read() == 'hoho'
- assert len(tmpdir.listdir()) == 1
- def test_dont_remove_simultaneously_created_file(tmpdir):
- fname = tmpdir.join('ha')
- with pytest.raises(OSError) as excinfo:
- with atomic_write(str(fname), overwrite=False) as f:
- f.write('hoho')
- fname.write('harhar')
- assert fname.read() == 'harhar'
- assert excinfo.value.errno == errno.EEXIST
- assert fname.read() == 'harhar'
- assert len(tmpdir.listdir()) == 1
- # Verify that nested exceptions during rollback do not overwrite the initial
- # exception that triggered a rollback.
- def test_open_reraise(tmpdir):
- fname = tmpdir.join('ha')
- with pytest.raises(AssertionError):
- aw = atomic_write(str(fname), overwrite=False)
- with aw:
- # Mess with internals, so commit will trigger a ValueError. We're
- # testing that the initial AssertionError triggered below is
- # propagated up the stack, not the second exception triggered
- # during commit.
- aw.rollback = lambda: 1 / 0
- # Now trigger our own exception.
- assert False, "Intentional failure for testing purposes"
- def test_atomic_write_in_pwd(tmpdir):
- orig_curdir = os.getcwd()
- try:
- os.chdir(str(tmpdir))
- fname = 'ha'
- for i in range(2):
- with atomic_write(str(fname), overwrite=True) as f:
- f.write('hoho')
- with pytest.raises(OSError) as excinfo:
- with atomic_write(str(fname), overwrite=False) as f:
- f.write('haha')
- assert excinfo.value.errno == errno.EEXIST
- assert open(fname).read() == 'hoho'
- assert len(tmpdir.listdir()) == 1
- finally:
- os.chdir(orig_curdir)
|