def test_online_query_year(self):
        cisco_eox_api = CiscoEoxApi()

        with pytest.raises(CiscoApiCallFailed):
            cisco_eox_api.query_year(self.TEST_YEAR, 1)

        cisco_eox_api.load_client_credentials()
        cisco_eox_api.create_temporary_access_token()

        assert cisco_eox_api.amount_of_pages() == 0
        assert cisco_eox_api.get_current_page() == 0
        assert cisco_eox_api.amount_of_total_records() == 0
        assert cisco_eox_api.get_page_record_count() == 0

        _ = cisco_eox_api.query_year(self.TEST_YEAR, 1)

        assert cisco_eox_api.amount_of_pages() == 14
        assert cisco_eox_api.get_current_page() == 1
        assert cisco_eox_api.amount_of_total_records() >= 13203
        assert cisco_eox_api.get_page_record_count() == 1000
        assert cisco_eox_api.has_api_error() is False
Beispiel #2
0
    def test_online_query_year(self):
        cisco_eox_api = CiscoEoxApi()

        with pytest.raises(CiscoApiCallFailed):
            cisco_eox_api.query_year(self.TEST_YEAR, 1)

        cisco_eox_api.load_client_credentials()
        cisco_eox_api.create_temporary_access_token()

        assert cisco_eox_api.amount_of_pages() == 0
        assert cisco_eox_api.get_current_page() == 0
        assert cisco_eox_api.amount_of_total_records() == 0
        assert cisco_eox_api.get_page_record_count() == 0

        _ = cisco_eox_api.query_year(self.TEST_YEAR, 1)

        # the response for the year is not stable over time, so just check that something was provided
        assert cisco_eox_api.amount_of_pages() > 2
        assert cisco_eox_api.get_current_page() == 1
        assert cisco_eox_api.amount_of_total_records() >= 1001
        assert cisco_eox_api.get_page_record_count() == 1000
        assert cisco_eox_api.has_api_error() is False
    def test_offline_query_year(self, monkeypatch):
        class MockSession:
            def get(self, *args, **kwargs):
                r = Response()
                r.status_code = 200
                with open(
                        "app/ciscoeox/tests/data/cisco_eox_response_page_1_of_1.json"
                ) as f:
                    r._content = f.read().encode("utf-8")
                return r

        monkeypatch.setattr(requests, "Session", MockSession)

        cisco_eox_api = CiscoEoxApi()
        monkeypatch.setattr(
            cisco_eox_api,
            "create_temporary_access_token",
            lambda force_new_token=True: mock_access_token_generation())
        cisco_eox_api.load_client_credentials()
        cisco_eox_api.create_temporary_access_token()

        assert cisco_eox_api.get_eox_records() == []
        assert cisco_eox_api.amount_of_pages() == 0
        assert cisco_eox_api.get_current_page() == 0
        assert cisco_eox_api.amount_of_total_records() == 0
        assert cisco_eox_api.get_page_record_count() == 0

        jresult = cisco_eox_api.query_year(self.TEST_YEAR, 1)

        assert "EOXRecord" in jresult
        assert "PaginationResponseRecord" in jresult
        assert len(jresult["EOXRecord"]) == 3
        assert cisco_eox_api.get_eox_records() == jresult["EOXRecord"]
        assert cisco_eox_api.amount_of_pages() == 1
        assert cisco_eox_api.get_current_page() == 1
        assert cisco_eox_api.amount_of_total_records() == 3
        assert cisco_eox_api.get_page_record_count() == 3
        assert cisco_eox_api.has_api_error() is False
        assert cisco_eox_api.get_api_error_message() == "no error"
        assert cisco_eox_api.get_error_description(
            jresult["EOXRecord"][0]) == ""
        assert cisco_eox_api.get_error_description(
            jresult["EOXRecord"][0]) == ""
Beispiel #4
0
def get_raw_api_data(api_query=None, year=None):
    """
    returns all EoX records for a specific query (from all pages)
    :param api_query: single query that is send to the Cisco EoX API
    :param year: get all EoX data that are announced in a specific year
    :raises CiscoApiCallFailed: exception raised if Cisco EoX API call failed
    :return: list that contains all EoX records from the Cisco EoX API
    """
    if api_query is None and year is None:
        raise ValueError("either year or the api_query must be provided")

    if api_query:
        if type(api_query) is not str:
            raise ValueError("api_query must be a string value")

    if year:
        if type(year) is not int:
            raise ValueError("year must be an integer value")

    # load application settings and check, that the API is enabled
    app_settings = AppSettings()

    if not app_settings.is_cisco_api_enabled():
        msg = "Cisco API access not enabled"
        logger.warning(msg)
        raise CiscoApiCallFailed(msg)

    # start Cisco EoX API query
    logger.info("send query to Cisco EoX database: %s" % api_query)

    eoxapi = CiscoEoxApi()
    eoxapi.load_client_credentials()
    results = []

    try:
        current_page = 1
        result_pages = 999

        while current_page <= result_pages:
            logger.info("Executing API query %s on page '%d" % ('%s' % api_query if api_query else "for year %d" % year, current_page))

            # will raise a CiscoApiCallFailed exception on error
            if year:
                eoxapi.query_year(year_to_query=year, page=current_page)

            else:
                eoxapi.query_product(product_id=api_query, page=current_page)

            result_pages = eoxapi.amount_of_pages()

            if eoxapi.get_page_record_count() > 0:
                results.extend(eoxapi.get_eox_records())

            current_page += 1

    except ConnectionFailedException:
        logger.error("Query failed, server not reachable: %s" % api_query, exc_info=True)
        raise

    except CiscoApiCallFailed:
        logger.fatal("Query failed: %s" % api_query, exc_info=True)
        raise

    logger.debug("found %d records for year %s" % (len(results), year))

    return results