Files
fm_be/internal/repository/mysql/flight_data_repo_test.go
2026-07-16 22:16:45 +07:00

111 lines
3.7 KiB
Go

package mysql
import (
"fmt"
"testing"
"time"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
flightdata "wucher/internal/domain/flight_data"
"wucher/internal/shared/pkg/uuidv7"
)
func openFlightDataTestDB(t *testing.T) *gorm.DB {
t.Helper()
dsn := fmt.Sprintf("file:flight_data_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() },
})
if err != nil {
t.Fatalf("open sqlite: %v", err)
}
return db
}
func TestFlightDataPersistenceValues_AllowsNullableLocationFields(t *testing.T) {
row := &flightdata.FlightData{
ID: uuidv7.MustBytes(),
MissionID: uuidv7.MustBytes(),
CoPilotID: uuidv7.MustBytes(),
FromHospitalID: uuidv7.MustBytes(),
ToICAOID: uuidv7.MustBytes(),
CreatedAt: time.Now().UTC(),
UpdatedAt: time.Now().UTC(),
CreatedBy: uuidv7.MustBytes(),
UpdatedBy: uuidv7.MustBytes(),
Status: flightdata.StatusInProgress,
FlightTakeOff: time.Now().UTC(),
FlightLanding: time.Now().UTC(),
FlightDuration: 4 * time.Second,
FlightRED: 10 * time.Second,
FlightPlanTime: 10 * time.Second,
FlightPlanDistance: 10,
FlightPlanTrueCourse: 10,
FuelBeforeFlight: 10,
FuelUpload: 10,
FuelAfterFlight: 10,
FuelPlanning: 10,
}
values := flightDataPersistenceValues(row)
if values["from_icao_id"] != nil {
t.Fatalf("expected from_icao_id to be nil, got %#v", values["from_icao_id"])
}
if values["to_hospital_id"] != nil {
t.Fatalf("expected to_hospital_id to be nil, got %#v", values["to_hospital_id"])
}
if values["from_hospital_id"] == nil {
t.Fatal("expected from_hospital_id to be populated")
}
if values["to_icao_id"] == nil {
t.Fatal("expected to_icao_id to be populated")
}
if values["status"] != flightdata.StatusInProgress {
t.Fatalf("expected status to be on_progress, got %#v", values["status"])
}
}
func TestFlightDataPersistenceValues_ZeroTimesBecomeNull(t *testing.T) {
row := &flightdata.FlightData{
ID: uuidv7.MustBytes(),
MissionID: uuidv7.MustBytes(),
CoPilotID: uuidv7.MustBytes(),
CreatedAt: time.Now().UTC(),
UpdatedAt: time.Now().UTC(),
CreatedBy: uuidv7.MustBytes(),
UpdatedBy: uuidv7.MustBytes(),
}
values := flightDataPersistenceValues(row)
if values["take_off"] != nil {
t.Fatalf("expected take_off to be nil, got %#v", values["take_off"])
}
if values["landing"] != nil {
t.Fatalf("expected landing to be nil, got %#v", values["landing"])
}
}
func TestNewFlightDataRepositoryCachesOptionalTables(t *testing.T) {
db := openFlightDataTestDB(t)
for _, stmt := range []string{
`CREATE TABLE heslo_flights (id BLOB PRIMARY KEY, flight_data_id BLOB, created_at DATETIME)`,
`CREATE TABLE heslo_slings (id BLOB PRIMARY KEY, heslo_flight_id BLOB, created_at DATETIME)`,
`CREATE TABLE logging_slings (id BLOB PRIMARY KEY, flight_data_id BLOB, created_at DATETIME)`,
`CREATE TABLE hec_flights (id BLOB PRIMARY KEY, flight_data_id BLOB, created_at DATETIME)`,
`CREATE TABLE hec_slings (id BLOB PRIMARY KEY, flight_data_id BLOB, created_at DATETIME)`,
`CREATE TABLE hec_loads (id BLOB PRIMARY KEY, flight_data_id BLOB, created_at DATETIME)`,
} {
if err := db.Exec(stmt).Error; err != nil {
t.Fatalf("create table: %v", err)
}
}
repo := NewFlightDataRepository(db)
if !repo.hasHesloFlightsTable || !repo.hasHesloSlingsTable || !repo.hasLoggingSlingsTable ||
!repo.hasHecFlightsTable || !repo.hasHecSlingsTable || !repo.hasHecLoadsTable {
t.Fatalf("expected all optional table flags to be cached as true")
}
}