service_test.go 4.4 KB

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