public_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package fserr
  2. import (
  3. "errors"
  4. "github.com/stretchr/testify/suite"
  5. "net/http"
  6. "testing"
  7. )
  8. type TestPublicSuite struct {
  9. suite.Suite
  10. outerErr,
  11. newErr, newFmtErr,
  12. wrapErr, wrapFmtErr, wrapOuterErr, wrapNilErr,
  13. codeErr, codeOptionErr, codeOuterErr, codeNilErr error
  14. errBasicMsg string
  15. }
  16. func (s *TestPublicSuite) SetupTest() {
  17. s.outerErr = errors.New("outer error")
  18. s.errBasicMsg = "basic error"
  19. NewOK(ErrBasic, s.errBasicMsg)
  20. // new
  21. s.newErr = New("new error")
  22. s.newFmtErr = New("new %s", "error")
  23. // wrap
  24. s.wrapErr = Wrap(s.newErr, "wrap error")
  25. s.wrapFmtErr = Wrap(s.newErr, "wrap %s", "error")
  26. s.wrapOuterErr = Wrap(s.outerErr, "wrap error")
  27. s.wrapNilErr = Wrap(nil, "wrap error")
  28. // code
  29. s.codeErr = WithCode(s.newErr, ErrBasic)
  30. s.codeOptionErr = WithCode(s.newErr, ErrBasic, MsgOption("cover message"))
  31. s.codeOuterErr = WithCode(s.outerErr, ErrBasic)
  32. s.codeNilErr = WithCode(nil, ErrBasic)
  33. }
  34. func (s *TestPublicSuite) TestNew() {
  35. s.Equal("new error", s.newErr.Error())
  36. s.Equal("new error", s.newFmtErr.Error())
  37. }
  38. func (s *TestPublicSuite) TestWrap() {
  39. s.Equal("wrap error: new error", s.wrapErr.Error())
  40. s.Equal("wrap error: new error", s.wrapFmtErr.Error())
  41. s.Equal("wrap error: outer error", s.wrapOuterErr.Error())
  42. s.Nil(s.wrapNilErr)
  43. }
  44. func (s *TestPublicSuite) TestWithCode() {
  45. s.Equal(s.errBasicMsg, s.codeErr.Error())
  46. s.Equal("cover message", s.codeOptionErr.Error())
  47. s.Equal("basic error", s.codeOuterErr.Error())
  48. s.Equal("basic error", s.codeNilErr.Error())
  49. }
  50. func (s *TestPublicSuite) TestUnWrap() {
  51. s.Equal(s.newErr, UnWrap(s.newErr))
  52. s.Equal(s.newErr, UnWrap(s.wrapErr))
  53. s.Equal(s.outerErr, UnWrap(s.wrapOuterErr))
  54. s.Nil(UnWrap(s.wrapNilErr))
  55. s.Equal(s.newErr, UnWrap(s.codeErr))
  56. s.Equal(s.outerErr, UnWrap(s.codeOuterErr))
  57. s.Equal(nil, UnWrap(s.codeNilErr))
  58. }
  59. func (s *TestPublicSuite) TestIs() {
  60. s.True(Is(s.newErr, s.newErr))
  61. s.True(Is(s.wrapErr, s.newErr))
  62. s.True(Is(s.codeErr, s.newErr))
  63. s.False(Is(s.newErr, s.outerErr))
  64. s.False(Is(s.wrapErr, s.outerErr))
  65. s.False(Is(s.codeErr, s.outerErr))
  66. }
  67. func (s *TestPublicSuite) TestAs() {
  68. var originErr *fundamental
  69. s.True(As(s.wrapErr, &originErr))
  70. s.Equal(UnWrap(s.wrapErr), originErr)
  71. var codeErr *withCode
  72. s.False(As(s.wrapErr, &codeErr))
  73. }
  74. func (s *TestPublicSuite) TestOuterMsg() {
  75. s.Equal("new error", outerMsg(s.newErr))
  76. s.Equal("wrap error", outerMsg(s.wrapErr))
  77. s.Equal(s.errBasicMsg, outerMsg(s.codeErr))
  78. s.Equal("outer error", outerMsg(s.outerErr))
  79. s.Equal("", outerMsg(nil))
  80. }
  81. func (s *TestPublicSuite) TestParseCode() {
  82. code := ParseCode(s.codeErr)
  83. s.Equal(ErrBasic, code.BusinessCode)
  84. s.Equal(http.StatusOK, code.HttpCode)
  85. s.Equal(s.errBasicMsg, code.Msg)
  86. s.Equal(s.newErr, code.cause)
  87. err := ParseCode(Wrap(s.codeErr, "wrap error"))
  88. s.Equal(ErrBasic, err.BusinessCode)
  89. s.Equal(http.StatusOK, err.HttpCode)
  90. s.Equal("wrap error", err.Msg)
  91. s.Equal(s.newErr, err.cause)
  92. }
  93. func (s *TestPublicSuite) TestIsCode() {
  94. s.True(IsCode(s.codeErr, ErrBasic))
  95. s.False(IsCode(s.codeErr, ErrDb))
  96. s.False(IsCode(s.wrapErr, ErrBasic))
  97. }
  98. func (s *TestPublicSuite) TestSetServiceCode() {
  99. SetServiceCode(300000)
  100. NewOK(2001, "ok")
  101. err := WithCode(nil, 2001)
  102. s.Equal(302001, ParseCode(err).BusinessCode)
  103. }
  104. func TestPublic(t *testing.T) {
  105. suite.Run(t, &TestPublicSuite{})
  106. }