-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtest_import_transaction.py
65 lines (54 loc) · 2.21 KB
/
test_import_transaction.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# SPDX-FileCopyrightText: 2022 Felix Gruber <[email protected]>
#
# SPDX-License-Identifier: GPL-3.0-or-later
from pathlib import Path
import pytest
from git import Git
from import_transaction import import_transaction
def create_first_commit(working_dir: Path) -> Git:
# import_transaction needs the import branch to pre-exist.
# Therefore it does not work without any commit.
git = Git.create(working_dir)
my_file = working_dir / 'initial_file'
my_file.touch()
git.add_file(my_file)
git.commit('first commit')
return git
def test_import_transaction(tmp_path: Path) -> None:
git = create_first_commit(tmp_path)
test_files = [tmp_path / f'test{i}' for i in range(3)]
with import_transaction(git, 'master', dry_run=False) as transaction:
for f in test_files:
f.touch()
transaction.add_file(test_files[0])
transaction.add_files(test_files[1:])
transaction.set_commit_message('test commit')
assert git.working_directory_is_clean()
for f in test_files:
assert f.exists()
def test_rollback_on_missing_commit_message(tmp_path: Path) -> None:
git = create_first_commit(tmp_path)
test_files = [tmp_path / f'test{i}' for i in range(3)]
with import_transaction(git, 'master', dry_run=False) as transaction:
for f in test_files:
f.touch()
transaction.add_file(test_files[0])
transaction.add_files(test_files[1:])
# Don't set a commit message to force a rollback.
assert git.working_directory_is_clean()
for f in test_files:
assert not f.exists()
def test_rollback_on_exception(tmp_path: Path) -> None:
git = create_first_commit(tmp_path)
test_files = [tmp_path / f'test{i}' for i in range(3)]
with pytest.raises(RuntimeError):
with import_transaction(git, 'master', dry_run=False) as transaction:
for f in test_files:
f.touch()
transaction.add_file(test_files[0])
transaction.add_files(test_files[1:])
transaction.set_commit_message('test commit')
raise RuntimeError('Some random exception')
assert git.working_directory_is_clean()
for f in test_files:
assert not f.exists()