Beispiel #1
0
 def test_body_is_none_on_304(self):
     response = mock.MagicMock()
     response.status_code = 304
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     body, headers = session.request('get', 'https://example.org/test')
     assert body is None
Beispiel #2
0
 def test_waits_if_retry_after_is_forced(self):
     self.requests_mock.request.side_effect = [self.response_503,
                                               self.response_200]
     with mock.patch('kinto_http.session.time.sleep') as sleep_mocked:
         session = Session('https://example.org', retry=1, retry_after=10)
         session.request('GET', '/v1/foobar')
         sleep_mocked.assert_called_with(10)
Beispiel #3
0
 def test_forced_retry_after_overrides_value_of_header(self):
     self.response_503.headers["Retry-After"] = "27"
     self.requests_mock.request.side_effect = [self.response_503,
                                               self.response_200]
     with mock.patch('kinto_http.session.time.sleep') as sleep_mocked:
         session = Session('https://example.org', retry=1, retry_after=10)
         session.request('GET', '/v1/foobar')
         sleep_mocked.assert_called_with(10)
Beispiel #4
0
 def test_waits_if_retry_after_header_is_present(self):
     self.response_503.headers["Retry-After"] = "27"
     self.requests_mock.request.side_effect = [self.response_503,
                                               self.response_200]
     with mock.patch('kinto_http.session.time.sleep') as sleep_mocked:
         session = Session('https://example.org', retry=1)
         session.request('GET', '/v1/foobar')
         sleep_mocked.assert_called_with(27)
Beispiel #5
0
 def test_fails_if_retry_exhausted(self):
     self.requests_mock.request.side_effect = [self.response_503,
                                               self.response_503,  # retry 1
                                               self.response_503,  # retry 2
                                               self.response_200]
     session = Session('https://example.org', retry=2)
     with self.assertRaises(KintoException):
         session.request('GET', '/v1/foobar')
Beispiel #6
0
 def test_payload_is_sent_on_put_requests(self):
     response = fake_response(200)
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     session.request('put', 'https://example.org/anothertest')
     self.requests_mock.request.assert_called_with(
         'put', 'https://example.org/anothertest', json={},
         headers=self.requests_mock.request.return_value.headers)
Beispiel #7
0
 def test_no_payload_is_sent_on_get_requests(self):
     response = mock.MagicMock()
     response.status_code = 200
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     session.request('get', 'https://example.org/anothertest')
     self.requests_mock.request.assert_called_with(
         'get', 'https://example.org/anothertest')
Beispiel #8
0
 def test_user_agent_is_sent_on_requests(self):
     response = fake_response(200)
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     expected = {'User-Agent': USER_AGENT}
     session.request('get', '/test')
     self.requests_mock.request.assert_called_with(
         'get', 'https://example.org/test', headers=expected)
Beispiel #9
0
 def test_no_auth_is_used_by_default(self):
     response = fake_response(200)
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     self.assertEquals(session.auth, None)
     session.request('get', '/test')
     self.requests_mock.request.assert_called_with(
         'get', 'https://example.org/test',
         headers=self.requests_mock.request.return_value.headers)
Beispiel #10
0
 def test_session_injects_auth_on_requests(self):
     response = fake_response(200)
     self.requests_mock.request.return_value = response
     session = Session(auth=mock.sentinel.auth,
                       server_url='https://example.org')
     session.request('get', '/test')
     self.requests_mock.request.assert_called_with(
         'get', 'https://example.org/test',
         auth=mock.sentinel.auth, headers=self.requests_mock.request.return_value.headers)
Beispiel #11
0
 def test_requests_arguments_are_forwarded(self):
     response = fake_response(200)
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     session.request('get', '/test',
                     foo=mock.sentinel.bar)
     self.requests_mock.request.assert_called_with(
         'get', 'https://example.org/test',
         foo=mock.sentinel.bar, headers=self.requests_mock.request.return_value.headers)
Beispiel #12
0
 def test_no_auth_is_used_by_default(self):
     response = mock.MagicMock()
     response.status_code = 200
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     self.assertEquals(session.auth, None)
     session.request('get', '/test')
     self.requests_mock.request.assert_called_with(
         'get', 'https://example.org/test')
Beispiel #13
0
 def test_passed_data_is_encoded_to_json(self):
     response = fake_response(200)
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     session.request('post', '/test',
                     data={'foo': 'bar'})
     self.requests_mock.request.assert_called_with(
         'post', 'https://example.org/test',
         json={"data": {'foo': 'bar'}}, headers=self.requests_mock.request.return_value.headers)
Beispiel #14
0
    def test_bad_http_status_raises_exception_even_in_case_of_invalid_json_response(self):
        response = fake_response(502)
        response.json.side_effect = ValueError
        response.text = "Foobar"
        self.requests_mock.request.return_value = response
        session = Session('https://example.org')

        with pytest.raises(KintoException) as e:
            session.request('get', '/test')
        self.assertEqual(e.value.message, "502 - Foobar")
Beispiel #15
0
 def test_requests_arguments_are_forwarded(self):
     response = mock.MagicMock()
     response.status_code = 200
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     session.request('get', '/test',
                     foo=mock.sentinel.bar)
     self.requests_mock.request.assert_called_with(
         'get', 'https://example.org/test',
         foo=mock.sentinel.bar)
Beispiel #16
0
 def test_session_injects_auth_on_requests(self):
     response = mock.MagicMock()
     response.status_code = 200
     self.requests_mock.request.return_value = response
     session = Session(auth=mock.sentinel.auth,
                       server_url='https://example.org')
     session.request('get', '/test')
     self.requests_mock.request.assert_called_with(
         'get', 'https://example.org/test',
         auth=mock.sentinel.auth)
Beispiel #17
0
 def test_passed_data_is_encoded_to_json(self):
     response = mock.MagicMock()
     response.status_code = 200
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     session.request('post', '/test',
                     data={'foo': 'bar'})
     self.requests_mock.request.assert_called_with(
         'post', 'https://example.org/test',
         json={"data": {'foo': 'bar'}})
Beispiel #18
0
 def test_url_is_used_if_schema_is_present(self):
     response = fake_response(200)
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     permissions = mock.MagicMock()
     permissions.as_dict.return_value = {'foo': 'bar'}
     session.request('get', 'https://example.org/anothertest')
     self.requests_mock.request.assert_called_with(
         'get', 'https://example.org/anothertest',
         headers=self.requests_mock.request.return_value.headers)
Beispiel #19
0
 def test_passed_data_is_passed_as_is_when_files_are_posted(self):
     response = mock.MagicMock()
     response.status_code = 200
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     session.request('post', '/test',
                     data='{"foo": "bar"}',
                     files={"attachment": {"filename"}})
     self.requests_mock.request.assert_called_with(
         'post', 'https://example.org/test',
         data={"data": '{"foo": "bar"}'},
         files={"attachment": {"filename"}})
Beispiel #20
0
 def test_passed_permissions_is_added_in_the_payload(self):
     response = fake_response(200)
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     permissions = mock.MagicMock()
     permissions.as_dict.return_value = {'foo': 'bar'}
     session.request('post', '/test',
                     permissions=permissions)
     self.requests_mock.request.assert_called_with(
         'post', 'https://example.org/test',
         json={'permissions': {'foo': 'bar'}},
         headers=self.requests_mock.request.return_value.headers)
Beispiel #21
0
 def test_passed_permissions_is_added_in_the_payload(self):
     response = mock.MagicMock()
     response.status_code = 200
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     permissions = mock.MagicMock()
     permissions.as_dict.return_value = {'foo': 'bar'}
     session.request('post', '/test',
                     permissions=permissions)
     self.requests_mock.request.assert_called_with(
         'post', 'https://example.org/test',
         json={'data': {}, 'permissions': {'foo': 'bar'}})
Beispiel #22
0
 def test_passed_data_is_passed_as_is_when_files_are_posted(self):
     response = fake_response(200)
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     session.request('post', '/test',
                     data='{"foo": "bar"}',
                     files={"attachment": {"filename"}})
     self.requests_mock.request.assert_called_with(
         'post', 'https://example.org/test',
         data={"data": '{"foo": "bar"}'},
         files={"attachment": {"filename"}},
         headers=self.requests_mock.request.return_value.headers)
Beispiel #23
0
    def test_raises_exception_if_backoff_time_not_spent(self):
        response = fake_response(200)
        response.headers = {"Backoff": "60"}
        self.requests_mock.request.side_effect = [response]
        session = Session('https://example.org')

        session.request('get', '/test')  # The first call get's the Backoff
        with pytest.raises(BackoffException) as e:
            # This one raises because we made the next requests too fast.
            session.request('get', '/test')
        self.assertLessEqual(e.value.backoff, 60)
        self.assertEqual(e.value.message, "Retry after 59 seconds")
Beispiel #24
0
    def test_next_request_without_the_header_clear_the_backoff(self):
        response1 = mock.MagicMock()
        response1.headers = {"Backoff": "1"}
        response1.status_code = 200
        response2 = mock.MagicMock()
        response2.headers = {}
        response2.status_code = 200
        self.requests_mock.request.side_effect = [response1, response2]
        session = Session('https://example.org')

        session.request('get', '/test')  # The first call get's the Backoff
        self.assertGreaterEqual(session.backoff, time.time())
        time.sleep(1)  # Spend the backoff
        session.request('get', '/test')  # The second call reset the backoff
        self.assertIsNone(session.backoff)
Beispiel #25
0
 def test_body_is_none_on_304(self):
     response = fake_response(304)
     self.requests_mock.request.return_value = response
     session = Session("https://example.org")
     body, headers = session.request("get", "https://example.org/test")
     assert body is None
Beispiel #26
0
class SessionJSONTest(unittest.TestCase):
    def setUp(self):
        p = mock.patch("kinto_http.session.requests")
        self.requests_mock = p.start()
        self.addCleanup(p.stop)
        self.requests_mock.request.headers = {"User-Agent": USER_AGENT}
        self.requests_mock.request.post_json_headers = {
            "User-Agent": USER_AGENT,
            "Content-Type": "application/json",
        }
        self.requests_mock.request.return_value = fake_response(200)
        self.session = Session("https://example.org")

    def test_passed_datetime_data_is_encoded_to_json(self):
        self.session.request("post", "/test", data={"foo": datetime(2018, 6, 22, 18, 00)})
        self.requests_mock.request.assert_called_with(
            "post",
            "https://example.org/test",
            data='{"data": {"foo": "2018-06-22T18:00:00"}}',
            headers=self.requests_mock.request.post_json_headers,
        )

    def test_passed_random_python_data_fails_to_be_encoded_to_json(self):
        with pytest.raises(TypeError) as exc:
            self.session.request("post", "/test", data={"foo": object()})
        assert str(exc.value) == "Type <class 'object'> is not serializable"

    def test_passed_date_data_is_encoded_to_json(self):
        self.session.request("post", "/test", data={"foo": date(2018, 6, 22)})
        self.requests_mock.request.assert_called_with(
            "post",
            "https://example.org/test",
            data='{"data": {"foo": "2018-06-22"}}',
            headers=self.requests_mock.request.post_json_headers,
        )

    def test_request_converts_params(self):
        response = mock.MagicMock()
        response.headers = {}
        response.status_code = 200
        self.requests_mock.request.return_value = response
        self.session.request(
            "get",
            "/v1/buckets/buck/collections/coll/records",
            params=dict(
                _sort="-published_date",
                is_published=True,
                price=12,
                contains_id=["toto", "tata"],
                in_id=["toto", "tata"],
                exclude_id=["titi", "tutu"],
            ),
        )
        self.requests_mock.request.assert_called_with(
            "get",
            "https://example.org/v1/buckets/buck/collections/coll/records",
            params={
                "_sort": "-published_date",
                "is_published": "true",
                "price": "12",
                "contains_id": '["toto", "tata"]',
                "in_id": "toto,tata",
                "exclude_id": "titi,tutu",
            },
            headers=self.requests_mock.request.headers,
        )
    def test_raises_exception_if_headers_not_dict(self):
        session = Session('https://example.org')

        with pytest.raises(TypeError):
            session.request('get', '/test', headers=4)
Beispiel #28
0
 def test_does_not_retry_by_default(self):
     session = Session("https://example.org")
     with self.assertRaises(KintoException):
         session.request("GET", "/v1/foobar")
Beispiel #29
0
 def test_does_not_retry_on_400_errors(self):
     self.requests_mock.request.side_effect = [self.response_403]
     session = Session('https://example.org', retry=1)
     with self.assertRaises(KintoException):
         session.request('GET', '/v1/foobar')
Beispiel #30
0
 def test_does_not_retry_by_default(self):
     session = Session('https://example.org')
     with self.assertRaises(KintoException):
         session.request('GET', '/v1/foobar')
Beispiel #31
0
 def test_can_retry_several_times(self):
     self.requests_mock.request.side_effect = [self.response_503,
                                               self.response_503,  # retry 1
                                               self.response_200]  # retry 2
     session = Session('https://example.org', retry=2)
     session.request('GET', '/v1/foobar')  # Not raising.
Beispiel #32
0
 def test_uses_specified_server_url(self):
     session = Session(mock.sentinel.server_url)
     self.assertEqual(session.server_url, mock.sentinel.server_url)
Beispiel #33
0
 def test_succeeds_on_retry(self):
     self.requests_mock.request.side_effect = [self.response_503,
                                               self.response_200]  # retry 1
     session = Session('https://example.org', retry=1)
     session.request('GET', '/v1/foobar')  # Not raising.
Beispiel #34
0
 def test_does_not_retry_if_successful(self):
     self.requests_mock.request.side_effect = [self.response_200,
                                               self.response_403]  # retry 1
     session = Session('https://example.org', retry=1)
     session.request('GET', '/v1/foobar')  # Not raising.
Beispiel #35
0
 def test_does_not_retry_by_default(self):
     session = Session('https://example.org')
     with self.assertRaises(KintoException):
         session.request('GET', '/v1/foobar')
Beispiel #36
0
 def test_does_not_retry_on_400_errors(self):
     self.requests_mock.request.side_effect = [self.response_403]
     session = Session('https://example.org', retry=1)
     with self.assertRaises(KintoException):
         session.request('GET', '/v1/foobar')
Beispiel #37
0
 def test_succeeds_on_retry(self):
     self.requests_mock.request.side_effect = [self.response_503, self.response_200]  # retry 1
     session = Session("https://example.org", retry=1)
     session.request("GET", "/v1/foobar")  # Not raising.
Beispiel #38
0
 def test_can_retry_several_times(self):
     self.requests_mock.request.side_effect = [self.response_503,
                                               self.response_503,  # retry 1
                                               self.response_200]  # retry 2
     session = Session('https://example.org', retry=2)
     session.request('GET', '/v1/foobar')  # Not raising.
Beispiel #39
0
 def test_does_not_retry_if_successful(self):
     self.requests_mock.request.side_effect = [self.response_200, self.response_403]  # retry 1
     session = Session("https://example.org", retry=1)
     session.request("GET", "/v1/foobar")  # Not raising.
 def test_retries_on_409_errors(self):
     self.requests_mock.request.side_effect = [
         self.response_409, self.response_200
     ]
     session = Session('https://example.org', retry=1)
     session.request('GET', '/v1/foobar')  # Not raising.
Beispiel #41
0
 def test_body_is_none_on_304(self):
     response = fake_response(304)
     self.requests_mock.request.return_value = response
     session = Session('https://example.org')
     body, headers = session.request('get', 'https://example.org/test')
     assert body is None