service_test.go 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package service
  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/modules/parking-session/model/request"
  12. )
  13. func setupParkingSessionTest(t *testing.T) *ParkingSessionService {
  14. t.Helper()
  15. dsn := fmt.Sprintf("file:parking-session-%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.VehicleRecord{}))
  28. return NewParkingSessionService()
  29. }
  30. func TestParkingSessionOpenResolveAndClose(t *testing.T) {
  31. svc := setupParkingSessionTest(t)
  32. var session *dao.VehicleRecord
  33. require.NoError(t, global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  34. var err error
  35. session, err = svc.OpenSessionTx(tx, request.OpenSessionRequest{
  36. PlateNumber: "SESSION-001", RFIDTag: "RFID-001", ParkingLotID: 1,
  37. EntryChannelID: 11, EntryChannelCode: "ENTRY-A", EntryChannelName: "东入口通道",
  38. EntryDeviceCode: "GATE-ENTRY-A", EntryDeviceName: "东入口读卡器",
  39. })
  40. return err
  41. }))
  42. resolved, err := svc.ResolveActiveSession(request.ResolveActiveSessionRequest{
  43. PlateNumber: "SESSION-001", RFIDTag: "RFID-001",
  44. })
  45. require.NoError(t, err)
  46. require.Equal(t, session.ID, resolved.ID)
  47. require.NoError(t, global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  48. if _, err := svc.MarkPaidTx(tx, session.ID, "counter", "cash", 12); err != nil {
  49. return err
  50. }
  51. _, err := svc.CloseSessionTx(tx, request.CloseSessionRequest{
  52. SessionID: session.ID, StayTime: 60, Fee: 12, PaymentEntry: "counter", PaymentMethod: "cash",
  53. ExitChannelID: 22, ExitChannelCode: "EXIT-B", ExitChannelName: "西出口通道",
  54. ExitDeviceCode: "GATE-EXIT-B", ExitDeviceName: "西出口读卡器",
  55. })
  56. return err
  57. }))
  58. var persisted dao.VehicleRecord
  59. require.NoError(t, global.GVA_DB.First(&persisted, session.ID).Error)
  60. require.EqualValues(t, 11, persisted.EntryChannelID)
  61. require.Equal(t, "ENTRY-A", persisted.EntryChannelCode)
  62. require.Equal(t, "东入口通道", persisted.EntryChannelName)
  63. require.Equal(t, "GATE-ENTRY-A", persisted.EntryDeviceCode)
  64. require.Equal(t, "东入口读卡器", persisted.EntryDeviceName)
  65. require.EqualValues(t, 22, persisted.ExitChannelID)
  66. require.Equal(t, "EXIT-B", persisted.ExitChannelCode)
  67. require.Equal(t, "西出口通道", persisted.ExitChannelName)
  68. require.Equal(t, "GATE-EXIT-B", persisted.ExitDeviceCode)
  69. require.Equal(t, "西出口读卡器", persisted.ExitDeviceName)
  70. _, err = svc.ResolveActiveSession(request.ResolveActiveSessionRequest{SessionID: session.ID})
  71. require.ErrorIs(t, err, ErrSessionAlreadyClosed)
  72. }
  73. func TestParkingSessionRejectsDuplicateAndConflictingIdentity(t *testing.T) {
  74. svc := setupParkingSessionTest(t)
  75. first, err := svc.OpenSessionTx(global.GVA_DB, request.OpenSessionRequest{PlateNumber: "SESSION-A", RFIDTag: "RFID-A"})
  76. require.NoError(t, err)
  77. _, err = svc.OpenSessionTx(global.GVA_DB, request.OpenSessionRequest{PlateNumber: "SESSION-A"})
  78. require.ErrorIs(t, err, ErrSessionAlreadyOpen)
  79. second, err := svc.OpenSessionTx(global.GVA_DB, request.OpenSessionRequest{PlateNumber: "SESSION-B", RFIDTag: "RFID-B"})
  80. require.NoError(t, err)
  81. require.NotEqual(t, first.ID, second.ID)
  82. _, err = svc.ResolveActiveSession(request.ResolveActiveSessionRequest{PlateNumber: "SESSION-A", RFIDTag: "RFID-B"})
  83. require.ErrorIs(t, err, ErrSessionIdentityConflict)
  84. }