diff --git a/internal/errkind/errkind_test.go b/internal/errkind/errkind_test.go index cba5ce5..d9bb6d6 100644 --- a/internal/errkind/errkind_test.go +++ b/internal/errkind/errkind_test.go @@ -54,6 +54,24 @@ func TestOf_ReducesAnErrorToAKindAndNeverItsText(t *testing.T) { } } +type sqlErr struct{} + +func (sqlErr) Error() string { + return `ERROR: invalid input syntax for type json: "Anders ansvarar för virket"` +} +func (sqlErr) SQLState() string { return "22P02" } + +func TestOf_ADatabaseErrorIsReducedToItsSQLStateNeverItsMessage(t *testing.T) { + // A Postgres error can quote the offending value, which for a transcript row is + // transcript text. The five-character SQLSTATE is a fixed vocabulary (fourth review). + err := fmt.Errorf("store: complete upload: %w", sqlErr{}) + + got := errkind.Of(err) + + assert.Equal(t, "sql_22P02", got) + assert.NotContains(t, got, "Anders") +} + func TestOf_AKindCarriesNoWordFromTheError(t *testing.T) { err := fmt.Errorf("convert /spool/upload-555: %w", errors.New("Anders ansvarar för virket"))