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)