parking_capacity_test.go 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package vehicle
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/stretchr/testify/require"
  6. "wails-app/internal/dao"
  7. "wails-app/internal/global"
  8. "wails-app/internal/model/vehicle/request"
  9. parkingSessionService "wails-app/internal/modules/parking-session/service"
  10. )
  11. func setFullLotPolicies(t *testing.T, temporary, monthly, vip bool) {
  12. t.Helper()
  13. require.NoError(t, global.GVA_DB.Model(&dao.ParkingLot{}).Where("id = ?", 1).Updates(map[string]interface{}{
  14. "capacity": 0, "occupied": 0, "available": 0,
  15. "allow_temporary_when_full": temporary,
  16. "allow_monthly_when_full": monthly,
  17. "allow_vip_when_full": vip,
  18. }).Error)
  19. }
  20. func TestVehicleEntryRejectsTemporaryVehicleWhenLotIsFull(t *testing.T) {
  21. svc := setupVehiclePaymentTest(t)
  22. setFullLotPolicies(t, false, true, true)
  23. vehicleType := &dao.VehicleType{Name: "临时车", IsSystem: true}
  24. require.NoError(t, global.GVA_DB.Create(vehicleType).Error)
  25. require.NoError(t, global.GVA_DB.Create(&dao.Vehicle{PlateNumber: "TEMP-FULL", VehicleTypeID: vehicleType.ID}).Error)
  26. _, err := svc.VehicleEntry(request.VehicleEntry{PlateNumber: "TEMP-FULL", ParkingLotID: 1})
  27. require.ErrorIs(t, err, parkingSessionService.ErrParkingLotFull)
  28. var sessionCount, ticketCount int64
  29. require.NoError(t, global.GVA_DB.Model(&dao.VehicleRecord{}).Count(&sessionCount).Error)
  30. require.NoError(t, global.GVA_DB.Model(&dao.DigitalTicket{}).Count(&ticketCount).Error)
  31. require.Zero(t, sessionCount)
  32. require.Zero(t, ticketCount)
  33. }
  34. func TestVehicleEntryAllowsValidMonthlyVehicleWhenLotIsFull(t *testing.T) {
  35. svc := setupVehiclePaymentTest(t)
  36. setFullLotPolicies(t, false, true, false)
  37. vehicleType := &dao.VehicleType{Name: "月租车型"}
  38. require.NoError(t, global.GVA_DB.Create(vehicleType).Error)
  39. vehicle := &dao.Vehicle{PlateNumber: "MONTHLY-FULL", VehicleTypeID: vehicleType.ID}
  40. require.NoError(t, global.GVA_DB.Create(vehicle).Error)
  41. require.NoError(t, global.GVA_DB.Create(&dao.MonthlyCard{
  42. VehicleID: vehicle.ID, StartDate: time.Now().Add(-time.Hour), EndDate: time.Now().Add(time.Hour), PaymentStatus: "paid",
  43. }).Error)
  44. _, err := svc.VehicleEntry(request.VehicleEntry{PlateNumber: vehicle.PlateNumber, ParkingLotID: 1})
  45. require.NoError(t, err)
  46. var lot dao.ParkingLot
  47. require.NoError(t, global.GVA_DB.First(&lot, 1).Error)
  48. require.Equal(t, 1, lot.Occupied)
  49. require.Zero(t, lot.Available)
  50. }
  51. func TestVehicleEntryAllowsValidVIPVehicleWhenLotIsFull(t *testing.T) {
  52. svc := setupVehiclePaymentTest(t)
  53. setFullLotPolicies(t, false, false, true)
  54. owner := &dao.Owner{OwnerName: "VIP车主", IsVip: true, VipExpireTime: time.Now().Add(time.Hour)}
  55. require.NoError(t, global.GVA_DB.Create(owner).Error)
  56. vehicleType := &dao.VehicleType{Name: "VIP车型"}
  57. require.NoError(t, global.GVA_DB.Create(vehicleType).Error)
  58. vehicle := &dao.Vehicle{PlateNumber: "VIP-FULL", VehicleTypeID: vehicleType.ID, OwnerId: &owner.ID}
  59. require.NoError(t, global.GVA_DB.Create(vehicle).Error)
  60. _, err := svc.VehicleEntry(request.VehicleEntry{PlateNumber: vehicle.PlateNumber, ParkingLotID: 1})
  61. require.NoError(t, err)
  62. }