def test_get_question_empty(self): """ Test when question is empty API call """ # Required fields question = '{"total": 0, "page_size": 0, "quota_remaining": 0, "quota_max": 0, "has_more": false}' httpretty.register_uri(httpretty.GET, STACKEXCHANGE_QUESTIONS_URL, body=question, status=200) payload = { 'page': ['1'], 'pagesize': ['1'], 'order': ['desc'], 'sort': ['activity'], 'tagged': ['python'], 'site': ['stackoverflow'], 'key': ['aaa'], 'filter': [QUESTIONS_FILTER] } client = StackExchangeClient(site="stackoverflow", tagged="python", token="aaa", max_questions=1) raw_questions = [ questions for questions in client.get_questions(from_date=None) ] self.assertEqual(len(raw_questions), 1) self.assertEqual(raw_questions[0], question) self.assertDictEqual(httpretty.last_request().querystring, payload)
def test_backoff_waiting(self): """Test if the clients waits some seconds when backoff field is received""" backoff_page = read_file( 'data/stackexchange/stackexchange_question_backoff_page') question_page = read_file( 'data/stackexchange/stackexchange_question_page_2') def request_callback(method, uri, headers): params = urllib.parse.parse_qs(urllib.parse.urlparse(uri).query) page = params.get('page')[0] body = backoff_page if page == '1' else question_page return (200, headers, body) httpretty.register_uri( httpretty.GET, STACKEXCHANGE_QUESTIONS_URL, responses=[httpretty.Response(body=request_callback)]) client = StackExchangeClient(site="stackoverflow", tagged="python", token="aaa", max_questions=1) before = time.time() raw_pages = [ question for question in client.get_questions(from_date=None) ] after = time.time() self.assertEqual(len(raw_pages), 2) # backoff value harcoded in the JSON diff = after - before self.assertGreaterEqual(diff, 0.2)
def test_get_questions(self): """Test question API call""" question = read_file('data/stackexchange/stackexchange_question') httpretty.register_uri(httpretty.GET, STACKEXCHANGE_QUESTIONS_URL, body=question, status=200) payload = { 'page': ['1'], 'pagesize': ['1'], 'order': ['desc'], 'sort': ['activity'], 'tagged': ['python'], 'site': ['stackoverflow'], 'key': ['aaa'], 'filter': [QUESTIONS_FILTER] } client = StackExchangeClient(site="stackoverflow", tagged="python", token="aaa", max_questions=1) raw_questions = [ questions for questions in client.get_questions(from_date=None) ] self.assertEqual(len(raw_questions), 1) self.assertEqual(raw_questions[0], question) request = httpretty.last_request().querystring self.assertTrue(len(request), 1) self.assertDictEqual(request, payload)
def test_get_questions_from_date(self): """Test question is returned from a given date""" question = read_file('data/stackexchange/stackexchange_question') httpretty.register_uri(httpretty.GET, STACKEXCHANGE_QUESTIONS_URL, body=question, status=200) from_date_unixtime = 1456876800 + time.timezone from_date = datetime.datetime(2016, 3, 2) payload = { 'page': ['1'], 'pagesize': ['1'], 'order': ['desc'], 'sort': ['activity'], 'tagged': ['python'], 'site': ['stackoverflow'], 'key': ['aaa'], 'filter': [QUESTIONS_FILTER], 'min': [str(from_date_unixtime)] } client = StackExchangeClient(site="stackoverflow", tagged="python", token="aaa", max_questions=1) raw_questions = [questions for questions in client.get_questions(from_date=from_date)] self.assertEqual(len(raw_questions), 1) self.assertEqual(raw_questions[0], question) self.assertDictEqual(httpretty.last_request().querystring, payload)
def test_get_questions_pagination(self): """Test question API call""" page_1 = read_file('data/stackexchange/stackexchange_question_page') page_2 = read_file('data/stackexchange/stackexchange_question_page_2') http_requests = [] def request_callback(method, uri, headers): params = urllib.parse.parse_qs(urllib.parse.urlparse(uri).query) page = params.get('page')[0] body = page_1 if page == '1' else page_2 http_requests.append(httpretty.last_request()) return (200, headers, body) httpretty.register_uri(httpretty.GET, STACKEXCHANGE_QUESTIONS_URL, responses=[ httpretty.Response(body=request_callback) ]) expected = [ { 'page': ['1'], 'pagesize': ['1'], 'order': ['desc'], 'sort': ['activity'], 'tagged': ['python'], 'site': ['stackoverflow'], 'key': ['aaa'], 'filter': [QUESTIONS_FILTER] }, { 'page': ['2'], 'pagesize': ['1'], 'order': ['desc'], 'sort': ['activity'], 'tagged': ['python'], 'site': ['stackoverflow'], 'key': ['aaa'], 'filter': [QUESTIONS_FILTER] } ] client = StackExchangeClient(site="stackoverflow", tagged="python", token="aaa", max_questions=1) raw_questions = [questions for questions in client.get_questions(from_date=None)] self.assertEqual(len(raw_questions), 2) self.assertEqual(raw_questions[0], page_1) self.assertEqual(raw_questions[1], page_2) self.assertEqual(len(http_requests), len(expected)) for i in range(len(expected)): self.assertDictEqual(http_requests[i].querystring, expected[i])
def test_initialization(self): """Test whether the parameters are initialized""" client = StackExchangeClient(site="stackoverflow", tagged="python", token="aaa") self.assertEqual(client.site, "stackoverflow") self.assertEqual(client.tagged, "python") self.assertEqual(client.token, "aaa") self.assertIsNone(client.access_token) self.assertEqual(client.max_questions, MAX_QUESTIONS) self.assertTrue(client.ssl_verify) client = StackExchangeClient(site="stackoverflow", tagged="python", token="aaa", access_token="bbb", max_questions=5, ssl_verify=False) self.assertEqual(client.site, "stackoverflow") self.assertEqual(client.tagged, "python") self.assertEqual(client.token, "aaa") self.assertEqual(client.access_token, "bbb") self.assertEqual(client.max_questions, 5) self.assertFalse(client.ssl_verify)
def test_sanitize_for_archive(self): """Test whether the sanitize method works properly""" url = "http://example.com" headers = "headers-information" payload = {'order': 'desc', 'site': 'stackoverflow', 'sort': 'activity', 'pagesize': 1, 'key': 'aaa', 'filter': 'Bf*y*ByQD_upZqozgU6lXL_62USGOoV3)MFNgiHqHpmO_Y-jHR', 'page': 1, 'tagged': 'python'} s_url, s_headers, s_payload = StackExchangeClient.sanitize_for_archive(url, headers, copy.deepcopy(payload)) payload.pop("key") self.assertEqual(url, s_url) self.assertEqual(headers, s_headers) self.assertEqual(payload, s_payload)