Skip to content

Commit e8ed509

Browse files
feat(tck): implement getFileInfo JSON-RPC method (hiero-ledger#2580)
Signed-off-by: achintya2k5 <achintyasin@gmail.com> Co-authored-by: exploreriii <133720349+exploreriii@users.noreply.github.com>
1 parent d992b66 commit e8ed509

5 files changed

Lines changed: 65 additions & 15 deletions

File tree

src/hiero_sdk_python/file/file_info_query.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,16 @@ def _make_request(self) -> query_pb2.Query:
6060
Query: The protobuf query message.
6161
6262
Raises:
63-
ValueError: If the file ID is not set.
64-
Exception: If any other error occurs during request construction.
63+
Exception: If any error occurs during request construction.
6564
"""
6665
try:
67-
if not self.file_id:
68-
raise ValueError("File ID must be set before making the request.")
69-
7066
query_header = self._make_request_header()
7167

7268
file_info_query = file_get_info_pb2.FileGetInfoQuery()
7369
file_info_query.header.CopyFrom(query_header)
74-
file_info_query.fileID.CopyFrom(self.file_id._to_proto())
70+
71+
if self.file_id is not None:
72+
file_info_query.fileID.CopyFrom(self.file_id._to_proto())
7573

7674
query = query_pb2.Query()
7775
query.fileGetInfo.CopyFrom(file_info_query)

tck/handlers/file.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,19 @@
33
from hiero_sdk_python.file.file_contents_query import FileContentsQuery
44
from hiero_sdk_python.file.file_create_transaction import FileCreateTransaction
55
from hiero_sdk_python.file.file_id import FileId
6+
from hiero_sdk_python.file.file_info import FileInfo
7+
from hiero_sdk_python.file.file_info_query import FileInfoQuery
68
from hiero_sdk_python.hbar import Hbar
79
from hiero_sdk_python.response_code import ResponseCode
810
from hiero_sdk_python.timestamp import Timestamp
911
from hiero_sdk_python.transaction.transaction_receipt import TransactionReceipt
1012
from tck.errors import JsonRpcError
1113
from tck.handlers.registry import rpc_method
12-
from tck.param.file import CreateFileParams, GetFileContentsParams
13-
from tck.response.file import CreateFileResponse, GetFileContentsResponse
14+
from tck.param.file import CreateFileParams, GetFileContentsParams, GetFileInfoParams
15+
from tck.response.file import CreateFileResponse, GetFileContentsResponse, GetFileInfoResponse
1416
from tck.util.client_utils import get_client
1517
from tck.util.constants import DEFAULT_GRPC_TIMEOUT
16-
from tck.util.key_utils import get_key_from_string
18+
from tck.util.key_utils import get_key_from_string, key_to_string
1719
from tck.util.param_utils import to_int
1820

1921

@@ -76,3 +78,31 @@ def get_file_contents(params: GetFileContentsParams) -> GetFileContentsResponse:
7678
decoded_contents = contents.decode("utf-8", errors="replace") if isinstance(contents, bytes) else str(contents)
7779

7880
return GetFileContentsResponse(contents=decoded_contents)
81+
82+
83+
def _build_file_info_response(info: FileInfo) -> GetFileInfoResponse:
84+
"""Build a GetFileResponse from a FileInfo object."""
85+
86+
keys = [key_to_string(k) for k in info.keys] if info.keys else []
87+
88+
return GetFileInfoResponse(
89+
fileId=str(info.file_id) if info.file_id is not None else None,
90+
size=str(info.size) if info.size is not None else None,
91+
expirationTime=str(info.expiration_time.seconds) if info.expiration_time is not None else None,
92+
isDeleted=info.is_deleted,
93+
keys=keys,
94+
memo=info.file_memo,
95+
ledgerId=info.ledger_id.hex() if info.ledger_id is not None else None,
96+
)
97+
98+
99+
@rpc_method("getFileInfo")
100+
def get_file_info(params: GetFileInfoParams) -> GetFileInfoResponse:
101+
client = get_client(params.sessionId)
102+
query = FileInfoQuery().set_grpc_deadline(DEFAULT_GRPC_TIMEOUT)
103+
104+
if params.fileId is not None:
105+
query.set_file_id(FileId.from_string(params.fileId))
106+
107+
info = query.execute(client)
108+
return _build_file_info_response(info)

tck/param/file.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,15 @@ def parse_json_params(cls, params: dict) -> GetFileContentsParams:
5151
queryPayment=params.get("queryPayment"),
5252
maxQueryPayment=params.get("maxQueryPayment"),
5353
)
54+
55+
56+
@dataclass
57+
class GetFileInfoParams(BaseParams):
58+
"""Parameters for getting file information."""
59+
60+
fileId: str | None = None
61+
62+
@classmethod
63+
def parse_json_params(cls, params: dict) -> GetFileInfoParams:
64+
"""Parse JSON-RPC params into a GetFileInfoParams instance."""
65+
return cls(fileId=params.get("fileId"), sessionId=parse_session_id(params))

tck/response/file.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from dataclasses import dataclass
3+
from dataclasses import dataclass, field
44

55

66
@dataclass
@@ -16,3 +16,14 @@ class GetFileContentsResponse:
1616
"""Response payload for getFileContents."""
1717

1818
contents: str | None = None
19+
20+
21+
@dataclass
22+
class GetFileInfoResponse:
23+
fileId: str | None = None
24+
size: str | None = None
25+
expirationTime: str | None = None
26+
isDeleted: bool | None = None
27+
keys: list[str] = field(default_factory=list)
28+
memo: str | None = None
29+
ledgerId: str | None = None

tests/unit/file_info_query_test.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,11 @@ def test_constructor():
3333
assert query.file_id == file_id
3434

3535

36-
def test_execute_fails_with_missing_file_id(mock_client):
37-
"""Test request creation with missing File ID."""
36+
def test_make_request_with_missing_file_id():
37+
"""Test File ID is omitted from proto when not set."""
3838
query = FileInfoQuery()
39-
40-
with pytest.raises(ValueError, match="File ID must be set before making the request."):
41-
query.execute(mock_client)
39+
proto = query._make_request()
40+
assert not proto.fileGetInfo.HasField("fileID")
4241

4342

4443
def test_get_method():

0 commit comments

Comments
 (0)