package rpc

import (
	"testing"

	"github.com/stretchr/testify/require"
)

// localMethods are methods that should be executed locally.
var localTestMethods = []string{"some_weirdo_method", "shh_newMessageFilter", "eth_accounts"}

func TestRouteWithUpstream(t *testing.T) {
	router := newRouter(true)

	for _, method := range remoteMethods {
		require.True(t, router.routeRemote(method), "method "+method+" should routed to remote")
	}

	for _, method := range localTestMethods {
		t.Run(method, func(t *testing.T) {
			require.False(t, router.routeRemote(method), "method "+method+" should routed to local")
		})
	}
}

func TestRouteWithoutUpstream(t *testing.T) {
	router := newRouter(false)

	for _, method := range remoteMethods {
		require.False(t, router.routeRemote(method), "method "+method+" should routed to locally without UpstreamEnabled")
	}

	for _, method := range localTestMethods {
		require.False(t, router.routeRemote(method), "method "+method+" should routed to local")
	}
}

func TestBlockedRoutes(t *testing.T) {
	// Be explicit as any change to `blockedMethods`
	// should be confirmed with a unit test fail.
	expectedBlockedMethods := [...]string{"shh_getPrivateKey"}
	require.Equal(t, expectedBlockedMethods, blockedMethods)
	require.Equal(t, expectedBlockedMethods[:], BlockedMethods())

	router := newRouter(false)
	for _, method := range blockedMethods {
		require.True(t, router.routeBlocked(method))
	}
}