Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aws
GitHub Repository: aws/aws-cli
Path: blob/develop/tests/unit/customizations/s3/syncstrategy/test_caseconflict.py
2634 views
1
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
# SPDX-License-Identifier: Apache-2.0
3
import pytest
4
5
from awscli.customizations.s3.filegenerator import FileStat
6
from awscli.customizations.s3.syncstrategy.caseconflict import (
7
CaseConflictException,
8
CaseConflictSync,
9
)
10
from awscli.testutils import skip_if_case_sensitive
11
12
13
@pytest.fixture
14
def lower_compare_key():
15
return 'a.txt'
16
17
18
@pytest.fixture
19
def lower_temp_filepath(lower_compare_key, tmp_path):
20
p = tmp_path / lower_compare_key
21
return p.resolve()
22
23
24
@pytest.fixture
25
def lower_file_stat(lower_compare_key, lower_temp_filepath):
26
return FileStat(
27
src=f'bucket/{lower_compare_key}',
28
dest=lower_temp_filepath,
29
compare_key=lower_compare_key,
30
)
31
32
33
@pytest.fixture
34
def upper_compare_key():
35
return 'A.txt'
36
37
38
@pytest.fixture
39
def upper_temp_filepath(upper_compare_key, tmp_path):
40
p = tmp_path / upper_compare_key
41
p.write_text('foobar')
42
return p.resolve()
43
44
45
@pytest.fixture
46
def upper_file_stat(upper_compare_key, upper_temp_filepath):
47
return FileStat(
48
src=f'bucket/{upper_compare_key}',
49
dest=upper_temp_filepath,
50
compare_key=upper_compare_key,
51
)
52
53
54
@pytest.fixture
55
def upper_key(upper_file_stat):
56
return upper_file_stat.compare_key.lower()
57
58
59
@pytest.fixture
60
def no_conflict_file_stat(tmp_path):
61
return FileStat(
62
src='bucket/foo.txt',
63
# Note that this file was never written to.
64
dest=f'{tmp_path}/foo.txt',
65
compare_key='foo.txt',
66
)
67
68
69
class TestCaseConflictSync:
70
def test_error_with_no_conflict_syncs(
71
self, no_conflict_file_stat, lower_file_stat, capsys
72
):
73
case_conflict = CaseConflictSync(on_case_conflict='error')
74
should_sync = case_conflict.determine_should_sync(
75
no_conflict_file_stat, lower_file_stat
76
)
77
captured = capsys.readouterr()
78
assert should_sync is True
79
assert not captured.err
80
81
@skip_if_case_sensitive()
82
def test_error_with_existing_file(self, lower_file_stat, upper_file_stat):
83
case_conflict_sync = CaseConflictSync(on_case_conflict='error')
84
with pytest.raises(CaseConflictException) as exc:
85
case_conflict_sync.determine_should_sync(
86
lower_file_stat,
87
upper_file_stat,
88
)
89
assert 'Failed to download bucket/a.txt' in str(exc.value)
90
91
def test_error_with_case_conflicts_in_s3(
92
self, lower_file_stat, upper_file_stat, upper_key
93
):
94
case_conflict_sync = CaseConflictSync(
95
on_case_conflict='error', submitted={upper_key}
96
)
97
with pytest.raises(CaseConflictException) as exc:
98
case_conflict_sync.determine_should_sync(
99
lower_file_stat,
100
upper_file_stat,
101
)
102
assert 'Failed to download bucket/a.txt' in str(exc.value)
103
104
def test_warn_with_no_conflict_syncs(
105
self, no_conflict_file_stat, lower_file_stat, capsys
106
):
107
case_conflict = CaseConflictSync(on_case_conflict='warn')
108
should_sync = case_conflict.determine_should_sync(
109
no_conflict_file_stat, lower_file_stat
110
)
111
captured = capsys.readouterr()
112
assert should_sync is True
113
assert not captured.err
114
115
@skip_if_case_sensitive()
116
def test_warn_with_existing_file(
117
self, lower_file_stat, upper_file_stat, capsys
118
):
119
case_conflict_sync = CaseConflictSync(on_case_conflict='warn')
120
should_sync = case_conflict_sync.determine_should_sync(
121
lower_file_stat, upper_file_stat
122
)
123
captured = capsys.readouterr()
124
assert should_sync is True
125
assert 'warning: ' in captured.err
126
127
def test_warn_with_case_conflicts_in_s3(
128
self, lower_file_stat, upper_file_stat, upper_key, capsys
129
):
130
case_conflict_sync = CaseConflictSync(
131
on_case_conflict='warn', submitted={upper_key}
132
)
133
should_sync = case_conflict_sync.determine_should_sync(
134
lower_file_stat,
135
upper_file_stat,
136
)
137
captured = capsys.readouterr()
138
assert should_sync is True
139
assert 'warning: ' in captured.err
140
141
def test_skip_with_no_conflict_syncs(
142
self, no_conflict_file_stat, lower_file_stat, capsys
143
):
144
case_conflict = CaseConflictSync(on_case_conflict='skip')
145
should_sync = case_conflict.determine_should_sync(
146
no_conflict_file_stat, lower_file_stat
147
)
148
captured = capsys.readouterr()
149
assert should_sync is True
150
assert not captured.err
151
152
@skip_if_case_sensitive()
153
def test_skip_with_existing_file(
154
self, lower_file_stat, upper_file_stat, capsys
155
):
156
case_conflict_sync = CaseConflictSync(on_case_conflict='skip')
157
should_sync = case_conflict_sync.determine_should_sync(
158
lower_file_stat, upper_file_stat
159
)
160
captured = capsys.readouterr()
161
assert should_sync is False
162
assert 'warning: Skipping' in captured.err
163
164
def test_skip_with_case_conflicts_in_s3(
165
self, lower_file_stat, upper_file_stat, upper_key, capsys
166
):
167
case_conflict_sync = CaseConflictSync(
168
on_case_conflict='skip', submitted={upper_key}
169
)
170
should_sync = case_conflict_sync.determine_should_sync(
171
lower_file_stat,
172
upper_file_stat,
173
)
174
captured = capsys.readouterr()
175
assert should_sync is False
176
assert 'warning: Skipping' in captured.err
177
178