service_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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/digital-ticket/repository"
  12. )
  13. func setupTicketServiceTest(t *testing.T) *TicketService {
  14. dsn := fmt.Sprintf("file:digital-ticket-service-%d?mode=memory&cache=shared", time.Now().UnixNano())
  15. db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{})
  16. require.NoError(t, err)
  17. sqlDB, err := db.DB()
  18. require.NoError(t, err)
  19. sqlDB.SetMaxOpenConns(16)
  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{}, &dao.DigitalTicket{}))
  28. return NewTicketService()
  29. }
  30. func TestMarkPaidAndExitedUsesTheActualPaymentEntry(t *testing.T) {
  31. svc := setupTicketServiceTest(t)
  32. record := &dao.VehicleRecord{PlateNumber: "TEST001"}
  33. require.NoError(t, global.GVA_DB.Create(record).Error)
  34. _, err := svc.Create("TEST001", "manual", record.ID)
  35. require.NoError(t, err)
  36. require.NoError(t, svc.MarkPaidAndExitedTx(global.GVA_DB, record.ID,
  37. "central_payment_machine", "pos", "ORDER-001", 10, 10))
  38. ticket, err := svc.repo.GetByVehicleRecordID(record.ID)
  39. require.NoError(t, err)
  40. require.Equal(t, StateExited, ticket.State)
  41. require.Equal(t, "central_payment_machine", ticket.PaymentEntry)
  42. require.Equal(t, "pos", ticket.PaymentMethod)
  43. require.Equal(t, "ORDER-001", ticket.PaymentOrderNo)
  44. }
  45. func TestMarkPaidAndExitedRequiresATicket(t *testing.T) {
  46. svc := setupTicketServiceTest(t)
  47. record := &dao.VehicleRecord{PlateNumber: "TEST002"}
  48. require.NoError(t, global.GVA_DB.Create(record).Error)
  49. require.EqualError(t,
  50. svc.MarkPaidAndExitedTx(global.GVA_DB, record.ID, "counter", "cash", "", 0, 0),
  51. "车辆对应的数字票不存在")
  52. }
  53. func TestSummaryCountsTheCompleteFilteredSet(t *testing.T) {
  54. svc := setupTicketServiceTest(t)
  55. states := []string{StateCreated, StatePendingPayment, StatePendingPayment, StatePaid, StateExited, StateExpired}
  56. for i, state := range states {
  57. record := &dao.VehicleRecord{PlateNumber: "SUMMARY"}
  58. require.NoError(t, global.GVA_DB.Create(record).Error)
  59. ticket := &dao.DigitalTicket{
  60. TicketNo: fmt.Sprintf("SUMMARY-%d", i),
  61. PlateNumber: "SUMMARY",
  62. State: state,
  63. VehicleRecordID: record.ID,
  64. EntryTime: time.Now(),
  65. }
  66. require.NoError(t, global.GVA_DB.Create(ticket).Error)
  67. }
  68. summary, err := svc.Summary(repository.TicketListQuery{PlateNumber: "SUMMARY", State: StatePaid, Page: 2, PageSize: 1})
  69. require.NoError(t, err)
  70. require.EqualValues(t, 6, summary.Total)
  71. require.EqualValues(t, 3, summary.Pending)
  72. require.EqualValues(t, 1, summary.Paid)
  73. require.EqualValues(t, 1, summary.Exited)
  74. require.EqualValues(t, 1, summary.Expired)
  75. list, total, err := svc.List(repository.TicketListQuery{PlateNumber: "SUMMARY", State: StatePendingPayment})
  76. require.NoError(t, err)
  77. require.EqualValues(t, 3, total)
  78. require.Len(t, list, 3)
  79. legacyRecord := &dao.VehicleRecord{PlateNumber: "SUMMARY-LEGACY"}
  80. require.NoError(t, global.GVA_DB.Create(legacyRecord).Error)
  81. require.NoError(t, global.GVA_DB.Create(&dao.DigitalTicket{
  82. TicketNo: "SUMMARY-LEGACY-001", State: StatePendingPayment,
  83. VehicleRecordID: legacyRecord.ID, EntryTime: time.Now(),
  84. }).Error)
  85. legacySummary, err := svc.Summary(repository.TicketListQuery{PlateNumber: "SUMMARY-LEGACY"})
  86. require.NoError(t, err)
  87. require.EqualValues(t, 1, legacySummary.Total)
  88. require.EqualValues(t, 1, legacySummary.Pending)
  89. }
  90. func TestPendingTicketUsesCurrentFeeAndRecordPlate(t *testing.T) {
  91. db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
  92. require.NoError(t, err)
  93. global.GVA_DB = db
  94. require.NoError(t, db.AutoMigrate(
  95. &dao.VehicleRecord{}, &dao.DigitalTicket{}, &dao.Vehicle{}, &dao.VehicleType{}, &dao.FeeConfig{},
  96. ))
  97. vehicleType := &dao.VehicleType{Name: "临时车", IsSystem: true}
  98. require.NoError(t, db.Create(vehicleType).Error)
  99. require.NoError(t, db.Create(&dao.FeeConfig{
  100. VehicleTypeID: vehicleType.ID, StartTime: 0, StartFee: 0, UnitTime: 60, UnitFee: 5, DailyMaxFee: 50,
  101. }).Error)
  102. require.NoError(t, db.Create(&dao.Vehicle{PlateNumber: "粤A12345", VehicleTypeID: vehicleType.ID}).Error)
  103. record := &dao.VehicleRecord{PlateNumber: "粤A12345", EntryTime: time.Now().Add(-61 * time.Minute)}
  104. require.NoError(t, db.Create(record).Error)
  105. require.NoError(t, db.Create(&dao.DigitalTicket{
  106. TicketNo: "FEE-001", PlateNumber: "", State: StatePendingPayment,
  107. VehicleRecordID: record.ID, EntryTime: record.EntryTime,
  108. }).Error)
  109. ticket, err := NewTicketService().GetByTicketNo("FEE-001")
  110. require.NoError(t, err)
  111. require.Equal(t, "粤A12345", ticket.PlateNumber)
  112. require.InDelta(t, 10, ticket.Fee, 0.001)
  113. }