From f3be00438b5f3bcccab9ab406e2452f1a24b032a Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 26 Oct 2026 14:27:16 +0100 Subject: [PATCH] Assert profile updates leave feedback idle and preserve outer-commit change flags --- tests/test_chat_feedback.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tests/test_chat_feedback.c b/tests/test_chat_feedback.c index a3be4c0d..3efa9412 100644 --- a/tests/test_chat_feedback.c +++ b/tests/test_chat_feedback.c @@ -114,6 +114,19 @@ static void membership_regressions(struct UASYNC* ua) { assert(chat_feedback_apply(&target, "1002", &other) == 1); uint8_t before[32], after[32], empty[32] = {0}, other_root[32], key[32]; root(&target, before); assert(merkle_sync_read_hash(&target, MT_DATA_FEEDBACK, "1002", 0, 0, other_root) == 0); + /* Подписанный профиль меняет MEMBERS, но не запускает feedback и его UI-события. */ + uint8_t profile_join[64], profile_update[64], profile_body[256], profile_x[32] = {3}, profile_ed[32]; + public_key(owner_private, profile_ed); + int profile_len = member_sync_build_join_msg(profile_x, profile_ed, author.node_id, author.my_keys.public_key, + 1, profile_body, sizeof(profile_body)); assert(profile_len == 112); + assert(sc_ed25519_sign(author.my_ed25519_privkey, profile_body, profile_len, profile_join) == SC_OK); + profile_len = member_sync_build_update_msg(profile_join, 2, "{\"name\":\"profile\"}", profile_body, sizeof(profile_body)); + assert(profile_len > 0 && sc_ed25519_sign(author.my_ed25519_privkey, profile_body, profile_len, profile_update) == SC_OK); + int profile_events = events; + int profile_changed = member_sync_put(&target, "1001", author.node_id, author.my_keys.public_key, author.my_ed25519_pubkey, + profile_join, 1, profile_update, 2, "{\"name\":\"profile\"}", NULL, NULL, 0, 0, NULL); + assert((profile_changed & MS_APPLY_CHANGED) && !(profile_changed & MS_APPLY_FEEDBACK) && events == profile_events); + root(&target, after); assert(!memcmp(before, after, 32)); int saved_events = events; assert(set_deleted(&target, &author, 1, 1) & MS_APPLY_CHANGED); root(&target, after); assert(!memcmp(after, empty, 32) && events > saved_events); @@ -222,9 +235,9 @@ static void membership_regressions(struct UASYNC* ua) { assert(sqlite3_exec(target.topo_sqlite_db, "ROLLBACK", NULL, NULL, NULL) == SQLITE_OK); root(&target, after); assert(!memcmp(before, after, 32) && events == saved_events); assert(sqlite3_exec(target.topo_sqlite_db, "BEGIN IMMEDIATE", NULL, NULL, NULL) == SQLITE_OK); - assert(set_deleted(&target, &author, 3, 1) & MS_APPLY_CHANGED); + int changes = set_deleted(&target, &author, 3, 1); assert(changes & MS_APPLY_CHANGED); assert(sqlite3_exec(target.topo_sqlite_db, "COMMIT", NULL, NULL, NULL) == SQLITE_OK && events == saved_events); - member_sync_record_committed(&target, "1001", author.node_id); assert(events > saved_events); + member_sync_record_committed(&target, "1001", author.node_id, (unsigned)changes); assert(events > saved_events); for (unsigned i = 0; i < 3; i++) assert_stored(&target, &original[i]); puts("PASS: SQL lookup/index failures, commit veto and outer rollback publish no partial data, roots or events"); member_sync_destroy(&author); member_sync_destroy(&target); member_sync_destroy(&inviter);