parking_session_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. ticketService "wails-app/internal/modules/digital-ticket/service"
  10. sessionRequest "wails-app/internal/modules/parking-session/model/request"
  11. sessionService "wails-app/internal/modules/parking-session/service"
  12. paymentService "wails-app/internal/modules/payment/service"
  13. )
  14. func TestVehicleEntryOpensSessionUsingCanonicalVehicleIdentity(t *testing.T) {
  15. svc := setupVehiclePaymentTest(t)
  16. vehicleType := &dao.VehicleType{Name: "session-entry", IsSystem: true}
  17. require.NoError(t, global.GVA_DB.Create(vehicleType).Error)
  18. vehicle := &dao.Vehicle{
  19. PlateNumber: "SESSION-ENTRY", RFIDTag: "RFID-SESSION-ENTRY", VehicleTypeID: vehicleType.ID,
  20. }
  21. require.NoError(t, global.GVA_DB.Create(vehicle).Error)
  22. entryResult, err := svc.VehicleEntry(request.VehicleEntry{
  23. PlateNumber: vehicle.PlateNumber, ParkingLotID: 1,
  24. EntryChannelID: 31, EntryChannelCode: "ENTRY-31", EntryChannelName: "入口三号通道",
  25. EntryDeviceCode: "GATE-31", EntryDeviceName: "入口三号设备",
  26. TriggerMode: "ticket_machine",
  27. })
  28. require.NoError(t, err)
  29. session, err := sessionService.NewParkingSessionService().FindActiveSession(sessionRequest.ResolveActiveSessionRequest{
  30. RFIDTag: vehicle.RFIDTag,
  31. })
  32. require.NoError(t, err)
  33. require.Equal(t, vehicle.PlateNumber, session.PlateNumber)
  34. require.Equal(t, vehicle.RFIDTag, session.RFIDTag)
  35. require.EqualValues(t, 31, session.EntryChannelID)
  36. require.Equal(t, "ENTRY-31", session.EntryChannelCode)
  37. require.Equal(t, "入口三号通道", session.EntryChannelName)
  38. require.Equal(t, "GATE-31", session.EntryDeviceCode)
  39. require.Equal(t, "入口三号设备", session.EntryDeviceName)
  40. var ticket dao.DigitalTicket
  41. require.NoError(t, global.GVA_DB.Where("vehicle_record_id = ?", session.ID).First(&ticket).Error)
  42. require.Equal(t, vehicle.PlateNumber, ticket.PlateNumber)
  43. require.Equal(t, "ticket_machine", ticket.TriggerMode)
  44. require.Equal(t, session.ID, entryResult.Data.SessionID)
  45. require.Equal(t, ticket.ID, entryResult.Data.TicketID)
  46. require.Equal(t, ticket.TicketNo, entryResult.Data.TicketNo)
  47. }
  48. func TestOperationContextResolvesRFIDOnlyVehicleForEntry(t *testing.T) {
  49. svc := setupVehiclePaymentTest(t)
  50. vehicleType := &dao.VehicleType{Name: "rfid-entry", IsSystem: true}
  51. require.NoError(t, global.GVA_DB.Create(vehicleType).Error)
  52. vehicle := &dao.Vehicle{PlateNumber: "RFID-CAR", RFIDTag: "RFID-ONLY-001", VehicleTypeID: vehicleType.ID}
  53. require.NoError(t, global.GVA_DB.Create(vehicle).Error)
  54. context, err := svc.GetOperationContext(request.VehicleIdentityRequest{RFIDTag: vehicle.RFIDTag})
  55. require.NoError(t, err)
  56. require.Equal(t, "entry", context.Action)
  57. require.True(t, context.VehicleFound)
  58. require.NotNil(t, context.Vehicle)
  59. require.Equal(t, vehicle.PlateNumber, context.Vehicle.PlateNumber)
  60. }
  61. func TestOperationContextReturnsSessionAndTicketForExit(t *testing.T) {
  62. svc := setupVehiclePaymentTest(t)
  63. record, vehicle := createVehiclePaymentFixture(t, true)
  64. context, err := svc.GetOperationContext(request.VehicleIdentityRequest{PlateNumber: vehicle.PlateNumber})
  65. require.NoError(t, err)
  66. require.Equal(t, "exit", context.Action)
  67. require.NotNil(t, context.Exit)
  68. require.Equal(t, record.ID, context.Exit.SessionID)
  69. require.Equal(t, ticketService.StatePendingPayment, context.Exit.TicketState)
  70. require.NotEmpty(t, context.Exit.TicketNo)
  71. require.Equal(t, sessionService.PaymentStatusUnpaid, context.Exit.PaymentStatus)
  72. }
  73. func TestExitConfirmAcceptsZeroFeeFreeReleaseBySession(t *testing.T) {
  74. svc := setupVehiclePaymentTest(t)
  75. record, vehicle := createVehiclePaymentFixture(t, true)
  76. require.NoError(t, global.GVA_DB.Model(record).Update("entry_time", time.Now()).Error)
  77. result, err := svc.ExitConfirm(request.ExitConfirmRequest{
  78. SessionID: record.ID, PlateNumber: vehicle.PlateNumber,
  79. PaymentEntry: paymentService.EntryCounter, PaymentMethod: paymentService.PaymentFree,
  80. ExitChannelID: 41, ExitChannelCode: "EXIT-41", ExitChannelName: "出口四号通道",
  81. ExitDeviceCode: "GATE-41", ExitDeviceName: "出口四号设备",
  82. }, 1)
  83. require.NoError(t, err)
  84. require.Zero(t, result.Fee)
  85. var persisted dao.VehicleRecord
  86. require.NoError(t, global.GVA_DB.First(&persisted, record.ID).Error)
  87. require.NotNil(t, persisted.ExitTime)
  88. require.EqualValues(t, 41, persisted.ExitChannelID)
  89. require.Equal(t, "EXIT-41", persisted.ExitChannelCode)
  90. require.Equal(t, "出口四号通道", persisted.ExitChannelName)
  91. require.Equal(t, "GATE-41", persisted.ExitDeviceCode)
  92. require.Equal(t, "出口四号设备", persisted.ExitDeviceName)
  93. }