Refactor code structure for improved readability and maintainability

This commit is contained in:
Lloyd
2026-06-02 10:27:40 +01:00
parent afb303af78
commit cb98211445
5 changed files with 57 additions and 5 deletions
+1
View File
@@ -65,3 +65,4 @@ syncpi.sh
# Docker
/data
Installing
+1 -1
View File
@@ -70,7 +70,7 @@ class PacketRecord:
origin_id=origin_id,
timestamp=dt.isoformat(),
type="PACKET",
direction="rx",
direction="tx" if bool(packet_record.get("transmitted", False)) else "rx",
time=dt.strftime("%H:%M:%S"),
date=dt.strftime("%-d/%-m/%Y"),
len=str(len(packet_record["raw_packet"]) // 2),
+9 -2
View File
@@ -1083,8 +1083,15 @@ class RepeaterDaemon:
route_type="flood",
)
# Send via dispatcher
await self.dispatcher.send_packet(packet, wait_for_ack=False)
# Route advert TX through router injection so it flows through engine/storage/MQTT.
if not self.router:
logger.error("Cannot send advert: router not initialized")
return False
send_ok = await self.router.inject_packet(packet, wait_for_ack=False)
if not send_ok:
logger.error("Failed to inject advert packet for TX")
return False
if self.repeater_handler:
self.repeater_handler.mark_seen(packet)
+9 -2
View File
@@ -212,7 +212,7 @@ async def test_register_identity_everywhere_calls_helpers_and_respects_collision
@pytest.mark.asyncio
async def test_send_advert_branches_and_success_path():
async def test_send_advert_branches_and_success_paths():
daemon = RepeaterDaemon(_base_config(), radio=object())
# Missing dispatcher/local identity
@@ -231,12 +231,19 @@ async def test_send_advert_branches_and_success_path():
get_repeater_location=lambda: {"latitude": 9.1, "longitude": 8.2, "source": "gps"}
)
# Router is now required for advert TX processing path.
daemon.router = None
assert await daemon.send_advert() is False
daemon.router = SimpleNamespace(inject_packet=AsyncMock(return_value=True))
packet = SimpleNamespace(calculate_packet_hash=lambda: b"\xab" * 16)
with patch("pymc_core.protocol.PacketBuilder.create_advert", return_value=packet):
ok = await daemon.send_advert()
assert ok is True
daemon.dispatcher.send_packet.assert_awaited_once_with(packet, wait_for_ack=False)
daemon.router.inject_packet.assert_awaited_once_with(packet, wait_for_ack=False)
daemon.dispatcher.send_packet.assert_not_called()
daemon.repeater_handler.mark_seen.assert_called_once_with(packet)
daemon.dispatcher.packet_filter.track_packet.assert_called_once()
+37
View File
@@ -236,3 +236,40 @@ def test_mqtt_published_packet_legacy_mqtt_format_uses_singular_packet_topic():
payload_dict = json.loads(captured[0]["payload"])
# Duration still flows through correctly even on the legacy topic
assert int(payload_dict["duration"]) > 0
def test_mqtt_published_packet_direction_uses_transmitted_flag_for_tx():
"""When engine marks packet_record.transmitted=True, published direction must be tx."""
config = _make_config(format_value="letsmesh", iata_code="LAX")
public_key_hex = "11" * 32
identity = _FakeIdentity(public_key_hex)
pusher = MeshCoreToMqttPusher(local_identity=identity, config=config)
captured = _attach_capturing_client(pusher.connections[0])
raw_bytes = bytes(range(12))
airtime_mgr = AirtimeManager(config)
packet_record = {
"timestamp": 1700000000.0,
"type": 8,
"route": 1,
"rssi": -88,
"snr": 6.0,
"score": 0.4,
"payload_length": 6,
"packet_hash": "FACEFEED" + "00" * 4,
"raw_packet": raw_bytes.hex(),
"airtime_ms": airtime_mgr.calculate_airtime(len(raw_bytes)),
"transmitted": True,
}
record = PacketRecord.from_packet_record(
packet_record, origin="test-node", origin_id=public_key_hex.upper()
)
assert record is not None
pusher.publish_packet(record.to_dict())
assert len(captured) == 1
payload_dict = json.loads(captured[0]["payload"])
assert payload_dict["direction"] == "tx"