stages(zip): add test for zip stage
Add a small integration test that runs zip with various options to ensure it works correctly.
This commit is contained in:
parent
ac8a2a4f30
commit
91f47ddf03
1 changed files with 64 additions and 0 deletions
|
|
@ -0,0 +1,64 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
import zipfile
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from osbuild import testutil
|
||||||
|
from osbuild.testutil import has_executable, make_fake_input_tree
|
||||||
|
|
||||||
|
STAGE_NAME = "org.osbuild.zip"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("test_data,expected_err", [
|
||||||
|
# bad
|
||||||
|
({}, "'filename' is a required property"),
|
||||||
|
({"filename": "x", "level": 99}, "99 is greater than the maximum of 9"),
|
||||||
|
# good
|
||||||
|
({"filename": "image.zip"}, ""),
|
||||||
|
])
|
||||||
|
def test_schema_validation_zip(stage_schema, test_data, expected_err):
|
||||||
|
test_input = {
|
||||||
|
"type": STAGE_NAME,
|
||||||
|
"options": {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
test_input["options"].update(test_data)
|
||||||
|
res = stage_schema.validate(test_input)
|
||||||
|
|
||||||
|
if expected_err == "":
|
||||||
|
assert res.valid is True, f"err: {[e.as_dict() for e in res.errors]}"
|
||||||
|
else:
|
||||||
|
assert res.valid is False
|
||||||
|
testutil.assert_jsonschema_error_contains(res, expected_err, expected_num_errs=1)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("only_include, expected", [
|
||||||
|
([], ["file-in-root.txt", "subdir/", "subdir/subdir.txt", "subdir2/", "subdir2/subdir2.txt"]),
|
||||||
|
(["subdir/*"], ["subdir/", "subdir/subdir.txt"]),
|
||||||
|
(["subdir/*", "subdir2/*"], ["subdir/", "subdir/subdir.txt", "subdir2/", "subdir2/subdir2.txt"]),
|
||||||
|
])
|
||||||
|
@pytest.mark.skipif(not has_executable("zip"), reason="no zip executable")
|
||||||
|
def test_zip_integration(tmp_path, stage_module, only_include, expected):
|
||||||
|
fake_input_tree = make_fake_input_tree(tmp_path, {
|
||||||
|
"/file-in-root.txt": "other content",
|
||||||
|
"/subdir/subdir.txt": "subdir content",
|
||||||
|
"/subdir2/subdir2.txt": "subdir2 content",
|
||||||
|
})
|
||||||
|
inputs = {
|
||||||
|
"tree": {
|
||||||
|
"path": fake_input_tree,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
options = {
|
||||||
|
"filename": "archive.zip",
|
||||||
|
}
|
||||||
|
if only_include:
|
||||||
|
options["include"] = only_include
|
||||||
|
output_dir = tmp_path
|
||||||
|
stage_module.main(inputs, output_dir, options)
|
||||||
|
expected_zip_path = output_dir / "archive.zip"
|
||||||
|
assert os.path.exists(expected_zip_path)
|
||||||
|
with zipfile.ZipFile(expected_zip_path, "r") as zfp:
|
||||||
|
assert sorted(zfp.namelist()) == sorted(expected)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue