init push

This commit is contained in:
2026-07-16 22:16:45 +07:00
commit 8b068bdb10
1021 changed files with 332816 additions and 0 deletions

View 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 }