111 lines
3.7 KiB
Go
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")
|
|
}
|
|
}
|