diff options
Diffstat (limited to 'packages/meshbay-node/tests')
| -rw-r--r-- | packages/meshbay-node/tests/test_chat_is_bounded.py | 18 | ||||
| -rw-r--r-- | packages/meshbay-node/tests/test_chat_store.py | 36 |
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 |