fee_config_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package vehicle
  2. import (
  3. "fmt"
  4. "math"
  5. "testing"
  6. "time"
  7. "github.com/glebarez/sqlite"
  8. "github.com/stretchr/testify/require"
  9. "gorm.io/gorm"
  10. "wails-app/internal/dao"
  11. "wails-app/internal/global"
  12. "wails-app/internal/model/vehicle/request"
  13. )
  14. func setupFeeConfigTest(t *testing.T) *FeeConfigService {
  15. t.Helper()
  16. dsn := fmt.Sprintf("file:fee-config-%d?mode=memory&cache=shared", time.Now().UnixNano())
  17. db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{})
  18. require.NoError(t, err)
  19. sqlDB, err := db.DB()
  20. require.NoError(t, err)
  21. t.Cleanup(func() {
  22. _ = sqlDB.Close()
  23. if global.GVA_DB == db {
  24. global.GVA_DB = nil
  25. }
  26. })
  27. global.GVA_DB = db
  28. require.NoError(t, db.AutoMigrate(&dao.VehicleType{}, &dao.FeeConfig{}))
  29. require.NoError(t, db.Create(&dao.VehicleType{Name: "临时车", IsSystem: true}).Error)
  30. return &FeeConfigService{}
  31. }
  32. func validReq() request.FeeConfigCreate {
  33. return request.FeeConfigCreate{
  34. VehicleTypeID: 1, StartTime: 15, StartFee: 5,
  35. UnitTime: 30, UnitFee: 3, DailyMaxFee: 30, VIPDiscount: 1.0,
  36. }
  37. }
  38. func TestCreateFeeConfigAcceptsValidRules(t *testing.T) {
  39. svc := setupFeeConfigTest(t)
  40. require.NoError(t, svc.CreateFeeConfig(validReq()))
  41. var config dao.FeeConfig
  42. require.NoError(t, global.GVA_DB.First(&config, "vehicle_type_id = ?", uint(1)).Error)
  43. require.Equal(t, 30.0, config.DailyMaxFee)
  44. }
  45. func TestCreateFeeConfigRejectsInvalidRules(t *testing.T) {
  46. svc := setupFeeConfigTest(t)
  47. cases := []struct {
  48. name string
  49. mut func(*request.FeeConfigCreate)
  50. want string
  51. }{
  52. {"负免费时长", func(r *request.FeeConfigCreate) { r.StartTime = -1 }, "免费时长"},
  53. {"单位时间为零", func(r *request.FeeConfigCreate) { r.UnitTime = 0 }, "单位时间"},
  54. {"负起步价", func(r *request.FeeConfigCreate) { r.StartFee = -1 }, "起步价"},
  55. {"负单位费用", func(r *request.FeeConfigCreate) { r.UnitFee = -1 }, "单位费用"},
  56. {"负日封顶", func(r *request.FeeConfigCreate) { r.DailyMaxFee = -1 }, "日封顶"},
  57. {"封顶低于起步价", func(r *request.FeeConfigCreate) { r.DailyMaxFee = 3 }, "日封顶"},
  58. {"折扣大于1", func(r *request.FeeConfigCreate) { r.VIPDiscount = 1.5 }, "VIP折扣"},
  59. {"折扣为负", func(r *request.FeeConfigCreate) { r.VIPDiscount = -0.5 }, "VIP折扣"},
  60. {"折扣为NaN", func(r *request.FeeConfigCreate) { r.VIPDiscount = math.NaN() }, "VIP折扣"},
  61. {"起步价为NaN", func(r *request.FeeConfigCreate) { r.StartFee = math.NaN() }, "起步价"},
  62. }
  63. for _, tc := range cases {
  64. t.Run(tc.name, func(t *testing.T) {
  65. req := validReq()
  66. tc.mut(&req)
  67. err := svc.CreateFeeConfig(req)
  68. require.Error(t, err)
  69. require.Contains(t, err.Error(), tc.want)
  70. })
  71. }
  72. // 全部拒绝,未入库
  73. var count int64
  74. require.NoError(t, global.GVA_DB.Model(&dao.FeeConfig{}).Count(&count).Error)
  75. require.Zero(t, count)
  76. }
  77. func TestUpdateFeeConfigRejectsInvalidRules(t *testing.T) {
  78. svc := setupFeeConfigTest(t)
  79. require.NoError(t, svc.CreateFeeConfig(validReq()))
  80. var existing dao.FeeConfig
  81. require.NoError(t, global.GVA_DB.First(&existing).Error)
  82. update := request.FeeConfigUpdate{
  83. ID: existing.ID, VehicleTypeID: 1, StartTime: 15, StartFee: 5,
  84. UnitTime: 0, UnitFee: 3, DailyMaxFee: 30, VIPDiscount: 1.0,
  85. }
  86. require.Error(t, svc.UpdateFeeConfig(update))
  87. // 原配置未被修改
  88. var after dao.FeeConfig
  89. require.NoError(t, global.GVA_DB.First(&after, existing.ID).Error)
  90. require.Equal(t, 30, after.UnitTime)
  91. }
  92. func TestListFeeConfigsHandlesZeroPage(t *testing.T) {
  93. svc := setupFeeConfigTest(t)
  94. require.NoError(t, svc.CreateFeeConfig(validReq()))
  95. // Page=0 兜底为第 1 页,不产生负 offset
  96. total, list, err := svc.ListFeeConfigs(request.FeeConfigQuery{Page: 0, PageSize: 0})
  97. require.NoError(t, err)
  98. require.Equal(t, int64(1), total)
  99. require.Len(t, list, 1)
  100. }