mirror of
https://github.com/status-im/status-go.git
synced 2026-08-31 09:01:16 +00:00
The network manager lived in internal/rpc and was constructed, started and stopped by rpc.Client, which reached back into it to route calls by chain. It is now a service of its own at pkg/services/networks. StatusNode owns the manager and hands it to rpc.Client through ClientConfig, so the client depends on ManagerInterface rather than the concrete type. The service owns the manager lifecycle. The four live network RPC methods are registered under the networks_ namespace. The wallet_ ones are left in place so nothing breaks before the app migrates; they are removed at the end of the stack.
232 lines
6.5 KiB
Go
232 lines
6.5 KiB
Go
package ens
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
"go.uber.org/mock/gomock"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
gethrpc "github.com/ethereum/go-ethereum/rpc"
|
|
|
|
"github.com/status-im/status-go/internal/db/appdatabase"
|
|
statusRPC "github.com/status-im/status-go/internal/rpc"
|
|
"github.com/status-im/status-go/internal/testutils"
|
|
"github.com/status-im/status-go/internal/transactions/fake"
|
|
"github.com/status-im/status-go/pkg/services/networks"
|
|
)
|
|
|
|
func createDB(t *testing.T) (*sql.DB, func()) {
|
|
db, cleanup, err := testutils.SetupTestSQLDB(appdatabase.DbInitializer{}, "service-ens-tests-")
|
|
require.NoError(t, err)
|
|
return db, func() { require.NoError(t, cleanup()) }
|
|
}
|
|
|
|
func setupTestAPI(t *testing.T) (*API, func()) {
|
|
db, cancel := createDB(t)
|
|
|
|
txServiceMockCtrl := gomock.NewController(t)
|
|
server, _ := fake.NewTestServer(txServiceMockCtrl)
|
|
client := gethrpc.DialInProc(server)
|
|
|
|
_ = client
|
|
|
|
networkManager := networks.NewManager(db, nil)
|
|
require.NotNil(t, networkManager)
|
|
require.NoError(t, networkManager.InitEmbeddedNetworks(nil))
|
|
|
|
config := statusRPC.ClientConfig{
|
|
NetworkManager: networkManager,
|
|
}
|
|
rpcClient, err := statusRPC.NewClient(config)
|
|
require.NoError(t, err)
|
|
|
|
return NewAPI(rpcClient, nil, nil, nil, db, time.Now, nil), cancel
|
|
}
|
|
|
|
func TestResolver(t *testing.T) {
|
|
t.Skip("skip test using infura")
|
|
api, cancel := setupTestAPI(t)
|
|
defer cancel()
|
|
|
|
r, err := api.Resolver(context.Background(), 1, "rramos.eth")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41", r.String())
|
|
}
|
|
|
|
func TestGetName(t *testing.T) {
|
|
t.Skip("skip test using infura")
|
|
api, cancel := setupTestAPI(t)
|
|
defer cancel()
|
|
|
|
r, err := api.GetName(context.Background(), 1, common.HexToAddress("0x7d28Ab6948F3Db2F95A43742265D382a4888c120"))
|
|
require.NoError(t, err)
|
|
require.Equal(t, "rramos.eth", r)
|
|
}
|
|
|
|
func TestOwnerOf(t *testing.T) {
|
|
t.Skip("skip test using infura")
|
|
api, cancel := setupTestAPI(t)
|
|
defer cancel()
|
|
|
|
r, err := api.OwnerOf(context.Background(), 1, "rramos.eth")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "0x7d28Ab6948F3Db2F95A43742265D382a4888c120", r.String())
|
|
}
|
|
|
|
func TestContentHash(t *testing.T) {
|
|
t.Skip("skip test using infura")
|
|
api, cancel := setupTestAPI(t)
|
|
defer cancel()
|
|
|
|
r, err := api.ContentHash(context.Background(), 1, "simpledapp.eth")
|
|
require.NoError(t, err)
|
|
require.Equal(t, []byte{0xe3, 0x1, 0x1, 0x70, 0x12, 0x20, 0x79, 0x5c, 0x1e, 0xa0, 0xce, 0xaf, 0x4c, 0xee, 0xdc, 0x98, 0x96, 0xf1, 0x4b, 0x73, 0xbb, 0x30, 0xe9, 0x78, 0xe4, 0x85, 0x5e, 0xe2, 0x21, 0xb9, 0xa5, 0x7f, 0x5a, 0x93, 0x42, 0x68, 0x28, 0xe}, r)
|
|
}
|
|
|
|
func TestPublicKeyOf(t *testing.T) {
|
|
t.Skip("skip test using infura")
|
|
api, cancel := setupTestAPI(t)
|
|
defer cancel()
|
|
|
|
pubKey, err := api.PublicKeyOf(context.Background(), 1, "rramos.eth")
|
|
require.NoError(t, err)
|
|
require.Equal(
|
|
t,
|
|
"0x04e25da6994ea2dc4ac70727e07eca153ae92bf7609db7befb7ebdceaad348f4fc55bbe90abf9501176301db5aa103fc0eb3bc3750272a26c424a10887db2a7ea8",
|
|
pubKey,
|
|
)
|
|
}
|
|
|
|
func TestAddressOf(t *testing.T) {
|
|
t.Skip("skip test using infura")
|
|
api, cancel := setupTestAPI(t)
|
|
defer cancel()
|
|
|
|
r, err := api.AddressOf(context.Background(), 1, "rramos.eth")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "0x7d28Ab6948F3Db2F95A43742265D382a4888c120", r.String())
|
|
}
|
|
|
|
func TestExpireAt(t *testing.T) {
|
|
t.Skip("skip test using infura")
|
|
api, cancel := setupTestAPI(t)
|
|
defer cancel()
|
|
|
|
r, err := api.ExpireAt(context.Background(), 1, "rramos")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "5db32cb7", r)
|
|
}
|
|
|
|
func TestPrice(t *testing.T) {
|
|
t.Skip("skip test using infura")
|
|
api, cancel := setupTestAPI(t)
|
|
defer cancel()
|
|
|
|
r, err := api.Price(context.Background(), 1)
|
|
require.NoError(t, err)
|
|
require.Equal(t, "8ac7230489e80000", r)
|
|
}
|
|
|
|
func TestResourceURL(t *testing.T) {
|
|
t.Skip("skip test using infura")
|
|
api, cancel := setupTestAPI(t)
|
|
defer cancel()
|
|
|
|
uri, err := api.ResourceURL(context.Background(), 1, "simpledapp.eth")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "https", uri.Scheme)
|
|
require.Equal(t, "bafybeidzlqpkbtvpjtxnzgew6ffxhozq5f4ojbk64iq3tjl7lkjue2biby", uri.Host)
|
|
require.Equal(t, "", uri.Path)
|
|
|
|
//fixme: this block is the broken part
|
|
uri, err = api.ResourceURL(context.Background(), 1, "swarm.eth")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "https", uri.Scheme)
|
|
require.Equal(t, "swarm-gateways.net", uri.Host)
|
|
require.Equal(t, "/bzz:/b7976f7fabd7ba88a897452a2860228dcefec427302a3dedae164b51c780a5b8/", uri.Path)
|
|
|
|
uri, err = api.ResourceURL(context.Background(), 1, "noahzinsmeister.eth")
|
|
require.NoError(t, err)
|
|
require.Equal(t, "https", uri.Scheme)
|
|
require.Equal(t, "noahzinsmeister.com", uri.Host)
|
|
require.Equal(t, "", uri.Path)
|
|
}
|
|
|
|
func TestValidateUsername(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
username string
|
|
expectedErr bool
|
|
errContains string
|
|
}{
|
|
{
|
|
name: "valid username with .eth",
|
|
username: "validusername.eth",
|
|
expectedErr: false,
|
|
},
|
|
{
|
|
name: "valid username with subdomain",
|
|
username: "sub.validusername.eth",
|
|
expectedErr: false,
|
|
},
|
|
{
|
|
name: "valid stateofus username",
|
|
username: "username.stateofus.eth",
|
|
expectedErr: false,
|
|
},
|
|
{
|
|
name: "invalid - no .eth suffix",
|
|
username: "invalidusername",
|
|
expectedErr: true,
|
|
errContains: "user name must be a valid ENS name ending with .eth",
|
|
},
|
|
{
|
|
name: "invalid - .com suffix",
|
|
username: "username.com",
|
|
expectedErr: true,
|
|
errContains: "user name must be a valid ENS name ending with .eth",
|
|
},
|
|
{
|
|
name: "invalid - duplicated stateofus domain",
|
|
username: "username.stateofus.eth.stateofus.eth",
|
|
expectedErr: true,
|
|
errContains: "must not have a duplicated domain",
|
|
},
|
|
{
|
|
name: "invalid - duplicated stateofus domain with subdomain",
|
|
username: "sub.username.stateofus.eth.stateofus.eth",
|
|
expectedErr: true,
|
|
errContains: "must not have a duplicated domain",
|
|
},
|
|
{
|
|
name: "invalid - empty string should fail",
|
|
username: "",
|
|
expectedErr: true,
|
|
errContains: "user name must be a valid ENS name ending with .eth",
|
|
},
|
|
{
|
|
name: "invalid - only .eth",
|
|
username: ".eth",
|
|
expectedErr: true, // This is technically valid per the current implementation
|
|
errContains: "user name must be a valid ENS name ending with .eth",
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
err := ValidateUsername(tc.username)
|
|
|
|
if tc.expectedErr {
|
|
require.Error(t, err)
|
|
require.Contains(t, err.Error(), tc.errContains)
|
|
} else {
|
|
require.NoError(t, err)
|
|
}
|
|
})
|
|
}
|
|
}
|