blob: 4070279b7aeab6725bef94687bf1736655839e68 [file] [log] [blame]
Tarek Ziade1231a4e2011-05-19 13:07:25 +02001"""Tests for packaging.command.upload_docs."""
2import os
3import sys
4import shutil
5import zipfile
Tarek Ziade5edc31e2011-05-21 19:53:45 +02006try:
7 import _ssl
8except ImportError:
9 _ssl = None
Tarek Ziade1231a4e2011-05-19 13:07:25 +020010
11from packaging.command import upload_docs as upload_docs_mod
Éric Araujoce5fe832011-07-08 16:27:12 +020012from packaging.command.upload_docs import upload_docs, zip_dir
Tarek Ziade1231a4e2011-05-19 13:07:25 +020013from packaging.dist import Distribution
14from packaging.errors import PackagingFileError, PackagingOptionError
15
16from packaging.tests import unittest, support
Tarek Ziadefd883182011-05-19 15:26:59 +020017try:
18 import threading
19 from packaging.tests.pypi_server import PyPIServerTestCase
20except ImportError:
21 threading = None
22 PyPIServerTestCase = object
Tarek Ziade1231a4e2011-05-19 13:07:25 +020023
24
Tarek Ziade1231a4e2011-05-19 13:07:25 +020025PYPIRC = """\
26[distutils]
27index-servers = server1
28
29[server1]
30repository = %s
31username = real_slim_shady
32password = long_island
33"""
34
Tarek Ziadefd883182011-05-19 15:26:59 +020035
36@unittest.skipIf(threading is None, "Needs threading")
Tarek Ziade1231a4e2011-05-19 13:07:25 +020037class UploadDocsTestCase(support.TempdirManager,
38 support.EnvironRestorer,
39 support.LoggingCatcher,
40 PyPIServerTestCase):
41
42 restore_environ = ['HOME']
43
44 def setUp(self):
45 super(UploadDocsTestCase, self).setUp()
46 self.tmp_dir = self.mkdtemp()
47 self.rc = os.path.join(self.tmp_dir, '.pypirc')
48 os.environ['HOME'] = self.tmp_dir
49 self.dist = Distribution()
50 self.dist.metadata['Name'] = "distr-name"
51 self.cmd = upload_docs(self.dist)
52
53 def test_default_uploaddir(self):
54 sandbox = self.mkdtemp()
55 previous = os.getcwd()
56 os.chdir(sandbox)
57 try:
58 os.mkdir("build")
59 self.prepare_sample_dir("build")
60 self.cmd.ensure_finalized()
61 self.assertEqual(self.cmd.upload_dir, os.path.join("build", "docs"))
62 finally:
63 os.chdir(previous)
64
65 def test_default_uploaddir_looks_for_doc_also(self):
66 sandbox = self.mkdtemp()
67 previous = os.getcwd()
68 os.chdir(sandbox)
69 try:
70 os.mkdir("build")
71 self.prepare_sample_dir("build")
72 os.rename(os.path.join("build", "docs"), os.path.join("build", "doc"))
73 self.cmd.ensure_finalized()
74 self.assertEqual(self.cmd.upload_dir, os.path.join("build", "doc"))
75 finally:
76 os.chdir(previous)
77
78 def prepare_sample_dir(self, sample_dir=None):
79 if sample_dir is None:
80 sample_dir = self.mkdtemp()
81 os.mkdir(os.path.join(sample_dir, "docs"))
82 self.write_file(os.path.join(sample_dir, "docs", "index.html"), "Ce mortel ennui")
83 self.write_file(os.path.join(sample_dir, "index.html"), "Oh la la")
84 return sample_dir
85
86 def test_zip_dir(self):
87 source_dir = self.prepare_sample_dir()
88 compressed = zip_dir(source_dir)
89
90 zip_f = zipfile.ZipFile(compressed)
91 self.assertEqual(zip_f.namelist(), ['index.html', 'docs/index.html'])
92
Tarek Ziade1231a4e2011-05-19 13:07:25 +020093 def prepare_command(self):
94 self.cmd.upload_dir = self.prepare_sample_dir()
95 self.cmd.ensure_finalized()
96 self.cmd.repository = self.pypi.full_address
97 self.cmd.username = "username"
98 self.cmd.password = "password"
99
100 def test_upload(self):
101 self.prepare_command()
102 self.cmd.run()
103
104 self.assertEqual(len(self.pypi.requests), 1)
105 handler, request_data = self.pypi.requests[-1]
106 self.assertIn(b"content", request_data)
107 self.assertIn("Basic", handler.headers['authorization'])
108 self.assertTrue(handler.headers['content-type']
109 .startswith('multipart/form-data;'))
110
111 action, name, version, content =\
112 request_data.split("----------------GHSKFJDLGDS7543FJKLFHRE75642756743254".encode())[1:5]
113
114
115 # check that we picked the right chunks
116 self.assertIn(b'name=":action"', action)
117 self.assertIn(b'name="name"', name)
118 self.assertIn(b'name="version"', version)
119 self.assertIn(b'name="content"', content)
120
121 # check their contents
122 self.assertIn(b'doc_upload', action)
123 self.assertIn(b'distr-name', name)
124 self.assertIn(b'docs/index.html', content)
125 self.assertIn(b'Ce mortel ennui', content)
126
Tarek Ziade5edc31e2011-05-21 19:53:45 +0200127 @unittest.skipIf(_ssl is None, 'Needs SSL support')
Tarek Ziade1231a4e2011-05-19 13:07:25 +0200128 def test_https_connection(self):
129 https_called = False
130
Tarek Ziade3b1a22a2011-05-19 13:46:41 +0200131 orig_https = upload_docs_mod.http.client.HTTPSConnection
Tarek Ziade1231a4e2011-05-19 13:07:25 +0200132
133 def https_conn_wrapper(*args):
134 nonlocal https_called
135 https_called = True
136 # the testing server is http
137 return upload_docs_mod.http.client.HTTPConnection(*args)
138
139 upload_docs_mod.http.client.HTTPSConnection = https_conn_wrapper
140 try:
141 self.prepare_command()
142 self.cmd.run()
143 self.assertFalse(https_called)
144
145 self.cmd.repository = self.cmd.repository.replace("http", "https")
146 self.cmd.run()
147 self.assertTrue(https_called)
148 finally:
Tarek Ziade3b1a22a2011-05-19 13:46:41 +0200149 upload_docs_mod.http.client.HTTPSConnection = orig_https
Tarek Ziade1231a4e2011-05-19 13:07:25 +0200150
151 def test_handling_response(self):
152 self.pypi.default_response_status = '403 Forbidden'
153 self.prepare_command()
154 self.cmd.run()
155 self.assertIn('Upload failed (403): Forbidden', self.get_logs()[-1])
156
157 self.pypi.default_response_status = '301 Moved Permanently'
158 self.pypi.default_response_headers.append(("Location", "brand_new_location"))
159 self.cmd.run()
160 self.assertIn('brand_new_location', self.get_logs()[-1])
161
162 def test_reads_pypirc_data(self):
163 self.write_file(self.rc, PYPIRC % self.pypi.full_address)
164 self.cmd.repository = self.pypi.full_address
165 self.cmd.upload_dir = self.prepare_sample_dir()
166 self.cmd.ensure_finalized()
167 self.assertEqual(self.cmd.username, "real_slim_shady")
168 self.assertEqual(self.cmd.password, "long_island")
169
170 def test_checks_index_html_presence(self):
171 self.cmd.upload_dir = self.prepare_sample_dir()
172 os.remove(os.path.join(self.cmd.upload_dir, "index.html"))
173 self.assertRaises(PackagingFileError, self.cmd.ensure_finalized)
174
175 def test_checks_upload_dir(self):
176 self.cmd.upload_dir = self.prepare_sample_dir()
177 shutil.rmtree(os.path.join(self.cmd.upload_dir))
178 self.assertRaises(PackagingOptionError, self.cmd.ensure_finalized)
179
180 def test_show_response(self):
181 self.prepare_command()
182 self.cmd.show_response = True
183 self.cmd.run()
184 record = self.get_logs()[-1]
185 self.assertTrue(record, "should report the response")
186 self.assertIn(self.pypi.default_response_data, record)
187
188def test_suite():
189 return unittest.makeSuite(UploadDocsTestCase)
190
191if __name__ == "__main__":
192 unittest.main(defaultTest="test_suite")