[Python-checkins] distutils2: make mocked PyPIServer returning static files when accessing the server with
tarek.ziade
python-checkins at python.org
Sun Jul 4 11:48:39 CEST 2010
tarek.ziade pushed f90efe197ac3 to distutils2:
http://hg.python.org/distutils2/rev/f90efe197ac3
changeset: 285:f90efe197ac3
user: Alexis Metaireau <ametaireau at gmail.com>
date: Mon May 31 22:43:03 2010 +0200
summary: make mocked PyPIServer returning static files when accessing the server with the /simple/ prefix
files: docs/source/test_framework.rst, src/distutils2/tests/pypi_server.py, src/distutils2/tests/test_pypi_server.py
diff --git a/docs/source/test_framework.rst b/docs/source/test_framework.rst
--- a/docs/source/test_framework.rst
+++ b/docs/source/test_framework.rst
@@ -5,7 +5,6 @@
When you are testing code that works with distutils, you might find these tools
useful.
-
``PyPIServer``
==============
@@ -15,13 +14,16 @@
HTTP response can be overriden with the ``default_response_status``,
``default_response_headers`` and ``default_response_data`` attributes.
+When accessing the server with urls beginning with `/simple/`, the server also
+record your requests, but will look for files under the /tests/pypi_server/
+path.
``PyPIServerTestCase``
======================
``PyPIServerTestCase`` is a test case class with setUp and tearDown methods that
take care of a single PyPIServer instance attached as a ``pypi`` attribute on
-the test class. Use it as one of the base classes in you test case::
+the test class. Use it as one of the base classes in your test case::
class UploadTestCase(PyPIServerTestCase):
def test_something(self):
diff --git a/src/distutils2/tests/pypi_server.py b/src/distutils2/tests/pypi_server.py
--- a/src/distutils2/tests/pypi_server.py
+++ b/src/distutils2/tests/pypi_server.py
@@ -1,5 +1,8 @@
import Queue, threading, time, unittest2
from wsgiref.simple_server import make_server
+import os.path
+
+PYPI_HTML_BASE_PATH = os.path.dirname(os.path.abspath(__file__)) + "/pypiserver"
class PyPIServerTestCase(unittest2.TestCase):
@@ -33,16 +36,37 @@
self.join()
def pypi_app(self, environ, start_response):
- # record the request
- if environ.get("CONTENT_LENGTH"):
- request_data = environ.pop('wsgi.input').read(int(environ['CONTENT_LENGTH']))
+ # record the request. Read the input only on PUT or POST requests
+ if environ["REQUEST_METHOD"] in ("PUT", "POST"):
+ if environ.get("CONTENT_LENGTH"):
+ request_data = environ.pop('wsgi.input').read(int(environ['CONTENT_LENGTH']))
+ else:
+ request_data = environ.pop('wsgi.input').read()
+ elif environ["REQUEST_METHOD"] in ("GET", "DELETE"):
+ request_data = ''
+
+ self.request_queue.put((environ, request_data))
+
+ relative_path = environ["PATH_INFO"].replace(self.full_address, '')
+
+ # serve the content from local disc if we request /simple
+ if relative_path.startswith("/simple/"):
+ file_to_serve = relative_path.replace("/simple", PYPI_HTML_BASE_PATH)
+ try:
+ file = open(file_to_serve)
+ data = file.read()
+ start_response("200 OK", [('Content-type', 'text/plain')])
+ except IOError:
+ start_response("404 NOT FOUND", [('Content-type', 'text/plain')])
+ data = "Not Found"
+ return data
+
+ # otherwise serve the content from default_response* parameters
else:
- request_data = environ.pop('wsgi.input').read()
- self.request_queue.put((environ, request_data))
- # send back a response
- status, headers, data = self.get_next_response()
- start_response(status, headers)
- return data
+ # send back a response
+ status, headers, data = self.get_next_response()
+ start_response(status, headers)
+ return data
def get_next_response(self):
return (self.default_response_status,
diff --git a/src/distutils2/tests/test_pypi_server.py b/src/distutils2/tests/test_pypi_server.py
--- a/src/distutils2/tests/test_pypi_server.py
+++ b/src/distutils2/tests/test_pypi_server.py
@@ -5,6 +5,7 @@
class PyPIServerTest(unittest2.TestCase):
def test_records_requests(self):
+ """We expect that PyPIServer can log our requests"""
server = PyPIServer()
server.start()
self.assertEqual(len(server.requests), 0)
@@ -20,6 +21,26 @@
self.assertEqual(environ["HTTP_X_TEST_HEADER"], "Mister Iceberg")
server.stop()
+ def test_serve_static_content(self):
+ """We expect that when accessing the test PyPI server, files can
+ be served statically."""
+ server = PyPIServer()
+ server.start()
+
+ # the file does not exists on the disc, so it might not be served
+ url = server.full_address + "/simple/unexisting_page"
+ request = urllib2.Request(url)
+ try:
+ urllib2.urlopen(request)
+ except urllib2.HTTPError as e:
+ self.assertEqual(e.getcode(), 404)
+
+ # now try serving a content that do exists
+ url = server.full_address + "/simple/index.html"
+ request = urllib2.Request(url)
+ f = urllib2.urlopen(request)
+ self.assertEqual(f.read(), "Yeah\n")
+
def test_suite():
return unittest2.makeSuite(PyPIServerTest)
--
Repository URL: http://hg.python.org/distutils2
More information about the Python-checkins
mailing list