From 8e15c13e2232254548b43d2b1740386c758ebdb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mois=C3=A9s?= <7888669+moisses89@users.noreply.github.com> Date: Thu, 19 Dec 2024 11:43:24 +0100 Subject: [PATCH] Add test contract view --- app/routers/models.py | 2 +- app/{routers => tests}/mocks/__init__.py | 0 app/{routers => tests}/mocks/abi_mock.py | 2 +- app/tests/routers/test_contracts.py | 34 +++++++++++++++++------- app/tests/utils.py | 9 +++++++ 5 files changed, 35 insertions(+), 12 deletions(-) rename app/{routers => tests}/mocks/__init__.py (100%) rename app/{routers => tests}/mocks/abi_mock.py (99%) create mode 100644 app/tests/utils.py diff --git a/app/routers/models.py b/app/routers/models.py index 697d861..d37a032 100644 --- a/app/routers/models.py +++ b/app/routers/models.py @@ -37,7 +37,7 @@ def convert_bytes_to_hex(cls, abi_hash): class ContractsPublic(BaseModel): address: bytes | str name: str - display_name: str + display_name: str | None chain_id: int project: ProjectPublic | None abi: AbiPublic | None diff --git a/app/routers/mocks/__init__.py b/app/tests/mocks/__init__.py similarity index 100% rename from app/routers/mocks/__init__.py rename to app/tests/mocks/__init__.py diff --git a/app/routers/mocks/abi_mock.py b/app/tests/mocks/abi_mock.py similarity index 99% rename from app/routers/mocks/abi_mock.py rename to app/tests/mocks/abi_mock.py index 257979c..5448a0f 100644 --- a/app/routers/mocks/abi_mock.py +++ b/app/tests/mocks/abi_mock.py @@ -1,4 +1,4 @@ -abi_json: list[dict] = [ +mock_abi_json: list[dict] = [ { "inputs": [], "payable": False, diff --git a/app/tests/routers/test_contracts.py b/app/tests/routers/test_contracts.py index f371dc1..71722b0 100644 --- a/app/tests/routers/test_contracts.py +++ b/app/tests/routers/test_contracts.py @@ -1,11 +1,16 @@ from fastapi.testclient import TestClient +from eth_account import Account +from hexbytes import HexBytes +from safe_eth.eth.utils import fast_to_checksum_address from sqlmodel.ext.asyncio.session import AsyncSession from ...datasources.db.database import database_session -from ...datasources.db.models import Contract +from ...datasources.db.models import Abi, Contract from ...main import app from ..db.db_async_conn import DbAsyncConn +from ..mocks.abi_mock import mock_abi_json +from ..utils import get_md5_abi_hash class TestRouterContract(DbAsyncConn): @@ -17,18 +22,27 @@ def setUpClass(cls): @database_session async def test_view_contracts(self, session: AsyncSession): + abi_hash = get_md5_abi_hash(mock_abi_json) + abi = Abi(abi_hash=abi_hash, abi_json=mock_abi_json) + await abi.create(session) + address = HexBytes(Account.create().address) + contract = Contract( - address=b"0xe94B2EC38FA88bDc8cA9110b24deB5341ECeF251", - name="A Test Contracts", - chain_id=1, + address=address, name="A Test Contracts", chain_id=1, abi_id=abi.abi_hash ) - expected_response = { - "name": "A Test Contracts", - "description": None, - "address": "0xe94B2EC38FA88bDc8cA9110b24deB5341ECeF251", - } await contract.create(session) response = self.client.get( - "/api/v1/contracts/0xe94B2EC38FA88bDc8cA9110b24deB5341ECeF251" + f"/api/v1/contracts/{fast_to_checksum_address(address.hex())}", ) self.assertEqual(response.status_code, 200) + response_json = response.json() + results = response_json["results"] + self.assertEqual(response_json["count"], 1) + self.assertEqual(response_json["previous"], None) + self.assertEqual(response_json["next"], None) + self.assertEqual(results[0]["name"], "A Test Contracts") + self.assertEqual(results[0]["address"], address.hex()) + self.assertEqual(results[0]["abi"]["abi_json"], mock_abi_json) + self.assertEqual(results[0]["display_name"], None) + self.assertEqual(results[0]["chain_id"], 1) + self.assertEqual(results[0]["project"], None) diff --git a/app/tests/utils.py b/app/tests/utils.py new file mode 100644 index 0000000..3cd76fe --- /dev/null +++ b/app/tests/utils.py @@ -0,0 +1,9 @@ +import hashlib +import json + + +def get_md5_abi_hash(abi: list[dict]) -> bytes: + json_str = json.dumps(abi, sort_keys=True) + md5_hash = hashlib.md5(json_str.encode("utf-8")).hexdigest() + abi_hash = md5_hash[-8:] + return bytes.fromhex(abi_hash)