Add tests for introspection and export

libkeyringctl/keyring.py:
Change `get_packets_from_path()` to use full conditional statements
which is easier to cover in tests.

tests/test_keyring.py:
Add simple tests for `get_packets_from_path()`,
`get_packets_from_listing()`, `export()` and `build()`.
This commit is contained in:
David Runge 2021-11-10 22:09:54 +01:00 committed by Levente Polyak
parent 8689995b69
commit 743d2bb3bb
No known key found for this signature in database
GPG Key ID: FC1B547C8D8172C8
2 changed files with 72 additions and 4 deletions

View File

@ -754,17 +754,16 @@ def get_packets_from_path(path: Path) -> List[Path]:
------- -------
A list of packets ordered by root, certification, revocation A list of packets ordered by root, certification, revocation
""" """
if not path.exists(): if not path.exists():
return [] return []
packets: List[Path] = [] packets: List[Path] = []
packets += sorted(path.glob("*.asc")) packets += sorted(path.glob("*.asc"))
certifications = path / "certification" certifications = path / "certification"
if certifications.exists():
packets += sorted(certifications.glob("*.asc"))
revocations = path / "revocation" revocations = path / "revocation"
if revocations.exists(): packets += sorted(certifications.glob("*.asc")) if certifications.exists() else []
packets += sorted(revocations.glob("*.asc")) packets += sorted(revocations.glob("*.asc")) if revocations.exists() else []
return packets return packets

View File

@ -2,6 +2,8 @@ from contextlib import nullcontext as does_not_raise
from copy import deepcopy from copy import deepcopy
from pathlib import Path from pathlib import Path
from typing import ContextManager from typing import ContextManager
from unittest.mock import Mock
from unittest.mock import patch
from pytest import mark from pytest import mark
from pytest import raises from pytest import raises
@ -13,8 +15,10 @@ from libkeyringctl.types import Username
from .conftest import create_certificate from .conftest import create_certificate
from .conftest import create_key_revocation from .conftest import create_key_revocation
from .conftest import create_uid_certification
from .conftest import test_all_fingerprints from .conftest import test_all_fingerprints
from .conftest import test_certificates from .conftest import test_certificates
from .conftest import test_keyring_certificates
from .conftest import test_keys from .conftest import test_keys
from .conftest import test_main_fingerprints from .conftest import test_main_fingerprints
@ -167,6 +171,71 @@ def test_export_revoked(working_dir: Path, keyring_dir: Path) -> None:
assert line.strip() in revoked_fingerprints assert line.strip() in revoked_fingerprints
@mark.parametrize("path_exists", [(True), (False)])
@create_certificate(username=Username("main"), uids=[Uid("main <foo@bar.xyz>")], keyring_type="main")
@create_certificate(username=Username("foobar"), uids=[Uid("foobar <foo@bar.xyz>")])
@create_uid_certification(issuer=Username("main"), certified=Username("foobar"), uid=Uid("foobar <foo@bar.xyz>"))
@create_key_revocation(username=Username("foobar"))
def test_get_packets_from_path(working_dir: Path, keyring_dir: Path, path_exists: bool) -> None:
if not path_exists:
assert keyring.get_packets_from_path(path=working_dir / "nope") == []
else:
for username, paths in test_keyring_certificates.items():
for path in paths:
keyring.get_packets_from_path(path=path)
@mark.parametrize("path_exists", [(True), (False)])
@patch("libkeyringctl.keyring.get_packets_from_path")
def test_get_packets_from_listing(get_packets_from_path_mock: Mock, working_dir: Path, path_exists: bool) -> None:
path = working_dir / "path"
if not path_exists:
assert keyring.get_packets_from_listing(path=path) == []
else:
get_packets_from_path_mock.return_value = []
sub_path = path / "sub"
sub_path.mkdir(parents=True)
assert keyring.get_packets_from_listing(path=path) == []
get_packets_from_path_mock.assert_called_once_with(sub_path)
@create_certificate(username=Username("main"), uids=[Uid("main <foo@bar.xyz>")], keyring_type="main")
@create_certificate(username=Username("foobar"), uids=[Uid("foobar <foo@bar.xyz>")])
@create_uid_certification(issuer=Username("main"), certified=Username("foobar"), uid=Uid("foobar <foo@bar.xyz>"))
@create_key_revocation(username=Username("foobar"))
def test_export(working_dir: Path, keyring_dir: Path) -> None:
output_file = working_dir / "output"
empty_dir = working_dir / "empty"
empty_dir.mkdir()
assert not keyring.export(working_dir=working_dir, keyring_root=empty_dir, sources=None, output=output_file)
assert not output_file.exists()
keyring.export(working_dir=working_dir, keyring_root=keyring_dir, sources=None, output=output_file)
assert output_file.exists()
@create_certificate(username=Username("main"), uids=[Uid("main <foo@bar.xyz>")], keyring_type="main")
@create_certificate(username=Username("foobar"), uids=[Uid("foobar <foo@bar.xyz>")])
@create_uid_certification(issuer=Username("main"), certified=Username("foobar"), uid=Uid("foobar <foo@bar.xyz>"))
@create_key_revocation(username=Username("foobar"))
def test_build(working_dir: Path, keyring_dir: Path) -> None:
output_dir = working_dir / "output"
with raises(FileNotFoundError):
empty_dir = working_dir / "empty"
empty_dir.mkdir()
keyring.build(working_dir=working_dir, keyring_root=empty_dir, target_dir=output_dir)
keyring.build(working_dir=working_dir, keyring_root=keyring_dir, target_dir=output_dir)
assert (
(output_dir / "archlinux.gpg").exists()
and (output_dir / "archlinux-trusted").exists()
and (output_dir / "archlinux-revoked").exists()
)
@mark.parametrize( @mark.parametrize(
"create_dir, duplicate_fingerprints, expectation", "create_dir, duplicate_fingerprints, expectation",
[ [