def test_get_tags_sap_system(patch_xjoin_post, api_get, subtests, query_source_xjoin): patch_xjoin_post( response={"data": { "hostTags": { "meta": { "total": 1 }, "data": [] } }}) values = ("true", "false", "nil", "not_nil") for value in values: with subtests.test(value=value): implicit_url = build_tags_url( query=f"?filter[system_profile][sap_system]={value}") eq_url = build_tags_url( query=f"?filter[system_profile][sap_system][eq]={value}") implicit_response_status, implicit_response_data = api_get( implicit_url) eq_response_status, eq_response_data = api_get(eq_url) assert_response_status(implicit_response_status, 200) assert_response_status(eq_response_status, 200) assert implicit_response_data["total"] == 1 assert eq_response_data["total"] == 1
def test_get_tags_sap_sids(patch_xjoin_post, api_get, subtests, query_source_xjoin): patch_xjoin_post( response={"data": { "hostTags": { "meta": { "total": 1 }, "data": [] } }}) filter_paths = ("[system_profile][sap_sids][]", "[system_profile][sap_sids][contains][]") value_sets = (("ABC", ), ("BEN", "A72"), ("CDA", "MK2", "C2C")) for path in filter_paths: for values in value_sets: with subtests.test(values=values, path=path): url = build_tags_url( query="?" + "".join([f"filter{path}={value}&" for value in values])) response_status, response_data = api_get(url) assert_response_status(response_status, 200) assert response_data["total"] == 1
def test_tags_multiple_query_variables_staleness( culling_datetime_mock, query_source_xjoin, graphql_tag_query_empty_response, api_get): staleness = "fresh,stale_warning" url = build_tags_url(query=f"?staleness={staleness}") response_status, response_data = api_get(url) assert response_status == 200 graphql_tag_query_empty_response.assert_called_once_with( TAGS_QUERY, { "order_by": "tag", "order_how": "ASC", "limit": 50, "offset": 0, "hostFilter": { "OR": [ { "stale_timestamp": { "gt": "2019-12-16T10:10:06.754201+00:00" } }, { "stale_timestamp": { "gt": "2019-12-02T10:10:06.754201+00:00", "lte": "2019-12-09T10:10:06.754201+00:00", } }, ] }, }, )
def test_query_variables_tags_simple(mocker, query_source_xjoin, graphql_tag_query_empty_response, api_get): url = build_tags_url(query="?tags=insights-client/os=fedora") response_status, response_data = api_get(url) assert response_status == 200 graphql_tag_query_empty_response.assert_called_once_with( TAGS_QUERY, { "order_by": "tag", "order_how": "ASC", "limit": 50, "offset": 0, "hostFilter": { "OR": mocker.ANY, "AND": ({ "tag": { "namespace": { "eq": "insights-client" }, "key": { "eq": "os" }, "value": { "eq": "fedora" } } }, ), }, }, )
def test_tags_query_variables_registered_with(mocker, query_source_xjoin, graphql_tag_query_empty_response, api_get): url = build_tags_url(query="?registered_with=insights") response_status, response_data = api_get(url) assert response_status == 200 graphql_tag_query_empty_response.assert_called_once_with( TAGS_QUERY, { "order_by": mocker.ANY, "order_how": mocker.ANY, "limit": mocker.ANY, "offset": mocker.ANY, "hostFilter": { "OR": mocker.ANY, "NOT": { "insights_id": { "eq": None } } }, }, )
def test_tags_query_variables_search(mocker, query_source_xjoin, graphql_tag_query_empty_response, api_get): url = build_tags_url(query=f"?search={quote('Δwithčhar!/~|+ ')}") response_status, response_data = api_get(url) assert response_status == 200 graphql_tag_query_empty_response.assert_called_once_with( TAGS_QUERY, { "order_by": "tag", "order_how": "ASC", "limit": 50, "offset": 0, "filter": { "search": { "regex": ".*\\Δwith\\čhar\\!\\/\\~\\|\\+\\ .*" } }, "hostFilter": { "OR": mocker.ANY }, }, )
def test_query_variables_tags_with_only_key(mocker, query_source_xjoin, graphql_tag_query_empty_response, api_get): url = build_tags_url(query="?tags=env") response_status, response_data = api_get(url) assert response_status == 200 graphql_tag_query_empty_response.assert_called_once_with( TAGS_QUERY, { "order_by": "tag", "order_how": "ASC", "limit": 50, "offset": 0, "hostFilter": { "AND": ({ "tag": { "namespace": { "eq": None }, "key": { "eq": "env" }, "value": { "eq": None } } }, ), "OR": mocker.ANY, }, }, )
def test_query_variables_tags_with_special_characters_unescaped( mocker, query_source_xjoin, graphql_tag_query_empty_response, api_get): tags_query = quote(";?:@&+$/-_.!~*'()=#") url = build_tags_url(query=f"?tags={tags_query}") response_status, response_data = api_get(url) assert response_status == 200 graphql_tag_query_empty_response.assert_called_once_with( TAGS_QUERY, { "order_by": "tag", "order_how": "ASC", "limit": 50, "offset": 0, "hostFilter": { "AND": ({ "tag": { "namespace": { "eq": ";?:@&+$" }, "key": { "eq": "-_.!~*'()" }, "value": { "eq": "#" } } }, ), "OR": mocker.ANY, }, }, )
def test_tags_response_pagination_index_error(mocker, query_source_xjoin, graphql_tag_query_with_response, api_get): url = build_tags_url(query="?per_page=2&page=3") response_status, response_data = api_get(url) assert response_status == 404 graphql_tag_query_with_response.assert_called_once_with( TAGS_QUERY, { "order_by": "tag", "order_how": "ASC", "limit": 2, "offset": 4, "hostFilter": { "OR": mocker.ANY } })
def test_tags_response_pagination(page, limit, offset, mocker, query_source_xjoin, graphql_tag_query_empty_response, api_get): url = build_tags_url(query=f"?per_page={limit}&page={page}") response_status, response_data = api_get(url) assert response_status == 200 graphql_tag_query_empty_response.assert_called_once_with( TAGS_QUERY, { "order_by": "tag", "order_how": "ASC", "limit": limit, "offset": offset, "hostFilter": { "OR": mocker.ANY } }, )
def test_tags_query_variables_ordering_by(ordering, mocker, query_source_xjoin, graphql_tag_query_empty_response, api_get): url = build_tags_url(query=f"?order_by={ordering}") response_status, response_data = api_get(url) assert response_status == 200 graphql_tag_query_empty_response.assert_called_once_with( TAGS_QUERY, { "order_by": ordering, "order_how": "ASC", "limit": 50, "offset": 0, "hostFilter": { "OR": mocker.ANY } }, )
def test_get_list_of_tags_with_host_filters(patch_xjoin_post, query_source_xjoin, api_get, subtests): patch_xjoin_post(response={"data": {"hostTags": {"meta": {"total": 1}, "data": []}}}) """ Validate that the /tags endpoint doesn't break when we supply it with various filters. We test the actual xjoin call in test_xjoin.test_tags_query_host_filters. """ for query in ( "?display_name=test-example-host", "?fqdn=tagfilter.test.com", "?hostname_or_id=test-example-host", "?hostname_or_id=tagfilter.test.com", f"?insights_id={generate_uuid()}", f"?provider_id={generate_uuid()}", f"?provider_type={ProviderType.AZURE.value}", ): with subtests.test(query=query): url = build_tags_url(query=query) response_status, response_data = api_get(url) assert_response_status(response_status, 200) assert response_data["total"] == 1
def test_tags_query_variables_staleness(staleness, expected, culling_datetime_mock, query_source_xjoin, graphql_tag_query_empty_response, api_get): url = build_tags_url(query=f"?staleness={staleness}") response_status, response_data = api_get(url) assert response_status == 200 graphql_tag_query_empty_response.assert_called_once_with( TAGS_QUERY, { "order_by": "tag", "order_how": "ASC", "limit": 50, "offset": 0, "hostFilter": { "OR": [{ "stale_timestamp": expected }] }, }, )
def test_tags_response_invalid_registered_with(api_get): url = build_tags_url(query="?registered_with=salad") response_status, response_data = api_get(url) assert response_status == 400
def test_tags_response_invalid_pagination(page, per_page, api_get): url = build_tags_url(query=f"?per_page={per_page}&page={page}") response_status, response_data = api_get(url) assert response_status == 400