service_test.go 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package service
  2. import (
  3. "testing"
  4. "github.com/glebarez/sqlite"
  5. "github.com/stretchr/testify/require"
  6. "gorm.io/gorm"
  7. "wails-app/internal/dao"
  8. "wails-app/internal/global"
  9. )
  10. func setupPaymentServiceTest(t *testing.T) *PaymentService {
  11. db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
  12. require.NoError(t, err)
  13. global.GVA_DB = db
  14. require.NoError(t, db.AutoMigrate(&dao.PaymentMethodConfig{}, &dao.PaymentEntryConfig{}, &dao.PaymentEntryMethod{}))
  15. require.NoError(t, db.Create(&[]dao.PaymentMethodConfig{
  16. {Code: PaymentCash, Name: "人工支付", InputMode: InputModeManualAmount, Scenes: []string{SceneCounter}, Enabled: true, Sort: 10, IsSystem: true},
  17. {Code: PaymentPOS, Name: "POS机支付", InputMode: InputModeConfirm, Scenes: []string{SceneCounter}, Enabled: true, Sort: 20, IsSystem: true},
  18. {Code: PaymentTicketQR, Name: "小票扫码支付", InputMode: InputModeExternal, Scenes: []string{SceneTicket}, Enabled: true, Sort: 30, IsSystem: true},
  19. }).Error)
  20. require.NoError(t, db.Create(&[]dao.PaymentEntryConfig{
  21. {Code: EntryCounter, Name: "收费岗亭", Enabled: true, IsSystem: true},
  22. {Code: EntryTicket, Name: "停车小票", Enabled: true, IsSystem: true},
  23. }).Error)
  24. require.NoError(t, db.Create(&[]dao.PaymentEntryMethod{
  25. {EntryCode: EntryCounter, MethodCode: PaymentCash, Sort: 10},
  26. {EntryCode: EntryCounter, MethodCode: PaymentPOS, Sort: 20},
  27. {EntryCode: EntryTicket, MethodCode: PaymentCash, Sort: 10},
  28. {EntryCode: EntryTicket, MethodCode: PaymentPOS, Sort: 20},
  29. {EntryCode: EntryTicket, MethodCode: PaymentTicketQR, Sort: 30},
  30. }).Error)
  31. return NewPaymentService()
  32. }
  33. func TestCashCannotBeDisabledOrDeleted(t *testing.T) {
  34. svc := setupPaymentServiceTest(t)
  35. method, err := svc.repo.GetMethodByCode(nil, PaymentCash)
  36. require.NoError(t, err)
  37. require.EqualError(t, svc.SetMethodEnabled(method.ID, false), "人工支付是基础功能,不能停用")
  38. require.EqualError(t, svc.DeleteMethod(method.ID), "系统内置支付方式不能删除")
  39. }
  40. func TestPaymentMethodSceneAndAmountValidation(t *testing.T) {
  41. svc := setupPaymentServiceTest(t)
  42. _, _, err := svc.ValidatePayment(nil, PaymentTicketQR, SceneCounter, 10, 10)
  43. require.EqualError(t, err, "支付方式“小票扫码支付”未配置到当前支付入口")
  44. _, _, err = svc.ValidatePayment(nil, PaymentCash, SceneCounter, 10, 9.9)
  45. require.EqualError(t, err, "实收金额不足")
  46. _, paidAmount, err := svc.ValidatePayment(nil, PaymentPOS, SceneCounter, 10, 999)
  47. require.NoError(t, err)
  48. require.Equal(t, 10.0, paidAmount)
  49. _, paidAmount, err = svc.ValidatePayment(nil, PaymentFree, SceneCounter, 10, 0)
  50. require.NoError(t, err)
  51. require.Zero(t, paidAmount)
  52. _, _, err = svc.ValidatePayment(nil, PaymentFree, SceneTicket, 10, 0)
  53. require.EqualError(t, err, "免密放行不能用于当前支付场景")
  54. }
  55. func TestDisabledAndInvalidMethodsAreRejected(t *testing.T) {
  56. svc := setupPaymentServiceTest(t)
  57. method, err := svc.repo.GetMethodByCode(nil, PaymentPOS)
  58. require.NoError(t, err)
  59. require.NoError(t, svc.SetMethodEnabled(method.ID, false))
  60. _, _, err = svc.ValidatePayment(nil, PaymentPOS, SceneCounter, 10, 10)
  61. require.EqualError(t, err, "支付方式“POS机支付”已停用")
  62. err = svc.CreateMethod(&dao.PaymentMethodConfig{Code: "Bad Code", Name: "测试", InputMode: InputModeConfirm, Scenes: []string{SceneCounter}})
  63. require.ErrorContains(t, err, "支付编码必须")
  64. }
  65. func TestCustomMethodsAreOrderedAndDuplicateCodesRejected(t *testing.T) {
  66. svc := setupPaymentServiceTest(t)
  67. custom := &dao.PaymentMethodConfig{
  68. Code: "bank_card", Name: "银行卡", InputMode: InputModeConfirm,
  69. EntryCodes: []string{EntryCounter}, Enabled: true, Sort: 5,
  70. }
  71. require.NoError(t, svc.CreateMethod(custom))
  72. methods, err := svc.ListEnabledMethods(SceneCounter)
  73. require.NoError(t, err)
  74. require.Equal(t, "bank_card", methods[0].Code)
  75. duplicate := &dao.PaymentMethodConfig{
  76. Code: "bank_card", Name: "重复编码", InputMode: InputModeConfirm,
  77. EntryCodes: []string{EntryCounter}, Enabled: true,
  78. }
  79. require.EqualError(t, svc.CreateMethod(duplicate), "支付编码已存在")
  80. }