package vehicle import ( "testing" "time" "github.com/stretchr/testify/require" "wails-app/internal/dao" "wails-app/internal/global" "wails-app/internal/model/vehicle/request" ticketService "wails-app/internal/modules/digital-ticket/service" sessionRequest "wails-app/internal/modules/parking-session/model/request" sessionService "wails-app/internal/modules/parking-session/service" paymentService "wails-app/internal/modules/payment/service" ) func TestVehicleEntryOpensSessionUsingCanonicalVehicleIdentity(t *testing.T) { svc := setupVehiclePaymentTest(t) vehicleType := &dao.VehicleType{Name: "session-entry", IsSystem: true} require.NoError(t, global.GVA_DB.Create(vehicleType).Error) vehicle := &dao.Vehicle{ PlateNumber: "SESSION-ENTRY", RFIDTag: "RFID-SESSION-ENTRY", VehicleTypeID: vehicleType.ID, } require.NoError(t, global.GVA_DB.Create(vehicle).Error) entryResult, err := svc.VehicleEntry(request.VehicleEntry{ PlateNumber: vehicle.PlateNumber, ParkingLotID: 1, EntryChannelID: 31, EntryChannelCode: "ENTRY-31", EntryChannelName: "入口三号通道", EntryDeviceCode: "GATE-31", EntryDeviceName: "入口三号设备", TriggerMode: "ticket_machine", }) require.NoError(t, err) session, err := sessionService.NewParkingSessionService().FindActiveSession(sessionRequest.ResolveActiveSessionRequest{ RFIDTag: vehicle.RFIDTag, }) require.NoError(t, err) require.Equal(t, vehicle.PlateNumber, session.PlateNumber) require.Equal(t, vehicle.RFIDTag, session.RFIDTag) require.EqualValues(t, 31, session.EntryChannelID) require.Equal(t, "ENTRY-31", session.EntryChannelCode) require.Equal(t, "入口三号通道", session.EntryChannelName) require.Equal(t, "GATE-31", session.EntryDeviceCode) require.Equal(t, "入口三号设备", session.EntryDeviceName) var ticket dao.DigitalTicket require.NoError(t, global.GVA_DB.Where("vehicle_record_id = ?", session.ID).First(&ticket).Error) require.Equal(t, vehicle.PlateNumber, ticket.PlateNumber) require.Equal(t, "ticket_machine", ticket.TriggerMode) require.Equal(t, session.ID, entryResult.Data.SessionID) require.Equal(t, ticket.ID, entryResult.Data.TicketID) require.Equal(t, ticket.TicketNo, entryResult.Data.TicketNo) } func TestOperationContextResolvesRFIDOnlyVehicleForEntry(t *testing.T) { svc := setupVehiclePaymentTest(t) vehicleType := &dao.VehicleType{Name: "rfid-entry", IsSystem: true} require.NoError(t, global.GVA_DB.Create(vehicleType).Error) vehicle := &dao.Vehicle{PlateNumber: "RFID-CAR", RFIDTag: "RFID-ONLY-001", VehicleTypeID: vehicleType.ID} require.NoError(t, global.GVA_DB.Create(vehicle).Error) context, err := svc.GetOperationContext(request.VehicleIdentityRequest{RFIDTag: vehicle.RFIDTag}) require.NoError(t, err) require.Equal(t, "entry", context.Action) require.True(t, context.VehicleFound) require.NotNil(t, context.Vehicle) require.Equal(t, vehicle.PlateNumber, context.Vehicle.PlateNumber) } func TestOperationContextReturnsSessionAndTicketForExit(t *testing.T) { svc := setupVehiclePaymentTest(t) record, vehicle := createVehiclePaymentFixture(t, true) context, err := svc.GetOperationContext(request.VehicleIdentityRequest{PlateNumber: vehicle.PlateNumber}) require.NoError(t, err) require.Equal(t, "exit", context.Action) require.NotNil(t, context.Exit) require.Equal(t, record.ID, context.Exit.SessionID) require.Equal(t, ticketService.StatePendingPayment, context.Exit.TicketState) require.NotEmpty(t, context.Exit.TicketNo) require.Equal(t, sessionService.PaymentStatusUnpaid, context.Exit.PaymentStatus) } func TestExitConfirmAcceptsZeroFeeFreeReleaseBySession(t *testing.T) { svc := setupVehiclePaymentTest(t) record, vehicle := createVehiclePaymentFixture(t, true) require.NoError(t, global.GVA_DB.Model(record).Update("entry_time", time.Now()).Error) result, err := svc.ExitConfirm(request.ExitConfirmRequest{ SessionID: record.ID, PlateNumber: vehicle.PlateNumber, PaymentEntry: paymentService.EntryCounter, PaymentMethod: paymentService.PaymentFree, ExitChannelID: 41, ExitChannelCode: "EXIT-41", ExitChannelName: "出口四号通道", ExitDeviceCode: "GATE-41", ExitDeviceName: "出口四号设备", }, 1) require.NoError(t, err) require.Zero(t, result.Fee) var persisted dao.VehicleRecord require.NoError(t, global.GVA_DB.First(&persisted, record.ID).Error) require.NotNil(t, persisted.ExitTime) require.EqualValues(t, 41, persisted.ExitChannelID) require.Equal(t, "EXIT-41", persisted.ExitChannelCode) require.Equal(t, "出口四号通道", persisted.ExitChannelName) require.Equal(t, "GATE-41", persisted.ExitDeviceCode) require.Equal(t, "出口四号设备", persisted.ExitDeviceName) }