summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/tests
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/tests')
-rw-r--r--packages/meshbay-node/tests/test_chat_is_bounded.py18
-rw-r--r--packages/meshbay-node/tests/test_chat_store.py36
2 files changed, 36 insertions, 18 deletions
diff --git a/packages/meshbay-node/tests/test_chat_is_bounded.py b/packages/meshbay-node/tests/test_chat_is_bounded.py
index c48f26d..f98fd81 100644
--- a/packages/meshbay-node/tests/test_chat_is_bounded.py
+++ b/packages/meshbay-node/tests/test_chat_is_bounded.py
@@ -210,10 +210,10 @@ async def test_one_member_at_their_limit_has_not_spent_anyone_elses(ctx, store):
async def test_the_clear_fields_are_what_they_claim_and_no_larger(ctx, store):
"""
- `sender_name` and `thread_id` travel in clear beside the sealed envelope,
- which carries its own. They are stored on the operator's disk and relayed
- to every member, so a megabyte of name or a list for a thread id is dropped,
- not kept.
+ `sender_name` travels in clear beside the sealed envelope, which carries its
+ own. It is stored on the operator's disk and relayed to every member, so a
+ megabyte of name is dropped, not kept — and a `thread_id`, which an older
+ client still sends, is neither.
"""
alice = _session(ctx, store, user="alice", conn="c1")
bob = _session(ctx, store, user="bob", conn="c2")
@@ -225,17 +225,19 @@ async def test_the_clear_fields_are_what_they_claim_and_no_larger(ctx, store):
stored = (await store.get_recent(limit=1))[0]
assert stored.sender_name in ("", None)
- assert stored.thread_id is None
relayed = [m for m in bob.sent if m.get("type") == "chat_msg"]
- assert relayed and relayed[-1]["sender_name"] == "" and relayed[-1]["thread_id"] is None
+ assert relayed and relayed[-1]["sender_name"] == "" and "thread_id" not in relayed[-1]
-async def test_ordinary_clear_fields_pass_unchanged(ctx, store):
+async def test_an_older_clients_message_is_taken_its_thread_id_ignored(ctx, store):
alice = _session(ctx, store, user="alice", conn="c1")
+ bob = _session(ctx, store, user="bob", conn="c2")
msg = _message(alice, size=64)
msg["sender_name"] = "Alice"
msg["thread_id"] = "42"
alice._do_chat_message(msg)
await _drain(ctx)
stored = (await store.get_recent(limit=1))[0]
- assert (stored.sender_name, stored.thread_id) == ("Alice", "42")
+ assert stored.sender_name == "Alice"
+ relayed = [m for m in bob.sent if m.get("type") == "chat_msg"]
+ assert relayed and "thread_id" not in relayed[-1]
diff --git a/packages/meshbay-node/tests/test_chat_store.py b/packages/meshbay-node/tests/test_chat_store.py
index 2533921..c4dff6d 100644
--- a/packages/meshbay-node/tests/test_chat_store.py
+++ b/packages/meshbay-node/tests/test_chat_store.py
@@ -28,7 +28,6 @@ async def test_save_and_retrieve(store):
assert msgs[0].sender_id == "alice"
assert msgs[0].iteration == 0
assert msgs[0].payload == b"hello"
- assert msgs[0].thread_id is None
@pytest.mark.asyncio
@@ -52,15 +51,32 @@ async def test_get_messages_since(store):
@pytest.mark.asyncio
-async def test_thread_messages(store):
- await store.save_message("alice", 0, b"root", thread_id="t1")
- await store.save_message("bob", 1, b"reply", thread_id="t1")
- await store.save_message("carol", 2, b"other")
-
- thread = await store.get_thread("t1")
- assert len(thread) == 2
- assert thread[0].sender_id == "alice"
- assert thread[1].sender_id == "bob"
+async def test_the_thread_column_stays_for_an_older_node_and_its_index_goes(tmp_path):
+ """Chat has no threads; a node downgraded to a version that still names
+ `thread_id` in every query must keep reading its rows."""
+ import sqlite3
+ path = tmp_path / "chat.db"
+ with sqlite3.connect(path) as c: # as an older node left it
+ c.executescript("""
+ CREATE TABLE messages (id INTEGER PRIMARY KEY AUTOINCREMENT,
+ sender_id TEXT NOT NULL, iteration INTEGER NOT NULL,
+ payload BLOB NOT NULL, timestamp REAL NOT NULL,
+ thread_id TEXT DEFAULT NULL, sender_name TEXT DEFAULT '');
+ CREATE INDEX idx_messages_thread ON messages(thread_id);
+ INSERT INTO messages (sender_id, iteration, payload, timestamp, thread_id)
+ VALUES ('alice', 0, X'6869', 1.0, 't1');""")
+ s = ChatStore(path)
+ await s.open()
+ await s.save_message("bob", 1, b"now")
+ assert [m.payload for m in await s.get_recent()] == [b"hi", b"now"]
+ await s.close()
+ with sqlite3.connect(path) as c:
+ assert "thread_id" in [r[1] for r in c.execute("PRAGMA table_info(messages)")]
+ assert not c.execute("SELECT 1 FROM sqlite_master WHERE name = "
+ "'idx_messages_thread'").fetchone()
+ # What an older node selects still answers.
+ assert c.execute("SELECT thread_id FROM messages ORDER BY id").fetchall() == [
+ ("t1",), (None,)]
@pytest.mark.asyncio