From 49222c89f9cc6d766676acd80d3a13a3ee765d4e Mon Sep 17 00:00:00 2001 From: Yosuke Otosu Date: Mon, 1 Aug 2022 19:11:04 +0900 Subject: [PATCH] feat: endpoint to get the current block number --- app/model/schema/__init__.py | 3 +- app/model/schema/index.py | 5 ++ app/routers/index.py | 21 ++++++- tests/test_app_routers_block_number_GET.py | 67 ++++++++++++++++++++++ 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 tests/test_app_routers_block_number_GET.py diff --git a/app/model/schema/__init__.py b/app/model/schema/__init__.py index 8211b878..1541b64d 100644 --- a/app/model/schema/__init__.py +++ b/app/model/schema/__init__.py @@ -17,7 +17,8 @@ SPDX-License-Identifier: Apache-2.0 """ from .index import ( - E2EEResponse + E2EEResponse, + BlockNumberResponse ) from .account import ( AccountCreateKeyRequest, diff --git a/app/model/schema/index.py b/app/model/schema/index.py index a05a1b6a..c860d323 100644 --- a/app/model/schema/index.py +++ b/app/model/schema/index.py @@ -26,3 +26,8 @@ class E2EEResponse(BaseModel): """E2EE schema (Response)""" public_key: Optional[str] + + +class BlockNumberResponse(BaseModel): + """Block Number schema (Response)""" + block_number: int diff --git a/app/routers/index.py b/app/routers/index.py index cbe05379..1a803a91 100644 --- a/app/routers/index.py +++ b/app/routers/index.py @@ -22,10 +22,16 @@ from app.model.db import Node from app.utils.e2ee_utils import E2EEUtils from app.utils.docs_utils import get_routers_responses -from app.model.schema import E2EEResponse +from app.utils.web3_utils import Web3Wrapper +from app.model.schema import ( + E2EEResponse, + BlockNumberResponse +) from app.exceptions import ServiceUnavailableError from app import log +web3 = Web3Wrapper() + LOG = log.get_logger() router = APIRouter(tags=["index"]) @@ -88,3 +94,16 @@ def __check_ethereum(errors: list, db: Session): msg = "Ethereum node's block synchronization is down" LOG.error(msg) errors.append(msg) + + +# GET: /block_number +@router.get( + "/block_number", + response_model=BlockNumberResponse, + responses=get_routers_responses(ServiceUnavailableError) +) +def get_block_number(): + """Get Block Number in current""" + block_number = web3.eth.block_number + + return {"block_number": block_number} diff --git a/tests/test_app_routers_block_number_GET.py b/tests/test_app_routers_block_number_GET.py new file mode 100644 index 00000000..edf51aeb --- /dev/null +++ b/tests/test_app_routers_block_number_GET.py @@ -0,0 +1,67 @@ +""" +Copyright BOOSTRY Co., Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and +limitations under the License. + +SPDX-License-Identifier: Apache-2.0 +""" +from datetime import datetime + +from unittest import mock +from unittest.mock import MagicMock +from app.exceptions import ServiceUnavailableError + +from app.model.db import Node + + +class TestAppRoutersBlockNumberGET: + # target API endpoint + apiurl = "/block_number" + + ########################################################################### + # Normal Case + ########################################################################### + + # + @mock.patch("web3.eth.Eth.block_number", 100) + def test_normal_1(self, client, db): + # request target api + resp = client.get(self.apiurl) + + # assertion + assert resp.status_code == 200 + assert resp.json() == { + "block_number": 100 + } + + ########################################################################### + # Error Case + ########################################################################### + + # + # Unable to connect ibet + @mock.patch("web3.eth.BaseEth.get_block_number", MagicMock(side_effect=ServiceUnavailableError(""))) + def test_error_1(self, client, db): + # request target api + resp = client.get(self.apiurl) + + # assertion + assert resp.status_code == 503 + assert resp.json() == { + "meta": { + "code": 1, + "title": "ServiceUnavailableError" + }, + "detail": "" + }