def test_merge_packages_override_default() -> None:
    pkg = install_pinned.merge_packages(Package('foo == 2.0', weak=True),
                                        Package('foo[test] == 2.1'))
    assert pkg == Package('foo[test] == 2.1')

    # Only exact versions override defaults
    pkg = install_pinned.merge_packages(Package('foo == 2.0', weak=True),
                                        Package('foo[test] >= 1.0'))
    assert pkg == Package('foo[test] >=1.0, ==2.0')
def test_merge_packages_url_and_specifier() -> None:
    pkg = install_pinned.merge_packages(Package('foo[bar] >= 2.0, < 3'),
                                        Package('foo @ https://invalid.com'))
    assert pkg == Package('foo[bar] @ https://invalid.com')

    with pytest.raises(
            ValueError,
            match='Cannot combine URL .* with exact specifier ==2.0'):
        install_pinned.merge_packages(Package('foo[bar] == 2.0'),
                                      Package('foo @ https://invalid.com'))
def test_merge_packages_constraint() -> None:
    req1 = Requirement('foo >= 2.8')
    req2 = Requirement('foo [test] < 3.0')
    pkg = install_pinned.merge_packages(Package(req1, constraint=True),
                                        Package(req2, constraint=True))
    assert pkg == Package('foo [test] >=2.8, <3.0', constraint=True)

    pkg = install_pinned.merge_packages(Package(req1, constraint=False),
                                        Package(req2, constraint=True))
    assert pkg == Package('foo [test] >=2.8, <3.0', constraint=False)
def test_merge_packages_markers() -> None:
    pkg = install_pinned.merge_packages(
        Package('foo >= 1.0 ; python_version >= "2.7"'),
        Package('foo < 1.0 ; python_version < "2.7"'))
    assert pkg == Package('foo >= 1.0 ; python_version >= "2.7"')

    # Check symmetry
    pkg = install_pinned.merge_packages(
        Package('foo < 1.0 ; python_version < "2.7"'),
        Package('foo >= 1.0 ; python_version >= "2.7"'))
    assert pkg == Package('foo >= 1.0 ; python_version >= "2.7"')
def test_merge_packages_simple() -> None:
    pkg = install_pinned.merge_packages(
        Package(
            'requests [security,tests] >= 2.8.1, == 2.8.* ; python_version >= "2.7"'
        ), Package('requests [security,foo] >= 2.7'))
    assert pkg == Package(
        'requests [security,foo,tests]>=2.7,>=2.8.1,==2.8.*; python_version >= "2.7"'
    )
def test_merge_packages_mixed_urls() -> None:
    with pytest.raises(ValueError, match='inconsistent URLs'):
        install_pinned.merge_packages(Package('foo @ http://url1'),
                                      Package('foo @ http://url2'))
def test_merge_packages_mixed_names() -> None:
    with pytest.raises(ValueError, match='different names'):
        install_pinned.merge_packages(Package('foo==0.1'), Package('bar==0.2'))