alpkit 0.1.0-pre.2

A library for reading metadata from the APKv2 package format and APKBUILD.
Documentation
use indoc::indoc;

use crate::internal::test_utils::{assert, assert_let, dependency, S};

use super::*;

#[test]
fn pkginfo_parse() {
    let input = indoc! {"
        # Generated by abuild 3.10.0-r0
        # using fakeroot version 1.29
        # Wed Dec 21 00:21:26 UTC 2022
        pkgname = sample
        pkgver = 1.2.3-r2
        pkgdesc = A sample aport for testing
        url = https://example.org/sample
        builddate = 1671582086
        packager = Jakub Jirutka <jakub@jirutka.cz>
        size = 696320
        arch = x86_64
        origin = sample
        commit = 994dcb4685405e710a1e599cff82d2e45ec9daae
        maintainer = Jakub Jirutka <jakub@jirutka.cz>
        license = ISC and BSD-2-Clause and BSD-3-Clause
        triggers = /bin/* /usr/bin/*
        provider_priority = 10
        depend = ruby>=3.0
        depend = !sample-legacy
        install_if = sample=1.2.3-r2 bar
        # automatically detected:
        provides = cmd:sample=1.2.3-r2
        depend = so:libc.musl-x86_64.so.1
        datahash = 4c36284c04dd1e18e4df59b4bc873fd89b6240861b925cac59341cc66e36d94b
    "};
    let expected = PkgInfo {
        pkgname: S!("sample"),
        pkgver: S!("1.2.3-r2"),
        pkgdesc: S!("A sample aport for testing"),
        url: S!("https://example.org/sample"),
        builddate: 1671582086,
        packager: S!("Jakub Jirutka <jakub@jirutka.cz>"),
        size: 696320,
        arch: S!("x86_64"),
        origin: S!("sample"),
        commit: Some(S!("994dcb4685405e710a1e599cff82d2e45ec9daae")),
        maintainer: Some(S!("Jakub Jirutka <jakub@jirutka.cz>")),
        license: S!("ISC and BSD-2-Clause and BSD-3-Clause"),
        triggers: vec![S!("/bin/*"), S!("/usr/bin/*")],
        depends: vec![
            dependency("ruby>=3.0"),
            dependency("so:libc.musl-x86_64.so.1"),
        ],
        conflicts: vec![dependency("sample-legacy")],
        install_if: vec![dependency("sample=1.2.3-r2"), dependency("bar")],
        provides: vec![dependency("cmd:sample=1.2.3-r2")],
        provider_priority: Some(10),
        datahash: S!("4c36284c04dd1e18e4df59b4bc873fd89b6240861b925cac59341cc66e36d94b"),
        ..Default::default()
    };

    assert!(PkgInfo::parse(input).unwrap() == expected);
}

#[test]
fn parse_key_value_with_missing_equals() {
    let input = indoc! {"
        pkgname = foo
        depend bar
        depend = baz
    "};
    let mut parsed = parse_key_value(input);

    assert_let!(Some(Ok(("pkgname", "foo"))) = parsed.next());

    assert_let!(Some(Err(PkgInfoError::Syntax(2, line))) = parsed.next());
    assert!(line == "depend bar");

    assert_let!(Some(Ok(("depend", "baz"))) = parsed.next());

    assert!(parsed.next().is_none());
}

#[test]
fn json() {
    let input = indoc!(
        r#"
        {
        "pkgname": "gitea",
        "pkgver": "1.17.3-r2",
        "pkgdesc": "A self-hosted Git service written in Go",
        "url": "https://gitea.io",
        "builddate": 1670896833,
        "packager": "Buildozer <alpine-devel@lists.alpinelinux.org>",
        "size": 131379200,
        "arch": "x86_64",
        "origin": "gitea",
        "commit": "c872e600df22c6a82ec6cc4e8c38007b0d52abe1",
        "maintainer": "6543 <6543@obermui.de>",
        "license": "MIT",
        "depend": {
            "ruby": "*",
            "so:libc.musl-x86_64.so.1": "*"
        },
        "provides": ["cmd:gitea=1.17.3-r2"],
        "triggers": [],
        "install_if": {
            "foo": "=1.2.3-r0",
            "bar": "*"
        },
        "datahash": "17b7126d804b8ad8cfcd9c76d3482b35966ca298a590ade6c49fc791b4436e7d",
        "scripts": [
            "pre-install"
        ]
        }
    "#
    );

    let pkg: PkgInfo = serde_json::from_str(input).unwrap();

    println!("{:?}", pkg);
}