Skip to content

Commit 2f13541

Browse files
Merge branch 'main' into accountinfo
Signed-off-by: Mukund Jha <mukundiiitg@gmail.com>
2 parents 44e60ed + 4189f47 commit 2f13541

3 files changed

Lines changed: 76 additions & 57 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ This changelog is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.
77
## [Unreleased]
88

99
### Tests
10+
- Format tests/unit/logger_test.py with black for code style consistency (#1541)
1011
- Style: formatted `tests/unit/prng_transaction_test.py` with black (#1546)
1112
- Formatted contract unit tests with black for consistent style. (#1523)
1213
- Format account test files with Black (#1519)
@@ -124,6 +125,7 @@ This changelog is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.
124125

125126
### Changed
126127
- Refactored AccountInfo class to use the staking_info
128+
- chore: format tests/unit/mock_server.py with black (#1542)
127129
- Updated actions/checkout to v6.0.1 and actions/github-script v8.0.0 in bot-next-issue-recommendation workflow (#1586)
128130
- Expanded inactivity bot messages to include `/unassign` command information for contributors (#1555)
129131
- Update the acceptance criteria wording in the issue templates to improve clarity and consistency for contributors (#1491)

tests/unit/logger_test.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
pytestmark = pytest.mark.unit
77

8+
89
def test_set_level():
910
"""Test that changing log level affects what will be logged."""
1011
logger = Logger(LogLevel.DEBUG, "test_logger")
@@ -16,7 +17,7 @@ def test_get_level():
1617
"""Test getting the current log level."""
1718
logger = Logger(level=LogLevel.DEBUG)
1819
assert logger.get_level() == LogLevel.DEBUG
19-
20+
2021
logger.set_level(LogLevel.ERROR)
2122
assert logger.get_level() == LogLevel.ERROR
2223

@@ -25,7 +26,7 @@ def test_logger_creation():
2526
logger = Logger(LogLevel.DEBUG, "test_logger")
2627
assert logger.name == "test_logger"
2728
assert logger.level == LogLevel.DEBUG
28-
29+
2930

3031
def test_logger_creation_from_env():
3132
os.environ["LOG_LEVEL"] = "CRITICAL"
@@ -35,23 +36,23 @@ def test_logger_creation_from_env():
3536

3637
def test_logger_output(capsys):
3738
"""Test that logger outputs the expected messages to stdout.
38-
39+
3940
This test uses pytest's capsys fixture to capture the actual log output,
4041
allowing verification of the exact content written to stdout by the logger.
4142
"""
4243
# Create a logger that logs to the captured stdout with UNIQUE name
4344
logger = Logger(LogLevel.TRACE, "test_logger_output")
44-
45+
4546
# Log messages at different levels with key-value pairs
4647
logger.trace("trace message", "traceKey", "traceValue")
4748
logger.debug("debug message", "debugKey", "debugValue")
4849
logger.info("info message", "infoKey", "infoValue")
4950
logger.warning("warning message", "warningKey", "warningValue")
5051
logger.error("error message", "errorKey", "errorValue")
51-
52+
5253
# Get the captured output
5354
captured = capsys.readouterr()
54-
55+
5556
# Verify that each message appears in the output
5657
assert "trace message: traceKey = traceValue" in captured.out
5758
assert "debug message: debugKey = debugValue" in captured.out
@@ -63,7 +64,7 @@ def test_logger_output(capsys):
6364
logger.error("this should not appear")
6465
captured = capsys.readouterr()
6566
assert captured.out == ""
66-
67+
6768
# Test re-enabling logging
6869
logger.set_silent(False)
6970
logger.info("this should appear")
@@ -73,27 +74,27 @@ def test_logger_output(capsys):
7374

7475
def test_logger_respects_level(capsys):
7576
"""Test that logger only outputs messages at or above its level.
76-
77+
7778
Uses pytest's capsys fixture to verify that log filtering works correctly
7879
by examining which messages actually appear in the captured output based on
7980
the configured log level.
8081
"""
8182
# Create a logger that logs to the captured stdout with UNIQUE name
8283
logger = Logger(LogLevel.INFO, "test_logger_respects_level")
83-
84+
8485
# These should not be logged
8586
logger.trace("trace message")
8687
logger.debug("debug message")
87-
88+
8889
# These should be logged
8990
logger.info("info message")
9091
logger.warning("warning message")
9192
logger.error("error message")
92-
93+
9394
# Get the captured output
9495
captured = capsys.readouterr()
9596
logger.info(captured.out)
96-
97+
9798
# Check that appropriate messages were logged or not logged
9899
assert "trace message" not in captured.out
99100
assert "debug message" not in captured.out

tests/unit/mock_server.py

Lines changed: 61 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -20,89 +20,106 @@
2020
)
2121
from hiero_sdk_python.logger.log_level import LogLevel
2222

23+
2324
class MockServer:
2425
"""Mock gRPC server that returns predetermined responses."""
25-
26+
2627
def __init__(self, responses):
2728
"""
2829
Initialize a mock gRPC server with predetermined responses.
29-
30+
3031
Args:
3132
responses (list): List of response objects to return in sequence
3233
"""
3334
self.responses = responses
3435
self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
3536
self.port = _find_free_port()
3637
self.address = f"localhost:{self.port}"
37-
38+
3839
self._register_services()
39-
40+
4041
# Start the server
4142
self.server.add_insecure_port(self.address)
4243
self.server.start()
43-
44+
4445
def _register_services(self):
4546
"""Register all necessary gRPC services."""
4647
# Create and register all servicers
4748
services = [
48-
(crypto_service_pb2_grpc.CryptoServiceServicer,
49-
crypto_service_pb2_grpc.add_CryptoServiceServicer_to_server),
50-
(token_service_pb2_grpc.TokenServiceServicer,
51-
token_service_pb2_grpc.add_TokenServiceServicer_to_server),
52-
(consensus_service_pb2_grpc.ConsensusServiceServicer,
53-
consensus_service_pb2_grpc.add_ConsensusServiceServicer_to_server),
54-
(network_service_pb2_grpc.NetworkServiceServicer,
55-
network_service_pb2_grpc.add_NetworkServiceServicer_to_server),
56-
(file_service_pb2_grpc.FileServiceServicer,
57-
file_service_pb2_grpc.add_FileServiceServicer_to_server),
58-
(smart_contract_service_pb2_grpc.SmartContractServiceServicer,
59-
smart_contract_service_pb2_grpc.add_SmartContractServiceServicer_to_server),
60-
(schedule_service_pb2_grpc.ScheduleServiceServicer,
61-
schedule_service_pb2_grpc.add_ScheduleServiceServicer_to_server),
62-
(util_service_pb2_grpc.UtilServiceServicer,
63-
util_service_pb2_grpc.add_UtilServiceServicer_to_server),
49+
(
50+
crypto_service_pb2_grpc.CryptoServiceServicer,
51+
crypto_service_pb2_grpc.add_CryptoServiceServicer_to_server,
52+
),
53+
(
54+
token_service_pb2_grpc.TokenServiceServicer,
55+
token_service_pb2_grpc.add_TokenServiceServicer_to_server,
56+
),
57+
(
58+
consensus_service_pb2_grpc.ConsensusServiceServicer,
59+
consensus_service_pb2_grpc.add_ConsensusServiceServicer_to_server,
60+
),
61+
(
62+
network_service_pb2_grpc.NetworkServiceServicer,
63+
network_service_pb2_grpc.add_NetworkServiceServicer_to_server,
64+
),
65+
(
66+
file_service_pb2_grpc.FileServiceServicer,
67+
file_service_pb2_grpc.add_FileServiceServicer_to_server,
68+
),
69+
(
70+
smart_contract_service_pb2_grpc.SmartContractServiceServicer,
71+
smart_contract_service_pb2_grpc.add_SmartContractServiceServicer_to_server,
72+
),
73+
(
74+
schedule_service_pb2_grpc.ScheduleServiceServicer,
75+
schedule_service_pb2_grpc.add_ScheduleServiceServicer_to_server,
76+
),
77+
(
78+
util_service_pb2_grpc.UtilServiceServicer,
79+
util_service_pb2_grpc.add_UtilServiceServicer_to_server,
80+
),
6481
]
65-
82+
6683
for servicer_class, add_servicer_fn in services:
6784
servicer = self._create_mock_servicer(servicer_class)
6885
add_servicer_fn(servicer, self.server)
69-
86+
7087
def _create_mock_servicer(self, servicer_class):
7188
"""
7289
Create a mock servicer that returns predetermined responses.
73-
90+
7491
Args:
7592
servicer_class: The gRPC servicer class to mock
76-
93+
7794
Returns:
7895
A mock servicer object
7996
"""
8097
responses = self.responses
81-
98+
8299
class MockServicer(servicer_class):
83100
def __getattribute__(self, name):
84101
# Get special attributes normally
85-
if name in ('_next_response', '__class__'):
102+
if name in ("_next_response", "__class__"):
86103
return super().__getattribute__(name)
87-
104+
88105
def method_wrapper(request, context):
89106
nonlocal responses
90107
if not responses:
91108
# If no more responses are available, return None
92109
return None
93-
110+
94111
response = responses.pop(0)
95-
112+
96113
if isinstance(response, RealRpcError):
97114
# Abort with custom error
98115
context.abort(response.code(), response.details())
99-
116+
100117
return response
101-
118+
102119
return method_wrapper
103-
120+
104121
return MockServicer()
105-
122+
106123
def close(self):
107124
"""Stop the server."""
108125
self.server.stop(0)
@@ -111,21 +128,21 @@ def close(self):
111128
def _find_free_port():
112129
"""Find a free port on localhost."""
113130
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
114-
s.bind(('', 0))
131+
s.bind(("", 0))
115132
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
116133
return s.getsockname()[1]
117134

118135

119136
class RealRpcError(grpc.RpcError):
120137
"""A more realistic gRPC error for testing."""
121-
138+
122139
def __init__(self, status_code, details):
123140
self._status_code = status_code
124141
self._details = details
125-
142+
126143
def code(self):
127144
return self._status_code
128-
145+
129146
def details(self):
130147
return self._details
131148

@@ -134,29 +151,28 @@ def details(self):
134151
def mock_hedera_servers(response_sequences):
135152
"""
136153
Context manager that creates mock Hedera servers and a client.
137-
154+
138155
Args:
139156
response_sequences: List of response sequences, one for each mock server
140-
157+
141158
Yields:
142159
Client: The configured client
143160
"""
144161
# Create mock servers
145162
servers = [MockServer(responses) for responses in response_sequences]
146-
163+
147164
try:
148165
# Configure the network with mock servers
149166
nodes = []
150167
for i, server in enumerate(servers):
151168
node = _Node(AccountId(0, 0, 3 + i), server.address, None)
152-
169+
153170
# force insecure transport
154171
node._apply_transport_security(False)
155172
node._set_verify_certificates(False)
156-
173+
157174
nodes.append(node)
158175

159-
160176
# Create network and client
161177
network = Network(nodes=nodes)
162178
client = Client(network)
@@ -165,7 +181,7 @@ def mock_hedera_servers(response_sequences):
165181
key = PrivateKey.generate()
166182
client.set_operator(AccountId(0, 0, 1800), key)
167183
client.max_attempts = 4 # Configure for testing
168-
184+
169185
yield client
170186
finally:
171187
# Clean up the servers

0 commit comments

Comments
 (0)