parking_lot_test.go 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package parking
  2. import (
  3. "fmt"
  4. "testing"
  5. "time"
  6. "github.com/glebarez/sqlite"
  7. "github.com/stretchr/testify/require"
  8. "gorm.io/gorm"
  9. "wails-app/internal/dao"
  10. "wails-app/internal/global"
  11. "wails-app/internal/model/parking/request"
  12. )
  13. func setupParkingLotTest(t *testing.T) *parkingLotService {
  14. t.Helper()
  15. dsn := fmt.Sprintf("file:parking-lot-%d?mode=memory&cache=shared", time.Now().UnixNano())
  16. db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{})
  17. require.NoError(t, err)
  18. sqlDB, err := db.DB()
  19. require.NoError(t, err)
  20. t.Cleanup(func() {
  21. _ = sqlDB.Close()
  22. if global.GVA_DB == db {
  23. global.GVA_DB = nil
  24. }
  25. })
  26. global.GVA_DB = db
  27. require.NoError(t, db.AutoMigrate(&dao.ParkingLot{}, &dao.VehicleRecord{}))
  28. return NewParkingLotService()
  29. }
  30. func TestCreateParkingLotPersistsFullAdmissionPolicies(t *testing.T) {
  31. svc := setupParkingLotTest(t)
  32. require.NoError(t, svc.CreateParkingLot(request.ParkingLotCreate{
  33. LotCode: "LOT-A", LotName: "A区", Capacity: 20,
  34. AllowTemporaryWhenFull: false,
  35. AllowMonthlyWhenFull: true,
  36. AllowVIPWhenFull: false,
  37. }))
  38. var lot dao.ParkingLot
  39. require.NoError(t, global.GVA_DB.Where("lot_code = ?", "LOT-A").First(&lot).Error)
  40. require.Zero(t, lot.Occupied)
  41. require.Equal(t, 20, lot.Available)
  42. require.False(t, lot.AllowTemporaryWhenFull)
  43. require.True(t, lot.AllowMonthlyWhenFull)
  44. require.False(t, lot.AllowVIPWhenFull)
  45. }
  46. func TestUpdateParkingLotUsesActiveSessionsForAvailability(t *testing.T) {
  47. svc := setupParkingLotTest(t)
  48. lot := &dao.ParkingLot{LotCode: "LOT-B", LotName: "B区", Capacity: 2, Available: 2}
  49. require.NoError(t, global.GVA_DB.Create(lot).Error)
  50. require.NoError(t, global.GVA_DB.Create(&dao.VehicleRecord{
  51. PlateNumber: "IN-PARK", ParkingLotID: lot.ID, EntryTime: time.Now(), PaymentStatus: "unpaid",
  52. }).Error)
  53. err := svc.UpdateParkingLot(request.ParkingLotUpdate{
  54. ID: lot.ID, LotCode: lot.LotCode, LotName: lot.LotName, Capacity: 0,
  55. })
  56. require.EqualError(t, err, "停车场容量不能小于当前在场车辆数")
  57. require.NoError(t, svc.UpdateParkingLot(request.ParkingLotUpdate{
  58. ID: lot.ID, LotCode: lot.LotCode, LotName: lot.LotName, Capacity: 3,
  59. AllowTemporaryWhenFull: true, AllowMonthlyWhenFull: false, AllowVIPWhenFull: true,
  60. }))
  61. require.NoError(t, global.GVA_DB.First(&lot, lot.ID).Error)
  62. require.Equal(t, 1, lot.Occupied)
  63. require.Equal(t, 2, lot.Available)
  64. require.True(t, lot.AllowTemporaryWhenFull)
  65. require.False(t, lot.AllowMonthlyWhenFull)
  66. require.True(t, lot.AllowVIPWhenFull)
  67. }
  68. func TestDeleteParkingLotRejectsActiveSessions(t *testing.T) {
  69. svc := setupParkingLotTest(t)
  70. lot := &dao.ParkingLot{LotCode: "LOT-C", LotName: "C区", Capacity: 10, Available: 9, Occupied: 1}
  71. require.NoError(t, global.GVA_DB.Create(lot).Error)
  72. require.NoError(t, global.GVA_DB.Create(&dao.VehicleRecord{
  73. PlateNumber: "ACTIVE-CAR", ParkingLotID: lot.ID, EntryTime: time.Now(), PaymentStatus: "unpaid",
  74. }).Error)
  75. require.EqualError(t, svc.DeleteParkingLot(lot.ID), "停车场仍有在场车辆,不能删除")
  76. require.NoError(t, global.GVA_DB.First(&dao.ParkingLot{}, lot.ID).Error)
  77. }
  78. func TestDeleteParkingLotWithoutActiveSessions(t *testing.T) {
  79. svc := setupParkingLotTest(t)
  80. lot := &dao.ParkingLot{LotCode: "LOT-D", LotName: "D区", Capacity: 10, Available: 10}
  81. require.NoError(t, global.GVA_DB.Create(lot).Error)
  82. require.NoError(t, svc.DeleteParkingLot(lot.ID))
  83. var count int64
  84. require.NoError(t, global.GVA_DB.Model(&dao.ParkingLot{}).Where("id = ?", lot.ID).Count(&count).Error)
  85. require.Zero(t, count)
  86. }