def test_scroll_api_pages(http_mock, get_next_url_mock, __, ___, ____,
                          aggregator, instance):

    check = CloudFoundryApiCheck('cloud_foundry_api', {}, [instance])

    # When exhausting all pages
    for _ in check.scroll_api_pages("api_url", {}, {}):
        pass

    assert http_mock.get.call_args_list == [
        mock.call("api_url", params={"page": 1}, headers={}),
        mock.call("api_url", params={"page": 2}, headers={}),
    ]
    aggregator.assert_service_check(
        "cloud_foundry_api.api.can_connect",
        count=1,
        tags=["api_url:api.sys.domain.com", "foo:bar"])

    # When breaking in the middle of pagination
    http_mock.get.reset_mock()
    aggregator.reset()
    get_next_url_mock.side_effect = ["next", ""]
    for _ in check.scroll_api_pages("api_url", {}, {}):
        break

    assert http_mock.get.call_args_list == [
        mock.call("api_url", params={"page": 1}, headers={})
    ]
    aggregator.assert_service_check(
        "cloud_foundry_api.api.can_connect",
        status=CloudFoundryApiCheck.OK,
        count=1,
        tags=["api_url:api.sys.domain.com", "foo:bar"],
    )
def test_scroll_api_pages_errors(_, __, ___, aggregator, instance):
    check = CloudFoundryApiCheck('cloud_foundry_api', {}, [instance])
    check._http = None

    with mock.patch.object(check, "_http") as http_mock:
        http_mock.get.side_effect = RequestException()
        for _ in check.scroll_api_pages("", {}, {}):
            pass
        aggregator.assert_service_check(
            name="cloud_foundry_api.api.can_connect",
            status=CloudFoundryApiCheck.CRITICAL,
            tags=["api_url:api.sys.domain.com", "foo:bar"],
            count=1,
        )
        aggregator.assert_service_check(
            "cloud_foundry_api.api.can_connect",
            status=CloudFoundryApiCheck.OK,
            count=0,
            tags=["api_url:api.sys.domain.com", "foo:bar"],
        )
        aggregator.reset()

    with mock.patch.object(check, "_http") as http_mock:
        http_mock.get.return_value = mock.MagicMock(
            raise_for_status=mock.MagicMock(side_effect=HTTPError()))
        for _ in check.scroll_api_pages("", {}, {}):
            pass
        aggregator.assert_service_check(
            name="cloud_foundry_api.api.can_connect",
            status=CloudFoundryApiCheck.CRITICAL,
            tags=["api_url:api.sys.domain.com", "foo:bar"],
            count=1,
        )
        aggregator.assert_service_check(
            "cloud_foundry_api.api.can_connect",
            status=CloudFoundryApiCheck.OK,
            count=0,
            tags=["api_url:api.sys.domain.com", "foo:bar"],
        )
        aggregator.reset()

    with mock.patch.object(check, "_http") as http_mock:
        http_mock.get.return_value = mock.MagicMock(json=mock.MagicMock(
            side_effect=ValueError()))
        for _ in check.scroll_api_pages("", {}, {}):
            pass
        aggregator.assert_service_check(
            name="cloud_foundry_api.api.can_connect",
            status=CloudFoundryApiCheck.CRITICAL,
            tags=["api_url:api.sys.domain.com", "foo:bar"],
            count=1,
        )
        aggregator.assert_service_check(
            "cloud_foundry_api.api.can_connect",
            status=CloudFoundryApiCheck.OK,
            count=0,
            tags=["api_url:api.sys.domain.com", "foo:bar"],
        )
        aggregator.reset()