rpm 0.23.4

A pure rust library for building and parsing RPMs
Documentation
"""Tests for Package (full package with payload)."""

import os
import shutil
import tempfile
from pathlib import Path

from rpm_rs import FileEntry, FileType, Package, PackageMetadata, RpmFile

from conftest import RPM_BASIC, RPM_EMPTY, RPM_FILE_TYPES, RPM_SIGNED


class TestOpen:
    def test_open(self):
        pkg = Package.open(RPM_BASIC)
        assert pkg.metadata.name == "rpm-basic"

    def test_open_pathlike(self):
        pkg = Package.open(Path(RPM_BASIC))
        assert pkg.metadata.name == "rpm-basic"

    def test_from_bytes(self):
        with open(RPM_BASIC, "rb") as f:
            data = f.read()
        pkg = Package.from_bytes(data)
        assert pkg.metadata.name == "rpm-basic"


class TestMetadataProperty:
    def test_metadata_type(self):
        pkg = Package.open(RPM_BASIC)
        m = pkg.metadata
        assert isinstance(m, PackageMetadata)
        assert m.name == "rpm-basic"


class TestDigests:
    def test_verify_digests(self):
        pkg = Package.open(RPM_BASIC)
        pkg.verify_digests()

    def test_verify_digests_empty(self):
        pkg = Package.open(RPM_EMPTY)
        pkg.verify_digests()


class TestFiles:
    def test_files_basic(self):
        pkg = Package.open(RPM_BASIC)
        files = pkg.files()
        assert len(files) > 0
        assert all(isinstance(f, RpmFile) for f in files)

    def test_file_metadata_and_content(self):
        pkg = Package.open(RPM_BASIC)
        files = pkg.files()
        for f in files:
            assert isinstance(f.metadata, FileEntry)
            assert isinstance(f.content, bytes)

    def test_files_with_types(self):
        pkg = Package.open(RPM_FILE_TYPES)
        files = pkg.files()
        types = {f.metadata.mode.file_type for f in files}
        assert FileType.Regular in types

    def test_empty_package_no_files(self):
        pkg = Package.open(RPM_EMPTY)
        files = pkg.files()
        assert len(files) == 0


class TestExtract:
    def test_extract(self):
        pkg = Package.open(RPM_BASIC)
        with tempfile.TemporaryDirectory() as tmpdir:
            dest = os.path.join(tmpdir, "extracted")
            pkg.extract(dest)
            assert os.path.isdir(dest)


class TestRoundtrip:
    def test_roundtrip_bytes(self):
        pkg = Package.open(RPM_BASIC)
        data = pkg.to_bytes()
        pkg2 = Package.from_bytes(data)
        assert pkg2.metadata.name == pkg.metadata.name
        assert pkg2.metadata.version == pkg.metadata.version

    def test_write_file(self):
        pkg = Package.open(RPM_BASIC)
        with tempfile.TemporaryDirectory() as tmpdir:
            path = Path(tmpdir) / "output.rpm"
            pkg.write_file(path)
            pkg2 = Package.open(path)
            assert pkg2.metadata.name == pkg.metadata.name

    def test_write_to_directory(self):
        pkg = Package.open(RPM_BASIC)
        with tempfile.TemporaryDirectory() as tmpdir:
            actual_path = pkg.write_to(Path(tmpdir))
            assert os.path.isfile(actual_path)
            assert actual_path.startswith(tmpdir)
            assert actual_path.endswith(".rpm")
            pkg2 = Package.open(actual_path)
            assert pkg2.metadata.name == pkg.metadata.name

    def test_write_to_file(self):
        pkg = Package.open(RPM_BASIC)
        with tempfile.TemporaryDirectory() as tmpdir:
            path = os.path.join(tmpdir, "custom-name.rpm")
            actual_path = pkg.write_to(path)
            assert actual_path == path
            assert os.path.isfile(actual_path)
            pkg2 = Package.open(actual_path)
            assert pkg2.metadata.name == pkg.metadata.name


class TestCanonicalFilename:
    def test_canonical_filename(self):
        pkg = Package.open(RPM_BASIC)
        assert pkg.canonical_filename() == "rpm-basic-2.3.4-5.el9.noarch.rpm"