diff --git a/swh/graphql/tests/data.py b/swh/graphql/tests/data.py --- a/swh/graphql/tests/data.py +++ b/swh/graphql/tests/data.py @@ -7,99 +7,14 @@ # generation in SWH-wb moved to a shared location # or to a new test data project -from datetime import timedelta - -from swh.model.model import Origin, OriginVisit, OriginVisitStatus, Snapshot -from swh.storage.utils import now +from swh.model.tests import swh_model_data def populate_dummy_data(storage): - origins = get_origins() - visits = get_visits(origins) - snapshots = get_snapshots() - status = get_visit_status(visits, snapshots) - - storage.origin_add(origins) - storage.origin_visit_add(visits) - storage.snapshot_add(snapshots) - storage.origin_visit_status_add(status) + for object_type, objects in swh_model_data.TEST_OBJECTS.items(): + method = getattr(storage, object_type + "_add") + method(objects) def get_origins(): - # Return two dummy origins - return [ - Origin(url="http://example.com/forge1"), - Origin(url="http://example.com/forge2"), - ] - - -def get_visits(origins): - # Return two visits each for an origin - origin1, origin2 = origins - return [ - OriginVisit( - origin=origin1.url, - date=now() - timedelta(minutes=200), - type="git", - visit=1, - ), - OriginVisit( - origin=origin1.url, - date=now(), - type="git", - visit=2, - ), - OriginVisit( - origin=origin2.url, - date=now() - timedelta(minutes=500), - type="hg", - visit=1, - ), - OriginVisit( - origin=origin2.url, - date=now(), - type="hg", - visit=2, - ), - ] - - -def get_visit_status(visits, snapshots): - # Return one status per visit, adding only empty statpshots for now - visit1, visit2, visit3, visit4 = visits - (empty_snapshot,) = snapshots - return [ - OriginVisitStatus( - origin=visit1.origin, - visit=visit1.visit, - date=visit1.date, - status="full", - snapshot=empty_snapshot.id, - ), - OriginVisitStatus( - origin=visit2.origin, - visit=visit2.visit, - date=visit1.date, - status="full", - snapshot=empty_snapshot.id, - ), - OriginVisitStatus( - origin=visit3.origin, - visit=visit3.visit, - date=visit3.date, - status="full", - snapshot=empty_snapshot.id, - ), - OriginVisitStatus( - origin=visit4.origin, - visit=visit4.visit, - date=visit4.date, - status="full", - snapshot=empty_snapshot.id, - ), - ] - - -def get_snapshots(): - empty_snapshot = Snapshot(branches={}) - return [empty_snapshot] + return swh_model_data.ORIGINS diff --git a/swh/graphql/tests/functional/test_origin_connection.py b/swh/graphql/tests/functional/test_origin_connection.py --- a/swh/graphql/tests/functional/test_origin_connection.py +++ b/swh/graphql/tests/functional/test_origin_connection.py @@ -3,10 +3,11 @@ # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information +from ..data import get_origins from .utils import get_query_response -def test_get(client): +def test_get(client, storage): query_str = """ { origins(first: 10) { @@ -17,13 +18,13 @@ } """ data, _ = get_query_response(client, query_str) - assert len(data["origins"]["nodes"]) == 2 + assert len(data["origins"]["nodes"]) == len(get_origins()) def test_get_filter_by_pattern(client): query_str = """ { - origins(first: 10, urlPattern: "forge1") { + origins(first: 10, urlPattern: "somewhere.org/den") { nodes { url } @@ -34,10 +35,24 @@ assert len(data["origins"]["nodes"]) == 1 +def test_get_filter_by_non_existing_pattern(client): + query_str = """ + { + origins(first: 10, urlPattern: "somewhere.org/den/test/") { + nodes { + url + } + } + } + """ + data, _ = get_query_response(client, query_str) + assert len(data["origins"]["nodes"]) == 0 + + def test_basic_pagination(client): query_str = """ { - origins(first: 2) { + origins(first: %s) { nodes { id } @@ -49,6 +64,6 @@ } """ - data, _ = get_query_response(client, query_str) - assert len(data["origins"]["nodes"]) == 2 + data, _ = get_query_response(client, query_str % len(get_origins())) + assert len(data["origins"]["nodes"]) == len(get_origins()) assert data["origins"]["pageInfo"] == {"hasNextPage": False, "endCursor": None} diff --git a/swh/graphql/tests/functional/test_origin_node.py b/swh/graphql/tests/functional/test_origin_node.py --- a/swh/graphql/tests/functional/test_origin_node.py +++ b/swh/graphql/tests/functional/test_origin_node.py @@ -3,27 +3,28 @@ # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information -from .utils import get_query_response +import pytest + +from ..data import get_origins +from .utils import assert_missing_object, get_query_response def test_invalid_get(client): query_str = """ { - origin(url: "http://example.com/forge1/") { + origin(url: "http://example.com/non-existing") { url } } """ - data, errors = get_query_response(client, query_str) - assert data["origin"] is None - assert len(errors) == 1 - assert errors[0]["message"] == "Requested object is not available" + assert_missing_object(client, query_str, "origin") -def test_get(client): +@pytest.mark.parametrize("origin", get_origins()) +def test_get(client, storage, origin): query_str = """ { - origin(url: "http://example.com/forge1") { + origin(url: "%s") { url id visits(first: 10) { @@ -42,9 +43,14 @@ } } """ - data, _ = get_query_response(client, query_str) - origin = data["origin"] - assert origin["url"] == "http://example.com/forge1" - assert len(origin["visits"]["nodes"]) == 2 - assert origin["latestVisit"]["visitId"] == 2 - assert len(origin["snapshots"]["nodes"]) == 1 + + response, _ = get_query_response(client, query_str % origin.url) + data_origin = response["origin"] + storage_origin = storage.origin_get([origin.url])[0] + visits_and_statuses = storage.origin_visit_get_with_statuses(origin.url).results + assert data_origin["url"] == storage_origin.url + assert data_origin["id"] == storage_origin.id.hex() + assert len(data_origin["visits"]["nodes"]) == len(visits_and_statuses) + assert data_origin["latestVisit"]["visitId"] == visits_and_statuses[-1].visit.visit + snapshots = storage.origin_snapshot_get_all(origin.url) + assert len(data_origin["snapshots"]["nodes"]) == len(snapshots) diff --git a/swh/graphql/tests/functional/test_visit_node.py b/swh/graphql/tests/functional/test_visit_node.py --- a/swh/graphql/tests/functional/test_visit_node.py +++ b/swh/graphql/tests/functional/test_visit_node.py @@ -6,7 +6,7 @@ import pytest from ..data import get_origins -from .utils import get_query_response +from .utils import assert_missing_object, get_query_response @pytest.mark.parametrize("origin", get_origins()) @@ -63,7 +63,4 @@ } } """ - data, errors = get_query_response(client, query_str) - assert data["visit"] is None - assert len(errors) == 1 - assert errors[0]["message"] == "Requested object is not available" + assert_missing_object(client, query_str, "visit") diff --git a/swh/graphql/tests/functional/utils.py b/swh/graphql/tests/functional/utils.py --- a/swh/graphql/tests/functional/utils.py +++ b/swh/graphql/tests/functional/utils.py @@ -6,8 +6,25 @@ import json +def get_response(client, query_str): + return client.post("/", json={"query": query_str}) + + def get_query_response(client, query_str): - response = client.post("/", json={"query": query_str}) + response = get_response(client, query_str) assert response.status_code == 200, response.data result = json.loads(response.data) return result.get("data"), result.get("errors") + + +def assert_missing_object(client, query_str, obj_type): + data, errors = get_query_response(client, query_str) + assert data[obj_type] is None + assert len(errors) == 1 + assert errors[0]["message"] == "Requested object is not available" + + +def get_error_response(client, query_str, error_code=400): + response = get_response(client, query_str) + assert response.status_code == error_code + return json.loads(response.data)["errors"]