QTZPOC-20
QTZPOC-20: Refactor test inputs into named variables for improved readability and debugging.
This commit is contained in:
@@ -156,15 +156,19 @@ def test_gate_2_rejects_kdf_parameters_above_the_ceiling_without_allocating(
|
||||
|
||||
|
||||
def test_gate_2_rejects_a_digest_mismatch(work_dir, reader):
|
||||
payload = factory.make_bundle(digest_override=bytes(32))
|
||||
|
||||
with pytest.raises(BundleGateError) as error:
|
||||
_open(reader, work_dir, factory.make_bundle(digest_override=bytes(32)))
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 2
|
||||
|
||||
|
||||
def test_gate_2_rejects_a_truncated_transfer(work_dir, reader):
|
||||
payload = factory.truncate_bundle(factory.make_bundle())
|
||||
|
||||
with pytest.raises(BundleGateError) as error:
|
||||
_open(reader, work_dir, factory.truncate_bundle(factory.make_bundle()))
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 2
|
||||
|
||||
@@ -182,8 +186,10 @@ AMBIGUOUS_REASON = 'wrong password, or the file is damaged or was altered'
|
||||
|
||||
|
||||
def test_gate_3_wrong_password(work_dir, reader):
|
||||
payload = factory.make_bundle()
|
||||
|
||||
with pytest.raises(BundleGateError) as error:
|
||||
_open(reader, work_dir, factory.make_bundle(), password='Wrong1Password!Here')
|
||||
_open(reader, work_dir, payload, password='Wrong1Password!Here')
|
||||
|
||||
assert error.value.gate == 3
|
||||
assert error.value.step is ImportStep.DECRYPTION
|
||||
@@ -195,24 +201,30 @@ def test_gate_3_altered_ciphertext_reads_the_same_as_a_wrong_password(work_dir,
|
||||
|
||||
with pytest.raises(BundleGateError) as altered:
|
||||
_open(reader, work_dir, tampered)
|
||||
|
||||
wrong_password_payload = factory.make_bundle()
|
||||
with pytest.raises(BundleGateError) as wrong_password:
|
||||
_open(reader, work_dir, factory.make_bundle(), password='Wrong1Password!Here')
|
||||
_open(reader, work_dir, wrong_password_payload, password='Wrong1Password!Here')
|
||||
|
||||
assert str(altered.value) == str(wrong_password.value)
|
||||
assert altered.value.gate == wrong_password.value.gate == 3
|
||||
|
||||
|
||||
def test_gate_3_stream_without_a_final_tag_is_rejected(work_dir, reader):
|
||||
payload = factory.make_bundle(drop_final_tag=True)
|
||||
|
||||
with pytest.raises(BundleGateError) as error:
|
||||
_open(reader, work_dir, factory.make_bundle(drop_final_tag=True))
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 3
|
||||
assert AMBIGUOUS_REASON in str(error.value)
|
||||
|
||||
|
||||
def test_gate_3_leaves_no_decrypted_zip_behind(work_dir, reader):
|
||||
payload = factory.make_bundle()
|
||||
|
||||
with pytest.raises(BundleGateError):
|
||||
_open(reader, work_dir, factory.make_bundle(), password='Wrong1Password!Here')
|
||||
_open(reader, work_dir, payload, password='Wrong1Password!Here')
|
||||
|
||||
assert list(work_dir.glob('*.zip')) == []
|
||||
|
||||
@@ -277,18 +289,20 @@ def test_gate_4_rejects_hostile_central_directories(work_dir, reader, spec_kwarg
|
||||
|
||||
def test_gate_4_rejects_too_many_entries(work_dir):
|
||||
limited = BundleReader(BundleLimits(max_entries=3))
|
||||
payload = factory.make_bundle()
|
||||
|
||||
with pytest.raises(BundleGateError, match='entries') as error:
|
||||
_open(limited, work_dir, factory.make_bundle())
|
||||
_open(limited, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 4
|
||||
|
||||
|
||||
def test_gate_4_rejects_an_oversized_uncompressed_total(work_dir):
|
||||
limited = BundleReader(BundleLimits(max_uncompressed_bytes=64))
|
||||
payload = factory.make_bundle()
|
||||
|
||||
with pytest.raises(BundleGateError, match='uncompressed') as error:
|
||||
_open(limited, work_dir, factory.make_bundle())
|
||||
_open(limited, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 4
|
||||
|
||||
@@ -307,9 +321,10 @@ def test_gate_4_rejects_content_that_is_not_an_archive(work_dir, reader):
|
||||
|
||||
def test_gate_5_refuses_a_pre_existing_extraction_root(work_dir, reader):
|
||||
(work_dir / 'extract').mkdir()
|
||||
payload = factory.make_bundle()
|
||||
|
||||
with pytest.raises(BundleGateError, match='already exists') as error:
|
||||
_open(reader, work_dir, factory.make_bundle())
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 5
|
||||
assert error.value.step is ImportStep.EXTRACTION
|
||||
@@ -363,8 +378,10 @@ def test_gate_5_extraction_writes_plain_files(work_dir, reader):
|
||||
],
|
||||
)
|
||||
def test_gate_6_rejects_a_malformed_metadata_document(work_dir, reader, spec, match):
|
||||
payload = factory.make_bundle(spec)
|
||||
|
||||
with pytest.raises(BundleGateError, match=match) as error:
|
||||
_open(reader, work_dir, factory.make_bundle(spec))
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 6
|
||||
assert error.value.step is ImportStep.STRUCTURE_VALIDATION
|
||||
@@ -374,18 +391,20 @@ def test_gate_6_rejects_a_malformed_metadata_document(work_dir, reader, spec, ma
|
||||
def test_gate_6_rejects_unreadable_metadata_json(work_dir, reader):
|
||||
spec = factory.ZipSpec(include_metadata=False)
|
||||
spec.extra_files['metadata.json'] = b'{not json'
|
||||
payload = factory.make_bundle(spec)
|
||||
|
||||
with pytest.raises(BundleGateError, match='readable JSON') as error:
|
||||
_open(reader, work_dir, factory.make_bundle(spec))
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 6
|
||||
|
||||
|
||||
def test_gate_6_rejects_a_missing_artifacts_directory(work_dir, reader):
|
||||
spec = factory.ZipSpec(files={})
|
||||
payload = factory.make_bundle(spec)
|
||||
|
||||
with pytest.raises(BundleGateError, match='artifacts directory') as error:
|
||||
_open(reader, work_dir, factory.make_bundle(spec))
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 6
|
||||
|
||||
@@ -400,9 +419,10 @@ def test_gate_6_rejects_a_missing_artifacts_directory(work_dir, reader):
|
||||
def test_gate_6_rejects_an_incomplete_model_directory(work_dir, reader, dropped, match):
|
||||
spec = factory.ZipSpec()
|
||||
spec.files.pop(dropped)
|
||||
payload = factory.make_bundle(spec)
|
||||
|
||||
with pytest.raises(BundleGateError, match=match) as error:
|
||||
_open(reader, work_dir, factory.make_bundle(spec))
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 6
|
||||
|
||||
@@ -412,9 +432,10 @@ def test_gate_6_rejects_a_bundle_without_data_model(work_dir, reader):
|
||||
for name in list(spec.files):
|
||||
if name.startswith('artifacts/data_model/'):
|
||||
spec.files.pop(name)
|
||||
payload = factory.make_bundle(spec)
|
||||
|
||||
with pytest.raises(BundleGateError, match='no data_model artifacts') as error:
|
||||
_open(reader, work_dir, factory.make_bundle(spec))
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 6
|
||||
|
||||
@@ -426,9 +447,10 @@ def test_gate_6_rejects_a_bundle_without_data_model(work_dir, reader):
|
||||
def test_gate_7_rejects_content_a_model_export_should_not_carry(work_dir, reader, name):
|
||||
spec = factory.ZipSpec()
|
||||
spec.extra_files[name] = b'#!/bin/sh\n'
|
||||
payload = factory.make_bundle(spec)
|
||||
|
||||
with pytest.raises(BundleGateError, match='should not carry') as error:
|
||||
_open(reader, work_dir, factory.make_bundle(spec))
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 7
|
||||
assert error.value.step is ImportStep.CONTENT_POLICY
|
||||
@@ -444,9 +466,10 @@ def test_the_earlier_gate_wins(work_dir, reader):
|
||||
traversal_entry='artifacts/../escape.csv',
|
||||
document=factory.build_metadata_document(drop_parameter='target_variable'),
|
||||
)
|
||||
payload = factory.make_bundle(spec)
|
||||
|
||||
with pytest.raises(BundleGateError) as error:
|
||||
_open(reader, work_dir, factory.make_bundle(spec))
|
||||
_open(reader, work_dir, payload)
|
||||
|
||||
assert error.value.gate == 4
|
||||
assert _extracted_files(work_dir / 'extract') == []
|
||||
@@ -454,7 +477,9 @@ def test_the_earlier_gate_wins(work_dir, reader):
|
||||
|
||||
def test_header_is_checked_before_the_password(work_dir, reader):
|
||||
"""A bundle with a bad header and a wrong password reports the header, not the password."""
|
||||
payload = factory.make_bundle(magic=b'NOTSIENT')
|
||||
|
||||
with pytest.raises(BundleGateError) as error:
|
||||
_open(reader, work_dir, factory.make_bundle(magic=b'NOTSIENT'), password='Nope1!Nope1!')
|
||||
_open(reader, work_dir, payload, password='Nope1!Nope1!')
|
||||
|
||||
assert error.value.gate == 2
|
||||
|
||||
Reference in New Issue
Block a user