package client_test

import (
	"fmt"
	"testing"

	"github.com/TrueCloudLab/frostfs-sdk-go/client"
	apistatus "github.com/TrueCloudLab/frostfs-sdk-go/client/status"
	"github.com/stretchr/testify/require"
)

func TestErrors(t *testing.T) {
	for _, tc := range []struct {
		check func(error) bool
		errs  []error
	}{
		{
			check: client.IsErrContainerNotFound,
			errs: []error{
				apistatus.ContainerNotFound{},
				new(apistatus.ContainerNotFound),
			},
		},
		{
			check: client.IsErrEACLNotFound,
			errs: []error{
				apistatus.EACLNotFound{},
				new(apistatus.EACLNotFound),
			},
		},
		{
			check: client.IsErrObjectNotFound,
			errs: []error{
				apistatus.ObjectNotFound{},
				new(apistatus.ObjectNotFound),
			},
		},
		{
			check: client.IsErrObjectAlreadyRemoved,
			errs: []error{
				apistatus.ObjectAlreadyRemoved{},
				new(apistatus.ObjectAlreadyRemoved),
			},
		},
		{
			check: client.IsErrSessionExpired,
			errs: []error{
				apistatus.SessionTokenExpired{},
				new(apistatus.SessionTokenExpired),
			},
		}, {
			check: client.IsErrSessionNotFound,
			errs: []error{
				apistatus.SessionTokenNotFound{},
				new(apistatus.SessionTokenNotFound),
			},
		},
	} {
		require.NotEmpty(t, tc.errs)

		for i := range tc.errs {
			require.True(t, tc.check(tc.errs[i]), tc.errs[i])
			require.True(t, tc.check(fmt.Errorf("top-level context: :%w",
				fmt.Errorf("inner context: %w", tc.errs[i])),
			), tc.errs[i])
		}
	}
}