mirror of
https://github.com/pypiserver/pypiserver
synced 2024-11-09 16:45:51 +01:00
Add test_server
TCs with twine<-->real process.
+ TC for #82 uploading `dentodeps` package with 200 deps.
This commit is contained in:
parent
cda0fad7a9
commit
e32ca3425b
3
.gitignore
vendored
3
.gitignore
vendored
@ -17,8 +17,7 @@ ID
|
|||||||
__pycache__/
|
__pycache__/
|
||||||
/build/
|
/build/
|
||||||
/dist/
|
/dist/
|
||||||
/*.egg
|
/*.egg*
|
||||||
/.eggs
|
|
||||||
/MANIFEST
|
/MANIFEST
|
||||||
/README.html
|
/README.html
|
||||||
/pypi-server-standalone.py
|
/pypi-server-standalone.py
|
||||||
|
2
setup.py
2
setup.py
@ -4,7 +4,7 @@ import sys
|
|||||||
|
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
|
|
||||||
tests_require = ['pytest']
|
tests_require = ['pytest', 'twine']
|
||||||
if sys.version_info >= (3, 0):
|
if sys.version_info >= (3, 0):
|
||||||
exec("def do_exec(co, loc): exec(co, loc)\n")
|
exec("def do_exec(co, loc): exec(co, loc)\n")
|
||||||
else:
|
else:
|
||||||
|
4
tests/centodeps/.gitignore
vendored
Normal file
4
tests/centodeps/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/wheelhouse
|
||||||
|
/build
|
||||||
|
/*egg*
|
||||||
|
|
BIN
tests/centodeps/dist/centodeps-0.0.0-cp34-none-win_amd64.whl
vendored
Normal file
BIN
tests/centodeps/dist/centodeps-0.0.0-cp34-none-win_amd64.whl
vendored
Normal file
Binary file not shown.
15
tests/centodeps/setup.py
Normal file
15
tests/centodeps/setup.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
## A test-distribution to check if
|
||||||
|
# bottle supports uploading 100's of packages,
|
||||||
|
# see: https://github.com/pypiserver/pypiserver/issues/82
|
||||||
|
#
|
||||||
|
# Has been run once `pip wheel .`, just to generate:
|
||||||
|
# ./wheelhouse/centodeps-0.0.0-cp34-none-win_amd64.whl
|
||||||
|
#
|
||||||
|
from setuptools import setup
|
||||||
|
setup(
|
||||||
|
name='centodeps',
|
||||||
|
install_requires=['a==1.0'] * 200,
|
||||||
|
options={
|
||||||
|
'bdist_wheel': {'universal': True},
|
||||||
|
},
|
||||||
|
)
|
@ -1,13 +1,22 @@
|
|||||||
#! /usr/bin/env py.test
|
#! /usr/bin/env py.test
|
||||||
|
|
||||||
from pypiserver import __main__, bottle
|
import contextlib
|
||||||
import pytest, webtest
|
import glob
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
|
||||||
## Enable logging to detect any problems with it
|
import pytest
|
||||||
|
import webtest
|
||||||
|
|
||||||
|
from pypiserver import __main__, bottle
|
||||||
|
|
||||||
|
|
||||||
|
# Enable logging to detect any problems with it
|
||||||
##
|
##
|
||||||
__main__.init_logging(level=logging.NOTSET)
|
__main__.init_logging(level=logging.NOTSET)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def _app(app):
|
def _app(app):
|
||||||
return app.module
|
return app.module
|
||||||
@ -41,7 +50,7 @@ def testpriv(priv):
|
|||||||
return webtest.TestApp(priv)
|
return webtest.TestApp(priv)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(params=[" ", ## Mustcontain test below fails when string is empty.
|
@pytest.fixture(params=[" ", # Mustcontain test below fails when string is empty.
|
||||||
"Hey there!",
|
"Hey there!",
|
||||||
"<html><body>Hey there!</body></html>",
|
"<html><body>Hey there!</body></html>",
|
||||||
])
|
])
|
||||||
@ -54,7 +63,7 @@ def welcome_file_no_vars(request, root):
|
|||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def welcome_file_all_vars(request, root):
|
def welcome_file_all_vars(request, root):
|
||||||
msg ="""
|
msg = """
|
||||||
{{URL}}
|
{{URL}}
|
||||||
{{VERSION}}
|
{{VERSION}}
|
||||||
{{NUMPKGS}}
|
{{NUMPKGS}}
|
||||||
@ -102,7 +111,8 @@ def test_root_welcome_msg_all_vars(root, welcome_file_all_vars):
|
|||||||
|
|
||||||
def test_root_welcome_msg_antiXSS(testapp):
|
def test_root_welcome_msg_antiXSS(testapp):
|
||||||
"""https://github.com/pypiserver/pypiserver/issues/77"""
|
"""https://github.com/pypiserver/pypiserver/issues/77"""
|
||||||
resp = testapp.get("/?<alert>Red</alert>", headers={"Host": "somehost.org"})
|
resp = testapp.get(
|
||||||
|
"/?<alert>Red</alert>", headers={"Host": "somehost.org"})
|
||||||
resp.mustcontain("alert", "somehost.org", no="<alert>")
|
resp.mustcontain("alert", "somehost.org", no="<alert>")
|
||||||
|
|
||||||
|
|
||||||
@ -112,7 +122,7 @@ def test_root_remove_not_found_msg_antiXSS(testapp):
|
|||||||
headers={"Host": "somehost.org"},
|
headers={"Host": "somehost.org"},
|
||||||
params={':action': 'remove_pkg',
|
params={':action': 'remove_pkg',
|
||||||
'name': '<alert>Red</alert>',
|
'name': '<alert>Red</alert>',
|
||||||
'version':'1.1.1'})
|
'version': '1.1.1'})
|
||||||
resp.mustcontain("alert", "somehost.org", no="<alert>")
|
resp.mustcontain("alert", "somehost.org", no="<alert>")
|
||||||
|
|
||||||
|
|
||||||
@ -128,7 +138,8 @@ def test_favicon(testapp):
|
|||||||
def test_fallback(root, _app, testapp):
|
def test_fallback(root, _app, testapp):
|
||||||
assert _app.config.redirect_to_fallback
|
assert _app.config.redirect_to_fallback
|
||||||
resp = testapp.get("/simple/pypiserver/", status=302)
|
resp = testapp.get("/simple/pypiserver/", status=302)
|
||||||
assert resp.headers["Location"] == "http://pypi.python.org/simple/pypiserver/"
|
assert resp.headers[
|
||||||
|
"Location"] == "http://pypi.python.org/simple/pypiserver/"
|
||||||
|
|
||||||
|
|
||||||
def test_no_fallback(root, _app, testapp):
|
def test_no_fallback(root, _app, testapp):
|
||||||
@ -218,7 +229,7 @@ def test_nonroot_simple_index(root, testpriv):
|
|||||||
root.join("foobar-1.0.zip").write("")
|
root.join("foobar-1.0.zip").write("")
|
||||||
|
|
||||||
for path in ["/priv/simple/foobar",
|
for path in ["/priv/simple/foobar",
|
||||||
"/priv/simple/foobar/"]:
|
"/priv/simple/foobar/"]:
|
||||||
resp = testpriv.get(path)
|
resp = testpriv.get(path)
|
||||||
links = resp.html("a")
|
links = resp.html("a")
|
||||||
assert len(links) == 1
|
assert len(links) == 1
|
||||||
@ -228,7 +239,7 @@ def test_nonroot_simple_index(root, testpriv):
|
|||||||
def test_nonroot_simple_packages(root, testpriv):
|
def test_nonroot_simple_packages(root, testpriv):
|
||||||
root.join("foobar-1.0.zip").write("123")
|
root.join("foobar-1.0.zip").write("123")
|
||||||
for path in ["/priv/packages",
|
for path in ["/priv/packages",
|
||||||
"/priv/packages/"]:
|
"/priv/packages/"]:
|
||||||
resp = testpriv.get(path)
|
resp = testpriv.get(path)
|
||||||
links = resp.html("a")
|
links = resp.html("a")
|
||||||
assert len(links) == 1
|
assert len(links) == 1
|
||||||
@ -239,7 +250,8 @@ def test_root_no_relative_paths(testpriv):
|
|||||||
"""https://github.com/pypiserver/pypiserver/issues/25"""
|
"""https://github.com/pypiserver/pypiserver/issues/25"""
|
||||||
resp = testpriv.get("/priv/")
|
resp = testpriv.get("/priv/")
|
||||||
hrefs = [x["href"] for x in resp.html("a")]
|
hrefs = [x["href"] for x in resp.html("a")]
|
||||||
assert hrefs == ['/priv/packages/', '/priv/simple/', 'http://pypi.python.org/pypi/pypiserver']
|
assert hrefs == ['/priv/packages/', '/priv/simple/',
|
||||||
|
'http://pypi.python.org/pypi/pypiserver']
|
||||||
|
|
||||||
|
|
||||||
def test_simple_index_list_no_duplicates(root, testapp):
|
def test_simple_index_list_no_duplicates(root, testapp):
|
||||||
|
54
tests/test_server.py
Normal file
54
tests/test_server.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#! /usr/bin/env py.test
|
||||||
|
|
||||||
|
import contextlib
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
|
||||||
|
from py import path # @UnresolvedImport
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def packdir(tmpdir):
|
||||||
|
return tmpdir.mkdir("dists")
|
||||||
|
|
||||||
|
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def server(packdir):
|
||||||
|
cmd = "python -m pypiserver.__main__ -P. -a. %s" % packdir
|
||||||
|
try:
|
||||||
|
proc = subprocess.Popen(
|
||||||
|
cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
yield proc
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
proc.terminate()
|
||||||
|
time.sleep(1)
|
||||||
|
finally:
|
||||||
|
proc.kill()
|
||||||
|
|
||||||
|
|
||||||
|
def test_centodeps(packdir, monkeypatch):
|
||||||
|
from twine.commands import upload
|
||||||
|
|
||||||
|
pypirc_config = {"test": {"repository": "http://localhost:8080",
|
||||||
|
"username": 'a',
|
||||||
|
"password": 'a'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
monkeypatch.setattr(upload, 'get_repository_from_config',
|
||||||
|
lambda *x: pypirc_config)
|
||||||
|
dist_path = path.local('tests/centodeps/wheelhouse/centodeps*.whl')
|
||||||
|
|
||||||
|
with server(packdir) as srv:
|
||||||
|
upload.upload([str(dist_path)], repository='test',
|
||||||
|
sign=None, identity=None,
|
||||||
|
username='a', password='a',
|
||||||
|
comment=None, sign_with=None)
|
||||||
|
time.sleep(1)
|
||||||
|
assert list(packdir.visit('centodeps*.whl'))
|
||||||
|
|
||||||
|
out = srv.communicate()
|
||||||
|
assert "serving on http:" in str(out[0])
|
||||||
|
assert "Listening on http:" in str(out[1])
|
1
tox.ini
1
tox.ini
@ -6,6 +6,7 @@ deps=pytest>=2.3
|
|||||||
webtest
|
webtest
|
||||||
beautifulsoup4
|
beautifulsoup4
|
||||||
mock
|
mock
|
||||||
|
twine>=1.6.0
|
||||||
commands=py.test []
|
commands=py.test []
|
||||||
sitepackages=False
|
sitepackages=False
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user