Aufgaben-Python/courses/go/07_explizites_error_handling/test_aufgabe.go

86 lines
2.5 KiB
Go

package main
import (
"errors"
"testing"
)
func TestBankAccountDepositErrors(t *testing.T) {
acc := NewBankAccount("Tester", 50.0)
errValid := acc.Deposit(25.0)
if errValid != nil || acc.Balance != 75.0 {
t.Errorf("Deposit(25) = %v, Balance = %.2f; erwartet nil, 75.00", errValid, acc.Balance)
}
errZero := acc.Deposit(0.0)
if !errors.Is(errZero, ErrInvalidAmount) {
t.Errorf("Deposit(0) = %v; erwartet ErrInvalidAmount", errZero)
}
errNeg := acc.Deposit(-10.0)
if !errors.Is(errNeg, ErrInvalidAmount) {
t.Errorf("Deposit(-10) = %v; erwartet ErrInvalidAmount", errNeg)
}
}
func TestBankAccountWithdrawErrors(t *testing.T) {
acc := NewBankAccount("Tester", 100.0)
errValid := acc.Withdraw(40.0)
if errValid != nil || acc.Balance != 60.0 {
t.Errorf("Withdraw(40) = %v, Balance = %.2f; erwartet nil, 60.00", errValid, acc.Balance)
}
errOver := acc.Withdraw(100.0)
if !errors.Is(errOver, ErrInsufficientFunds) {
t.Errorf("Withdraw(100) bei Stand 60 = %v; erwartet ErrInsufficientFunds", errOver)
}
errNeg := acc.Withdraw(-5.0)
if !errors.Is(errNeg, ErrInvalidAmount) {
t.Errorf("Withdraw(-5) = %v; erwartet ErrInvalidAmount", errNeg)
}
}
func TestCustomAPIError(t *testing.T) {
apiErr := &APIError{
StatusCode: 404,
Endpoint: "/api/v1/resource",
Details: "nicht gefunden",
}
expected := "HTTP 404 Fehler bei /api/v1/resource: nicht gefunden"
if apiErr.Error() != expected {
t.Errorf("APIError.Error() = %q; erwartet %q", apiErr.Error(), expected)
}
}
func TestExecuteRequestWrapping(t *testing.T) {
// 1. Ungültiges Token
_, errAuth := ExecuteRequest("/data", "bad-token")
if errAuth == nil {
t.Fatalf("ExecuteRequest mit falschem Token sollte Fehler liefern")
}
var apiErr *APIError
if !errors.As(errAuth, &apiErr) {
t.Errorf("Fehler sollte Typ *APIError sein, ist aber %T", errAuth)
} else if apiErr.StatusCode != 401 {
t.Errorf("APIError StatusCode = %d; erwartet 401", apiErr.StatusCode)
}
// 2. Datenbank Timeout Error
_, errTimeout := ExecuteRequest("/error", "valid-token-123")
if errTimeout == nil {
t.Fatalf("ExecuteRequest('/error') sollte Fehler liefern")
}
if errTimeout.Error() != "interner fehler: datenbank timeout" {
t.Errorf("Fehlermeldung = %q; erwartet 'interner fehler: datenbank timeout'", errTimeout.Error())
}
// 3. Erfolgreicher Request
res, errSuccess := ExecuteRequest("/users", "valid-token-123")
if errSuccess != nil || res != "200 OK: Daten für /users" {
t.Errorf("ExecuteRequest() = (%q, %v); erwartet ('200 OK: Daten für /users', nil)", res, errSuccess)
}
}