package vehicle import ( "testing" "time" "github.com/stretchr/testify/require" "wails-app/internal/dao" "wails-app/internal/global" "wails-app/internal/model/vehicle/request" parkingSessionService "wails-app/internal/modules/parking-session/service" ) func setFullLotPolicies(t *testing.T, temporary, monthly, vip bool) { t.Helper() require.NoError(t, global.GVA_DB.Model(&dao.ParkingLot{}).Where("id = ?", 1).Updates(map[string]interface{}{ "capacity": 0, "occupied": 0, "available": 0, "allow_temporary_when_full": temporary, "allow_monthly_when_full": monthly, "allow_vip_when_full": vip, }).Error) } func TestVehicleEntryRejectsTemporaryVehicleWhenLotIsFull(t *testing.T) { svc := setupVehiclePaymentTest(t) setFullLotPolicies(t, false, true, true) vehicleType := &dao.VehicleType{Name: "临时车", IsSystem: true} require.NoError(t, global.GVA_DB.Create(vehicleType).Error) require.NoError(t, global.GVA_DB.Create(&dao.Vehicle{PlateNumber: "TEMP-FULL", VehicleTypeID: vehicleType.ID}).Error) _, err := svc.VehicleEntry(request.VehicleEntry{PlateNumber: "TEMP-FULL", ParkingLotID: 1}) require.ErrorIs(t, err, parkingSessionService.ErrParkingLotFull) var sessionCount, ticketCount int64 require.NoError(t, global.GVA_DB.Model(&dao.VehicleRecord{}).Count(&sessionCount).Error) require.NoError(t, global.GVA_DB.Model(&dao.DigitalTicket{}).Count(&ticketCount).Error) require.Zero(t, sessionCount) require.Zero(t, ticketCount) } func TestVehicleEntryAllowsValidMonthlyVehicleWhenLotIsFull(t *testing.T) { svc := setupVehiclePaymentTest(t) setFullLotPolicies(t, false, true, false) vehicleType := &dao.VehicleType{Name: "月租车型"} require.NoError(t, global.GVA_DB.Create(vehicleType).Error) vehicle := &dao.Vehicle{PlateNumber: "MONTHLY-FULL", VehicleTypeID: vehicleType.ID} require.NoError(t, global.GVA_DB.Create(vehicle).Error) require.NoError(t, global.GVA_DB.Create(&dao.MonthlyCard{ VehicleID: vehicle.ID, StartDate: time.Now().Add(-time.Hour), EndDate: time.Now().Add(time.Hour), PaymentStatus: "paid", }).Error) _, err := svc.VehicleEntry(request.VehicleEntry{PlateNumber: vehicle.PlateNumber, ParkingLotID: 1}) require.NoError(t, err) var lot dao.ParkingLot require.NoError(t, global.GVA_DB.First(&lot, 1).Error) require.Equal(t, 1, lot.Occupied) require.Zero(t, lot.Available) } func TestVehicleEntryAllowsValidVIPVehicleWhenLotIsFull(t *testing.T) { svc := setupVehiclePaymentTest(t) setFullLotPolicies(t, false, false, true) owner := &dao.Owner{OwnerName: "VIP车主", IsVip: true, VipExpireTime: time.Now().Add(time.Hour)} require.NoError(t, global.GVA_DB.Create(owner).Error) vehicleType := &dao.VehicleType{Name: "VIP车型"} require.NoError(t, global.GVA_DB.Create(vehicleType).Error) vehicle := &dao.Vehicle{PlateNumber: "VIP-FULL", VehicleTypeID: vehicleType.ID, OwnerId: &owner.ID} require.NoError(t, global.GVA_DB.Create(vehicle).Error) _, err := svc.VehicleEntry(request.VehicleEntry{PlateNumber: vehicle.PlateNumber, ParkingLotID: 1}) require.NoError(t, err) }