Skip to content

Commit f7af0fe

Browse files
Add db-sync test for data fetching from IPFS anchor-url
1 parent 41542fc commit f7af0fe

File tree

5 files changed

+112
-7
lines changed

5 files changed

+112
-7
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{
2+
"@context": {
3+
"CIP100": "https://github.com/cardano-foundation/CIPs/blob/master/CIP-0100/README.md#",
4+
"CIP119": "https://github.com/cardano-foundation/CIPs/blob/master/CIP-0119/README.md#",
5+
"hashAlgorithm": "CIP100:hashAlgorithm",
6+
"body": {
7+
"@id": "CIP119:body",
8+
"@context": {
9+
"references": {
10+
"@id": "CIP119:references",
11+
"@container": "@set",
12+
"@context": {
13+
"GovernanceMetadata": "CIP100:GovernanceMetadataReference",
14+
"Other": "CIP100:OtherReference",
15+
"label": "CIP100:reference-label",
16+
"uri": "CIP100:reference-uri"
17+
}
18+
},
19+
"paymentAddress": "CIP119:paymentAddress",
20+
"givenName": "CIP119:givenName",
21+
"image": {
22+
"@id": "CIP119:image",
23+
"@context": {
24+
"ImageObject": "https://schema.org/ImageObject"
25+
}
26+
},
27+
"objectives": "CIP119:objectives",
28+
"motivations": "CIP119:motivations",
29+
"qualifications": "CIP119:qualifications"
30+
}
31+
}
32+
},
33+
"hashAlgorithm": "blake2b-256",
34+
"body": {
35+
"paymentAddress": "addr1q9fevl7te5a6cp50ckgs87mp9337e30s6463hpdurt48advyt5slzns482tjz00w2qexkzdfh4cf9xaj8w8nhsmpshmqwr2ju7",
36+
"givenName": "Artur Wieczorek",
37+
"image": {
38+
"@type": "ImageObject",
39+
"contentUrl": "data:image/png;base64,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"
40+
},
41+
"objectives": "Ensure the quality, functionality, and reliability of Cardano products by identifying defects, verifying requirements, and validating that the software meets user and business needs.",
42+
"motivations": "Improve coverage of cardano-db-sync product.",
43+
"qualifications": "Software Test Enginner.",
44+
"references": [
45+
{
46+
"@type": "Link",
47+
"label": "GitHub Project",
48+
"uri": "https://github.com/IntersectMBO/cardano-node-tests"
49+
},
50+
{
51+
"@type": "Link",
52+
"label": "Cardano Forum Website",
53+
"uri": "https://forum.cardano.org/"
54+
},
55+
{
56+
"@type": "Identity",
57+
"label": "GitHub Organization Profile",
58+
"uri": "https://github.com/IntersectMBO"
59+
}
60+
]
61+
}
62+
}
File renamed without changes.

cardano_node_tests/tests/tests_conway/test_drep.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -387,18 +387,33 @@ def test_drep_id_is_blake2b_224_of_drep_vkey(
387387

388388
web.unpublish(url=drep_metadata_url)
389389

390+
DREP_METADATA_PARAMS = (
391+
{
392+
"drep_metadata_file": DATA_DIR / "drep_metadata_url.json",
393+
"drep_metadata_url": "https://tinyurl.com/w7vd3ek6",
394+
"expected_hash": "18b4b10150eab04ba66c8f9cb497ff05c6c31b9c9825388481c1790ce76b6b90",
395+
},
396+
{
397+
"drep_metadata_file": DATA_DIR / "drep_metadata_ipfs.json",
398+
"drep_metadata_url": "https://tinyurl.com/drep-ipfs",
399+
"expected_hash": "7b45535061dce55fca685fedfec6e41a195c4fe4ef812767c34505390b413ff3",
400+
},
401+
)
402+
390403
@allure.link(helpers.get_vcs_link())
391404
@submit_utils.PARAM_SUBMIT_METHOD
392405
@common.PARAM_USE_BUILD_CMD
393406
@pytest.mark.dbsync
394407
@pytest.mark.testnets
395408
@pytest.mark.smoke
409+
@pytest.mark.parametrize("drep_metadata", DREP_METADATA_PARAMS)
396410
def test_register_and_retire_drep(
397411
self,
398412
cluster: clusterlib.ClusterLib,
399413
payment_addr: clusterlib.AddressRecord,
400414
use_build_cmd: bool,
401415
submit_method: str,
416+
drep_metadata: dict,
402417
):
403418
"""Test DRep registration and retirement.
404419
@@ -412,10 +427,11 @@ def test_register_and_retire_drep(
412427
temp_template = common.get_test_id(cluster)
413428
errors_final = []
414429

415-
drep_metadata_file = DATA_DIR / "drep_metadata.json"
430+
drep_metadata_file = drep_metadata["drep_metadata_file"]
431+
drep_metadata_url = drep_metadata["drep_metadata_url"]
432+
expected_hash = drep_metadata["expected_hash"]
416433

417434
# Register DRep
418-
drep_metadata_url = "https://tinyurl.com/w7vd3ek6"
419435
reqc.cli012.start(url=helpers.get_vcs_link())
420436
drep_metadata_hash = cluster.g_conway_governance.drep.get_metadata_hash(
421437
drep_metadata_file=drep_metadata_file
@@ -465,10 +481,9 @@ def test_register_and_retire_drep(
465481

466482
metadata_anchor = reg_drep_state[0][1]["anchor"]
467483
assert (
468-
metadata_anchor["dataHash"]
469-
== drep_metadata_hash
470-
== "18b4b10150eab04ba66c8f9cb497ff05c6c31b9c9825388481c1790ce76b6b90"
484+
metadata_anchor["dataHash"] == drep_metadata_hash == expected_hash
471485
), "Unexpected metadata hash"
486+
472487
assert metadata_anchor["url"] == drep_metadata_url, "Unexpected metadata url"
473488
try:
474489
_url = helpers.get_vcs_link()

cardano_node_tests/utils/dbsync_queries.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ class OffChainVoteDrepDataDBRow:
534534
motivations: str
535535
qualifications: str
536536
image_url: str
537-
image_hash: str
537+
image_hash: str | None
538538

539539

540540
@pydantic.dataclasses.dataclass(frozen=True, config=_CONF_ARBITRARY_T_ALLOWED)

cardano_node_tests/utils/dbsync_utils.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1313,7 +1313,7 @@ def check_reward_rest(stake_address: str, transfer_amts: list[int], type: str =
13131313
assert not rem_amts, f"Not all expected amounts found in db-sync: {rem_amts}"
13141314

13151315

1316-
def check_off_chain_drep_registration(
1316+
def check_off_chain_drep_registration( # noqa: C901
13171317
drep_data: dbsync_types.DrepRegistrationRecord, metadata: dict
13181318
) -> None:
13191319
"""Check DRep off chain data in db-sync."""
@@ -1350,6 +1350,34 @@ def check_off_chain_drep_registration(
13501350
if db_metadata.qualifications != expected_metadata["qualifications"]:
13511351
errors.append("'qualifications' value is different than expected;")
13521352

1353+
# For the image rules refer to: https://cips.cardano.org/cip/CIP-0119
1354+
# off_chain_drep_data.image_url includes the image base64 with the data uri
1355+
# header prefix stripped and the off_chain_drep_data.image_sha256 remains empty
1356+
if "image" in expected_metadata:
1357+
image_data = expected_metadata["image"]
1358+
1359+
if "contentUrl" in image_data:
1360+
content_url = image_data["contentUrl"]
1361+
if content_url.startswith("data:"):
1362+
if "base64" not in content_url:
1363+
errors.append("Image is not Base64 encoded")
1364+
elif not content_url.startswith("data:image/"):
1365+
errors.append("Base64 encoded image should start with 'data:image/'")
1366+
base64_image_data = content_url.split("base64,")[1]
1367+
if db_metadata.image_url != base64_image_data:
1368+
errors.append(
1369+
"'image_url' value is different than expected Base64 'contentUrl';"
1370+
)
1371+
else:
1372+
if db_metadata.image_url != content_url:
1373+
errors.append("'image_url' value is different than expected 'contentUrl';")
1374+
if "sha256" not in image_data:
1375+
errors.append("SHA256 hash is required for image URL.")
1376+
elif db_metadata.image_hash != image_data["sha256"]:
1377+
errors.append("'image_hash' value is different than expected;")
1378+
else:
1379+
errors.append("Image contentUrl must be provided.")
1380+
13531381
if errors:
13541382
raise AssertionError("\n".join(errors))
13551383

0 commit comments

Comments
 (0)