1package hub_test23import (4 "testing"56 "gno.land/p/gnoland/boards/exts/hub/v0"7 "gno.land/p/gnoland/boards/v0"8 "gno.land/p/nt/urequire/v0"9)1011func TestNewSafeMember(t *testing.T) {12 ref := boards.User{13 Address: alice,14 Roles: []boards.Role{"owner", "admin"},15 }1617 member := hub.NewSafeMember(ref)1819 urequire.Equal(t, alice.String(), member.Address().String(), "expect address to match")20 urequire.Equal(t, 2, len(member.Roles()), "expect role count to match")21 urequire.Equal(t, "owner", member.Roles()[0], "expect first role to match")22 urequire.Equal(t, "admin", member.Roles()[1], "expect second role to match")23}2425func TestNewSafeMemberWithoutRoles(t *testing.T) {26 member := hub.NewSafeMember(boards.User{Address: bob})2728 urequire.Equal(t, bob.String(), member.Address().String(), "expect address to match")29 urequire.Equal(t, 0, len(member.Roles()), "expect no roles")30}3132func TestSafeMemberIsASnapshot(t *testing.T) {33 roles := []boards.Role{"owner"}34 member := hub.NewSafeMember(boards.User{Address: alice, Roles: roles})3536 // Mutating the source must not change what the member reports.37 roles[0] = "guest"38 urequire.Equal(t, "owner", member.Roles()[0], "expect source mutation to be ignored")3940 // Mutating a returned slice must not change what the member reports.41 member.Roles()[0] = "guest"42 urequire.Equal(t, "owner", member.Roles()[0], "expect returned slice to be a copy")43}44Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.