ยปCore Development>Code coverage>Lib/packaging/tests/test_command_upload_docs.py

Python code coverage for Lib/packaging/tests/test_command_upload_docs.py

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