upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/tests/unit/test_nostr_event.c
blob: 12bdb938915b4ff288639cc12d094f5ca0c85c46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "test_framework.h"
#include "../../main/nostr_event.h"
#include "../../main/identity.h"
#include <string.h>
#include <stdio.h>

static const char *TEST_NSEC = "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2";

static int time_override = 1700000000;

int main(void)
{
    printf("=== test_nostr_event ===\n");

    identity_init(TEST_NSEC);
    const tollgate_identity_t *id = identity_get();

    printf("\n--- Event ID computation (NIP-01) ---\n");
    nostr_event_t event;
    esp_err_t ret = nostr_event_init(&event, id->npub_hex, 1, "[]", "Hello TollGate");
    ASSERT_EQ_INT(ESP_OK, ret, "nostr_event_init succeeds");

    ASSERT_EQ_STR(id->npub_hex, event.pubkey, "Event pubkey matches npub");
    ASSERT_EQ_INT(1, event.kind, "Event kind is 1");
    ASSERT_EQ_INT(64, (int)strlen(event.id), "Event ID is 64 hex chars");

    printf("\n--- Schnorr signing ---\n");
    ret = nostr_event_sign(&event, id->nsec);
    ASSERT_EQ_INT(ESP_OK, ret, "nostr_event_sign succeeds");
    ASSERT_EQ_INT(128, (int)strlen(event.sig), "Signature is 128 hex chars");
    ASSERT(event.sig[0] != '\0', "Signature is not empty");

    printf("\n--- JSON serialization ---\n");
    char json_buf[2048];
    ret = nostr_event_to_json(&event, json_buf, sizeof(json_buf));
    ASSERT_EQ_INT(ESP_OK, ret, "nostr_event_to_json succeeds");

    ASSERT(strstr(json_buf, "\"id\"") != NULL, "JSON has 'id' field");
    ASSERT(strstr(json_buf, "\"pubkey\"") != NULL, "JSON has 'pubkey' field");
    ASSERT(strstr(json_buf, "\"created_at\"") != NULL, "JSON has 'created_at' field");
    ASSERT(strstr(json_buf, "\"kind\"") != NULL, "JSON has 'kind' field");
    ASSERT(strstr(json_buf, "\"tags\"") != NULL, "JSON has 'tags' field");
    ASSERT(strstr(json_buf, "\"content\"") != NULL, "JSON has 'content' field");
    ASSERT(strstr(json_buf, "\"sig\"") != NULL, "JSON has 'sig' field");
    ASSERT(strstr(json_buf, "Hello TollGate") != NULL, "JSON contains content");

    printf("\n--- Buffer too small ---\n");
    char tiny_buf[10];
    ret = nostr_event_to_json(&event, tiny_buf, sizeof(tiny_buf));
    ASSERT(ret != ESP_OK, "Returns error when buffer too small");

    printf("\n--- Kind 38787 event (wifistr) ---\n");
    nostr_event_t ws_event;
    const char *ws_tags = "[[\"d\",\"test-npub\"],[\"ssid\",\"TollGate-TEST\"],[\"g\",\"u281w0dfz\"]]";
    ret = nostr_event_init(&ws_event, id->npub_hex, 38787, ws_tags,
                           "TollGate WiFi hotspot: TollGate-TEST");
    ASSERT_EQ_INT(ESP_OK, ret, "Kind 38787 init succeeds");
    ASSERT_EQ_INT(38787, ws_event.kind, "Event kind is 38787");
    ASSERT_EQ_INT(64, (int)strlen(ws_event.id), "Kind 38787 event has valid ID");

    ret = nostr_event_sign(&ws_event, id->nsec);
    ASSERT_EQ_INT(ESP_OK, ret, "Kind 38787 signing succeeds");
    ASSERT_EQ_INT(128, (int)strlen(ws_event.sig), "Kind 38787 signature is 128 hex chars");

    printf("\n--- Determinism: same input → same ID ---\n");
    nostr_event_t event2;
    nostr_event_init(&event2, id->npub_hex, 1, "[]", "Hello TollGate");
    ASSERT(strcmp(event.id, event2.id) == 0 || event.created_at != event2.created_at,
           "Same input produces same ID (if timestamp matches) or differs only by time");

    TEST_SUMMARY();
}