mirror of
https://github.com/ipnet-mesh/meshcore-hub.git
synced 2026-07-02 07:51:07 +02:00
0478bb00a1
The LetsMesh normalizer stored public keys as UPPERCASE while the tag importer stored them as lowercase, creating duplicate nodes for the same device. Normalize all public keys to lowercase throughout: - MQTT topic parsing (event, command, LetsMesh upload) - LetsMesh normalizer output - Node model __init__ enforcement - Alembic migration to merge duplicates and normalize existing data
58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
"""Tests for MQTT topic parsing utilities."""
|
|
|
|
from meshcore_hub.common.mqtt import TopicBuilder
|
|
|
|
|
|
class TestTopicBuilder:
|
|
"""Tests for MQTT topic builder parsing helpers."""
|
|
|
|
def test_parse_event_topic_with_single_segment_prefix(self) -> None:
|
|
"""Event topics are parsed correctly with a simple prefix."""
|
|
builder = TopicBuilder(prefix="meshcore")
|
|
|
|
parsed = builder.parse_event_topic(
|
|
"meshcore/ABCDEF1234567890/event/advertisement"
|
|
)
|
|
|
|
assert parsed == ("abcdef1234567890", "advertisement")
|
|
|
|
def test_parse_event_topic_with_multi_segment_prefix(self) -> None:
|
|
"""Event topics are parsed correctly with a slash-delimited prefix."""
|
|
builder = TopicBuilder(prefix="meshcore/BOS")
|
|
|
|
parsed = builder.parse_event_topic(
|
|
"meshcore/BOS/ABCDEF1234567890/event/channel_msg_recv"
|
|
)
|
|
|
|
assert parsed == ("abcdef1234567890", "channel_msg_recv")
|
|
|
|
def test_parse_command_topic_with_multi_segment_prefix(self) -> None:
|
|
"""Command topics are parsed correctly with a slash-delimited prefix."""
|
|
builder = TopicBuilder(prefix="meshcore/BOS")
|
|
|
|
parsed = builder.parse_command_topic(
|
|
"meshcore/BOS/ABCDEF123456/command/send_msg"
|
|
)
|
|
|
|
assert parsed == ("abcdef123456", "send_msg")
|
|
|
|
def test_parse_letsmesh_upload_topic(self) -> None:
|
|
"""LetsMesh upload topics map to public key and feed type."""
|
|
builder = TopicBuilder(prefix="meshcore")
|
|
|
|
parsed = builder.parse_letsmesh_upload_topic(
|
|
"meshcore/STN/ABCDEF1234567890/status"
|
|
)
|
|
|
|
assert parsed == ("abcdef1234567890", "status")
|
|
|
|
def test_parse_letsmesh_upload_topic_rejects_unknown_feed(self) -> None:
|
|
"""Unknown LetsMesh feed topics are rejected."""
|
|
builder = TopicBuilder(prefix="meshcore")
|
|
|
|
parsed = builder.parse_letsmesh_upload_topic(
|
|
"meshcore/STN/ABCDEF1234567890/something_else"
|
|
)
|
|
|
|
assert parsed is None
|