| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | """Tests for packaging.command.upload_docs.""" | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import shutil | 
					
						
							| 
									
										
										
										
											2011-10-19 08:37:22 +02:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | import zipfile | 
					
						
							| 
									
										
										
										
											2011-05-21 19:53:45 +02:00
										 |  |  | try: | 
					
						
							|  |  |  |     import _ssl | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     _ssl = None | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | from packaging.command import upload_docs as upload_docs_mod | 
					
						
							| 
									
										
										
										
											2011-07-08 16:27:12 +02:00
										 |  |  | from packaging.command.upload_docs import upload_docs, zip_dir | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | from packaging.dist import Distribution | 
					
						
							|  |  |  | from packaging.errors import PackagingFileError, PackagingOptionError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from packaging.tests import unittest, support | 
					
						
							| 
									
										
										
										
											2011-05-19 15:26:59 +02:00
										 |  |  | try: | 
					
						
							|  |  |  |     import threading | 
					
						
							|  |  |  |     from packaging.tests.pypi_server import PyPIServerTestCase | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     threading = None | 
					
						
							| 
									
										
										
										
											2011-09-18 17:00:38 +02:00
										 |  |  |     PyPIServerTestCase = unittest.TestCase | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PYPIRC = """\
 | 
					
						
							|  |  |  | [distutils] | 
					
						
							|  |  |  | index-servers = server1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [server1] | 
					
						
							|  |  |  | repository = %s | 
					
						
							|  |  |  | username = real_slim_shady | 
					
						
							|  |  |  | password = long_island | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-19 15:26:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | @unittest.skipIf(threading is None, "Needs threading") | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | class UploadDocsTestCase(support.TempdirManager, | 
					
						
							|  |  |  |                          support.EnvironRestorer, | 
					
						
							|  |  |  |                          support.LoggingCatcher, | 
					
						
							|  |  |  |                          PyPIServerTestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     restore_environ = ['HOME'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         super(UploadDocsTestCase, self).setUp() | 
					
						
							|  |  |  |         self.tmp_dir = self.mkdtemp() | 
					
						
							|  |  |  |         self.rc = os.path.join(self.tmp_dir, '.pypirc') | 
					
						
							|  |  |  |         os.environ['HOME'] = self.tmp_dir | 
					
						
							|  |  |  |         self.dist = Distribution() | 
					
						
							|  |  |  |         self.dist.metadata['Name'] = "distr-name" | 
					
						
							|  |  |  |         self.cmd = upload_docs(self.dist) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_default_uploaddir(self): | 
					
						
							|  |  |  |         sandbox = self.mkdtemp() | 
					
						
							|  |  |  |         os.chdir(sandbox) | 
					
						
							| 
									
										
										
										
											2011-09-18 20:11:48 +02:00
										 |  |  |         os.mkdir("build") | 
					
						
							|  |  |  |         self.prepare_sample_dir("build") | 
					
						
							|  |  |  |         self.cmd.ensure_finalized() | 
					
						
							|  |  |  |         self.assertEqual(self.cmd.upload_dir, os.path.join("build", "docs")) | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_default_uploaddir_looks_for_doc_also(self): | 
					
						
							|  |  |  |         sandbox = self.mkdtemp() | 
					
						
							|  |  |  |         os.chdir(sandbox) | 
					
						
							| 
									
										
										
										
											2011-09-18 20:11:48 +02:00
										 |  |  |         os.mkdir("build") | 
					
						
							|  |  |  |         self.prepare_sample_dir("build") | 
					
						
							|  |  |  |         os.rename(os.path.join("build", "docs"), os.path.join("build", "doc")) | 
					
						
							|  |  |  |         self.cmd.ensure_finalized() | 
					
						
							|  |  |  |         self.assertEqual(self.cmd.upload_dir, os.path.join("build", "doc")) | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def prepare_sample_dir(self, sample_dir=None): | 
					
						
							|  |  |  |         if sample_dir is None: | 
					
						
							|  |  |  |             sample_dir = self.mkdtemp() | 
					
						
							|  |  |  |         os.mkdir(os.path.join(sample_dir, "docs")) | 
					
						
							| 
									
										
										
										
											2011-10-19 08:49:20 +02:00
										 |  |  |         self.write_file((sample_dir, "docs", "index.html"), "Ce mortel ennui") | 
					
						
							|  |  |  |         self.write_file((sample_dir, "index.html"), "Oh la la") | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |         return sample_dir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_zip_dir(self): | 
					
						
							|  |  |  |         source_dir = self.prepare_sample_dir() | 
					
						
							|  |  |  |         compressed = zip_dir(source_dir) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         zip_f = zipfile.ZipFile(compressed) | 
					
						
							|  |  |  |         self.assertEqual(zip_f.namelist(), ['index.html', 'docs/index.html']) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def prepare_command(self): | 
					
						
							|  |  |  |         self.cmd.upload_dir = self.prepare_sample_dir() | 
					
						
							|  |  |  |         self.cmd.ensure_finalized() | 
					
						
							|  |  |  |         self.cmd.repository = self.pypi.full_address | 
					
						
							|  |  |  |         self.cmd.username = "username" | 
					
						
							|  |  |  |         self.cmd.password = "password" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_upload(self): | 
					
						
							|  |  |  |         self.prepare_command() | 
					
						
							|  |  |  |         self.cmd.run() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(len(self.pypi.requests), 1) | 
					
						
							|  |  |  |         handler, request_data = self.pypi.requests[-1] | 
					
						
							|  |  |  |         self.assertIn(b"content", request_data) | 
					
						
							|  |  |  |         self.assertIn("Basic", handler.headers['authorization']) | 
					
						
							|  |  |  |         self.assertTrue(handler.headers['content-type'] | 
					
						
							|  |  |  |             .startswith('multipart/form-data;')) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-18 20:11:48 +02:00
										 |  |  |         action, name, version, content = request_data.split( | 
					
						
							|  |  |  |             b'----------------GHSKFJDLGDS7543FJKLFHRE75642756743254')[1:5] | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # check that we picked the right chunks | 
					
						
							|  |  |  |         self.assertIn(b'name=":action"', action) | 
					
						
							|  |  |  |         self.assertIn(b'name="name"', name) | 
					
						
							|  |  |  |         self.assertIn(b'name="version"', version) | 
					
						
							|  |  |  |         self.assertIn(b'name="content"', content) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # check their contents | 
					
						
							|  |  |  |         self.assertIn(b'doc_upload', action) | 
					
						
							|  |  |  |         self.assertIn(b'distr-name', name) | 
					
						
							|  |  |  |         self.assertIn(b'docs/index.html', content) | 
					
						
							|  |  |  |         self.assertIn(b'Ce mortel ennui', content) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-21 19:53:45 +02:00
										 |  |  |     @unittest.skipIf(_ssl is None, 'Needs SSL support') | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |     def test_https_connection(self): | 
					
						
							| 
									
										
										
										
											2011-09-18 20:11:48 +02:00
										 |  |  |         self.https_called = False | 
					
						
							|  |  |  |         self.addCleanup( | 
					
						
							|  |  |  |             setattr, upload_docs_mod.http.client, 'HTTPSConnection', | 
					
						
							|  |  |  |             upload_docs_mod.http.client.HTTPSConnection) | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def https_conn_wrapper(*args): | 
					
						
							| 
									
										
										
										
											2011-09-18 20:11:48 +02:00
										 |  |  |             self.https_called = True | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |             # the testing server is http | 
					
						
							|  |  |  |             return upload_docs_mod.http.client.HTTPConnection(*args) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         upload_docs_mod.http.client.HTTPSConnection = https_conn_wrapper | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-18 20:11:48 +02:00
										 |  |  |         self.prepare_command() | 
					
						
							|  |  |  |         self.cmd.run() | 
					
						
							|  |  |  |         self.assertFalse(self.https_called) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.cmd.repository = self.cmd.repository.replace("http", "https") | 
					
						
							|  |  |  |         self.cmd.run() | 
					
						
							|  |  |  |         self.assertTrue(self.https_called) | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_handling_response(self): | 
					
						
							|  |  |  |         self.pypi.default_response_status = '403 Forbidden' | 
					
						
							|  |  |  |         self.prepare_command() | 
					
						
							|  |  |  |         self.cmd.run() | 
					
						
							| 
									
										
										
										
											2011-10-19 08:37:22 +02:00
										 |  |  |         errors = self.get_logs(logging.ERROR) | 
					
						
							|  |  |  |         self.assertEqual(len(errors), 1) | 
					
						
							|  |  |  |         self.assertIn('Upload failed (403): Forbidden', errors[0]) | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.pypi.default_response_status = '301 Moved Permanently' | 
					
						
							| 
									
										
										
										
											2011-09-18 20:11:48 +02:00
										 |  |  |         self.pypi.default_response_headers.append( | 
					
						
							|  |  |  |             ("Location", "brand_new_location")) | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |         self.cmd.run() | 
					
						
							| 
									
										
										
										
											2011-10-19 08:37:22 +02:00
										 |  |  |         lastlog = self.get_logs(logging.INFO)[-1] | 
					
						
							|  |  |  |         self.assertIn('brand_new_location', lastlog) | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_reads_pypirc_data(self): | 
					
						
							|  |  |  |         self.write_file(self.rc, PYPIRC % self.pypi.full_address) | 
					
						
							|  |  |  |         self.cmd.repository = self.pypi.full_address | 
					
						
							|  |  |  |         self.cmd.upload_dir = self.prepare_sample_dir() | 
					
						
							|  |  |  |         self.cmd.ensure_finalized() | 
					
						
							|  |  |  |         self.assertEqual(self.cmd.username, "real_slim_shady") | 
					
						
							|  |  |  |         self.assertEqual(self.cmd.password, "long_island") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_checks_index_html_presence(self): | 
					
						
							|  |  |  |         self.cmd.upload_dir = self.prepare_sample_dir() | 
					
						
							|  |  |  |         os.remove(os.path.join(self.cmd.upload_dir, "index.html")) | 
					
						
							|  |  |  |         self.assertRaises(PackagingFileError, self.cmd.ensure_finalized) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_checks_upload_dir(self): | 
					
						
							|  |  |  |         self.cmd.upload_dir = self.prepare_sample_dir() | 
					
						
							|  |  |  |         shutil.rmtree(os.path.join(self.cmd.upload_dir)) | 
					
						
							|  |  |  |         self.assertRaises(PackagingOptionError, self.cmd.ensure_finalized) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_show_response(self): | 
					
						
							|  |  |  |         self.prepare_command() | 
					
						
							|  |  |  |         self.cmd.show_response = True | 
					
						
							|  |  |  |         self.cmd.run() | 
					
						
							| 
									
										
										
										
											2011-10-19 08:37:22 +02:00
										 |  |  |         record = self.get_logs(logging.INFO)[-1] | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  |         self.assertTrue(record, "should report the response") | 
					
						
							|  |  |  |         self.assertIn(self.pypi.default_response_data, record) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-18 20:11:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-19 13:07:25 +02:00
										 |  |  | def test_suite(): | 
					
						
							|  |  |  |     return unittest.makeSuite(UploadDocsTestCase) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     unittest.main(defaultTest="test_suite") |