[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