diff --git a/swh/graphql/tests/data.py b/swh/graphql/tests/data.py index 1216816..beed8b6 100644 --- a/swh/graphql/tests/data.py +++ b/swh/graphql/tests/data.py @@ -1,113 +1,107 @@ # Copyright (C) 2022 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information -from swh.model.hashutil import hash_to_bytes from swh.model.model import ObjectType, Release, Revision, RevisionType from swh.model.tests import swh_model_data def populate_search_data(search): search.origin_update({"url": origin.url} for origin in get_origins()) def get_origins(): return swh_model_data.ORIGINS def get_snapshots(): return swh_model_data.SNAPSHOTS def get_releases(): return swh_model_data.RELEASES def get_revisions(): return swh_model_data.REVISIONS def get_contents(): return swh_model_data.CONTENTS def get_directories(): return swh_model_data.DIRECTORIES def get_releases_with_target(): """ GraphQL will not return a target object unless the target id is present in the DB. Return release objects with real targets instead of dummy targets in swh.model.tests.swh_model_data """ with_revision = Release( - id=hash_to_bytes("9129dc4e14acd0e51ca3bcd6b80f4577d281fd25"), name=b"v0.0.1", target_type=ObjectType.REVISION, target=get_revisions()[0].id, message=b"foo", synthetic=False, ) with_release = Release( - id=hash_to_bytes("6429dc4e14acd0e51ca3bcd6b80f4577d281fd32"), name=b"v0.0.1", target_type=ObjectType.RELEASE, target=get_releases()[0].id, message=b"foo", synthetic=False, ) with_directory = Release( - id=hash_to_bytes("3129dc4e14acd0e51ca3bcd6b80f4577d281fd42"), name=b"v0.0.1", target_type=ObjectType.DIRECTORY, target=get_directories()[0].id, message=b"foo", synthetic=False, ) with_content = Release( - id=hash_to_bytes("7589dc4e14acd0e51ca3bcd6b80f4577d281fd34"), name=b"v0.0.1", target_type=ObjectType.CONTENT, target=get_contents()[0].sha1_git, message=b"foo", synthetic=False, ) return [with_revision, with_release, with_directory, with_content] def get_revisions_with_parents(): """ Revisions with real revisions as parents """ return [ Revision( - id=hash_to_bytes("37580d63b8dcc0ec73e74994e66896858542844c"), message=b"hello", date=swh_model_data.DATES[0], committer=swh_model_data.COMMITTERS[0], author=swh_model_data.COMMITTERS[0], committer_date=swh_model_data.DATES[0], type=RevisionType.GIT, directory=b"\x01" * 20, synthetic=False, parents=(get_revisions()[0].id, get_revisions()[1].id), ) ] GRAPHQL_EXTRA_TEST_OBJECTS = { "release": get_releases_with_target(), "revision": get_revisions_with_parents(), } def populate_dummy_data(storage): for object_type, objects in swh_model_data.TEST_OBJECTS.items(): method = getattr(storage, object_type + "_add") method(objects) for object_type, objects in GRAPHQL_EXTRA_TEST_OBJECTS.items(): method = getattr(storage, object_type + "_add") method(objects) diff --git a/swh/graphql/tests/functional/test_release_node.py b/swh/graphql/tests/functional/test_release_node.py index e409973..fe31b4c 100644 --- a/swh/graphql/tests/functional/test_release_node.py +++ b/swh/graphql/tests/functional/test_release_node.py @@ -1,202 +1,165 @@ # Copyright (C) 2022 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information import base64 import pytest +from swh.model.model import ObjectType + from . import utils -from ..data import get_releases +from ..data import ( + get_contents, + get_directories, + get_releases, + get_releases_with_target, + get_revisions, +) @pytest.mark.parametrize("release", get_releases()) def test_get_release(client, release): query_str = ( """ { release(swhid: "%s") { swhid name { text base64 } message { text } author { email { text } name { text } fullname { text } } date targetType } } """ % release.swhid() ) data, _ = utils.get_query_response(client, query_str) assert data["release"] == { "swhid": str(release.swhid()), "name": { "text": release.name.decode(), "base64": base64.b64encode(release.name).decode("ascii"), }, "message": {"text": release.message.decode()}, "author": { "email": {"text": release.author.email.decode()}, "name": {"text": release.author.name.decode()}, "fullname": {"text": release.author.fullname.decode()}, } if release.author else None, "date": release.date.to_datetime().isoformat() if release.date else None, "targetType": release.target_type.value, } def test_get_release_with_invalid_swhid(client): query_str = """ { content(swhid: "swh:1:rel:invalid") { swhid } } """ errors = utils.get_error_response(client, query_str) # API will throw an error in case of an invalid SWHID assert len(errors) == 1 -def test_get_release_target_revision(client): - swhid = "swh:1:rel:9129dc4e14acd0e51ca3bcd6b80f4577d281fd25" +@pytest.mark.parametrize("release_with_target", get_releases_with_target()) +def test_get_release_targets(client, release_with_target): query_str = """ { release(swhid: "%s") { targetType target { ...on Revision { swhid } - } - } - } - """ - data, _ = utils.get_query_response(client, query_str % swhid) - assert data["release"] == { - "target": {"swhid": "swh:1:rev:66c7c1cd9673275037140f2abff7b7b11fc9439c"}, - "targetType": "revision", - } - - -def test_get_release_target_release(client): - swhid = "swh:1:rel:6429dc4e14acd0e51ca3bcd6b80f4577d281fd32" - query_str = """ - { - release(swhid: "%s") { - targetType - target { ...on Release { swhid } - } - } - } - """ - data, _ = utils.get_query_response(client, query_str % swhid) - assert data["release"] == { - "target": {"swhid": "swh:1:rel:8059dc4e17fcd0e51ca3bcd6b80f4577d281fd08"}, - "targetType": "release", - } - - -def test_get_release_target_directory(client): - swhid = "swh:1:rel:3129dc4e14acd0e51ca3bcd6b80f4577d281fd42" - query_str = """ - { - release(swhid: "%s") { - targetType - target { ...on Directory { swhid } - } - } - } - """ - data, _ = utils.get_query_response(client, query_str % swhid) - assert data["release"] == { - "target": {"swhid": "swh:1:dir:4b825dc642cb6eb9a060e54bf8d69288fbee4904"}, - "targetType": "directory", - } - - -def test_get_release_target_content(client): - swhid = "swh:1:rel:7589dc4e14acd0e51ca3bcd6b80f4577d281fd34" - query_str = """ - { - release(swhid: "%s") { - targetType - target { ...on Content { swhid } } } } """ - data, _ = utils.get_query_response(client, query_str % swhid) + data, _ = utils.get_query_response(client, query_str % release_with_target.swhid()) + + if release_with_target.target_type == ObjectType.REVISION: + target_swhid = get_revisions()[0].swhid() + elif release_with_target.target_type == ObjectType.RELEASE: + target_swhid = get_releases()[0].swhid() + elif release_with_target.target_type == ObjectType.DIRECTORY: + target_swhid = get_directories()[0].swhid() + elif release_with_target.target_type == ObjectType.CONTENT: + target_swhid = get_contents()[0].swhid() assert data["release"] == { - "target": {"swhid": "swh:1:cnt:86bc6b377e9d25f9d26777a4a28d08e63e7c5779"}, - "targetType": "content", + "targetType": release_with_target.target_type.value, + "target": {"swhid": str(target_swhid)}, } def test_get_release_target_unknown(client): # Clinet can request all the possible options if the target type # is unknown. The data under the right type will be returned # The target is of type Revision in this case # ie: both swhid and message will be available in the response - swhid = "swh:1:rel:9129dc4e14acd0e51ca3bcd6b80f4577d281fd25" + swhid = get_releases_with_target()[0].swhid() query_str = """ { release(swhid: "%s") { targetType target { ...on Revision { swhid message { text } } ...on Release { swhid } ...on Directory { swhid } ...on Content { swhid } } } } """ data, _ = utils.get_query_response(client, query_str % swhid) assert data["release"] == { "target": { "message": {"text": "hello"}, - "swhid": "swh:1:rev:66c7c1cd9673275037140f2abff7b7b11fc9439c", + "swhid": str(get_revisions()[0].swhid()), }, "targetType": "revision", } diff --git a/swh/graphql/tests/functional/test_revision.py b/swh/graphql/tests/functional/test_revision.py index 6c20c0b..1c72970 100644 --- a/swh/graphql/tests/functional/test_revision.py +++ b/swh/graphql/tests/functional/test_revision.py @@ -1,159 +1,160 @@ # Copyright (C) 2022 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information import pytest from swh.model.swhids import CoreSWHID from . import utils -from ..data import get_revisions +from ..data import get_revisions, get_revisions_with_parents @pytest.mark.parametrize("revision", get_revisions()) def test_get_revision(client, revision): query_str = """ { revision(swhid: "%s") { swhid message { text } author { fullname { text } name { text } email { text } } committer { fullname { text } name { text } email { text } } date type directory { swhid } } } """ data, _ = utils.get_query_response(client, query_str % revision.swhid()) assert data["revision"] == { "swhid": str(revision.swhid()), "message": {"text": revision.message.decode()}, "author": { "fullname": {"text": revision.author.fullname.decode()}, "name": {"text": revision.author.name.decode()}, "email": {"text": revision.author.email.decode()}, }, "committer": { "fullname": {"text": revision.committer.fullname.decode()}, "name": {"text": revision.committer.name.decode()}, "email": {"text": revision.committer.email.decode()}, }, "date": revision.date.to_datetime().isoformat(), "type": revision.type.value, "directory": { "swhid": str(CoreSWHID(object_id=revision.directory, object_type="dir")) }, } def test_get_revision_with_invalid_swhid(client): query_str = """ { revision(swhid: "swh:1:cnt:invalid") { swhid } } """ errors = utils.get_error_response(client, query_str) # API will throw an error in case of an invalid SWHID assert len(errors) == 1 assert "Invalid SWHID: invalid syntax" in errors[0]["message"] def test_get_revision_as_target(client): # SWHID of a snapshot with revision as target snapshot_swhid = "swh:1:snp:9e78d7105c5e0f886487511e2a92377b4ee4c32a" query_str = """ { snapshot(swhid: "%s") { branches(first: 1, types: [revision]) { nodes { type target { ...on Revision { swhid } } } } } } """ data, _ = utils.get_query_response(client, query_str % snapshot_swhid) revision_obj = data["snapshot"]["branches"]["nodes"][0]["target"] assert revision_obj == { "swhid": "swh:1:rev:66c7c1cd9673275037140f2abff7b7b11fc9439c" } def test_get_revision_log(client): - revision_swhid = "swh:1:rev:37580d63b8dcc0ec73e74994e66896858542844c" + revision_swhid = get_revisions_with_parents()[0].swhid() query_str = """ { revision(swhid: "%s") { swhid revisionLog(first: 3) { nodes { swhid } } } } """ data, _ = utils.get_query_response(client, query_str % revision_swhid) assert data["revision"]["revisionLog"] == { "nodes": [ - {"swhid": "swh:1:rev:37580d63b8dcc0ec73e74994e66896858542844c"}, - {"swhid": "swh:1:rev:66c7c1cd9673275037140f2abff7b7b11fc9439c"}, - {"swhid": "swh:1:rev:c7f96242d73c267adc77c2908e64e0c1cb6a4431"}, + {"swhid": str(revision_swhid)}, + {"swhid": str(get_revisions()[0].swhid())}, + {"swhid": str(get_revisions()[1].swhid())}, ] } def test_get_revision_parents(client): - revision_swhid = "swh:1:rev:37580d63b8dcc0ec73e74994e66896858542844c" + revision_swhid = get_revisions_with_parents()[0].swhid() query_str = """ { revision(swhid: "%s") { swhid parents { nodes { swhid } } } } """ data, _ = utils.get_query_response(client, query_str % revision_swhid) + assert data["revision"]["parents"] == { "nodes": [ - {"swhid": "swh:1:rev:66c7c1cd9673275037140f2abff7b7b11fc9439c"}, - {"swhid": "swh:1:rev:c7f96242d73c267adc77c2908e64e0c1cb6a4431"}, + {"swhid": str(get_revisions()[0].swhid())}, + {"swhid": str(get_revisions()[1].swhid())}, ] }