package mysql import ( "context" "errors" "fmt" "testing" driver "github.com/go-sql-driver/mysql" ) func TestRetryableTransactionErrorOnlyMatchesPreCommitLockFailures(t *testing.T) { tests := []struct { name string err error want bool }{ {name: "deadlock", err: &driver.MySQLError{Number: 1213}, want: true}, {name: "lock wait timeout", err: fmt.Errorf("wrapped: %w", &driver.MySQLError{Number: 1205}), want: true}, {name: "duplicate key", err: &driver.MySQLError{Number: 1062}, want: false}, {name: "application error", err: errors.New("validation failed"), want: false}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { if got := retryableTransactionError(test.err); got != test.want { t.Fatalf("retryableTransactionError()=%v want %v", got, test.want) } }) } } func TestWaitTransactionRetryHonorsCancellation(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) cancel() if err := waitTransactionRetry(ctx, 0); !errors.Is(err, context.Canceled) { t.Fatalf("waitTransactionRetry()=%v want context canceled", err) } }