Coverage for gws-app / gws / lib / net / _test.py: 100%
72 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-03 10:12 +0100
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-03 10:12 +0100
1import gws
2import gws.lib.net as net
3import gws.lib.osx as osx
4import gws.test.util as u
7def test_parse_url():
8 url = 'http://foo.bar:1234/path/to/file.ext?lower=AA%2FBB%3ACC&UPPER=DDD#hash'
9 pp = net.parse_url(url)
10 assert isinstance(pp, net.Url)
11 assert pp.url == url
12 assert vars(pp.pathparts) == vars(osx.ParsePathResult(
13 path='/path/to/file.ext',
14 dirname='/path/to',
15 filename='file.ext',
16 stem='file',
17 extension='ext',
18 ))
19 assert pp.params == {'lower': 'AA/BB:CC', 'upper': 'DDD'}
20 assert pp.qsl == [('lower', 'AA/BB:CC'), ('UPPER', 'DDD')]
21 assert pp.fragment == 'hash'
22 assert pp.hostname == 'foo.bar'
23 assert pp.netloc == 'foo.bar:1234'
24 assert pp.password == ''
25 assert pp.port == '1234'
26 assert pp.query == 'lower=AA%2FBB%3ACC&UPPER=DDD'
27 assert pp.scheme == 'http'
28 assert pp.username == ''
29 assert pp.password == ''
32def test_make_url():
33 r = {
34 'fragment': 'hash',
35 'hostname': 'foo.bar',
36 'params': {'p1': 'AA A', 'p2': 'BB&B'},
37 'path': '/path/to/file.ext',
38 'password': 'PASS',
39 'port': '1234',
40 'scheme': 'http',
41 'username': 'USER',
42 }
43 p = net.make_url(r)
44 assert p == 'http://USER:PASS@foo.bar:1234/path/to/file.ext?p1=AA%20A&p2=BB%26B#hash'
47def test_request_ok():
48 u.mockserver.set(rf'''
49 if path == '/ok':
50 return end('HELLO')
51 ''')
52 res = net.http_request(u.mockserver.url('ok'))
53 assert (res.ok, res.status_code, res.text) == (True, 200, 'HELLO')
56def test_request_redirect_ok():
57 target_url = u.mockserver.url('ok')
58 u.mockserver.set(rf'''
59 if path == '/ok':
60 return end('HELLO')
61 if path == '/redir':
62 return end('', status=301, location={target_url!r})
63 ''')
64 res = net.http_request(u.mockserver.url('redir'))
65 assert (res.ok, res.status_code, res.text) == (True, 200, 'HELLO')
68def test_request_404():
69 res = net.http_request(u.mockserver.url('NOT_FOUND'))
70 assert (res.ok, res.status_code) == (False, 404)
73def test_request_timeout():
74 u.mockserver.set(rf'''
75 if path == '/timeout':
76 gws.u.sleep(3)
77 return end('')
78 ''')
80 res = net.http_request(u.mockserver.url('timeout'), timeout=1)
81 assert (res.ok, res.status_code) == (False, 901)
83 res = net.http_request(u.mockserver.url('timeout'), timeout=100)
84 assert (res.ok, res.status_code) == (True, 200)
87def test_request_connection_error():
88 res = net.http_request('255.255.255.255')
89 assert (res.ok, res.status_code) == (False, 999)
92def test_request_valid_response_cached():
93 u.mockserver.set(rf'''
94 if path == '/ok':
95 return end('ORIGINAL')
96 ''')
98 res = net.http_request(u.mockserver.url('ok'), max_age=3)
99 assert res.text == 'ORIGINAL'
101 u.mockserver.set(rf'''
102 if path == '/ok':
103 return end('UPDATED')
104 ''')
106 res = net.http_request(u.mockserver.url('ok'), max_age=3)
107 assert res.text == 'ORIGINAL'
109 res = net.http_request(u.mockserver.url('ok'))
110 assert res.text == 'UPDATED'
113def test_request_cache_expiration():
114 u.mockserver.set(rf'''
115 if path == '/ok':
116 return end('ORIGINAL')
117 ''')
118 res = net.http_request(u.mockserver.url('ok'), max_age=3)
119 assert res.text == 'ORIGINAL'
121 u.mockserver.set(rf'''
122 if path == '/ok':
123 return end('UPDATED')
124 ''')
126 res = net.http_request(u.mockserver.url('ok'), max_age=3)
127 assert res.text == 'ORIGINAL'
129 gws.u.sleep(4)
131 res = net.http_request(u.mockserver.url('ok'), max_age=3)
132 assert res.text == 'UPDATED'
135def test_request_invalid_response_not_cached():
136 u.mockserver.set(rf'''
137 if path == '/bad':
138 return end('ORIGINAL', 400)
139 ''')
141 res = net.http_request(u.mockserver.url('bad'), max_age=10)
142 assert res.text == 'ORIGINAL'
144 u.mockserver.set(rf'''
145 if path == '/bad':
146 return end('UPDATED', 400)
147 ''')
149 res = net.http_request(u.mockserver.url('bad'), max_age=10)
150 assert res.text == 'UPDATED'