package oracle

import (
	"net"
	"strings"
	"testing"
	"time"

	"git.marketally.com/tutus-one/tutus-chain/pkg/config"
	"github.com/stretchr/testify/require"
)

func TestIsReserved(t *testing.T) {
	require.True(t, isReserved(net.IPv4zero))
	require.True(t, isReserved(net.IPv4(10, 0, 0, 1)))
	require.True(t, isReserved(net.IPv4(192, 168, 0, 1)))
	require.True(t, isReserved(net.IPv6interfacelocalallnodes))
	require.True(t, isReserved(net.IPv6loopback))

	require.False(t, isReserved(net.IPv4(8, 8, 8, 8)))
}

func TestDefaultClient_RestrictedRedirectErr(t *testing.T) {
	cfg := config.OracleConfiguration{
		AllowPrivateHost: false,
		RequestTimeout:   time.Second,
	}
	cl := getDefaultClient(cfg)

	testCases := []string{
		"http://localhost:8080",
		"http://localhost",
		"https://localhost:443",
		"https://" + net.IPv4zero.String(),
		"https://" + net.IPv4(10, 0, 0, 1).String(),
		"https://" + net.IPv4(192, 168, 0, 1).String(),
		"https://[" + net.IPv6interfacelocalallnodes.String() + "]",
		"https://[" + net.IPv6loopback.String() + "]",
	}
	for _, c := range testCases {
		t.Run(c, func(t *testing.T) {
			_, err := cl.Get(c) //nolint:bodyclose // It errors out and it's a test.
			require.ErrorIs(t, err, ErrRestrictedRedirect)
			require.True(t, strings.Contains(err.Error(), "IP is not global unicast"), err)
		})
	}
}
