diff --git a/MANIFEST.in b/MANIFEST.in index a7d3b6d..7237bb6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,6 @@ include .gitignore include MANIFEST.in include README.rst -include conftest.py include gen-standalone.py include pypi-server include pypi-server-in.py diff --git a/conftest.py b/conftest.py deleted file mode 100644 index 4aa51a6..0000000 --- a/conftest.py +++ /dev/null @@ -1,8 +0,0 @@ -import sys -import httplib - - -def pytest_configure(config): - if hasattr(sys, "pypy_version_info"): - # mechanize (as included by twill) calls this - httplib.HTTPResponse._decref_socketios = lambda self: None diff --git a/tests/test_app.py b/tests/test_app.py index 60df5c0..bc6b9ef 100755 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -1,238 +1,170 @@ #! /usr/bin/env py.test -import twill -from twill.commands import go, code, show, find, reload, showlinks, notfind -import pytest - -try: - from paste.deploy import loadapp -except ImportError: - loadapp = None - from pypiserver import core # do no remove. needed for bottle -import bottle - -fallback_app = bottle.Bottle() - - -@fallback_app.route("path#.*#") -def pypi_notfound(path): - return bottle.HTTPError(404) +import pytest, bottle, webtest @pytest.fixture() -def root(request, env): - return env["root"] +def _app(app): + return app.module -@pytest.fixture() -def _app(request, env): - return env["_app"] - - -@pytest.fixture() -def env(request, tmpdir): +@pytest.fixture +def app(tmpdir): from pypiserver import app - a = app(root=tmpdir.strpath) - - if loadapp: - pini = tmpdir.join(".paste.ini") - pini.write(""" -[composite:main] -use = egg:Paste#urlmap -/priv/ = private - -[app:private] -paste.app_factory = pypiserver:paste_app_factory -root = %s - -[server:main] -use = egg:gunicorn#main -host = 0.0.0.0 -port = 8001 -workers = 5 -accesslog = - -""" % tmpdir) - - twill.add_wsgi_intercept("nonroot", 80, lambda: loadapp("config:%s" % pini)) - - twill.add_wsgi_intercept("localhost", 8080, lambda: a) - twill.add_wsgi_intercept("systemexit.de", 80, lambda: a) - twill.add_wsgi_intercept("pypi.python.org", 80, lambda: fallback_app) - - def cleanup(): - twill.remove_wsgi_intercept("localhost", 8080) - twill.remove_wsgi_intercept("systemexit.de", 80) - twill.remove_wsgi_intercept("pypi.python.org", 80) - if loadapp: - twill.remove_wsgi_intercept("nonroot", 80) - - request.addfinalizer(cleanup) - - go("http://localhost:8080/") - return dict(root=tmpdir, app=a, _app=a.module) + return app(root=tmpdir.strpath) -def test_root_count(root): - go("/") - show() - code(200) - find("PyPI compatible package index serving 0 packages") - showlinks() +@pytest.fixture +def testapp(app): + return webtest.TestApp(app) + +@pytest.fixture +def root(tmpdir): + return tmpdir + + +@pytest.fixture +def priv(app): + b = bottle.Bottle() + b.mount("/priv/", app) + return b + + +@pytest.fixture +def testpriv(priv): + return webtest.TestApp(priv) + + +def test_root_count(root, testapp): + resp = testapp.get("/") + resp.mustcontain("PyPI compatible package index serving 0 packages") root.join("Twisted-11.0.0.tar.bz2").write("") - reload() - show() - find("PyPI compatible package index serving 1 packages") + resp = testapp.get("/") + resp.mustcontain("PyPI compatible package index serving 1 packages") -def test_root_hostname(root): - go("http://systemexit.de/") - find("easy_install -i http://systemexit.de/simple/ PACKAGE") +def test_root_hostname(testapp): + resp = testapp.get("/", headers={"Host": "systemexit.de"}) + resp.mustcontain("easy_install -i http://systemexit.de/simple/ PACKAGE") + # go("http://systemexit.de/") -def test_packages_empty(root): - go("/packages") - show() - code(200) - assert list(showlinks()) == [] +def test_packages_empty(testapp): + resp = testapp.get("/packages") + assert len(resp.html("a")) == 0 -def test_favicon(root): - final_url = go("/favicon.ico") - show() - print "FINAL_URL:", final_url - assert final_url == "http://localhost:8080/favicon.ico" - code(404) +def test_favicon(testapp): + testapp.get("/favicon.ico", status=404) -def test_fallback(root, _app): +def test_fallback(root, _app, testapp): assert _app.config.redirect_to_fallback - final_url = go("/simple/pypiserver/") - assert final_url == "http://pypi.python.org/simple/pypiserver/" + resp = testapp.get("/simple/pypiserver/", status=302) + assert resp.headers["Location"] == "http://pypi.python.org/simple/pypiserver/" -def test_no_fallback(root, _app): +def test_no_fallback(root, _app, testapp): _app.config.redirect_to_fallback = False - final_url = go("/simple/pypiserver/") - assert final_url == "http://localhost:8080/simple/pypiserver/" - code(404) + testapp.get("/simple/pypiserver/", status=404) -def test_serve_no_dotfiles(root): +def test_serve_no_dotfiles(root, testapp): root.join(".foo-1.0.zip").write("secret") - go("/packages/.foo-1.0.zip") - show() - code(404) + testapp.get("/packages/.foo-1.0.zip", status=404) -def test_packages_list_no_dotfiles(root): +def test_packages_list_no_dotfiles(root, testapp): root.join(".foo-1.0.zip").write("secret") - go("/packages/") - notfind("foo") + resp = testapp.get("/packages/") + assert "foo" not in resp -def test_simple_list_no_dotfiles(root): +def test_simple_list_no_dotfiles(root, testapp): root.join(".foo-1.0.zip").write("secret") - go("/simple/") - notfind("foo") + resp = testapp.get("/simple/") + assert "foo" not in resp -def test_simple_list_no_dotfiles2(root): +def test_simple_list_no_dotfiles2(root, testapp): root.join(".foo-1.0.zip").write("secret") - go("/simple/.foo/") - assert list(showlinks()) == [] + resp = testapp.get("/simple/") + assert resp.html("a") == [] -def test_serve_no_dotdir(root): +def test_serve_no_dotdir(root, testapp): root.mkdir(".subdir").join("foo-1.0.zip").write("secret") - go("/packages/.subdir/foo-1.0.zip") - code(404) + testapp.get("/packages/.subdir/foo-1.0.zip", status=404) -def test_packages_list_no_dotdir(root): +def test_packages_list_no_dotdir(root, testapp): root.mkdir(".subdir").join("foo-1.0.zip").write("secret") - go("/packages/") - show() - notfind("foo") + resp = testapp.get("/packages/") + assert "foo" not in resp -def test_simple_list_no_dotdir(root): +def test_simple_list_no_dotdir(root, testapp): root.mkdir(".subdir").join("foo-1.0.zip").write("secret") - go("/simple/") - show() - notfind("foo") + resp = testapp.get("/simple/") + assert "foo" not in resp -def test_simple_list_no_dotdir2(root): +def test_simple_list_no_dotdir2(root, testapp): root.mkdir(".subdir").join("foo-1.0.zip").write("secret") - go("/simple/foo/") - show() - assert list(showlinks()) == [] + resp = testapp.get("/simple/foo/") + assert resp.html("a") == [] -def test_simple_index(root): +def test_simple_index(root, testapp): root.join("foobar-1.0.zip").write("") root.join("foobar-1.1.zip").write("") root.join("foobarbaz-1.1.zip").write("") root.join("foobar.baz-1.1.zip").write("") - go("/simple/foobar") - show() - links = list(showlinks()) - assert len(links) == 2 + resp = testapp.get("/simple/foobar") + assert len(resp.html("a")) == 2 -def test_simple_index_list(root): +def test_simple_index_list(root, testapp): root.join("foobar-1.0.zip").write("") root.join("foobar-1.1.zip").write("") root.join("foobarbaz-1.1.zip").write("") root.join("foobar.baz-1.1.zip").write("") - go("/simple/") - show() - links = list(showlinks()) - assert len(links) == 3 + resp = testapp.get("/simple/") + assert len(resp.html("a")) == 3 -def test_simple_index_case(root): +def test_simple_index_case(root, testapp): root.join("FooBar-1.0.zip").write("") root.join("FooBar-1.1.zip").write("") - - go("/simple/foobar") - show() - links = list(showlinks()) - assert len(links) == 2 - -need_paste = pytest.mark.skipif("loadapp is None") + resp = testapp.get("/simple/foobar") + assert len(resp.html("a")) == 2 -@need_paste -def test_nonroot_root(root): - go("http://nonroot/priv/") - find("easy_install -i http://nonroot/priv/simple/ PACKAGE") +def test_nonroot_root(testpriv): + resp = testpriv.get("/priv/", headers={"Host": "nonroot"}) + resp.mustcontain("easy_install -i http://nonroot/priv/simple/ PACKAGE") -@need_paste -def test_nonroot_simple_index(root): +def test_nonroot_simple_index(root, testpriv): root.join("foobar-1.0.zip").write("") - for url in ["http://nonroot/priv/simple/foobar", - "http://nonroot/priv/simple/foobar/"]: - go(url) - show() - links = list(showlinks()) + for path in ["/priv/simple/foobar", + "/priv/simple/foobar/"]: + resp = testpriv.get(path) + links = resp.html("a") assert len(links) == 1 - assert links[0].url == "/priv/packages/foobar-1.0.zip" + assert links[0]["href"] == "/priv/packages/foobar-1.0.zip" -@need_paste -def test_nonroot_simple_packages(root): +def test_nonroot_simple_packages(root, testpriv): root.join("foobar-1.0.zip").write("123") - for url in ["http://nonroot/priv/packages", - "http://nonroot/priv/packages/"]: - go(url) - show() - links = list(showlinks()) + for path in ["/priv/packages", + "/priv/packages/"]: + resp = testpriv.get(path) + links = resp.html("a") assert len(links) == 1 - assert links[0].url == "/priv/packages/foobar-1.0.zip" + assert links[0]["href"] == "/priv/packages/foobar-1.0.zip" diff --git a/tox.ini b/tox.ini index 84ef744..248b912 100644 --- a/tox.ini +++ b/tox.ini @@ -1,9 +1,9 @@ [tox] envlist = py25,py26,py27 + [testenv] deps=pytest>=2.3 - twill - paste - pastedeploy -commands=py.test + webtest + beautifulsoup4 +commands=py.test [] sitepackages=False