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):
|
||||
return "Пакет игры превышает допустимый размер."
|
||||
case errors.Is(err, game_package_service.ErrInvalidPackage):
|
||||
var validation *game_package_service.ValidationError
|
||||
if errors.As(err, &validation) {
|
||||
return "Не удалось подготовить автономный пакет: " + validation.Reason
|
||||
}
|
||||
return "Данные игры не подходят для автономного пакета."
|
||||
default:
|
||||
return "Не удалось подготовить пакет. Запустите экспорт повторно."
|
||||
|
||||
@@ -14,8 +14,21 @@ import (
|
||||
"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 {
|
||||
return fmt.Errorf("%w: %s", ErrInvalidPackage, reason)
|
||||
return &ValidationError{Reason: reason}
|
||||
}
|
||||
|
||||
func validateData(data *Data) error {
|
||||
|
||||
Reference in New Issue
Block a user