This commit is contained in:
2026-10-28 23:38:57 +07:00
parent e68cf4322c
commit e16c52544e
3 changed files with 52 additions and 1 deletions
@@ -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 {