From 0f14abd6c84fdac2a5a193dfd0899ebac1f8cc07 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 7 Oct 2026 08:12:32 +0200 Subject: [PATCH] Test single reaction replacement, cancellation and multi-emoji rejection --- tests/test_chat_feedback.c | 7 ++++++- tests/test_chat_poll.c | 21 ++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/tests/test_chat_feedback.c b/tests/test_chat_feedback.c index 464bb94f..48557043 100644 --- a/tests/test_chat_feedback.c +++ b/tests/test_chat_feedback.c @@ -110,9 +110,14 @@ int main(int argc, char** argv) { puts("PASS: message identity is deterministic and binds channel, timestamp and signature"); uint64_t ver; struct chat_feedback_record first, second, cancelled, actual; - uint8_t a[] = {1, 0}, b[] = {2, 0, 1}, answer_data[] = {1, 0, 0, 0}; + uint8_t a[] = {1, 0}, b[] = {1, 1}, answer_data[] = {1, 0, 0, 0}; assert(chat_feedback_set(&source, "1001", message, CHAT_FEEDBACK_REACTION, a, sizeof(a), &ver) == 1 && ver == 1); assert(chat_feedback_get(&source, "1001", message, source.node_id, CHAT_FEEDBACK_REACTION, &first) == 1); + uint8_t invalid_multi[] = {2, 0, 1}; + assert(chat_feedback_set(&source, "1001", message, CHAT_FEEDBACK_REACTION, invalid_multi, sizeof(invalid_multi), NULL) < 0); + struct chat_feedback_record invalid = first; invalid.ver++; invalid.data_len = sizeof(invalid_multi); + memcpy(invalid.data, invalid_multi, sizeof(invalid_multi)); + assert(chat_feedback_apply(&target, "1001", &invalid) < 0); int saved_events = events; assert(chat_feedback_set(&source, "1001", message, CHAT_FEEDBACK_REACTION, a, sizeof(a), &ver) == 0 && ver == 1); assert(events == saved_events); diff --git a/tests/test_chat_poll.c b/tests/test_chat_poll.c index c0a7c267..d1fb838f 100644 --- a/tests/test_chat_poll.c +++ b/tests/test_chat_poll.c @@ -48,9 +48,11 @@ static void codecs(void) { assert(chat_answer_decode(NULL, 0, &parsed) == 0 && !parsed.count); uint8_t empty[] = {0, 0, 0}; assert(chat_answer_decode(empty, sizeof(empty), &parsed) < 0); uint8_t ids[] = {5, 0}, read[CHAT_REACTION_SELECTED_MAX]; size_t count; - n = chat_reactions_encode(ids, 2, wire, sizeof(wire)); assert(n == 3); - assert(chat_reactions_decode(wire, n, read, &count) == 0 && count == 2 && read[0] == 0 && read[1] == 5); - wire[2] = 0; assert(chat_reactions_decode(wire, n, read, &count) < 0); + assert(chat_reactions_encode(ids, 2, wire, sizeof(wire)) < 0); + uint8_t multi[] = {2, 0, 5}; assert(chat_reactions_decode(multi, sizeof(multi), read, &count) < 0); + n = chat_reactions_encode(ids, 1, wire, sizeof(wire)); assert(n == 2); + assert(chat_reactions_decode(wire, n, read, &count) == 0 && count == 1 && read[0] == 5); + wire[1] = CHAT_REACTION_COUNT; assert(chat_reactions_decode(wire, n, read, &count) < 0); assert(chat_reactions_encode(NULL, 0, wire, sizeof(wire)) == 0); puts("PASS: canonical codecs, truncation, duplicate choices and UTF-8 rejection"); } @@ -97,6 +99,19 @@ int main(void) { snprintf(request, sizeof(request), "{\"cmd\":\"react\",\"ch\":\"%s\",\"message_id\":\"%s\",\"emoji\":0}", channel, id); result = command(inst, request, 0); assert(json_number(db, result, "$.reactions[0].count") == 1); u_free(result); result = command(inst, request, 0); assert(json_number(db, result, "$.reaction_ver") == 2); u_free(result); + snprintf(request, sizeof(request), "{\"cmd\":\"react\",\"ch\":\"%s\",\"message_id\":\"%s\",\"emoji\":0}", channel, id); + result = command(inst, request, 0); assert(json_number(db, result, "$.reactions[0].id") == 0); u_free(result); + snprintf(request, sizeof(request), "{\"cmd\":\"react\",\"ch\":\"%s\",\"message_id\":\"%s\",\"emoji\":4}", channel, id); + result = command(inst, request, 0); + assert(json_number(db, result, "$.reactions[0].id") == 4 && json_number(db, result, "$.reaction_ver") == 4); + assert(json_number(db, result, "$.reactions[1].count") == 0); u_free(result); + snprintf(request, sizeof(request), "{\"cmd\":\"react\",\"ch\":\"%s\",\"message_id\":\"%s\",\"emoji\":0,\"on\":false}", channel, id); + result = command(inst, request, 0); + assert(json_number(db, result, "$.reactions[0].id") == 4 && json_number(db, result, "$.reaction_ver") == 4); u_free(result); + snprintf(request, sizeof(request), "{\"cmd\":\"react\",\"ch\":\"%s\",\"message_id\":\"%s\",\"emoji\":4}", channel, id); + result = command(inst, request, 0); assert(json_number(db, result, "$.reactions[0].count") == 0); + assert(json_number(db, result, "$.reaction_ver") == 5); u_free(result); + puts("PASS: selecting another emoji replaces the previous one; unselected withdrawal is inert; repeat click cancels"); snprintf(request, sizeof(request), "{\"cmd\":\"poll_create\",\"ch\":\"%s\",\"question\":\"Выбор\",\"mode\":\"multiple\"," "\"options\":[\"Первый\",\"Второй\"],\"allow_custom_answer\":true}", channel);