82 lines
2.3 KiB
Go
82 lines
2.3 KiB
Go
package mysql
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
|
|
helicopterusage "wucher/internal/domain/helicopter_usage"
|
|
"wucher/internal/shared/pkg/uuidv7"
|
|
)
|
|
|
|
func openHelicopterUsageTestDB(t *testing.T) *gorm.DB {
|
|
t.Helper()
|
|
dsn := fmt.Sprintf("file:helicopter_usage_test_%d?mode=memory&cache=shared", time.Now().UnixNano())
|
|
db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{
|
|
NowFunc: func() time.Time { return time.Now().UTC() },
|
|
DisableForeignKeyConstraintWhenMigrating: true,
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("open sqlite: %v", err)
|
|
}
|
|
if err := db.AutoMigrate(&helicopterusage.HelicopterUsage{}); err != nil {
|
|
t.Fatalf("auto migrate: %v", err)
|
|
}
|
|
return db
|
|
}
|
|
|
|
// TestHelicopterUsageRepositoryDecimalRoundTrip guards that the formerly-int counters
|
|
// (landing, cycles, ccc, flight report, hook release, rotor brake) keep 2 decimals through
|
|
// a persist -> read cycle.
|
|
func TestHelicopterUsageRepositoryDecimalRoundTrip(t *testing.T) {
|
|
db := openHelicopterUsageTestDB(t)
|
|
repo := NewHelicopterUsageRepository(db)
|
|
ctx := context.Background()
|
|
|
|
helID := uuidv7.MustBytes()
|
|
row := &helicopterusage.HelicopterUsage{HelicopterID: helID}
|
|
row.ApplyManualSummary(helicopterusage.ManualSummaryInput{
|
|
Landing: usageF64(123.45),
|
|
AirframeCycles: usageF64(12.30),
|
|
Engine1Ccc: usageF64(44.25),
|
|
FlightReport: usageF64(80.10),
|
|
HookRelease: usageF64(10.75),
|
|
RotorBrakeCycle: usageF64(8.99),
|
|
})
|
|
if err := repo.Create(ctx, row); err != nil {
|
|
t.Fatalf("create: %v", err)
|
|
}
|
|
|
|
got, err := repo.GetByHelicopterID(ctx, helID)
|
|
if err != nil {
|
|
t.Fatalf("get: %v", err)
|
|
}
|
|
if got == nil {
|
|
t.Fatalf("expected row")
|
|
}
|
|
cases := []struct {
|
|
name string
|
|
got float64
|
|
want float64
|
|
}{
|
|
{"total_landing", got.TotalLanding, 123.45},
|
|
{"total_airframe_cycles", got.TotalAirframeCycles, 12.30},
|
|
{"total_engine_1_ccc", got.TotalEngine1Ccc, 44.25},
|
|
{"total_flight_report", got.TotalFlightReport, 80.10},
|
|
{"total_hook_release", got.TotalHookRelease, 10.75},
|
|
{"total_rotor_brake_cycle", got.TotalRotorBrakeCycle, 8.99},
|
|
{"manual_landing", got.ManualLanding, 123.45},
|
|
}
|
|
for _, c := range cases {
|
|
if c.got != c.want {
|
|
t.Fatalf("%s = %v, want %v (decimal truncated?)", c.name, c.got, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func usageF64(v float64) *float64 { return &v }
|