2 changed files with 182 additions and 1 deletions
@ -0,0 +1,178 @@
@@ -0,0 +1,178 @@
|
||||
defmodule GcIndexRelay.Nostr.PubEventTest do |
||||
use ExUnit.Case, async: true |
||||
|
||||
alias GcIndexRelay.Nostr.Event |
||||
alias GcIndexRelay.Nostr.PubEvent |
||||
alias GcIndexRelay.Nostr.Tag |
||||
|
||||
import GcIndexRelay.NostrFixtures |
||||
|
||||
@moduletag :unit |
||||
|
||||
describe "to_db/1" do |
||||
test "converts tags with name and value" do |
||||
pub_event = valid_pub_event_fixture(tags: [["e", "abc123"], ["p", "def456"]]) |
||||
event = PubEvent.to_db(pub_event) |
||||
|
||||
assert [tag1, tag2] = event.tags |
||||
assert %Tag{name: "e", value: "abc123", additional_values: []} = tag1 |
||||
assert %Tag{name: "p", value: "def456", additional_values: []} = tag2 |
||||
end |
||||
|
||||
test "converts tags with additional values" do |
||||
tags = [["p", "pubkey_hex", "wss://relay.example.com", "alice"]] |
||||
pub_event = valid_pub_event_fixture(tags: tags) |
||||
event = PubEvent.to_db(pub_event) |
||||
|
||||
assert [tag] = event.tags |
||||
assert %Tag{name: "p", value: "pubkey_hex"} = tag |
||||
assert tag.additional_values == ["wss://relay.example.com", "alice"] |
||||
end |
||||
|
||||
test "preserves empty content" do |
||||
pub_event = valid_pub_event_fixture(content: "") |
||||
event = PubEvent.to_db(pub_event) |
||||
|
||||
assert event.content == "" |
||||
end |
||||
end |
||||
|
||||
describe "from_db/1" do |
||||
test "returns {:error, :not_found} for nil" do |
||||
assert {:error, :not_found} = PubEvent.from_db(nil) |
||||
end |
||||
|
||||
test "converts Tag structs back to nested lists" do |
||||
event = %Event{ |
||||
id: Base.decode16!(String.duplicate("ab", 32), case: :lower), |
||||
pubkey: Base.decode16!(String.duplicate("cd", 32), case: :lower), |
||||
created_at: ~U[2021-12-20 17:46:40Z], |
||||
kind: 1, |
||||
content: "test", |
||||
sig: Base.decode16!(String.duplicate("ef", 64), case: :lower), |
||||
tags: [ |
||||
%Tag{name: "e", value: "event_id", additional_values: []}, |
||||
%Tag{name: "p", value: "pubkey", additional_values: ["relay", "petname"]} |
||||
] |
||||
} |
||||
|
||||
assert {:ok, pub_event} = PubEvent.from_db(event) |
||||
assert pub_event.tags == [["e", "event_id"], ["p", "pubkey", "relay", "petname"]] |
||||
end |
||||
|
||||
test "preserves kind and content" do |
||||
event = %Event{ |
||||
id: Base.decode16!(String.duplicate("ab", 32), case: :lower), |
||||
pubkey: Base.decode16!(String.duplicate("cd", 32), case: :lower), |
||||
created_at: ~U[2021-12-20 17:46:40Z], |
||||
kind: 30023, |
||||
content: "long-form content", |
||||
sig: Base.decode16!(String.duplicate("ef", 64), case: :lower), |
||||
tags: [] |
||||
} |
||||
|
||||
assert {:ok, pub_event} = PubEvent.from_db(event) |
||||
assert pub_event.kind == 30023 |
||||
assert pub_event.content == "long-form content" |
||||
end |
||||
|
||||
test "handles empty content" do |
||||
event = %Event{ |
||||
id: Base.decode16!(String.duplicate("ab", 32), case: :lower), |
||||
pubkey: Base.decode16!(String.duplicate("cd", 32), case: :lower), |
||||
created_at: ~U[2021-12-20 17:46:40Z], |
||||
kind: 1, |
||||
content: "", |
||||
sig: Base.decode16!(String.duplicate("ef", 64), case: :lower), |
||||
tags: [] |
||||
} |
||||
|
||||
assert {:ok, pub_event} = PubEvent.from_db(event) |
||||
assert pub_event.content == "" |
||||
end |
||||
end |
||||
|
||||
describe "round-trip: to_db |> from_db" do |
||||
test "preserves all fields for a basic event" do |
||||
pub_event = valid_pub_event_fixture(content: "round-trip test") |
||||
|
||||
assert {:ok, result} = pub_event |> PubEvent.to_db() |> PubEvent.from_db() |
||||
|
||||
assert result.id == pub_event.id |
||||
assert result.pubkey == pub_event.pubkey |
||||
assert result.created_at == pub_event.created_at |
||||
assert result.kind == pub_event.kind |
||||
assert result.content == pub_event.content |
||||
assert result.sig == pub_event.sig |
||||
assert result.tags == pub_event.tags |
||||
end |
||||
|
||||
test "preserves event with empty tags" do |
||||
pub_event = valid_pub_event_fixture(tags: []) |
||||
|
||||
assert {:ok, result} = pub_event |> PubEvent.to_db() |> PubEvent.from_db() |
||||
assert result.tags == [] |
||||
end |
||||
|
||||
test "preserves event with tags" do |
||||
tags = [ |
||||
["e", "abc123"], |
||||
["p", "def456", "wss://relay.example.com"], |
||||
["t", "nostr", "extra1", "extra2"] |
||||
] |
||||
|
||||
pub_event = valid_pub_event_fixture(tags: tags) |
||||
|
||||
assert {:ok, result} = pub_event |> PubEvent.to_db() |> PubEvent.from_db() |
||||
assert result.tags == tags |
||||
end |
||||
|
||||
test "preserves event with empty content" do |
||||
pub_event = valid_pub_event_fixture(content: "") |
||||
|
||||
assert {:ok, result} = pub_event |> PubEvent.to_db() |> PubEvent.from_db() |
||||
assert result.content == "" |
||||
end |
||||
|
||||
test "preserves different keypairs" do |
||||
pub_event_1 = valid_pub_event_fixture(keypair: :keypair1) |
||||
pub_event_2 = valid_pub_event_fixture(keypair: :keypair2) |
||||
|
||||
assert {:ok, result_1} = pub_event_1 |> PubEvent.to_db() |> PubEvent.from_db() |
||||
assert {:ok, result_2} = pub_event_2 |> PubEvent.to_db() |> PubEvent.from_db() |
||||
|
||||
assert result_1.pubkey == pub_event_1.pubkey |
||||
assert result_2.pubkey == pub_event_2.pubkey |
||||
refute result_1.pubkey == result_2.pubkey |
||||
end |
||||
end |
||||
|
||||
describe "to_db/1 with invalid hex input" do |
||||
test "raises on invalid hex in id" do |
||||
pub_event = valid_pub_event_fixture() |
||||
invalid = %{pub_event | id: String.duplicate("zz", 32)} |
||||
|
||||
assert_raise BadStructError, fn -> |
||||
PubEvent.to_db(invalid) |
||||
end |
||||
end |
||||
|
||||
test "raises on invalid hex in pubkey" do |
||||
pub_event = valid_pub_event_fixture() |
||||
invalid = %{pub_event | pubkey: String.duplicate("zz", 32)} |
||||
|
||||
assert_raise BadStructError, fn -> |
||||
PubEvent.to_db(invalid) |
||||
end |
||||
end |
||||
|
||||
test "raises on invalid hex in sig" do |
||||
pub_event = valid_pub_event_fixture() |
||||
invalid = %{pub_event | sig: String.duplicate("zz", 64)} |
||||
|
||||
assert_raise BadStructError, fn -> |
||||
PubEvent.to_db(invalid) |
||||
end |
||||
end |
||||
end |
||||
end |
||||
Loading…
Reference in new issue