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)