From be19e616a3a2ea4581be1f2ebac831bb407a8c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kol=C3=A1rik?= Date: Tue, 24 Sep 2024 17:13:44 +0200 Subject: [PATCH] fix: improve error messages of 422 errors (#133) --- cmd/common.go | 2 +- globalping/measurements.go | 5 +++-- globalping/measurements_test.go | 4 ++-- utils/text.go | 28 +++++++++++++++++++++++++++- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/cmd/common.go b/cmd/common.go index 9804669..64231d2 100644 --- a/cmd/common.go +++ b/cmd/common.go @@ -335,7 +335,7 @@ func silenceUsageOnCreateMeasurementError(err error) bool { e, ok := err.(*globalping.MeasurementError) if ok { switch e.Code { - case http.StatusBadRequest, http.StatusUnprocessableEntity: + case http.StatusBadRequest: return false default: return true diff --git a/globalping/measurements.go b/globalping/measurements.go index b260c5e..8471dac 100644 --- a/globalping/measurements.go +++ b/globalping/measurements.go @@ -59,6 +59,7 @@ func (c *client) CreateMeasurement(measurement *MeasurementCreate) (*Measurement } err := data.Error err.Code = resp.StatusCode + if resp.StatusCode == http.StatusBadRequest { resErr := "" for _, v := range data.Error.Params { @@ -68,7 +69,7 @@ func (c *client) CreateMeasurement(measurement *MeasurementCreate) (*Measurement if len(resErr) > 0 { resErr = resErr[:len(resErr)-1] } - err.Message = fmt.Sprintf("invalid parameters\n%s", resErr) + err.Message = fmt.Sprintf("invalid parameters:\n%s", resErr) return nil, err } @@ -82,7 +83,7 @@ func (c *client) CreateMeasurement(measurement *MeasurementCreate) (*Measurement } if resp.StatusCode == http.StatusUnprocessableEntity { - err.Message = "no suitable probes found - please choose a different location" + err.Message = fmt.Sprintf("%s - please try a different location", utils.TextFromSentence(err.Message)) return nil, err } diff --git a/globalping/measurements_test.go b/globalping/measurements_test.go index 8836b80..e16f6c1 100644 --- a/globalping/measurements_test.go +++ b/globalping/measurements_test.go @@ -184,7 +184,7 @@ func Test_CreateMeasurement_NoProbes(t *testing.T) { assert.Equal(t, &MeasurementError{ Code: 422, Type: "no_probes_found", - Message: "no suitable probes found - please choose a different location", + Message: "no suitable probes found - please try a different location", }, err) } @@ -206,7 +206,7 @@ func Test_CreateMeasurement_Validation(t *testing.T) { assert.Equal(t, &MeasurementError{ Code: 400, Type: "validation_error", - Message: `invalid parameters + Message: `invalid parameters: - "target" does not match any of the allowed types`, Params: map[string]interface{}{ "target": "\"target\" does not match any of the allowed types", diff --git a/utils/text.go b/utils/text.go index 799e18d..6fd7677 100644 --- a/utils/text.go +++ b/utils/text.go @@ -1,6 +1,21 @@ package utils -import "fmt" +import ( + "fmt" + "unicode" +) + +func LowercaseMessage(message string) string { + if len(message) >= 2 { + firstChar := rune(message[0]) + secondChar := rune(message[1]) + + if !unicode.IsLower(firstChar) && unicode.IsLower(secondChar) { + return string(unicode.ToLower(firstChar)) + message[1:] + } + } + return message +} func Pluralize(count int64, singular string) string { if count == 1 { @@ -8,3 +23,14 @@ func Pluralize(count int64, singular string) string { } return fmt.Sprintf("%d %ss", count, singular) } + +func RemoveTrailingPeriod(message string) string { + if len(message) > 0 && message[len(message)-1] == '.' { + return message[:len(message)-1] + } + return message +} + +func TextFromSentence(message string) string { + return RemoveTrailingPeriod(LowercaseMessage(message)) +}