package packs

import (
	"errors"
	"fmt"
	"testing"

	"github.com/go-sql-driver/mysql"
)

func TestManagedLifecycleTransactionErrorClassification(t *testing.T) {
	tests := []struct {
		name          string
		err           error
		deterministic bool
		transient     bool
	}{
		{name: "duplicate key", err: &mysql.MySQLError{Number: 1062}, deterministic: true},
		{name: "write conflict", err: &mysql.MySQLError{Number: 8147}, deterministic: true},
		{name: "lock wait timeout", err: &mysql.MySQLError{Number: 1205}, transient: true},
		{name: "deadlock", err: &mysql.MySQLError{Number: 1213}, transient: true},
		{name: "wrapped lock wait timeout", err: fmt.Errorf("mutate: %w", &mysql.MySQLError{Number: 1205}), transient: true},
		{name: "non MySQL error", err: errors.New("connection reset")},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			if got := managedLifecycleDeterministicTransactionError(test.err); got != test.deterministic {
				t.Errorf("managedLifecycleDeterministicTransactionError() = %v, want %v", got, test.deterministic)
			}
			if got := managedLifecycleTransientLockError(test.err); got != test.transient {
				t.Errorf("managedLifecycleTransientLockError() = %v, want %v", got, test.transient)
			}
		})
	}
}
