init push
This commit is contained in:
81
internal/repository/mysql/helicopter_usage_repo_test.go
Normal file
81
internal/repository/mysql/helicopter_usage_repo_test.go
Normal file
@@ -0,0 +1,81 @@
|
||||
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 }
|
||||
Reference in New Issue
Block a user