示例#1
0
def test_xmlrpc_changelog_last_serial():
    app = pretend.stub(db=pretend.stub(packaging=pretend.stub(
        get_last_changelog_serial=pretend.call_recorder(lambda *a: 2), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    assert interface.changelog_last_serial() == 2

    assert app.db.packaging.get_last_changelog_serial.calls == [pretend.call()]
示例#2
0
def test_xmlrpc_browse_invalid_classifier():
    cids = {'hello': 1}
    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_classifier_ids=pretend.call_recorder(lambda *a: cids), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    with pytest.raises(ValueError):
        interface.browse(['hello', 'spam'])
示例#3
0
def test_xmlrpc_package_hosting_mode():
    app = pretend.stub(db=pretend.stub(packaging=pretend.stub(
        get_hosting_mode=pretend.call_recorder(lambda *a: 'yes!'), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    assert interface.package_hosting_mode('name') == 'yes!'

    assert app.db.packaging.get_hosting_mode.calls == [pretend.call('name')]
示例#4
0
def test_release_data(monkeypatch):
    # arrow conversion is messy, make sure we are comparing the same thing
    now_timestamp = arrow.utcnow().timestamp
    now = arrow.get(now_timestamp).datetime

    resp = dict(
        name="spam",
        version="1.0",
        author="John Doe",
        author_email="*****@*****.**",
        maintainer=None,
        maintainer_email=None,
        home_page="https://example.com/",
        license="Apache License v2.0",
        summary="A Test Project",
        description="A Longer Test Project",
        keywords="foo,bar,wat",
        platform="All",
        download_url="https://example.com/downloads/test-project-1.0.tar.gz",
        requires_dist=["requests (>=2.0)"],
        provides_dist=["test-project-old"],
        project_url={"Repository": "git://git.example.com/"},
        created=now,
    )
    # snapshot that info now for comparison later
    info = dict(resp)
    docs = "https://pythonhosted.org/spam/"
    cfiers = ['Section A :: Subsection B :: Aisle 3', 'Section B']
    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_release=pretend.call_recorder(lambda *a: resp),
        get_documentation_url=pretend.call_recorder(lambda *a: docs),
        get_download_counts=pretend.call_recorder(lambda *a: 10),
        get_classifiers=pretend.call_recorder(lambda *a: cfiers),
    ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    result = interface.release_data('spam', '1.0')

    assert app.models.packaging.get_release.calls == [
        pretend.call('spam', '1.0'),
    ]

    # modify the model response data according to the expected mutation
    info.update(
        package_url='http://pypi.python.org/pypi/spam',
        release_url='http://pypi.python.org/pypi/spam/1.0',
        docs_url=docs,
        downloads=10,
        classifiers=cfiers,
        maintainer='',  # converted from None
        maintainer_email='',  # converted from None
        stable_version='',  # filled in as no-op
        created=now_timestamp,
    )
    assert result == info
示例#5
0
def test_xmlrpc_package_releases():
    result = ['1', '2', '3', '4']
    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_project_versions=pretend.call_recorder(lambda *a: result), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    assert interface.package_releases('name') == ['1', '2', '3', '4']

    assert app.models.packaging.get_project_versions.calls == [
        pretend.call('name')
    ]
示例#6
0
def test_xmlrpc_list_packages():
    all_projects = ["bar", "foo"]

    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        all_projects=pretend.call_recorder(lambda: all_projects), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    result = interface.list_packages()

    assert app.models.packaging.all_projects.calls == [pretend.call()]
    assert result == ['bar', 'foo']
示例#7
0
def test_xmlrpc_list_packages_with_serial():
    d = dict(one=1, two=2, three=3)
    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_projects_with_serial=pretend.call_recorder(lambda: d), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    result = interface.list_packages_with_serial()

    assert app.models.packaging.get_projects_with_serial.calls == [
        pretend.call(),
    ]
    assert result == d
示例#8
0
def test_xmlrpc_changelog(with_ids):
    now_timestamp = arrow.utcnow().timestamp
    now = arrow.get(now_timestamp).datetime
    old = datetime.datetime.utcnow() - datetime.timedelta(days=1)
    old_timestamp = arrow.get(old).timestamp
    old = arrow.get(old_timestamp).datetime
    now_plus_1 = now + datetime.timedelta(days=1)
    now_plus_2 = now + datetime.timedelta(days=2)
    data = [
        dict(name='one',
             version='1',
             submitted_date=now,
             action='created',
             id=1),
        dict(name='two',
             version='2',
             submitted_date=now,
             action='new release',
             id=2),
        dict(name='one',
             version='2',
             submitted_date=now_plus_1,
             action='new release',
             id=3),
        dict(name='one',
             version='3',
             submitted_date=now_plus_2,
             action='new release',
             id=4),
    ]
    result = [
        ['one', '1', arrow.get(now).timestamp, 'created', 1],
        ['two', '2', arrow.get(now).timestamp, 'new release', 2],
        ['one', '2',
         arrow.get(now_plus_1).timestamp, 'new release', 3],
        ['one', '3',
         arrow.get(now_plus_2).timestamp, 'new release', 4],
    ]
    if not with_ids:
        result = [r[:4] for r in result]
    app = pretend.stub(db=pretend.stub(packaging=pretend.stub(
        get_changelog=pretend.call_recorder(lambda *a: data), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    old_timestamp = arrow.get(old).timestamp
    assert interface.changelog(old_timestamp, with_ids) == result

    old = arrow.get(old_timestamp).datetime
    assert app.db.packaging.get_changelog.calls == [pretend.call(old)]
示例#9
0
def test_xmlrpc_user_packages():
    result = [
        dict(package_name='one', role_name='Owner'),
        dict(package_name='two', role_name='Maintainer')
    ]
    app = pretend.stub(db=pretend.stub(packaging=pretend.stub(
        get_roles_for_user=pretend.call_recorder(lambda *a: result), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    assert interface.user_packages('name') == [['one', 'Owner'],
                                               ['two', 'Maintainer']]

    assert app.db.packaging.get_roles_for_user.calls == [pretend.call('name')]
示例#10
0
def test_xmlrpc_top_packages(num, result):
    app = pretend.stub(db=pretend.stub(packaging=pretend.stub(
        get_top_projects=pretend.call_recorder(lambda *a: result), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    if num:
        r = interface.top_packages(num)
        assert app.db.packaging.get_top_projects.calls == [pretend.call(num)]
    else:
        r = interface.top_packages()
        assert app.db.packaging.get_top_projects.calls == [pretend.call(None)]

    assert r == result
示例#11
0
def test_xmlrpc_changed_packages():
    now = datetime.datetime.utcnow()

    result = ['one', 'two', 'three']
    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_changed_since=pretend.call_recorder(lambda *a: result), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    old_timestamp = arrow.get(now - datetime.timedelta(days=1)).timestamp
    assert interface.changed_packages(old_timestamp) == result

    assert app.models.packaging.get_changed_since.calls == [
        pretend.call(arrow.get(old_timestamp).datetime)
    ]
示例#12
0
def project_json(app, request, project_name, version=None):
    # fail early if callback is invalid
    callback = request.args.get('callback')
    if callback:
        if not is_valid_json_callback_name(callback):
            raise BadRequest('invalid JSONP callback name')

    # Get the real project name for this project
    project = app.db.packaging.get_project(project_name)

    if project is None:
        raise NotFound("{} does not exist".format(project_name))

    # we're looking for the latest version
    versions = app.db.packaging.get_project_versions(project['name'])
    if version is None:
        if not versions:
            raise NotFound("{} has no releases".format(project_name))
        version = versions[0]
    elif version not in versions:
        raise NotFound("{} has no release {}".format(project_name, version))

    rpc = xmlrpc.Interface(app, request)

    d = dict(
        info=rpc.release_data(project['name'], version),
        urls=rpc.release_urls(project['name'], version),
        releases=rpc.all_release_urls(project['name']),
    )
    time_format = '%Y-%m-%dT%H:%M:%S'
    for url in d['urls']:
        url['upload_time'] = url['upload_time'].strftime(time_format)
    for release, urls in d['releases'].items():
        for url in urls:
            url['upload_time'] = url['upload_time'].strftime(time_format)

    data = json.dumps(d, sort_keys=True)

    # write the JSONP extra crap if necessary
    if callback:
        data = '/**/ %s(%s);' % (callback, data)

    serial = app.db.packaging.get_last_serial()

    response = Response(data, mimetype="application/json")
    response.headers['Content-Disposition'] = 'inline'
    response.headers.add("X-PyPI-Last-Serial", serial)
    return response
示例#13
0
def test_xmlrpc_release_downloads():
    results = [
        dict(filename='one', downloads=1),
        dict(filename='two', downloads=2),
    ]
    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_downloads=pretend.call_recorder(lambda *a: results), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    assert interface.release_downloads('name', '1.0') == [('one', 1),
                                                          ('two', 2)]

    assert app.models.packaging.get_downloads.calls == [
        pretend.call('name', '1.0')
    ]
示例#14
0
def test_xmlrpc_package_roles():
    result = [
        dict(user_name='one', role_name='Owner'),
        dict(user_name='two', role_name='Maintainer')
    ]
    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_roles_for_project=pretend.call_recorder(lambda *a: result), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    assert interface.package_roles('name') == [('one', 'Owner'),
                                               ('two', 'Maintainer')]

    assert app.models.packaging.get_roles_for_project.calls == [
        pretend.call('name')
    ]
示例#15
0
def test_release_data_missing(monkeypatch):
    def f(*a):
        raise IndexError()

    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_release=pretend.call_recorder(f), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    result = interface.release_data('spam', '1.0')

    assert app.models.packaging.get_release.calls == [
        pretend.call('spam', '1.0'),
    ]

    assert result == {}
示例#16
0
def test_xmlrpc_search(spec, operator, length, query):
    results = {
        "hits": {
            "hits": [{
                "_source": {
                    "name": "Django",
                    "version": "1.0",
                    "summary": "Wat",
                },
            }] * 1000,
            "total":
            length,
        }
    }
    app = pretend.stub(search=pretend.stub(
        es=pretend.stub(search=pretend.call_recorder(
            lambda index, doc_type, body: results), ),
        _index="warehouse",
        types=pretend.stub(project=pretend.stub(_type="project")),
    ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    args = [spec]
    if operator:
        args.append(operator)

    assert interface.search(*args) == [{
        "name": "Django",
        "version": "1.0",
        "summary": "Wat",
        "_pypi_ordering": 0,
    }] * length

    calls = [
        pretend.call(
            body={
                'query': query,
                'from': x * 1000,
                'size': 1000
            },
            index='warehouse',
            doc_type='project',
        ) for x in range(0, length // 1000)
    ]

    assert app.search.es.search.calls == calls
示例#17
0
def test_xmlrpc_browse():
    cids = {'hello': 1, 'there': 2}
    results = [('one', 1), ('two', 2)]
    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_classifier_ids=pretend.call_recorder(lambda *a: cids),
        search_by_classifier=pretend.call_recorder(lambda *a: results),
    ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    assert interface.browse(['hello', 'there']) == results

    assert app.models.packaging.get_classifier_ids.calls == [
        pretend.call(['hello', 'there'])
    ]
    assert app.models.packaging.search_by_classifier.calls == [
        pretend.call([2, 1])
    ]
示例#18
0
def test_xmlrpc_changelog_serial():
    now_timestamp = arrow.utcnow().timestamp
    now = arrow.get(now_timestamp).datetime
    now_plus_1 = now + datetime.timedelta(days=1)
    now_plus_2 = now + datetime.timedelta(days=2)
    data = [
        dict(name='one',
             version='1',
             submitted_date=now,
             action='created',
             id=1),
        dict(name='two',
             version='2',
             submitted_date=now,
             action='new release',
             id=2),
        dict(name='one',
             version='2',
             submitted_date=now_plus_1,
             action='new release',
             id=3),
        dict(name='one',
             version='3',
             submitted_date=now_plus_2,
             action='new release',
             id=4),
    ]
    result = [
        ['one', '1', arrow.get(now).timestamp, 'created', 1],
        ['two', '2', arrow.get(now).timestamp, 'new release', 2],
        ['one', '2',
         arrow.get(now_plus_1).timestamp, 'new release', 3],
        ['one', '3',
         arrow.get(now_plus_2).timestamp, 'new release', 4],
    ]
    app = pretend.stub(db=pretend.stub(packaging=pretend.stub(
        get_changelog_serial=pretend.call_recorder(lambda *a: data), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    assert interface.changelog_since_serial(1) == result

    assert app.db.packaging.get_changelog_serial.calls == [pretend.call(1)]
示例#19
0
def test_xmlrpc_updated_releases():
    now = datetime.datetime.utcnow()

    result = [
        dict(name='one', version='1', created=now, summary='text'),
        dict(name='two', version='2', created=now, summary='text'),
        dict(name='two', version='3', created=now, summary='text'),
        dict(name='three', version='4', created=now, summary='text')
    ]
    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_releases_since=pretend.call_recorder(lambda *a: result), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    old_timestamp = arrow.get(now - datetime.timedelta(days=1)).timestamp
    assert interface.updated_releases(old_timestamp) == \
        [('one', '1'), ('two', '2'), ('two', '3'), ('three', '4')]

    assert app.models.packaging.get_releases_since.calls == [
        pretend.call(arrow.get(old_timestamp).datetime)
    ]
示例#20
0
def test_xmlrpc_browse_invalid_arg():
    interface = xmlrpc.Interface(pretend.stub(), pretend.stub())

    with pytest.raises(TypeError):
        interface.browse('hello')
示例#21
0
def test_all_release_urls(monkeypatch):
    dt = datetime.datetime.utcnow()

    urls = {
        '1.0': [
            dict(
                name="spam",
                url='/packages/source/t/spam/spam-1.0.tar.gz',
                version="1.0",
                filename="spam-1.0.tar.gz",
                python_version="source",
                packagetype="sdist",
                md5_digest="0cc175b9c0f1b6a831c399e269772661",
                downloads=10,
                size=1234,
                pgp_url=None,
                comment_text='download for great justice',
                upload_time=dt,
            ),
            dict(
                name="spam",
                url='/packages/source/t/spam/spam-1.0.zip',
                version="1.0",
                filename="spam-1.0.zip",
                python_version="source",
                packagetype="sdist",
                md5_digest="0cc175b3c0f1b6a831c399e269772661",
                downloads=12,
                size=1235,
                pgp_url=None,
                comment_text=None,
                upload_time=dt,
            )
        ],
        '2.0': [
            dict(
                name="spam",
                url='/packages/source/t/spam/spam-2.0.tar.gz',
                version="2.0",
                filename="spam-2.0.tar.gz",
                python_version="source",
                packagetype="sdist",
                md5_digest="0cc175b9c0f1b6a831c399e269772661",
                downloads=10,
                size=1234,
                pgp_url=None,
                comment_text='download for great justice',
                upload_time=dt,
            )
        ]
    }

    vers = ['1.0', '2.0']

    app = pretend.stub(db=pretend.stub(packaging=pretend.stub(
        get_downloads=pretend.call_recorder(lambda *a: urls[a[1]]),
        get_project_versions=pretend.call_recorder(lambda *a: vers),
    ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    result = interface.all_release_urls('spam')

    assert app.db.packaging.get_downloads.calls == [
        pretend.call('spam', '1.0'),
        pretend.call('spam', '2.0'),
    ]
    assert result == {
        '1.0': [
            dict(
                url='/packages/source/t/spam/spam-1.0.tar.gz',
                packagetype="sdist",
                filename="spam-1.0.tar.gz",
                size=1234,
                md5_digest="0cc175b9c0f1b6a831c399e269772661",
                downloads=10,
                has_sig=False,
                python_version="source",
                comment_text='download for great justice',
                upload_time=dt,
            ),
            dict(
                url='/packages/source/t/spam/spam-1.0.zip',
                packagetype="sdist",
                filename="spam-1.0.zip",
                size=1235,
                md5_digest="0cc175b3c0f1b6a831c399e269772661",
                downloads=12,
                has_sig=False,
                python_version="source",
                comment_text=None,
                upload_time=dt,
            )
        ],
        '2.0': [
            dict(
                url='/packages/source/t/spam/spam-2.0.tar.gz',
                packagetype="sdist",
                filename="spam-2.0.tar.gz",
                size=1234,
                md5_digest="0cc175b9c0f1b6a831c399e269772661",
                downloads=10,
                has_sig=False,
                python_version="source",
                comment_text='download for great justice',
                upload_time=dt,
            )
        ]
    }
示例#22
0
def test_release_urls(pgp, monkeypatch):
    downloads = [
        dict(
            name="spam",
            url='/packages/source/t/spam/spam-1.0.tar.gz',
            version="1.0",
            filename="spam-1.0.tar.gz",
            python_version="source",
            packagetype="sdist",
            md5_digest="0cc175b9c0f1b6a831c399e269772661",
            downloads=10,
            size=1234,
            pgp_url='/packages/source/t/spam/spam-1.0.tar.gz.sig'
            if pgp else None,
            comment_text='download for great justice',
        ),
        dict(
            name="spam",
            url='/packages/source/t/spam/spam-1.0.zip',
            version="1.0",
            filename="spam-1.0.zip",
            python_version="source",
            packagetype="sdist",
            md5_digest="0cc175b3c0f1b6a831c399e269772661",
            downloads=12,
            size=1235,
            pgp_url='/packages/source/t/spam/spam-1.0.zip.sig'
            if pgp else None,
            comment_text=None,
        )
    ]
    app = pretend.stub(models=pretend.stub(packaging=pretend.stub(
        get_downloads=pretend.call_recorder(lambda *a: downloads), ), ), )

    interface = xmlrpc.Interface(app, pretend.stub())

    result = interface.release_urls('spam', '1.0')

    assert app.models.packaging.get_downloads.calls == [
        pretend.call('spam', '1.0'),
    ]
    assert result == [
        dict(
            url='/packages/source/t/spam/spam-1.0.tar.gz',
            packagetype="sdist",
            filename="spam-1.0.tar.gz",
            size=1234,
            md5_digest="0cc175b9c0f1b6a831c399e269772661",
            downloads=10,
            has_sig=pgp,
            python_version="source",
            comment_text='download for great justice',
        ),
        dict(
            url='/packages/source/t/spam/spam-1.0.zip',
            packagetype="sdist",
            filename="spam-1.0.zip",
            size=1235,
            md5_digest="0cc175b3c0f1b6a831c399e269772661",
            downloads=12,
            has_sig=pgp,
            python_version="source",
            comment_text=None,
        )
    ]
示例#23
0
def test_xmlrpc_search_invalid():
    interface = xmlrpc.Interface(pretend.stub(), pretend.stub())

    with pytest.raises(TypeError):
        interface.search({}, "fake!")