aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/tests/package/base_package_test.rs
blob: d1bf432f82ab4d68412bf062b3f88d76553c31f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//! ref: composer/tests/Composer/Test/Package/BasePackageTest.php

use crate::test_case::get_package;
use shirabe::package::DisplayMode;
use shirabe::package::base_package::package_names_to_regexp;
use shirabe::package::handle::PackageHandle;
use shirabe::repository::{ArrayRepository, RepositoryInterfaceHandle};
use shirabe_semver::VersionParser;

fn empty_repository() -> RepositoryInterfaceHandle {
    RepositoryInterfaceHandle::new(ArrayRepository::new(vec![]).unwrap())
}

#[test]
fn test_set_same_repository() {
    let package = get_package("foo", "1.0.0");
    let repository = empty_repository();

    package.set_repository(repository.clone()).unwrap();
    // Set against the same repository is allowed.
    package.set_repository(repository.clone()).unwrap();
}

#[test]
fn test_set_another_repository() {
    let package = get_package("foo", "1.0.0");
    let repository1 = empty_repository();
    let repository2 = empty_repository();

    // The package stores the repository as a weak ref, so keep both strong handles
    // alive for the "already in another repository" check to fire.
    package.set_repository(repository1.clone()).unwrap();
    assert!(package.set_repository(repository2.clone()).is_err());
}

// PHP mocks isDev()/getSourceType()/getPrettyVersion()/getSourceReference() on an abstract
// BasePackage. A real Package reproduces the same observable getters: a "dev-master" version makes
// isDev() true, while the pretty version is an independent constructor argument.
#[test]
fn test_format_version_for_dev_package() {
    let cases: Vec<(&str, bool, &str)> = vec![
        ("v2.1.0-RC2", true, "PrettyVersion v2.1.0-RC2"),
        (
            "bbf527a27356414bfa9bf520f018c5cb7af67c77",
            true,
            "PrettyVersion bbf527a",
        ),
        ("v1.0.0", false, "PrettyVersion v1.0.0"),
        (
            "bbf527a27356414bfa9bf520f018c5cb7af67c77",
            false,
            "PrettyVersion bbf527a27356414bfa9bf520f018c5cb7af67c77",
        ),
    ];

    for (source_reference, truncate, expected) in cases {
        let package = PackageHandle::new(
            "dummy/pkg".to_string(),
            VersionParser.normalize("dev-master", None).unwrap(),
            "PrettyVersion".to_string(),
        );
        package.__set_source_type(Some("git".to_string()));
        package.set_source_reference(Some(source_reference.to_string()));

        assert_eq!(
            expected,
            package.get_full_pretty_version(truncate, DisplayMode::SourceRefIfDev)
        );
    }
}

#[test]
fn test_package_names_to_regexp() {
    // The PHP data provider yields a single row whose extra elements are ignored,
    // so only the first (packageNames, wrap, expected) triple is exercised.
    let regexp = package_names_to_regexp(
        &["ext-*".to_string(), "monolog/monolog".to_string()],
        "{^%s$}i",
    );

    assert_eq!("{^ext\\-.*|monolog/monolog$}i", regexp);
}