1"""Unit tests for code in urllib.response."""
2
3import socket
4import tempfile
5import urllib.response
6import unittest
7from test import support
8
9if support.is_wasi:
10    raise unittest.SkipTest("Cannot create socket on WASI")
11
12
13class TestResponse(unittest.TestCase):
14
15    def setUp(self):
16        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
17        self.fp = self.sock.makefile('rb')
18        self.test_headers = {"Host": "www.python.org",
19                             "Connection": "close"}
20
21    def test_with(self):
22        addbase = urllib.response.addbase(self.fp)
23
24        self.assertIsInstance(addbase, tempfile._TemporaryFileWrapper)
25
26        def f():
27            with addbase as spam:
28                pass
29        self.assertFalse(self.fp.closed)
30        f()
31        self.assertTrue(self.fp.closed)
32        self.assertRaises(ValueError, f)
33
34    def test_addclosehook(self):
35        closehook_called = False
36
37        def closehook():
38            nonlocal closehook_called
39            closehook_called = True
40
41        closehook = urllib.response.addclosehook(self.fp, closehook)
42        closehook.close()
43
44        self.assertTrue(self.fp.closed)
45        self.assertTrue(closehook_called)
46
47    def test_addinfo(self):
48        info = urllib.response.addinfo(self.fp, self.test_headers)
49        self.assertEqual(info.info(), self.test_headers)
50        self.assertEqual(info.headers, self.test_headers)
51
52    def test_addinfourl(self):
53        url = "http://www.python.org"
54        code = 200
55        infourl = urllib.response.addinfourl(self.fp, self.test_headers,
56                                             url, code)
57        self.assertEqual(infourl.info(), self.test_headers)
58        self.assertEqual(infourl.geturl(), url)
59        self.assertEqual(infourl.getcode(), code)
60        self.assertEqual(infourl.headers, self.test_headers)
61        self.assertEqual(infourl.url, url)
62        self.assertEqual(infourl.status, code)
63
64    def tearDown(self):
65        self.sock.close()
66
67if __name__ == '__main__':
68    unittest.main()
69