service_test.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. })
  38. return err
  39. }))
  40. resolved, err := svc.ResolveActiveSession(request.ResolveActiveSessionRequest{
  41. PlateNumber: "SESSION-001", RFIDTag: "RFID-001",
  42. })
  43. require.NoError(t, err)
  44. require.Equal(t, session.ID, resolved.ID)
  45. require.NoError(t, global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  46. if _, err := svc.MarkPaidTx(tx, session.ID, "counter", "cash", 12); err != nil {
  47. return err
  48. }
  49. _, err := svc.CloseSessionTx(tx, request.CloseSessionRequest{
  50. SessionID: session.ID, StayTime: 60, Fee: 12, PaymentEntry: "counter", PaymentMethod: "cash",
  51. })
  52. return err
  53. }))
  54. _, err = svc.ResolveActiveSession(request.ResolveActiveSessionRequest{SessionID: session.ID})
  55. require.ErrorIs(t, err, ErrSessionAlreadyClosed)
  56. }
  57. func TestParkingSessionRejectsDuplicateAndConflictingIdentity(t *testing.T) {
  58. svc := setupParkingSessionTest(t)
  59. first, err := svc.OpenSessionTx(global.GVA_DB, request.OpenSessionRequest{PlateNumber: "SESSION-A", RFIDTag: "RFID-A"})
  60. require.NoError(t, err)
  61. _, err = svc.OpenSessionTx(global.GVA_DB, request.OpenSessionRequest{PlateNumber: "SESSION-A"})
  62. require.ErrorIs(t, err, ErrSessionAlreadyOpen)
  63. second, err := svc.OpenSessionTx(global.GVA_DB, request.OpenSessionRequest{PlateNumber: "SESSION-B", RFIDTag: "RFID-B"})
  64. require.NoError(t, err)
  65. require.NotEqual(t, first.ID, second.ID)
  66. _, err = svc.ResolveActiveSession(request.ResolveActiveSessionRequest{PlateNumber: "SESSION-A", RFIDTag: "RFID-B"})
  67. require.ErrorIs(t, err, ErrSessionIdentityConflict)
  68. }