package regionalservice

import (
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/tidbcloud/ticdc-service-ng/pkg/util"
)

func TestHTTPStatusErrorError(t *testing.T) {
	tests := []struct {
		name       string
		err        *util.StatusError
		want       string
		notContain string
	}{
		{
			name:       "status with body",
			err:        &util.StatusError{StatusCode: 404, Status: "Not Found", Body: "sensitive-body"},
			want:       "http request failed: status=404 Not Found",
			notContain: "sensitive-body",
		},
		{
			name: "status only",
			err:  &util.StatusError{StatusCode: 500, Status: "Internal Server Error"},
			want: "http request failed: status=500 Internal Server Error",
		},
		{
			name: "status code only",
			err:  &util.StatusError{StatusCode: 503},
			want: "http request failed: status=503",
		},
		{
			name: "nil receiver",
			err:  nil,
			want: "<nil>",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := tt.err.Error()
			assert.Equal(t, tt.want, got)
			if tt.notContain != "" {
				assert.NotContains(t, got, tt.notContain)
			}
		})
	}
}

func TestHTTPStatusErrorTruncatedBody(t *testing.T) {
	tests := []struct {
		name string
		err  *util.StatusError
		max  int
		want string
	}{
		{
			name: "nil receiver",
			err:  nil,
			max:  10,
			want: "",
		},
		{
			name: "invalid max",
			err:  &util.StatusError{Body: "abc"},
			max:  0,
			want: "",
		},
		{
			name: "no truncation",
			err:  &util.StatusError{Body: "abc"},
			max:  10,
			want: "abc",
		},
		{
			name: "with truncation",
			err:  &util.StatusError{Body: strings.Repeat("a", 16)},
			max:  8,
			want: strings.Repeat("a", 8),
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			assert.Equal(t, tt.want, tt.err.TruncatedBody(tt.max))
		})
	}
}
