Merge pull request #219 from mattn/fix/petname-test-api

Fix petname tests for explicit resolver identities
This commit is contained in:
mattn
2026-09-25 15:24:29 +00:00
committed by GitHub
2 changed files with 18 additions and 22 deletions
+4
View File
@@ -17,3 +17,7 @@ jobs:
with: with:
go-version-file: go.mod go-version-file: go.mod
- run: go build . - run: go build .
# Existing CLI tests share flag state and include public-relay requests.
# Keep this regression suite independent of those tests and Go vet's
# pre-existing non-constant-format diagnostics.
- run: go test -vet=off . -run 'TestResolvePetname|TestParsePubKey' -count=1
+14 -22
View File
@@ -41,7 +41,6 @@ func setupPetnameSystem(t *testing.T, lists map[nostr.SecretKey][]sdk.ProfileRef
t.Cleanup(func() { t.Cleanup(func() {
sys = nil sys = nil
rootSec = ""
}) })
} }
@@ -94,9 +93,8 @@ func TestResolvePetnamePathChain(t *testing.T) {
erin: {{Pubkey: david.Public(), Petname: "david"}}, erin: {{Pubkey: david.Public(), Petname: "david"}},
david: {{Pubkey: frank.Public(), Petname: "frank"}}, david: {{Pubkey: frank.Public(), Petname: "frank"}},
}) })
rootSec = me.Hex()
pk, err := resolvePetnamePath("~erin/david/frank") pk, err := resolvePetnamePath("~erin/david/frank", me.Public())
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, frank.Public(), pk) require.Equal(t, frank.Public(), pk)
} }
@@ -108,9 +106,8 @@ func TestResolvePetnamePathSingleHop(t *testing.T) {
setupPetnameSystem(t, map[nostr.SecretKey][]sdk.ProfileRef{ setupPetnameSystem(t, map[nostr.SecretKey][]sdk.ProfileRef{
me: {{Pubkey: erin.Public(), Petname: "erin"}}, me: {{Pubkey: erin.Public(), Petname: "erin"}},
}) })
rootSec = me.Hex()
pk, err := resolvePetnamePath("~erin") pk, err := resolvePetnamePath("~erin", me.Public())
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, erin.Public(), pk) require.Equal(t, erin.Public(), pk)
} }
@@ -122,9 +119,8 @@ func TestResolvePetnamePathCurrentUser(t *testing.T) {
setupPetnameSystem(t, map[nostr.SecretKey][]sdk.ProfileRef{ setupPetnameSystem(t, map[nostr.SecretKey][]sdk.ProfileRef{
me: {{Pubkey: erin.Public(), Petname: "erin"}}, me: {{Pubkey: erin.Public(), Petname: "erin"}},
}) })
rootSec = me.Hex()
pk, err := resolvePetnamePath("~/erin") pk, err := resolvePetnamePath("~/erin", me.Public())
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, erin.Public(), pk) require.Equal(t, erin.Public(), pk)
} }
@@ -137,7 +133,7 @@ func TestResolvePetnamePathDirectRootWithoutIdentity(t *testing.T) {
me: {{Pubkey: erin.Public(), Petname: "erin"}}, me: {{Pubkey: erin.Public(), Petname: "erin"}},
}) })
pk, err := resolvePetnamePath("~" + nip19.EncodeNpub(me.Public()) + "/erin") pk, err := resolvePetnamePath("~"+nip19.EncodeNpub(me.Public())+"/erin", nostr.ZeroPK)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, erin.Public(), pk) require.Equal(t, erin.Public(), pk)
} }
@@ -152,7 +148,7 @@ func TestResolvePetnamePathNip05Root(t *testing.T) {
// the first segment must be routed to nip05 (which will fail to connect here, as nothing // the first segment must be routed to nip05 (which will fail to connect here, as nothing
// listens on 127.0.0.1:443) instead of being treated as a petname // listens on 127.0.0.1:443) instead of being treated as a petname
_, err := resolvePetnamePath("~erin@127.0.0.1/david") _, err := resolvePetnamePath("~erin@127.0.0.1/david", nostr.ZeroPK)
require.Error(t, err) require.Error(t, err)
require.Contains(t, err.Error(), "request failed") require.Contains(t, err.Error(), "request failed")
require.NotContains(t, err.Error(), "follow list") require.NotContains(t, err.Error(), "follow list")
@@ -167,32 +163,30 @@ func TestResolvePetnamePathErrors(t *testing.T) {
me: {{Pubkey: erin.Public(), Petname: "erin"}}, me: {{Pubkey: erin.Public(), Petname: "erin"}},
erin: {{Pubkey: david.Public(), Petname: "david"}}, erin: {{Pubkey: david.Public(), Petname: "david"}},
}) })
rootSec = me.Hex()
// unknown petname at root // unknown petname at root
_, err := resolvePetnamePath("~carol") _, err := resolvePetnamePath("~carol", me.Public())
require.ErrorContains(t, err, "no one in your follow list") require.ErrorContains(t, err, "no one in your follow list")
// unknown petname mid-chain // unknown petname mid-chain
_, err = resolvePetnamePath("~erin/carol") _, err = resolvePetnamePath("~erin/carol", me.Public())
require.ErrorContains(t, err, "doesn't follow anyone named") require.ErrorContains(t, err, "doesn't follow anyone named")
// empty reference // empty reference
_, err = resolvePetnamePath("~") _, err = resolvePetnamePath("~", me.Public())
require.Error(t, err) require.Error(t, err)
// empty segment // empty segment
_, err = resolvePetnamePath("~erin//frank") _, err = resolvePetnamePath("~erin//frank", me.Public())
require.Error(t, err) require.Error(t, err)
// invalid petname characters // invalid petname characters
_, err = resolvePetnamePath("~er\tin") _, err = resolvePetnamePath("~er\tin", me.Public())
require.Error(t, err) require.Error(t, err)
// no identity // no identity
rootSec = "" _, err = resolvePetnamePath("~erin", nostr.ZeroPK)
_, err = resolvePetnamePath("~erin") require.ErrorContains(t, err, "without an identity")
require.ErrorContains(t, err, "no secret key")
} }
func TestResolvePetnameMissingFollowList(t *testing.T) { func TestResolvePetnameMissingFollowList(t *testing.T) {
@@ -205,10 +199,9 @@ func TestResolvePetnameMissingFollowList(t *testing.T) {
me: {{Pubkey: erin.Public(), Petname: "erin"}}, me: {{Pubkey: erin.Public(), Petname: "erin"}},
erin: nil, erin: nil,
}) })
t.Cleanup(func() { sys = nil; rootSec = "" }) t.Cleanup(func() { sys = nil })
rootSec = me.Hex()
_, err := resolvePetnamePath("~erin/frank") _, err := resolvePetnamePath("~erin/frank", me.Public())
require.ErrorContains(t, err, "couldn't get follow list") require.ErrorContains(t, err, "couldn't get follow list")
} }
@@ -219,7 +212,6 @@ func TestParsePubKeyUnaffectedInputs(t *testing.T) {
setupPetnameSystem(t, map[nostr.SecretKey][]sdk.ProfileRef{ setupPetnameSystem(t, map[nostr.SecretKey][]sdk.ProfileRef{
me: {{Pubkey: erin.Public(), Petname: "erin"}}, me: {{Pubkey: erin.Public(), Petname: "erin"}},
}) })
rootSec = me.Hex()
// plain npub keeps working through parsePubKey // plain npub keeps working through parsePubKey
pk, err := parsePubKey(nip19.EncodeNpub(erin.Public()), nostr.ZeroPK) pk, err := parsePubKey(nip19.EncodeNpub(erin.Public()), nostr.ZeroPK)