package kafka

import (
	"fmt"
	"testing"
)

func TestError(t *testing.T) {
	t.Parallel()

	errorCodes := []Error{
		Unknown,
		OffsetOutOfRange,
		InvalidMessage,
		UnknownTopicOrPartition,
		InvalidMessageSize,
		LeaderNotAvailable,
		NotLeaderForPartition,
		RequestTimedOut,
		BrokerNotAvailable,
		ReplicaNotAvailable,
		MessageSizeTooLarge,
		StaleControllerEpoch,
		OffsetMetadataTooLarge,
		GroupLoadInProgress,
		GroupCoordinatorNotAvailable,
		NotCoordinatorForGroup,
		InvalidTopic,
		RecordListTooLarge,
		NotEnoughReplicas,
		NotEnoughReplicasAfterAppend,
		InvalidRequiredAcks,
		IllegalGeneration,
		InconsistentGroupProtocol,
		InvalidGroupId,
		UnknownMemberId,
		InvalidSessionTimeout,
		RebalanceInProgress,
		InvalidCommitOffsetSize,
		TopicAuthorizationFailed,
		GroupAuthorizationFailed,
		ClusterAuthorizationFailed,
		InvalidTimestamp,
		UnsupportedSASLMechanism,
		IllegalSASLState,
		UnsupportedVersion,
		TopicAlreadyExists,
		InvalidPartitionNumber,
		InvalidReplicationFactor,
		InvalidReplicaAssignment,
		InvalidConfiguration,
		NotController,
		InvalidRequest,
		UnsupportedForMessageFormat,
		PolicyViolation,
		OutOfOrderSequenceNumber,
		DuplicateSequenceNumber,
		InvalidProducerEpoch,
		InvalidTransactionState,
		InvalidProducerIDMapping,
		InvalidTransactionTimeout,
		ConcurrentTransactions,
		TransactionCoordinatorFenced,
		TransactionalIDAuthorizationFailed,
		SecurityDisabled,
		BrokerAuthorizationFailed,
	}

	for _, err := range errorCodes {
		t.Run(fmt.Sprintf("verify that error %d has a non-empty title, description, and error message", err), func(t *testing.T) {
			if len(err.Title()) == 0 {
				t.Error("empty title")
			}
			if len(err.Description()) == 0 {
				t.Error("empty description")
			}
			if len(err.Error()) == 0 {
				t.Error("empty error message")
			}
		})
	}

	t.Run("verify that an invalid error code has an empty title and description", func(t *testing.T) {
		err := Error(-2)

		if s := err.Title(); len(s) != 0 {
			t.Error("non-empty title:", s)
		}

		if s := err.Description(); len(s) != 0 {
			t.Error("non-empty description:", s)
		}
	})
}
