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

1import gws 

2import gws.lib.net as net 

3import gws.lib.osx as osx 

4import gws.test.util as u 

5 

6 

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 == '' 

30 

31 

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' 

45 

46 

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') 

54 

55 

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') 

66 

67 

68def test_request_404(): 

69 res = net.http_request(u.mockserver.url('NOT_FOUND')) 

70 assert (res.ok, res.status_code) == (False, 404) 

71 

72 

73def test_request_timeout(): 

74 u.mockserver.set(rf''' 

75 if path == '/timeout': 

76 gws.u.sleep(3) 

77 return end('') 

78 ''') 

79 

80 res = net.http_request(u.mockserver.url('timeout'), timeout=1) 

81 assert (res.ok, res.status_code) == (False, 901) 

82 

83 res = net.http_request(u.mockserver.url('timeout'), timeout=100) 

84 assert (res.ok, res.status_code) == (True, 200) 

85 

86 

87def test_request_connection_error(): 

88 res = net.http_request('255.255.255.255') 

89 assert (res.ok, res.status_code) == (False, 999) 

90 

91 

92def test_request_valid_response_cached(): 

93 u.mockserver.set(rf''' 

94 if path == '/ok': 

95 return end('ORIGINAL') 

96 ''') 

97 

98 res = net.http_request(u.mockserver.url('ok'), max_age=3) 

99 assert res.text == 'ORIGINAL' 

100 

101 u.mockserver.set(rf''' 

102 if path == '/ok': 

103 return end('UPDATED') 

104 ''') 

105 

106 res = net.http_request(u.mockserver.url('ok'), max_age=3) 

107 assert res.text == 'ORIGINAL' 

108 

109 res = net.http_request(u.mockserver.url('ok')) 

110 assert res.text == 'UPDATED' 

111 

112 

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' 

120 

121 u.mockserver.set(rf''' 

122 if path == '/ok': 

123 return end('UPDATED') 

124 ''') 

125 

126 res = net.http_request(u.mockserver.url('ok'), max_age=3) 

127 assert res.text == 'ORIGINAL' 

128 

129 gws.u.sleep(4) 

130 

131 res = net.http_request(u.mockserver.url('ok'), max_age=3) 

132 assert res.text == 'UPDATED' 

133 

134 

135def test_request_invalid_response_not_cached(): 

136 u.mockserver.set(rf''' 

137 if path == '/bad': 

138 return end('ORIGINAL', 400) 

139 ''') 

140 

141 res = net.http_request(u.mockserver.url('bad'), max_age=10) 

142 assert res.text == 'ORIGINAL' 

143 

144 u.mockserver.set(rf''' 

145 if path == '/bad': 

146 return end('UPDATED', 400) 

147 ''') 

148 

149 res = net.http_request(u.mockserver.url('bad'), max_age=10) 

150 assert res.text == 'UPDATED'