test_adapter.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. # Licensed under the Apache License, Version 2.0 (the "License"); you may
  2. # not use this file except in compliance with the License. You may obtain
  3. # a copy of the License at
  4. #
  5. # https://www.apache.org/licenses/LICENSE-2.0
  6. #
  7. # Unless required by applicable law or agreed to in writing, software
  8. # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  9. # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  10. # License for the specific language governing permissions and limitations
  11. # under the License.
  12. import http.client
  13. import io
  14. import json
  15. import re
  16. import urllib.parse
  17. import purl
  18. import requests
  19. from urllib3 import HTTPResponse
  20. import requests_mock
  21. from . import base
  22. class MyExc(Exception):
  23. pass
  24. class SessionAdapterTests(base.TestCase):
  25. PREFIX = "mock"
  26. def setUp(self):
  27. super(SessionAdapterTests, self).setUp()
  28. self.adapter = requests_mock.Adapter()
  29. self.session = requests.Session()
  30. self.session.mount(self.PREFIX, self.adapter)
  31. self.url = '%s://example.com/test' % self.PREFIX
  32. self.headers = {'header_a': 'A', 'header_b': 'B'}
  33. def assertHeaders(self, resp):
  34. for k, v in self.headers.items():
  35. self.assertEqual(v, resp.headers[k])
  36. def assertLastRequest(self, method='GET', body=None):
  37. self.assertEqual(self.url, self.adapter.last_request.url)
  38. self.assertEqual(method, self.adapter.last_request.method)
  39. self.assertEqual(body, self.adapter.last_request.body)
  40. url_parts = urllib.parse.urlparse(self.url)
  41. qs = urllib.parse.parse_qs(url_parts.query)
  42. self.assertEqual(url_parts.scheme, self.adapter.last_request.scheme)
  43. self.assertEqual(url_parts.netloc, self.adapter.last_request.netloc)
  44. self.assertEqual(url_parts.path, self.adapter.last_request.path)
  45. self.assertEqual(url_parts.query, self.adapter.last_request.query)
  46. self.assertEqual(url_parts.query, self.adapter.last_request.query)
  47. self.assertEqual(qs, self.adapter.last_request.qs)
  48. def test_content(self):
  49. data = b'testdata'
  50. self.adapter.register_uri('GET',
  51. self.url,
  52. content=data,
  53. headers=self.headers)
  54. resp = self.session.get(self.url)
  55. self.assertEqual(data, resp.content)
  56. self.assertHeaders(resp)
  57. self.assertLastRequest()
  58. def test_content_callback(self):
  59. status_code = 401
  60. data = b'testdata'
  61. def _content_cb(request, context):
  62. context.status_code = status_code
  63. context.headers.update(self.headers)
  64. return data
  65. self.adapter.register_uri('GET',
  66. self.url,
  67. content=_content_cb)
  68. resp = self.session.get(self.url)
  69. self.assertEqual(status_code, resp.status_code)
  70. self.assertEqual(data, resp.content)
  71. self.assertHeaders(resp)
  72. self.assertLastRequest()
  73. def test_text(self):
  74. data = u'testdata'
  75. self.adapter.register_uri('GET',
  76. self.url,
  77. text=data,
  78. headers=self.headers)
  79. resp = self.session.get(self.url)
  80. self.assertEqual(data.encode('utf-8'), resp.content)
  81. self.assertEqual(data, resp.text)
  82. self.assertEqual('utf-8', resp.encoding)
  83. self.assertHeaders(resp)
  84. self.assertLastRequest()
  85. def test_text_callback(self):
  86. status_code = 401
  87. data = u'testdata'
  88. def _text_cb(request, context):
  89. context.status_code = status_code
  90. context.headers.update(self.headers)
  91. return data
  92. self.adapter.register_uri('GET', self.url, text=_text_cb)
  93. resp = self.session.get(self.url)
  94. self.assertEqual(status_code, resp.status_code)
  95. self.assertEqual(data, resp.text)
  96. self.assertEqual(data.encode('utf-8'), resp.content)
  97. self.assertEqual('utf-8', resp.encoding)
  98. self.assertHeaders(resp)
  99. self.assertLastRequest()
  100. def test_raw_callback(self):
  101. status_code = 401
  102. data = 'testdata'
  103. def _raw_cb(request, context):
  104. return HTTPResponse(
  105. status=status_code,
  106. headers=self.headers,
  107. body=io.BytesIO(data.encode('utf-8')),
  108. preload_content=False,
  109. reason=http.client.responses.get(status_code),
  110. )
  111. self.adapter.register_uri('GET', self.url, raw=_raw_cb)
  112. resp = self.session.get(self.url)
  113. self.assertEqual(status_code, resp.status_code)
  114. self.assertEqual(data, resp.text)
  115. self.assertEqual(data.encode('utf-8'), resp.content)
  116. self.assertHeaders(resp)
  117. self.assertLastRequest()
  118. def test_json(self):
  119. json_data = {'hello': 'world'}
  120. self.adapter.register_uri('GET',
  121. self.url,
  122. json=json_data,
  123. headers=self.headers)
  124. resp = self.session.get(self.url)
  125. self.assertEqual(b'{"hello": "world"}', resp.content)
  126. self.assertEqual(u'{"hello": "world"}', resp.text)
  127. self.assertEqual(json_data, resp.json())
  128. self.assertEqual('utf-8', resp.encoding)
  129. self.assertHeaders(resp)
  130. self.assertLastRequest()
  131. def test_json_callback(self):
  132. status_code = 401
  133. json_data = {'hello': 'world'}
  134. data = u'{"hello": "world"}'
  135. def _json_cb(request, context):
  136. context.status_code = status_code
  137. context.headers.update(self.headers)
  138. return json_data
  139. self.adapter.register_uri('GET', self.url, json=_json_cb)
  140. resp = self.session.get(self.url)
  141. self.assertEqual(status_code, resp.status_code)
  142. self.assertEqual(json_data, resp.json())
  143. self.assertEqual(data, resp.text)
  144. self.assertEqual(data.encode('utf-8'), resp.content)
  145. self.assertEqual('utf-8', resp.encoding)
  146. self.assertHeaders(resp)
  147. self.assertLastRequest()
  148. def test_no_body(self):
  149. self.adapter.register_uri('GET', self.url)
  150. resp = self.session.get(self.url)
  151. self.assertEqual(b'', resp.content)
  152. self.assertEqual(200, resp.status_code)
  153. def test_multiple_body_elements(self):
  154. self.assertRaises(RuntimeError,
  155. self.adapter.register_uri,
  156. self.url,
  157. 'GET',
  158. content=b'b',
  159. text=u'u')
  160. def test_multiple_responses(self):
  161. inp = [{'status_code': 400, 'text': 'abcd'},
  162. {'status_code': 300, 'text': 'defg'},
  163. {'status_code': 200, 'text': 'hijk'}]
  164. self.adapter.register_uri('GET', self.url, inp)
  165. out = [self.session.get(self.url) for i in range(0, len(inp))]
  166. for i, o in zip(inp, out):
  167. for k, v in i.items():
  168. self.assertEqual(v, getattr(o, k))
  169. last = self.session.get(self.url)
  170. for k, v in inp[-1].items():
  171. self.assertEqual(v, getattr(last, k))
  172. def test_callback_optional_status(self):
  173. headers = {'a': 'b'}
  174. def _test_cb(request, context):
  175. context.headers.update(headers)
  176. return ''
  177. self.adapter.register_uri('GET',
  178. self.url,
  179. text=_test_cb,
  180. status_code=300)
  181. resp = self.session.get(self.url)
  182. self.assertEqual(300, resp.status_code)
  183. for k, v in headers.items():
  184. self.assertEqual(v, resp.headers[k])
  185. def test_callback_optional_headers(self):
  186. headers = {'a': 'b'}
  187. def _test_cb(request, context):
  188. context.status_code = 300
  189. return ''
  190. self.adapter.register_uri('GET',
  191. self.url,
  192. text=_test_cb,
  193. headers=headers)
  194. resp = self.session.get(self.url)
  195. self.assertEqual(300, resp.status_code)
  196. for k, v in headers.items():
  197. self.assertEqual(v, resp.headers[k])
  198. def test_latest_register_overrides(self):
  199. self.adapter.register_uri('GET', self.url, text='abc')
  200. self.adapter.register_uri('GET', self.url, text='def')
  201. resp = self.session.get(self.url)
  202. self.assertEqual('def', resp.text)
  203. def test_no_last_request(self):
  204. self.assertIsNone(self.adapter.last_request)
  205. self.assertEqual(0, len(self.adapter.request_history))
  206. def test_dont_pass_list_and_kwargs(self):
  207. self.assertRaises(RuntimeError,
  208. self.adapter.register_uri,
  209. 'GET',
  210. self.url,
  211. [{'text': 'a'}],
  212. headers={'a': 'b'})
  213. def test_empty_string_return(self):
  214. # '' evaluates as False, so make sure an empty string is not ignored.
  215. self.adapter.register_uri('GET', self.url, text='')
  216. resp = self.session.get(self.url)
  217. self.assertEqual('', resp.text)
  218. def test_dont_pass_multiple_bodies(self):
  219. self.assertRaises(RuntimeError,
  220. self.adapter.register_uri,
  221. 'GET',
  222. self.url,
  223. json={'abc': 'def'},
  224. text='ghi')
  225. def test_dont_pass_unexpected_kwargs(self):
  226. self.assertRaises(TypeError,
  227. self.adapter.register_uri,
  228. 'GET',
  229. self.url,
  230. unknown='argument')
  231. def test_dont_pass_unicode_as_content(self):
  232. self.assertRaises(TypeError,
  233. self.adapter.register_uri,
  234. 'GET',
  235. self.url,
  236. content=u'unicode')
  237. def test_dont_pass_empty_string_as_content(self):
  238. self.assertRaises(TypeError,
  239. self.adapter.register_uri,
  240. 'GET',
  241. self.url,
  242. content=u'')
  243. def test_dont_pass_bytes_as_text(self):
  244. self.assertRaises(TypeError,
  245. self.adapter.register_uri,
  246. 'GET',
  247. self.url,
  248. text=b'bytes')
  249. def test_dont_pass_empty_string_as_text(self):
  250. self.assertRaises(TypeError,
  251. self.adapter.register_uri,
  252. 'GET',
  253. self.url,
  254. text=b'')
  255. def test_dont_pass_non_str_as_content(self):
  256. self.assertRaises(TypeError,
  257. self.adapter.register_uri,
  258. 'GET',
  259. self.url,
  260. content=5)
  261. def test_dont_pass_non_str_as_text(self):
  262. self.assertRaises(TypeError,
  263. self.adapter.register_uri,
  264. 'GET',
  265. self.url,
  266. text=5)
  267. def test_with_any_method(self):
  268. self.adapter.register_uri(requests_mock.ANY, self.url, text='resp')
  269. for m in ('GET', 'HEAD', 'POST', 'UNKNOWN'):
  270. resp = self.session.request(m, self.url)
  271. self.assertEqual('resp', resp.text)
  272. def test_with_any_url(self):
  273. self.adapter.register_uri('GET', requests_mock.ANY, text='resp')
  274. for u in ('mock://a', 'mock://b', 'mock://c'):
  275. resp = self.session.get(u)
  276. self.assertEqual('resp', resp.text)
  277. def test_with_regexp(self):
  278. self.adapter.register_uri('GET', re.compile('tester.com'), text='resp')
  279. for u in ('mock://www.tester.com/a', 'mock://abc.tester.com'):
  280. resp = self.session.get(u)
  281. self.assertEqual('resp', resp.text)
  282. def test_with_purl(self):
  283. self.adapter.register_uri('GET',
  284. purl.URL('mock://www.tester.com/a'),
  285. text='resp')
  286. resp = self.session.get('mock://www.tester.com/a')
  287. self.assertEqual('resp', resp.text)
  288. def test_requests_in_history_on_no_match(self):
  289. self.assertRaises(requests_mock.NoMockAddress,
  290. self.session.get,
  291. self.url)
  292. self.assertEqual(self.url, self.adapter.last_request.url)
  293. def test_requests_in_history_on_exception(self):
  294. def _test_cb(request, ctx):
  295. raise MyExc()
  296. self.adapter.register_uri('GET', self.url, text=_test_cb)
  297. self.assertRaises(MyExc,
  298. self.session.get,
  299. self.url)
  300. self.assertEqual(self.url, self.adapter.last_request.url)
  301. def test_not_called_and_called_count(self):
  302. m = self.adapter.register_uri('GET', self.url, text='resp')
  303. self.assertEqual(0, m.call_count)
  304. self.assertFalse(m.called)
  305. self.assertFalse(m.called_once)
  306. self.assertEqual(0, self.adapter.call_count)
  307. self.assertFalse(self.adapter.called)
  308. self.assertFalse(m.called_once)
  309. def test_called_and_called_count(self):
  310. m = self.adapter.register_uri('GET', self.url, text='resp')
  311. resps = [self.session.get(self.url) for i in range(0, 3)]
  312. for r in resps:
  313. self.assertEqual('resp', r.text)
  314. self.assertEqual(200, r.status_code)
  315. self.assertEqual(len(resps), m.call_count)
  316. self.assertTrue(m.called)
  317. self.assertFalse(m.called_once)
  318. self.assertEqual(len(resps), self.adapter.call_count)
  319. self.assertTrue(self.adapter.called)
  320. self.assertFalse(m.called_once)
  321. def test_reset_reverts_call_count(self):
  322. # Create matchers and add calls to history
  323. call_count = 3
  324. matcher_count = 3
  325. for i in range(matcher_count):
  326. url = self.url + str(i)
  327. self.adapter.register_uri('GET', url, text='resp')
  328. for _ in range(call_count):
  329. self.session.get(url)
  330. # Verify call counts on adapter and matchers
  331. self.assertEqual(self.adapter.call_count, matcher_count * call_count)
  332. for matcher in self.adapter._matchers:
  333. self.assertEqual(matcher.call_count, call_count)
  334. self.adapter.reset()
  335. # Verify call counts are 0 after reset
  336. self.assertEqual(self.adapter.call_count, 0)
  337. for matcher in self.adapter._matchers:
  338. self.assertEqual(matcher.call_count, 0)
  339. def test_adapter_picks_correct_adapter(self):
  340. good = '%s://test3.url/' % self.PREFIX
  341. self.adapter.register_uri('GET',
  342. '%s://test1.url' % self.PREFIX,
  343. text='bad')
  344. self.adapter.register_uri('GET',
  345. '%s://test2.url' % self.PREFIX,
  346. text='bad')
  347. self.adapter.register_uri('GET', good, text='good')
  348. self.adapter.register_uri('GET',
  349. '%s://test4.url' % self.PREFIX,
  350. text='bad')
  351. resp = self.session.get(good)
  352. self.assertEqual('good', resp.text)
  353. def test_adapter_is_connection(self):
  354. url = '%s://test.url' % self.PREFIX
  355. text = 'text'
  356. self.adapter.register_uri('GET', url, text=text)
  357. resp = self.session.get(url)
  358. self.assertEqual(text, resp.text)
  359. self.assertIs(self.adapter, resp.connection)
  360. def test_send_to_connection(self):
  361. url1 = '%s://test1.url/' % self.PREFIX
  362. url2 = '%s://test2.url/' % self.PREFIX
  363. text1 = 'text1'
  364. text2 = 'text2'
  365. self.adapter.register_uri('GET', url1, text=text1)
  366. self.adapter.register_uri('GET', url2, text=text2)
  367. req = requests.Request(method='GET', url=url2).prepare()
  368. resp1 = self.session.get(url1)
  369. self.assertEqual(text1, resp1.text)
  370. resp2 = resp1.connection.send(req)
  371. self.assertEqual(text2, resp2.text)
  372. def test_request_json_with_str_data(self):
  373. dict_req = {'hello': 'world'}
  374. dict_resp = {'goodbye': 'world'}
  375. m = self.adapter.register_uri('POST', self.url, json=dict_resp)
  376. data = json.dumps(dict_req)
  377. resp = self.session.post(self.url, data=data)
  378. self.assertIs(data, m.last_request.body)
  379. self.assertEqual(dict_resp, resp.json())
  380. self.assertEqual(dict_req, m.last_request.json())
  381. def test_request_json_with_bytes_data(self):
  382. dict_req = {'hello': 'world'}
  383. dict_resp = {'goodbye': 'world'}
  384. m = self.adapter.register_uri('POST', self.url, json=dict_resp)
  385. data = json.dumps(dict_req).encode('utf-8')
  386. resp = self.session.post(self.url, data=data)
  387. self.assertIs(data, m.last_request.body)
  388. self.assertEqual(dict_resp, resp.json())
  389. self.assertEqual(dict_req, m.last_request.json())
  390. def test_request_json_with_cb(self):
  391. dict_req = {'hello': 'world'}
  392. dict_resp = {'goodbye': 'world'}
  393. data = json.dumps(dict_req)
  394. def _cb(req, context):
  395. self.assertEqual(dict_req, req.json())
  396. return dict_resp
  397. m = self.adapter.register_uri('POST', self.url, json=_cb)
  398. resp = self.session.post(self.url, data=data)
  399. self.assertEqual(1, m.call_count)
  400. self.assertTrue(m.called_once)
  401. self.assertEqual(dict_resp, resp.json())
  402. def test_raises_exception(self):
  403. self.adapter.register_uri('GET', self.url, exc=MyExc)
  404. self.assertRaises(MyExc,
  405. self.session.get,
  406. self.url)
  407. self.assertTrue(self.adapter.called_once)
  408. self.assertEqual(self.url, self.adapter.last_request.url)
  409. def test_raises_exception_with_body_args_fails(self):
  410. self.assertRaises(TypeError,
  411. self.adapter.register_uri,
  412. 'GET',
  413. self.url,
  414. exc=MyExc,
  415. text='fail')
  416. def test_sets_request_matcher_in_history(self):
  417. url1 = '%s://test1.url/' % self.PREFIX
  418. url2 = '%s://test2.url/' % self.PREFIX
  419. text1 = 'text1'
  420. text2 = 'text2'
  421. m1 = self.adapter.register_uri('GET', url1, text=text1)
  422. m2 = self.adapter.register_uri('GET', url2, text=text2)
  423. resp1 = self.session.get(url1)
  424. resp2 = self.session.get(url2)
  425. self.assertEqual(text1, resp1.text)
  426. self.assertEqual(text2, resp2.text)
  427. self.assertEqual(2, self.adapter.call_count)
  428. self.assertFalse(self.adapter.called_once)
  429. self.assertEqual(url1, self.adapter.request_history[0].url)
  430. self.assertEqual(url2, self.adapter.request_history[1].url)
  431. self.assertIs(m1, self.adapter.request_history[0].matcher)
  432. self.assertIs(m2, self.adapter.request_history[1].matcher)
  433. def test_sets_request_matcher_on_exception(self):
  434. m = self.adapter.register_uri('GET', self.url, exc=MyExc)
  435. self.assertRaises(MyExc,
  436. self.session.get,
  437. self.url)
  438. self.assertEqual(self.url, self.adapter.last_request.url)
  439. self.assertIs(m, self.adapter.last_request.matcher)
  440. def test_cookies_from_header(self):
  441. headers = {'Set-Cookie': 'fig=newton; Path=/test; domain=.example.com'}
  442. self.adapter.register_uri('GET',
  443. self.url,
  444. text='text',
  445. headers=headers)
  446. resp = self.session.get(self.url)
  447. self.assertEqual('newton', resp.cookies['fig'])
  448. self.assertEqual(['/test'], resp.cookies.list_paths())
  449. self.assertEqual(['.example.com'], resp.cookies.list_domains())
  450. def test_cookies_from_dict(self):
  451. # This is a syntax we get from requests. I'm not sure i like it.
  452. self.adapter.register_uri('GET',
  453. self.url,
  454. text='text',
  455. cookies={'fig': 'newton', 'sugar': 'apple'})
  456. resp = self.session.get(self.url)
  457. self.assertEqual('newton', resp.cookies['fig'])
  458. self.assertEqual('apple', resp.cookies['sugar'])
  459. def test_cookies_with_jar(self):
  460. jar = requests_mock.CookieJar()
  461. jar.set('fig', 'newton', path='/foo', domain='.example.com')
  462. jar.set('sugar', 'apple', path='/bar', domain='.example.com')
  463. self.adapter.register_uri('GET', self.url, text='text', cookies=jar)
  464. resp = self.session.get(self.url)
  465. self.assertEqual('newton', resp.cookies['fig'])
  466. self.assertEqual('apple', resp.cookies['sugar'])
  467. self.assertEqual({'/foo', '/bar'}, set(resp.cookies.list_paths()))
  468. self.assertEqual(['.example.com'], resp.cookies.list_domains())
  469. def test_cookies_header_with_cb(self):
  470. def _cb(request, context):
  471. val = 'fig=newton; Path=/test; domain=.example.com'
  472. context.headers['Set-Cookie'] = val
  473. return 'text'
  474. self.adapter.register_uri('GET', self.url, text=_cb)
  475. resp = self.session.get(self.url)
  476. self.assertEqual('newton', resp.cookies['fig'])
  477. self.assertEqual(['/test'], resp.cookies.list_paths())
  478. self.assertEqual(['.example.com'], resp.cookies.list_domains())
  479. def test_cookies_from_dict_with_cb(self):
  480. def _cb(request, context):
  481. # converted into a jar by now
  482. context.cookies.set('sugar', 'apple', path='/test')
  483. return 'text'
  484. self.adapter.register_uri('GET',
  485. self.url,
  486. text=_cb,
  487. cookies={'fig': 'newton'})
  488. resp = self.session.get(self.url)
  489. self.assertEqual('newton', resp.cookies['fig'])
  490. self.assertEqual('apple', resp.cookies['sugar'])
  491. self.assertEqual(['/', '/test'], resp.cookies.list_paths())
  492. def test_cookies_with_jar_cb(self):
  493. def _cb(request, context):
  494. context.cookies.set('sugar',
  495. 'apple',
  496. path='/bar',
  497. domain='.example.com')
  498. return 'text'
  499. jar = requests_mock.CookieJar()
  500. jar.set('fig', 'newton', path='/foo', domain='.example.com')
  501. self.adapter.register_uri('GET', self.url, text=_cb, cookies=jar)
  502. resp = self.session.get(self.url)
  503. self.assertEqual('newton', resp.cookies['fig'])
  504. self.assertEqual('apple', resp.cookies['sugar'])
  505. self.assertEqual({'/foo', '/bar'}, set(resp.cookies.list_paths()))
  506. self.assertEqual(['.example.com'], resp.cookies.list_domains())
  507. def test_reading_closed_fp(self):
  508. self.adapter.register_uri('GET', self.url, text='abc')
  509. resp = self.session.get(self.url)
  510. # raw will have been closed during the request reading
  511. self.assertTrue(resp.raw.closed)
  512. data = resp.raw.read()
  513. self.assertIsInstance(data, bytes)
  514. self.assertEqual(0, len(data))
  515. def test_case_sensitive_headers(self):
  516. data = 'testdata'
  517. headers = {'aBcDe': 'FgHiJ'}
  518. self.adapter.register_uri('GET', self.url, text=data)
  519. resp = self.session.get(self.url, headers=headers)
  520. self.assertEqual('GET', self.adapter.last_request.method)
  521. self.assertEqual(200, resp.status_code)
  522. self.assertEqual(data, resp.text)
  523. for k, v in headers.items():
  524. self.assertEqual(v, self.adapter.last_request.headers[k])
  525. def test_case_sensitive_history(self):
  526. self.adapter._case_sensitive = True
  527. data = 'testdata'
  528. netloc = 'examPlE.CoM'
  529. path = '/TesTER'
  530. query = 'aBC=deF'
  531. mock_url = '%s://%s%s' % (self.PREFIX, netloc.lower(), path)
  532. request_url = '%s://%s%s?%s' % (self.PREFIX, netloc, path, query)
  533. # test that the netloc is ignored when actually making the request
  534. self.adapter.register_uri('GET', mock_url, text=data)
  535. resp = self.session.get(request_url)
  536. self.assertEqual('GET', self.adapter.last_request.method)
  537. self.assertEqual(200, resp.status_code)
  538. self.assertEqual(data, resp.text)
  539. # but even still the mixed case parameters come out in history
  540. self.assertEqual(netloc, self.adapter.last_request.netloc)
  541. self.assertEqual(path, self.adapter.last_request.path)
  542. self.assertEqual(query, self.adapter.last_request.query)
  543. def test_stream_none(self):
  544. text = 'hello world'
  545. self.adapter.register_uri('GET',
  546. self.url,
  547. text=text,
  548. headers=self.headers)
  549. resp = self.session.get(self.url, stream=True)
  550. resps = [c for c in resp.iter_content(None, decode_unicode=True)]
  551. self.assertEqual([text], resps)
  552. def test_stream_size(self):
  553. text = 'hello world'
  554. self.adapter.register_uri('GET',
  555. self.url,
  556. text=text,
  557. headers=self.headers)
  558. resp = self.session.get(self.url, stream=True)
  559. resps = [c for c in resp.iter_content(3, decode_unicode=True)]
  560. self.assertEqual(['hel', 'lo ', 'wor', 'ld'], resps)