generated from VLADIMIR/template
up
This commit is contained in:
@@ -0,0 +1,34 @@
|
|||||||
|
package game_export_service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"evening_detective_server/internal/services/game_package_service"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSafeFailure(t *testing.T) {
|
||||||
|
validation := &game_package_service.ValidationError{Reason: "некорректная команда"}
|
||||||
|
for _, tc := range []struct {
|
||||||
|
name string
|
||||||
|
err error
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{"validation", validation, "Не удалось подготовить автономный пакет: некорректная команда"},
|
||||||
|
{"wrapped validation", fmt.Errorf("private path: %w", validation), "Не удалось подготовить автономный пакет: некорректная команда"},
|
||||||
|
{"invalid package", errors.Join(game_package_service.ErrInvalidPackage, errors.New("private")), "Данные игры не подходят для автономного пакета."},
|
||||||
|
{"technical", errors.New("private password"), "Не удалось подготовить пакет. Запустите экспорт повторно."},
|
||||||
|
{"media", game_package_service.ErrMediaUnavailable, "Не удалось получить медиафайлы игры. Проверьте их доступность и повторите экспорт."},
|
||||||
|
{"size", game_package_service.ErrLimitExceeded, "Пакет игры превышает допустимый размер."},
|
||||||
|
} {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
if got := safeFailure(tc.err); got != tc.want {
|
||||||
|
t.Fatalf("got %q, want %q", got, tc.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if !errors.Is(validation, game_package_service.ErrInvalidPackage) {
|
||||||
|
t.Fatal("validation must remain an invalid package error")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -319,6 +319,10 @@ func safeFailure(err error) string {
|
|||||||
case errors.Is(err, game_package_service.ErrLimitExceeded):
|
case errors.Is(err, game_package_service.ErrLimitExceeded):
|
||||||
return "Пакет игры превышает допустимый размер."
|
return "Пакет игры превышает допустимый размер."
|
||||||
case errors.Is(err, game_package_service.ErrInvalidPackage):
|
case errors.Is(err, game_package_service.ErrInvalidPackage):
|
||||||
|
var validation *game_package_service.ValidationError
|
||||||
|
if errors.As(err, &validation) {
|
||||||
|
return "Не удалось подготовить автономный пакет: " + validation.Reason
|
||||||
|
}
|
||||||
return "Данные игры не подходят для автономного пакета."
|
return "Данные игры не подходят для автономного пакета."
|
||||||
default:
|
default:
|
||||||
return "Не удалось подготовить пакет. Запустите экспорт повторно."
|
return "Не удалось подготовить пакет. Запустите экспорт повторно."
|
||||||
|
|||||||
@@ -14,8 +14,21 @@ import (
|
|||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// ValidationError contains a safe, user-facing package validation reason.
|
||||||
|
type ValidationError struct {
|
||||||
|
Reason string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *ValidationError) Error() string {
|
||||||
|
return ErrInvalidPackage.Error() + ": " + e.Reason
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *ValidationError) Unwrap() error {
|
||||||
|
return ErrInvalidPackage
|
||||||
|
}
|
||||||
|
|
||||||
func invalid(reason string) error {
|
func invalid(reason string) error {
|
||||||
return fmt.Errorf("%w: %s", ErrInvalidPackage, reason)
|
return &ValidationError{Reason: reason}
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateData(data *Data) error {
|
func validateData(data *Data) error {
|
||||||
|
|||||||
Reference in New Issue
Block a user