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:
Michael Vogt 2024-04-04 10:08:26 +02:00 committed by Achilleas Koutsou
parent ac8a2a4f30
commit 91f47ddf03

View file

@ -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)