Coverage for gws-app/gws/lib/net/_test.py: 0%
59 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1import gws
2import gws.lib.net as net
3import gws.test.util as u
6def test_parse_url():
7 url = 'http://foo.bar:1234/path/to/file.ext?lower=AA%2FBB%3ACC&UPPER=DDD#hash'
8 p = net.parse_url(url)
9 r = {
10 'fragment': 'hash',
11 'hostname': 'foo.bar',
12 'netloc': 'foo.bar:1234',
13 'params': {'lower': 'AA/BB:CC', 'upper': 'DDD'},
14 'path': '/path/to/file.ext',
15 'password': '',
16 'pathparts': {
17 'dirname': '/path/to',
18 'extension': 'ext',
19 'filename': 'file.ext',
20 'name': 'file'
21 },
22 'port': '1234',
23 'qsl': [('lower', 'AA/BB:CC'), ('UPPER', 'DDD')],
24 'query': 'lower=AA%2FBB%3ACC&UPPER=DDD',
25 'scheme': 'http',
26 'url': url,
27 'username': '',
28 }
29 assert vars(p) == r
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'